Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <sal/config.h>
21 : : #include <rtl/ustring.hxx>
22 : : #include <rtl/string.hxx>
23 : : #include <com/sun/star/i18n/ScriptType.hpp>
24 : :
25 : : #include "i18npool/mslangid.hxx"
26 : :
27 : :
28 : : LanguageType MsLangId::nConfiguredSystemLanguage = LANGUAGE_SYSTEM;
29 : : LanguageType MsLangId::nConfiguredSystemUILanguage = LANGUAGE_SYSTEM;
30 : :
31 : : LanguageType MsLangId::nConfiguredWesternFallback = LANGUAGE_SYSTEM;
32 : : LanguageType MsLangId::nConfiguredAsianFallback = LANGUAGE_SYSTEM;
33 : : LanguageType MsLangId::nConfiguredComplexFallback = LANGUAGE_SYSTEM;
34 : :
35 : : // static
36 : 368 : void MsLangId::setConfiguredSystemLanguage( LanguageType nLang )
37 : : {
38 : 368 : nConfiguredSystemLanguage = nLang;
39 : 368 : }
40 : :
41 : :
42 : : // static
43 : 158 : void MsLangId::setConfiguredSystemUILanguage( LanguageType nLang )
44 : : {
45 : 158 : nConfiguredSystemUILanguage = nLang;
46 : 158 : }
47 : :
48 : : // static
49 : 474 : void MsLangId::setConfiguredWesternFallback( LanguageType nLang )
50 : : {
51 : 474 : nConfiguredWesternFallback = nLang;
52 : 474 : }
53 : :
54 : : // static
55 : 0 : void MsLangId::setConfiguredAsianFallback( LanguageType nLang )
56 : : {
57 : 0 : nConfiguredAsianFallback = nLang;
58 : 0 : }
59 : :
60 : : // static
61 : 0 : void MsLangId::setConfiguredComplexFallback( LanguageType nLang )
62 : : {
63 : 0 : nConfiguredComplexFallback = nLang;
64 : 0 : }
65 : :
66 : : // static
67 : 441348 : inline LanguageType MsLangId::simplifySystemLanguages( LanguageType nLang )
68 : : {
69 [ + + ]: 441348 : switch (nLang)
70 : : {
71 : : case LANGUAGE_PROCESS_OR_USER_DEFAULT :
72 : : case LANGUAGE_SYSTEM_DEFAULT :
73 : : case LANGUAGE_SYSTEM :
74 : 229616 : nLang = LANGUAGE_SYSTEM;
75 : 229616 : break;
76 : : default:
77 : : ; // nothing
78 : : }
79 : 441348 : return nLang;
80 : : }
81 : :
82 : : // static
83 : 439987 : LanguageType MsLangId::getRealLanguage( LanguageType nLang )
84 : : {
85 [ + + + ]: 439987 : switch (simplifySystemLanguages( nLang))
86 : : {
87 : : case LANGUAGE_SYSTEM :
88 [ + + ]: 229440 : if (nConfiguredSystemLanguage == LANGUAGE_SYSTEM)
89 : 21 : nLang = getSystemLanguage();
90 : : else
91 : 229419 : nLang = nConfiguredSystemLanguage;
92 : 229440 : break;
93 : : case LANGUAGE_NONE :
94 [ + - ]: 9 : if (nConfiguredSystemUILanguage == LANGUAGE_SYSTEM)
95 : 9 : nLang = getSystemUILanguage();
96 : : else
97 : 0 : nLang = nConfiguredSystemUILanguage;
98 : 9 : break;
99 : : default:
100 : : /* TODO: would this be useful here? */
101 : : //nLang = MsLangId::getReplacementForObsoleteLanguage( nLang);
102 : : ; // nothing
103 : : }
104 [ + + ]: 439987 : if (nLang == LANGUAGE_DONTKNOW)
105 : 5 : nLang = LANGUAGE_ENGLISH_US;
106 : 439987 : return nLang;
107 : : }
108 : :
109 : :
110 : : // static
111 : 73389 : LanguageType MsLangId::resolveSystemLanguageByScriptType( LanguageType nLang, sal_Int16 nType )
112 : : {
113 [ - + ]: 73389 : if (nLang == LANGUAGE_NONE)
114 : 0 : return nLang;
115 : :
116 : 73389 : nLang = getRealLanguage(nLang);
117 [ + + ][ + + ]: 73389 : if (nType != ::com::sun::star::i18n::ScriptType::WEAK && getScriptType(nLang) != nType)
[ + - ]
118 : : {
119 [ + + - ]: 48926 : switch(nType)
120 : : {
121 : : case ::com::sun::star::i18n::ScriptType::ASIAN:
122 [ + - ]: 24463 : if (nConfiguredAsianFallback == LANGUAGE_SYSTEM)
123 : 24463 : nLang = LANGUAGE_CHINESE_SIMPLIFIED;
124 : : else
125 : 0 : nLang = nConfiguredAsianFallback;
126 : 24463 : break;
127 : : case ::com::sun::star::i18n::ScriptType::COMPLEX:
128 [ + - ]: 24463 : if (nConfiguredComplexFallback == LANGUAGE_SYSTEM)
129 : 24463 : nLang = LANGUAGE_HINDI;
130 : : else
131 : 0 : nLang = nConfiguredComplexFallback;
132 : 24463 : break;
133 : : default:
134 [ # # ]: 0 : if (nConfiguredWesternFallback == LANGUAGE_SYSTEM)
135 : 0 : nLang = LANGUAGE_ENGLISH_US;
136 : : else
137 : 0 : nLang = nConfiguredWesternFallback;
138 : 48926 : break;
139 : : }
140 : : }
141 : 73389 : return nLang;
142 : : }
143 : :
144 : : // static
145 : 857159 : void MsLangId::convertLanguageToLocale( LanguageType nLang,
146 : : ::com::sun::star::lang::Locale & rLocale )
147 : : {
148 [ - + ]: 857159 : if (!rLocale.Variant.isEmpty())
149 : 0 : rLocale.Variant = rtl::OUString();
150 : 857159 : convertLanguageToIsoNames( nLang, rLocale.Language, rLocale.Country);
151 : 857159 : }
152 : :
153 : :
154 : : // static
155 : 217177 : ::com::sun::star::lang::Locale MsLangId::convertLanguageToLocale(
156 : : LanguageType nLang, bool bResolveSystem )
157 : : {
158 : 217177 : ::com::sun::star::lang::Locale aLocale;
159 [ + + ][ + + ]: 217177 : if (!bResolveSystem && simplifySystemLanguages( nLang) == LANGUAGE_SYSTEM)
[ + + ]
160 : : ; // nothing => empty locale
161 : : else
162 : : {
163 : : // Still resolve LANGUAGE_DONTKNOW if resolving is not requested,
164 : : // but not LANGUAGE_NONE or others.
165 [ + + ][ + + ]: 217001 : if (bResolveSystem || nLang == LANGUAGE_DONTKNOW)
166 [ + - ]: 215821 : nLang = MsLangId::getRealLanguage( nLang);
167 [ + - ]: 217001 : convertLanguageToLocale( nLang, aLocale);
168 : : }
169 : 217177 : return aLocale;
170 : : }
171 : :
172 : :
173 : : // static
174 : 625800 : LanguageType MsLangId::convertLocaleToLanguage(
175 : : const ::com::sun::star::lang::Locale& rLocale )
176 : : {
177 : : // empty language => LANGUAGE_SYSTEM
178 [ + + ]: 625800 : if (rLocale.Language.isEmpty())
179 : 22391 : return LANGUAGE_SYSTEM;
180 : :
181 : : LanguageType nRet = convertIsoNamesToLanguage( rLocale.Language,
182 : 603409 : rLocale.Country);
183 [ + + ]: 603409 : if (nRet == LANGUAGE_DONTKNOW)
184 : 9 : nRet = LANGUAGE_SYSTEM;
185 : :
186 : 625800 : return nRet;
187 : : }
188 : :
189 : :
190 : : // static
191 : 57 : LanguageType MsLangId::convertLocaleToLanguageWithFallback(
192 : : const ::com::sun::star::lang::Locale & rLocale )
193 : : {
194 : : // empty language => LANGUAGE_SYSTEM
195 [ - + ]: 57 : if (rLocale.Language.isEmpty())
196 : 0 : return lookupFallbackLanguage( LANGUAGE_SYSTEM);
197 : :
198 : 57 : return lookupFallbackLanguage( rLocale);
199 : : }
200 : :
201 : :
202 : : // static
203 : 149543 : ::com::sun::star::lang::Locale MsLangId::convertLanguageToLocaleWithFallback(
204 : : LanguageType nLang )
205 : : {
206 : 149543 : return lookupFallbackLocale( MsLangId::getRealLanguage( nLang));
207 : : }
208 : :
209 : :
210 : : // static
211 : 149978 : ::com::sun::star::lang::Locale MsLangId::getFallbackLocale(
212 : : const ::com::sun::star::lang::Locale & rLocale )
213 : : {
214 : : // empty language => LANGUAGE_SYSTEM
215 [ + + ]: 149978 : if (rLocale.Language.isEmpty())
216 : 149543 : return convertLanguageToLocaleWithFallback( LANGUAGE_SYSTEM);
217 : :
218 : 149978 : return lookupFallbackLocale( rLocale);
219 : : }
220 : :
221 : : // static
222 : 597882 : bool MsLangId::isRightToLeft( LanguageType nLang )
223 : : {
224 [ - + ]: 597882 : switch( nLang & LANGUAGE_MASK_PRIMARY )
225 : : {
226 : : case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY :
227 : : case LANGUAGE_HEBREW & LANGUAGE_MASK_PRIMARY :
228 : : case LANGUAGE_YIDDISH & LANGUAGE_MASK_PRIMARY :
229 : : case LANGUAGE_URDU & LANGUAGE_MASK_PRIMARY :
230 : : case LANGUAGE_FARSI & LANGUAGE_MASK_PRIMARY :
231 : : case LANGUAGE_KASHMIRI & LANGUAGE_MASK_PRIMARY :
232 : : case LANGUAGE_SINDHI & LANGUAGE_MASK_PRIMARY :
233 : : case LANGUAGE_UIGHUR_CHINA & LANGUAGE_MASK_PRIMARY :
234 : : case LANGUAGE_USER_KYRGYZ_CHINA & LANGUAGE_MASK_PRIMARY :
235 : 0 : return true;
236 : :
237 : : default:
238 : 597882 : break;
239 : : }
240 : 597882 : return false;
241 : : }
242 : :
243 : : // static
244 : 31533 : bool MsLangId::isSimplifiedChinese( LanguageType nLang )
245 : : {
246 [ - + ][ # # ]: 31533 : return isChinese(nLang) && !isTraditionalChinese(nLang);
247 : : }
248 : :
249 : : // static
250 : 0 : bool MsLangId::isSimplifiedChinese( const ::com::sun::star::lang::Locale & rLocale )
251 : : {
252 [ # # ][ # # ]: 0 : return rLocale.Language == "zh" && !isTraditionalChinese(rLocale);
253 : : }
254 : :
255 : : // static
256 : 387 : bool MsLangId::isTraditionalChinese( LanguageType nLang )
257 : : {
258 : 387 : bool bRet = false;
259 [ - + ]: 387 : switch (nLang)
260 : : {
261 : : case LANGUAGE_CHINESE_TRADITIONAL:
262 : : case LANGUAGE_CHINESE_HONGKONG:
263 : : case LANGUAGE_CHINESE_MACAU:
264 : 0 : bRet = true;
265 : : default:
266 : 387 : break;
267 : : }
268 : 387 : return bRet;
269 : : }
270 : :
271 : : // static
272 : 0 : bool MsLangId::isTraditionalChinese( const ::com::sun::star::lang::Locale & rLocale )
273 : : {
274 [ # # ][ # # ]: 0 : return rLocale.Language == "zh" && (rLocale.Country == "TW" || rLocale.Country == "HK" || rLocale.Country == "MO");
[ # # ][ # # ]
275 : : }
276 : :
277 : : //static
278 : 31533 : bool MsLangId::isChinese( LanguageType nLang )
279 : : {
280 : 31533 : return MsLangId::getPrimaryLanguage(nLang) == LANGUAGE_CHINESE;
281 : : }
282 : :
283 : : //static
284 : 2511 : bool MsLangId::isKorean( LanguageType nLang )
285 : : {
286 : 2511 : return MsLangId::getPrimaryLanguage(nLang) == LANGUAGE_KOREAN;
287 : : }
288 : :
289 : : // static
290 : 432 : bool MsLangId::isCJK( LanguageType nLang )
291 : : {
292 [ - + ]: 432 : switch (nLang & LANGUAGE_MASK_PRIMARY)
293 : : {
294 : : case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
295 : : case LANGUAGE_JAPANESE & LANGUAGE_MASK_PRIMARY:
296 : : case LANGUAGE_KOREAN & LANGUAGE_MASK_PRIMARY:
297 : 0 : return true;
298 : : default:
299 : 432 : break;
300 : : }
301 : 432 : return false;
302 : : }
303 : :
304 : : // static
305 : 0 : bool MsLangId::isFamilyNameFirst( LanguageType nLang )
306 : : {
307 [ # # ][ # # ]: 0 : return isCJK(nLang) || nLang == LANGUAGE_HUNGARIAN;
308 : : }
309 : :
310 : : // static
311 : 0 : bool MsLangId::hasForbiddenCharacters( LanguageType nLang )
312 : : {
313 : 0 : return isCJK(nLang);
314 : : }
315 : :
316 : :
317 : : // static
318 : 0 : bool MsLangId::needsSequenceChecking( LanguageType nLang )
319 : : {
320 [ # # ]: 0 : switch (nLang & LANGUAGE_MASK_PRIMARY)
321 : : {
322 : : case LANGUAGE_BURMESE & LANGUAGE_MASK_PRIMARY:
323 : : case LANGUAGE_KHMER & LANGUAGE_MASK_PRIMARY:
324 : : case LANGUAGE_LAO & LANGUAGE_MASK_PRIMARY:
325 : : case LANGUAGE_THAI & LANGUAGE_MASK_PRIMARY:
326 : 0 : return true;
327 : : default:
328 : 0 : break;
329 : : }
330 : 0 : return false;
331 : : }
332 : :
333 : :
334 : : // static
335 : 2179298 : sal_Int16 MsLangId::getScriptType( LanguageType nLang )
336 : : {
337 : : sal_Int16 nScript;
338 [ - - + ]: 2179298 : switch( nLang )
339 : : {
340 : : // CJK
341 : : // all LANGUAGE_CHINESE_... are caught below
342 : : case LANGUAGE_JAPANESE:
343 : : case LANGUAGE_KOREAN:
344 : : case LANGUAGE_KOREAN_JOHAB:
345 : : case LANGUAGE_USER_KOREAN_NORTH:
346 : 0 : nScript = ::com::sun::star::i18n::ScriptType::ASIAN;
347 : 0 : break;
348 : :
349 : : // CTL
350 : : // all LANGUAGE_ARABIC_... are caught below
351 : : case LANGUAGE_AMHARIC_ETHIOPIA:
352 : : case LANGUAGE_ASSAMESE:
353 : : case LANGUAGE_BENGALI:
354 : : case LANGUAGE_BENGALI_BANGLADESH:
355 : : case LANGUAGE_BURMESE:
356 : : case LANGUAGE_FARSI:
357 : : case LANGUAGE_HEBREW:
358 : : case LANGUAGE_YIDDISH:
359 : : case LANGUAGE_USER_YIDDISH_US:
360 : : case LANGUAGE_MARATHI:
361 : : case LANGUAGE_PUNJABI:
362 : : case LANGUAGE_GUJARATI:
363 : : case LANGUAGE_HINDI:
364 : : case LANGUAGE_KANNADA:
365 : : case LANGUAGE_KASHMIRI:
366 : : case LANGUAGE_KASHMIRI_INDIA:
367 : : case LANGUAGE_KHMER:
368 : : case LANGUAGE_LAO:
369 : : case LANGUAGE_MALAYALAM:
370 : : case LANGUAGE_MANIPURI:
371 : : case LANGUAGE_MONGOLIAN_MONGOLIAN:
372 : : case LANGUAGE_NEPALI:
373 : : case LANGUAGE_NEPALI_INDIA:
374 : : case LANGUAGE_ORIYA:
375 : : case LANGUAGE_SANSKRIT:
376 : : case LANGUAGE_SINDHI:
377 : : case LANGUAGE_SINDHI_PAKISTAN:
378 : : case LANGUAGE_SINHALESE_SRI_LANKA:
379 : : case LANGUAGE_SYRIAC:
380 : : case LANGUAGE_TAMIL:
381 : : case LANGUAGE_TELUGU:
382 : : case LANGUAGE_THAI:
383 : : case LANGUAGE_TIBETAN:
384 : : case LANGUAGE_DZONGKHA:
385 : : case LANGUAGE_URDU:
386 : : case LANGUAGE_URDU_PAKISTAN:
387 : : case LANGUAGE_URDU_INDIA:
388 : : case LANGUAGE_USER_KURDISH_IRAQ:
389 : : case LANGUAGE_USER_KURDISH_IRAN:
390 : : case LANGUAGE_DHIVEHI:
391 : : case LANGUAGE_USER_BODO_INDIA:
392 : : case LANGUAGE_USER_DOGRI_INDIA:
393 : : case LANGUAGE_USER_MAITHILI_INDIA:
394 : : case LANGUAGE_UIGHUR_CHINA:
395 : : case LANGUAGE_USER_LIMBU:
396 : : case LANGUAGE_USER_KYRGYZ_CHINA:
397 : 0 : nScript = ::com::sun::star::i18n::ScriptType::COMPLEX;
398 : 0 : break;
399 : :
400 : : // currently not knowing scripttype - defaulted to LATIN:
401 : : /*
402 : : #define LANGUAGE_ARMENIAN 0x042B
403 : : #define LANGUAGE_INDONESIAN 0x0421
404 : : #define LANGUAGE_KAZAK 0x043F
405 : : #define LANGUAGE_KONKANI 0x0457
406 : : #define LANGUAGE_MACEDONIAN 0x042F
407 : : #define LANGUAGE_TATAR 0x0444
408 : : */
409 : :
410 : : default:
411 [ + - + ]: 2179298 : switch ( nLang & LANGUAGE_MASK_PRIMARY )
412 : : {
413 : : // CJK catcher
414 : : case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
415 : 3 : nScript = ::com::sun::star::i18n::ScriptType::ASIAN;
416 : 3 : break;
417 : : // CTL catcher
418 : : case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY:
419 : 0 : nScript = ::com::sun::star::i18n::ScriptType::COMPLEX;
420 : 0 : break;
421 : : // Western (actually not necessarily Latin but also Cyrillic, for example)
422 : : default:
423 : 2179295 : nScript = ::com::sun::star::i18n::ScriptType::LATIN;
424 : : }
425 : 2179298 : break;
426 : : }
427 : 2179298 : return nScript;
428 : : }
429 : :
430 : :
431 : : // static
432 : 598 : LanguageType MsLangId::getReplacementForObsoleteLanguage( LanguageType nLang, bool bUserInterfaceSelection )
433 : : {
434 [ + - - - : 598 : switch (nLang)
- - - - -
- - - -
- ]
435 : : {
436 : : default:
437 : 598 : break; // nothing
438 : : case LANGUAGE_OBSOLETE_USER_LATIN:
439 : 0 : nLang = LANGUAGE_LATIN;
440 : 0 : break;
441 : : case LANGUAGE_OBSOLETE_USER_MAORI:
442 : 0 : nLang = LANGUAGE_MAORI_NEW_ZEALAND;
443 : 0 : break;
444 : : case LANGUAGE_OBSOLETE_USER_KINYARWANDA:
445 : 0 : nLang = LANGUAGE_KINYARWANDA_RWANDA;
446 : 0 : break;
447 : : case LANGUAGE_OBSOLETE_USER_UPPER_SORBIAN:
448 : 0 : nLang = LANGUAGE_UPPER_SORBIAN_GERMANY;
449 : 0 : break;
450 : : case LANGUAGE_OBSOLETE_USER_LOWER_SORBIAN:
451 : 0 : nLang = LANGUAGE_LOWER_SORBIAN_GERMANY;
452 : 0 : break;
453 : : case LANGUAGE_OBSOLETE_USER_OCCITAN:
454 : 0 : nLang = LANGUAGE_OCCITAN_FRANCE;
455 : 0 : break;
456 : : case LANGUAGE_OBSOLETE_USER_BRETON:
457 : 0 : nLang = LANGUAGE_BRETON_FRANCE;
458 : 0 : break;
459 : : case LANGUAGE_OBSOLETE_USER_KALAALLISUT:
460 : 0 : nLang = LANGUAGE_KALAALLISUT_GREENLAND;
461 : 0 : break;
462 : : case LANGUAGE_OBSOLETE_USER_LUXEMBOURGISH:
463 : 0 : nLang = LANGUAGE_LUXEMBOURGISH_LUXEMBOURG;
464 : 0 : break;
465 : : case LANGUAGE_OBSOLETE_USER_KABYLE:
466 : 0 : nLang = LANGUAGE_TAMAZIGHT_LATIN;
467 : 0 : break;
468 : :
469 : : // The following are not strictly obsolete but should be mapped to a
470 : : // replacement locale when encountered.
471 : :
472 : : // no_NO is an alias for nb_NO
473 : : case LANGUAGE_NORWEGIAN:
474 : 0 : nLang = LANGUAGE_NORWEGIAN_BOKMAL;
475 : 0 : break;
476 : :
477 : : // #i94435# A Spanish variant that differs only in collation details we
478 : : // do not support.
479 : : case LANGUAGE_SPANISH_DATED:
480 : 0 : nLang = LANGUAGE_SPANISH_MODERN;
481 : 0 : break;
482 : :
483 : : // Do not use ca-XV for document content.
484 : : /* TODO: remove in case we implement BCP47 language tags. */
485 : : case LANGUAGE_USER_CATALAN_VALENCIAN:
486 [ # # ]: 0 : if (!bUserInterfaceSelection)
487 : 0 : nLang = LANGUAGE_CATALAN;
488 : 0 : break;
489 : : }
490 : 598 : return nLang;
491 : : }
492 : :
493 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|