1449ab281SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3449ab281SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4449ab281SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5449ab281SAndrew Rist  * distributed with this work for additional information
6449ab281SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7449ab281SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8449ab281SAndrew Rist  * "License"); you may not use this file except in compliance
9449ab281SAndrew Rist  * with the License.  You may obtain a copy of the License at
10449ab281SAndrew Rist  *
11449ab281SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12449ab281SAndrew Rist  *
13449ab281SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14449ab281SAndrew Rist  * software distributed under the License is distributed on an
15449ab281SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16449ab281SAndrew Rist  * KIND, either express or implied.  See the License for the
17449ab281SAndrew Rist  * specific language governing permissions and limitations
18449ab281SAndrew Rist  * under the License.
19449ab281SAndrew Rist  *
20449ab281SAndrew Rist  *************************************************************/
21449ab281SAndrew Rist 
22449ab281SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_i18npool.hxx"
26cdf0e10cSrcweir #include <sal/config.h>
27cdf0e10cSrcweir #include <rtl/ustring.hxx>
28cdf0e10cSrcweir #include <rtl/string.hxx>
29cdf0e10cSrcweir #include <com/sun/star/i18n/ScriptType.hpp>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include "i18npool/mslangid.hxx"
32cdf0e10cSrcweir 
33cdf0e10cSrcweir 
34cdf0e10cSrcweir LanguageType MsLangId::nConfiguredSystemLanguage   = LANGUAGE_SYSTEM;
35cdf0e10cSrcweir LanguageType MsLangId::nConfiguredSystemUILanguage = LANGUAGE_SYSTEM;
36cdf0e10cSrcweir 
37cdf0e10cSrcweir LanguageType MsLangId::nConfiguredWesternFallback  = LANGUAGE_SYSTEM;
38cdf0e10cSrcweir LanguageType MsLangId::nConfiguredAsianFallback    = LANGUAGE_SYSTEM;
39cdf0e10cSrcweir LanguageType MsLangId::nConfiguredComplexFallback  = LANGUAGE_SYSTEM;
40cdf0e10cSrcweir 
41cdf0e10cSrcweir // static
setConfiguredSystemLanguage(LanguageType nLang)42cdf0e10cSrcweir void MsLangId::setConfiguredSystemLanguage( LanguageType nLang )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir     nConfiguredSystemLanguage = nLang;
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // static
setConfiguredSystemUILanguage(LanguageType nLang)49cdf0e10cSrcweir void MsLangId::setConfiguredSystemUILanguage( LanguageType nLang )
50cdf0e10cSrcweir {
51cdf0e10cSrcweir     nConfiguredSystemUILanguage = nLang;
52cdf0e10cSrcweir }
53cdf0e10cSrcweir 
54cdf0e10cSrcweir // static
setConfiguredWesternFallback(LanguageType nLang)55cdf0e10cSrcweir void MsLangId::setConfiguredWesternFallback( LanguageType nLang )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     nConfiguredWesternFallback = nLang;
58cdf0e10cSrcweir }
59cdf0e10cSrcweir 
60cdf0e10cSrcweir // static
setConfiguredAsianFallback(LanguageType nLang)61cdf0e10cSrcweir void MsLangId::setConfiguredAsianFallback( LanguageType nLang )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     nConfiguredAsianFallback = nLang;
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir // static
setConfiguredComplexFallback(LanguageType nLang)67cdf0e10cSrcweir void MsLangId::setConfiguredComplexFallback( LanguageType nLang )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir     nConfiguredComplexFallback = nLang;
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir // static
simplifySystemLanguages(LanguageType nLang)73cdf0e10cSrcweir inline LanguageType MsLangId::simplifySystemLanguages( LanguageType nLang )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     switch (nLang)
76cdf0e10cSrcweir     {
77cdf0e10cSrcweir         case LANGUAGE_PROCESS_OR_USER_DEFAULT :
78cdf0e10cSrcweir         case LANGUAGE_SYSTEM_DEFAULT :
79cdf0e10cSrcweir         case LANGUAGE_SYSTEM :
80cdf0e10cSrcweir             nLang = LANGUAGE_SYSTEM;
81cdf0e10cSrcweir             break;
82cdf0e10cSrcweir         default:
83cdf0e10cSrcweir             ;   // nothing
84cdf0e10cSrcweir     }
85cdf0e10cSrcweir     return nLang;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 
89cdf0e10cSrcweir // static
getRealLanguageWithoutConfig(LanguageType nLang)90cdf0e10cSrcweir LanguageType MsLangId::getRealLanguageWithoutConfig( LanguageType nLang )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     switch (simplifySystemLanguages( nLang))
93cdf0e10cSrcweir     {
94cdf0e10cSrcweir         case LANGUAGE_SYSTEM :
95cdf0e10cSrcweir             nLang = getSystemLanguage();
96cdf0e10cSrcweir             break;
97cdf0e10cSrcweir         case LANGUAGE_NONE :
98cdf0e10cSrcweir             nLang = getSystemUILanguage();
99cdf0e10cSrcweir             break;
100cdf0e10cSrcweir         default:
101cdf0e10cSrcweir             /* TODO: would this be useful here? */
102cdf0e10cSrcweir             //nLang = MsLangId::getReplacementForObsoleteLanguage( nLang);
103cdf0e10cSrcweir             ;   // nothing
104cdf0e10cSrcweir     }
105cdf0e10cSrcweir     if (nLang == LANGUAGE_DONTKNOW)
106cdf0e10cSrcweir         nLang = LANGUAGE_ENGLISH_US;
107cdf0e10cSrcweir     return nLang;
108cdf0e10cSrcweir }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 
111cdf0e10cSrcweir // static
getRealLanguage(LanguageType nLang)112cdf0e10cSrcweir LanguageType MsLangId::getRealLanguage( LanguageType nLang )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir     switch (simplifySystemLanguages( nLang))
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         case LANGUAGE_SYSTEM :
117cdf0e10cSrcweir             if (nConfiguredSystemLanguage == LANGUAGE_SYSTEM)
118cdf0e10cSrcweir                 nLang = getSystemLanguage();
119cdf0e10cSrcweir             else
120cdf0e10cSrcweir                 nLang = nConfiguredSystemLanguage;
121cdf0e10cSrcweir             break;
122cdf0e10cSrcweir         case LANGUAGE_NONE :
123cdf0e10cSrcweir             if (nConfiguredSystemUILanguage == LANGUAGE_SYSTEM)
124cdf0e10cSrcweir                 nLang = getSystemUILanguage();
125cdf0e10cSrcweir             else
126cdf0e10cSrcweir                 nLang = nConfiguredSystemUILanguage;
127cdf0e10cSrcweir             break;
128cdf0e10cSrcweir         default:
129cdf0e10cSrcweir             /* TODO: would this be useful here? */
130cdf0e10cSrcweir             //nLang = MsLangId::getReplacementForObsoleteLanguage( nLang);
131cdf0e10cSrcweir             ;   // nothing
132cdf0e10cSrcweir     }
133cdf0e10cSrcweir     if (nLang == LANGUAGE_DONTKNOW)
134cdf0e10cSrcweir         nLang = LANGUAGE_ENGLISH_US;
135cdf0e10cSrcweir     return nLang;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir // static
resolveSystemLanguageByScriptType(LanguageType nLang,sal_Int16 nType)140cdf0e10cSrcweir LanguageType MsLangId::resolveSystemLanguageByScriptType( LanguageType nLang, sal_Int16 nType )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir     if (nLang == LANGUAGE_NONE)
143cdf0e10cSrcweir         return nLang;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     nLang = getRealLanguage(nLang);
146cdf0e10cSrcweir     if (nType != ::com::sun::star::i18n::ScriptType::WEAK && getScriptType(nLang) != nType)
147cdf0e10cSrcweir     {
148cdf0e10cSrcweir         switch(nType)
149cdf0e10cSrcweir         {
150cdf0e10cSrcweir             case ::com::sun::star::i18n::ScriptType::ASIAN:
151cdf0e10cSrcweir                 if (nConfiguredAsianFallback == LANGUAGE_SYSTEM)
152cdf0e10cSrcweir                     nLang = LANGUAGE_CHINESE_SIMPLIFIED;
153cdf0e10cSrcweir                 else
154cdf0e10cSrcweir                     nLang = nConfiguredAsianFallback;
155cdf0e10cSrcweir                 break;
156cdf0e10cSrcweir             case ::com::sun::star::i18n::ScriptType::COMPLEX:
157cdf0e10cSrcweir                 if (nConfiguredComplexFallback == LANGUAGE_SYSTEM)
158cdf0e10cSrcweir                     nLang = LANGUAGE_HINDI;
159cdf0e10cSrcweir                 else
160cdf0e10cSrcweir                     nLang = nConfiguredComplexFallback;
161cdf0e10cSrcweir                 break;
162cdf0e10cSrcweir             default:
163cdf0e10cSrcweir                 if (nConfiguredWesternFallback == LANGUAGE_SYSTEM)
164cdf0e10cSrcweir                     nLang = LANGUAGE_ENGLISH_US;
165cdf0e10cSrcweir                 else
166cdf0e10cSrcweir                     nLang = nConfiguredWesternFallback;
167cdf0e10cSrcweir                 break;
168cdf0e10cSrcweir         }
169cdf0e10cSrcweir     }
170cdf0e10cSrcweir     return nLang;
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir // static
convertLanguageToLocale(LanguageType nLang,::com::sun::star::lang::Locale & rLocale)174cdf0e10cSrcweir void MsLangId::convertLanguageToLocale( LanguageType nLang,
175cdf0e10cSrcweir         ::com::sun::star::lang::Locale & rLocale )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir     if (rLocale.Variant.getLength())
178cdf0e10cSrcweir         rLocale.Variant = rtl::OUString();
179cdf0e10cSrcweir     convertLanguageToIsoNames( nLang, rLocale.Language, rLocale.Country);
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 
183cdf0e10cSrcweir // static
convertLanguageToLocale(LanguageType nLang,bool bResolveSystem)184cdf0e10cSrcweir ::com::sun::star::lang::Locale MsLangId::convertLanguageToLocale(
185cdf0e10cSrcweir         LanguageType nLang, bool bResolveSystem )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     ::com::sun::star::lang::Locale aLocale;
188cdf0e10cSrcweir     if (!bResolveSystem && simplifySystemLanguages( nLang) == LANGUAGE_SYSTEM)
189cdf0e10cSrcweir         ;   // nothing => empty locale
190cdf0e10cSrcweir     else
191cdf0e10cSrcweir     {
192cdf0e10cSrcweir         // Still resolve LANGUAGE_DONTKNOW if resolving is not requested,
193cdf0e10cSrcweir         // but not LANGUAGE_NONE or others.
194cdf0e10cSrcweir         if (bResolveSystem || nLang == LANGUAGE_DONTKNOW)
195cdf0e10cSrcweir             nLang = MsLangId::getRealLanguage( nLang);
196cdf0e10cSrcweir         convertLanguageToLocale( nLang, aLocale);
197cdf0e10cSrcweir     }
198cdf0e10cSrcweir     return aLocale;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 
202cdf0e10cSrcweir // static
convertLocaleToLanguage(const::com::sun::star::lang::Locale & rLocale)203cdf0e10cSrcweir LanguageType MsLangId::convertLocaleToLanguage(
204cdf0e10cSrcweir         const ::com::sun::star::lang::Locale& rLocale )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir     // empty language => LANGUAGE_SYSTEM
207cdf0e10cSrcweir     if (rLocale.Language.getLength() == 0)
208cdf0e10cSrcweir         return LANGUAGE_SYSTEM;
209cdf0e10cSrcweir 
210cdf0e10cSrcweir     LanguageType nRet = convertIsoNamesToLanguage( rLocale.Language,
211cdf0e10cSrcweir             rLocale.Country);
212cdf0e10cSrcweir     if (nRet == LANGUAGE_DONTKNOW)
213cdf0e10cSrcweir         nRet = LANGUAGE_SYSTEM;
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     return nRet;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 
219cdf0e10cSrcweir // static
convertLocaleToLanguageWithFallback(const::com::sun::star::lang::Locale & rLocale)220cdf0e10cSrcweir LanguageType MsLangId::convertLocaleToLanguageWithFallback(
221cdf0e10cSrcweir             const ::com::sun::star::lang::Locale & rLocale )
222cdf0e10cSrcweir {
223cdf0e10cSrcweir     // empty language => LANGUAGE_SYSTEM
224cdf0e10cSrcweir     if (rLocale.Language.getLength() == 0)
225cdf0e10cSrcweir         return lookupFallbackLanguage( LANGUAGE_SYSTEM);
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     return lookupFallbackLanguage( rLocale);
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 
231cdf0e10cSrcweir // static
convertLanguageToLocaleWithFallback(LanguageType nLang)232cdf0e10cSrcweir ::com::sun::star::lang::Locale MsLangId::convertLanguageToLocaleWithFallback(
233cdf0e10cSrcweir         LanguageType nLang )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir     return lookupFallbackLocale( MsLangId::getRealLanguage( nLang));
236cdf0e10cSrcweir }
237cdf0e10cSrcweir 
238cdf0e10cSrcweir 
239cdf0e10cSrcweir // static
getFallbackLocale(const::com::sun::star::lang::Locale & rLocale)240cdf0e10cSrcweir ::com::sun::star::lang::Locale MsLangId::getFallbackLocale(
241cdf0e10cSrcweir             const ::com::sun::star::lang::Locale & rLocale )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir     // empty language => LANGUAGE_SYSTEM
244cdf0e10cSrcweir     if (rLocale.Language.getLength() == 0)
245cdf0e10cSrcweir         return convertLanguageToLocaleWithFallback( LANGUAGE_SYSTEM);
246cdf0e10cSrcweir 
247cdf0e10cSrcweir     return lookupFallbackLocale( rLocale);
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 
251cdf0e10cSrcweir // static
getFallbackLanguage(LanguageType nLang)252cdf0e10cSrcweir LanguageType MsLangId::getFallbackLanguage( LanguageType nLang )
253cdf0e10cSrcweir {
254cdf0e10cSrcweir     return lookupFallbackLanguage( MsLangId::getRealLanguage( nLang));
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 
258cdf0e10cSrcweir // static
isRightToLeft(LanguageType nLang)259cdf0e10cSrcweir bool MsLangId::isRightToLeft( LanguageType nLang )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     switch( nLang & LANGUAGE_MASK_PRIMARY )
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY :
264cdf0e10cSrcweir         case LANGUAGE_HEBREW              & LANGUAGE_MASK_PRIMARY :
265cdf0e10cSrcweir         case LANGUAGE_YIDDISH             & LANGUAGE_MASK_PRIMARY :
266cdf0e10cSrcweir         case LANGUAGE_URDU                & LANGUAGE_MASK_PRIMARY :
267cdf0e10cSrcweir         case LANGUAGE_FARSI               & LANGUAGE_MASK_PRIMARY :
268cdf0e10cSrcweir         case LANGUAGE_KASHMIRI            & LANGUAGE_MASK_PRIMARY :
269cdf0e10cSrcweir         case LANGUAGE_SINDHI              & LANGUAGE_MASK_PRIMARY :
270cdf0e10cSrcweir         case LANGUAGE_UIGHUR_CHINA        & LANGUAGE_MASK_PRIMARY :
271cdf0e10cSrcweir             return true;
272cdf0e10cSrcweir 
273cdf0e10cSrcweir         default:
274cdf0e10cSrcweir             break;
275cdf0e10cSrcweir     }
276cdf0e10cSrcweir     return false;
277cdf0e10cSrcweir }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir 
280cdf0e10cSrcweir // static
hasForbiddenCharacters(LanguageType nLang)281cdf0e10cSrcweir bool MsLangId::hasForbiddenCharacters( LanguageType nLang )
282cdf0e10cSrcweir {
283cdf0e10cSrcweir     switch (nLang & LANGUAGE_MASK_PRIMARY)
284cdf0e10cSrcweir     {
285cdf0e10cSrcweir         case LANGUAGE_CHINESE  & LANGUAGE_MASK_PRIMARY:
286cdf0e10cSrcweir         case LANGUAGE_JAPANESE & LANGUAGE_MASK_PRIMARY:
287cdf0e10cSrcweir         case LANGUAGE_KOREAN   & LANGUAGE_MASK_PRIMARY:
288cdf0e10cSrcweir             return true;
289cdf0e10cSrcweir         default:
290cdf0e10cSrcweir             break;
291cdf0e10cSrcweir     }
292cdf0e10cSrcweir     return false;
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 
296cdf0e10cSrcweir // static
needsSequenceChecking(LanguageType nLang)297cdf0e10cSrcweir bool MsLangId::needsSequenceChecking( LanguageType nLang )
298cdf0e10cSrcweir {
299cdf0e10cSrcweir     switch (nLang & LANGUAGE_MASK_PRIMARY)
300cdf0e10cSrcweir     {
301cdf0e10cSrcweir         case LANGUAGE_BURMESE & LANGUAGE_MASK_PRIMARY:
302cdf0e10cSrcweir         case LANGUAGE_KHMER   & LANGUAGE_MASK_PRIMARY:
303cdf0e10cSrcweir         case LANGUAGE_LAO     & LANGUAGE_MASK_PRIMARY:
304cdf0e10cSrcweir         case LANGUAGE_THAI    & LANGUAGE_MASK_PRIMARY:
305cdf0e10cSrcweir             return true;
306cdf0e10cSrcweir         default:
307cdf0e10cSrcweir             break;
308cdf0e10cSrcweir     }
309cdf0e10cSrcweir     return false;
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 
313cdf0e10cSrcweir // static
getScriptType(LanguageType nLang)314cdf0e10cSrcweir sal_Int16 MsLangId::getScriptType( LanguageType nLang )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir     sal_Int16 nScript;
317cdf0e10cSrcweir     switch( nLang )
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         // CJK
320cdf0e10cSrcweir         // all LANGUAGE_CHINESE_... are caught below
321cdf0e10cSrcweir         case LANGUAGE_JAPANESE:
322cdf0e10cSrcweir         case LANGUAGE_KOREAN:
323cdf0e10cSrcweir         case LANGUAGE_KOREAN_JOHAB:
324cdf0e10cSrcweir         case LANGUAGE_USER_KOREAN_NORTH:
325cdf0e10cSrcweir             nScript = ::com::sun::star::i18n::ScriptType::ASIAN;
326cdf0e10cSrcweir             break;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir         // CTL
329cdf0e10cSrcweir         // all LANGUAGE_ARABIC_... are caught below
330cdf0e10cSrcweir         case LANGUAGE_AMHARIC_ETHIOPIA:
331cdf0e10cSrcweir         case LANGUAGE_ASSAMESE:
332cdf0e10cSrcweir         case LANGUAGE_BENGALI:
333cdf0e10cSrcweir         case LANGUAGE_BENGALI_BANGLADESH:
334cdf0e10cSrcweir         case LANGUAGE_BURMESE:
335cdf0e10cSrcweir         case LANGUAGE_FARSI:
336cdf0e10cSrcweir         case LANGUAGE_HEBREW:
337cdf0e10cSrcweir         case LANGUAGE_YIDDISH:
338cdf0e10cSrcweir         case LANGUAGE_USER_YIDDISH_US:
339cdf0e10cSrcweir         case LANGUAGE_MARATHI:
340cdf0e10cSrcweir         case LANGUAGE_PUNJABI:
341cdf0e10cSrcweir         case LANGUAGE_GUJARATI:
342cdf0e10cSrcweir         case LANGUAGE_HINDI:
343cdf0e10cSrcweir         case LANGUAGE_KANNADA:
344cdf0e10cSrcweir         case LANGUAGE_KASHMIRI:
345cdf0e10cSrcweir         case LANGUAGE_KASHMIRI_INDIA:
346cdf0e10cSrcweir         case LANGUAGE_KHMER:
347cdf0e10cSrcweir         case LANGUAGE_LAO:
348cdf0e10cSrcweir         case LANGUAGE_MALAYALAM:
349cdf0e10cSrcweir         case LANGUAGE_MANIPURI:
350cdf0e10cSrcweir         case LANGUAGE_MONGOLIAN_MONGOLIAN:
351cdf0e10cSrcweir         case LANGUAGE_NEPALI:
352cdf0e10cSrcweir         case LANGUAGE_NEPALI_INDIA:
353cdf0e10cSrcweir         case LANGUAGE_ORIYA:
354cdf0e10cSrcweir         case LANGUAGE_SANSKRIT:
355cdf0e10cSrcweir         case LANGUAGE_SINDHI:
356cdf0e10cSrcweir         case LANGUAGE_SINDHI_PAKISTAN:
357cdf0e10cSrcweir         case LANGUAGE_SINHALESE_SRI_LANKA:
358cdf0e10cSrcweir         case LANGUAGE_SYRIAC:
359cdf0e10cSrcweir         case LANGUAGE_TAMIL:
360cdf0e10cSrcweir         case LANGUAGE_TELUGU:
361cdf0e10cSrcweir         case LANGUAGE_THAI:
362cdf0e10cSrcweir         case LANGUAGE_TIBETAN:
363cdf0e10cSrcweir         case LANGUAGE_DZONGKHA:
364cdf0e10cSrcweir         case LANGUAGE_URDU:
365cdf0e10cSrcweir         case LANGUAGE_URDU_PAKISTAN:
366cdf0e10cSrcweir         case LANGUAGE_URDU_INDIA:
367cdf0e10cSrcweir         case LANGUAGE_USER_KURDISH_IRAQ:
368cdf0e10cSrcweir         case LANGUAGE_USER_KURDISH_IRAN:
369cdf0e10cSrcweir         case LANGUAGE_DHIVEHI:
370cdf0e10cSrcweir         case LANGUAGE_USER_BODO_INDIA:
371cdf0e10cSrcweir         case LANGUAGE_USER_DOGRI_INDIA:
372cdf0e10cSrcweir         case LANGUAGE_USER_MAITHILI_INDIA:
373cdf0e10cSrcweir         case LANGUAGE_UIGHUR_CHINA:
374cdf0e10cSrcweir         case LANGUAGE_USER_LIMBU:
375cdf0e10cSrcweir             nScript = ::com::sun::star::i18n::ScriptType::COMPLEX;
376cdf0e10cSrcweir             break;
377cdf0e10cSrcweir 
378cdf0e10cSrcweir // currently not knowing scripttype - defaulted to LATIN:
379cdf0e10cSrcweir /*
380cdf0e10cSrcweir #define LANGUAGE_ARMENIAN                   0x042B
381cdf0e10cSrcweir #define LANGUAGE_INDONESIAN                 0x0421
382cdf0e10cSrcweir #define LANGUAGE_KAZAK                      0x043F
383cdf0e10cSrcweir #define LANGUAGE_KONKANI                    0x0457
384cdf0e10cSrcweir #define LANGUAGE_MACEDONIAN                 0x042F
385cdf0e10cSrcweir #define LANGUAGE_TATAR                      0x0444
386cdf0e10cSrcweir */
387cdf0e10cSrcweir 
388cdf0e10cSrcweir     default:
389cdf0e10cSrcweir         switch ( nLang & LANGUAGE_MASK_PRIMARY )
390cdf0e10cSrcweir         {
391cdf0e10cSrcweir             // CJK catcher
392cdf0e10cSrcweir             case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
393cdf0e10cSrcweir                 nScript = ::com::sun::star::i18n::ScriptType::ASIAN;
394cdf0e10cSrcweir                 break;
395cdf0e10cSrcweir             // CTL catcher
396cdf0e10cSrcweir             case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY:
397cdf0e10cSrcweir                 nScript = ::com::sun::star::i18n::ScriptType::COMPLEX;
398cdf0e10cSrcweir                 break;
399cdf0e10cSrcweir             // Western (actually not necessarily Latin but also Cyrillic, for example)
400cdf0e10cSrcweir             default:
401cdf0e10cSrcweir                 nScript = ::com::sun::star::i18n::ScriptType::LATIN;
402cdf0e10cSrcweir         }
403cdf0e10cSrcweir         break;
404cdf0e10cSrcweir     }
405cdf0e10cSrcweir     return nScript;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 
409cdf0e10cSrcweir // static
getReplacementForObsoleteLanguage(LanguageType nLang)410cdf0e10cSrcweir LanguageType MsLangId::getReplacementForObsoleteLanguage( LanguageType nLang )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir     switch (nLang)
413cdf0e10cSrcweir     {
414cdf0e10cSrcweir         default:
415cdf0e10cSrcweir             break;  // nothing
416cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_LATIN:
417cdf0e10cSrcweir             nLang = LANGUAGE_LATIN;
418cdf0e10cSrcweir             break;
419cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_MAORI:
420cdf0e10cSrcweir             nLang = LANGUAGE_MAORI_NEW_ZEALAND;
421cdf0e10cSrcweir             break;
422cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_KINYARWANDA:
423cdf0e10cSrcweir             nLang = LANGUAGE_KINYARWANDA_RWANDA;
424cdf0e10cSrcweir             break;
425cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_UPPER_SORBIAN:
426cdf0e10cSrcweir             nLang = LANGUAGE_UPPER_SORBIAN_GERMANY;
427cdf0e10cSrcweir             break;
428cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_LOWER_SORBIAN:
429cdf0e10cSrcweir             nLang = LANGUAGE_LOWER_SORBIAN_GERMANY;
430cdf0e10cSrcweir             break;
431cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_OCCITAN:
432cdf0e10cSrcweir             nLang = LANGUAGE_OCCITAN_FRANCE;
433cdf0e10cSrcweir             break;
434cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_BRETON:
435cdf0e10cSrcweir             nLang = LANGUAGE_BRETON_FRANCE;
436cdf0e10cSrcweir             break;
437cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_KALAALLISUT:
438cdf0e10cSrcweir             nLang = LANGUAGE_KALAALLISUT_GREENLAND;
439cdf0e10cSrcweir             break;
440cdf0e10cSrcweir         case LANGUAGE_OBSOLETE_USER_LUXEMBOURGISH:
441cdf0e10cSrcweir             nLang = LANGUAGE_LUXEMBOURGISH_LUXEMBOURG;
442cdf0e10cSrcweir             break;
443cdf0e10cSrcweir 
444cdf0e10cSrcweir         // The following are not strictly obsolete but should be mapped to a
445cdf0e10cSrcweir         // replacement locale when encountered.
446cdf0e10cSrcweir 
447cdf0e10cSrcweir         // no_NO is an alias for nb_NO
448cdf0e10cSrcweir         case LANGUAGE_NORWEGIAN:
449cdf0e10cSrcweir             nLang = LANGUAGE_NORWEGIAN_BOKMAL;
450cdf0e10cSrcweir             break;
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         // #i94435# A Spanish variant that differs only in collation details we
453cdf0e10cSrcweir         // do not support.
454cdf0e10cSrcweir         case LANGUAGE_SPANISH_DATED:
455cdf0e10cSrcweir             nLang = LANGUAGE_SPANISH_MODERN;
456cdf0e10cSrcweir             break;
457cdf0e10cSrcweir 
458*df5bc930SJuergen Schmidt          // Do not use ca-XV, ca-XR for document content.
459cdf0e10cSrcweir          /* TODO: remove in case we implement BCP47 language tags. */
460cdf0e10cSrcweir         case LANGUAGE_USER_CATALAN_VALENCIAN:
461*df5bc930SJuergen Schmidt         case LANGUAGE_USER_CATALAN_VALENCIAN_RACV:
462cdf0e10cSrcweir             nLang = LANGUAGE_CATALAN;
463cdf0e10cSrcweir             break;
464cdf0e10cSrcweir     }
465cdf0e10cSrcweir     return nLang;
466cdf0e10cSrcweir }
467