blob: e42c66b7b90744a720eac67ae962ff7baed85010 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_i18npool.hxx"
#include <sal/config.h>
#include <rtl/ustring.hxx>
#include <rtl/string.hxx>
#include <com/sun/star/i18n/ScriptType.hpp>
#include "i18npool/mslangid.hxx"
LanguageType MsLangId::nConfiguredSystemLanguage = LANGUAGE_SYSTEM;
LanguageType MsLangId::nConfiguredSystemUILanguage = LANGUAGE_SYSTEM;
LanguageType MsLangId::nConfiguredWesternFallback = LANGUAGE_SYSTEM;
LanguageType MsLangId::nConfiguredAsianFallback = LANGUAGE_SYSTEM;
LanguageType MsLangId::nConfiguredComplexFallback = LANGUAGE_SYSTEM;
// static
void MsLangId::setConfiguredSystemLanguage( LanguageType nLang )
{
nConfiguredSystemLanguage = nLang;
}
// static
void MsLangId::setConfiguredSystemUILanguage( LanguageType nLang )
{
nConfiguredSystemUILanguage = nLang;
}
// static
void MsLangId::setConfiguredWesternFallback( LanguageType nLang )
{
nConfiguredWesternFallback = nLang;
}
// static
void MsLangId::setConfiguredAsianFallback( LanguageType nLang )
{
nConfiguredAsianFallback = nLang;
}
// static
void MsLangId::setConfiguredComplexFallback( LanguageType nLang )
{
nConfiguredComplexFallback = nLang;
}
// static
inline LanguageType MsLangId::simplifySystemLanguages( LanguageType nLang )
{
switch (nLang)
{
case LANGUAGE_PROCESS_OR_USER_DEFAULT :
case LANGUAGE_SYSTEM_DEFAULT :
case LANGUAGE_SYSTEM :
nLang = LANGUAGE_SYSTEM;
break;
default:
; // nothing
}
return nLang;
}
// static
LanguageType MsLangId::getRealLanguageWithoutConfig( LanguageType nLang )
{
switch (simplifySystemLanguages( nLang))
{
case LANGUAGE_SYSTEM :
nLang = getSystemLanguage();
break;
case LANGUAGE_NONE :
nLang = getSystemUILanguage();
break;
default:
/* TODO: would this be useful here? */
//nLang = MsLangId::getReplacementForObsoleteLanguage( nLang);
; // nothing
}
if (nLang == LANGUAGE_DONTKNOW)
nLang = LANGUAGE_ENGLISH_US;
return nLang;
}
// static
LanguageType MsLangId::getRealLanguage( LanguageType nLang )
{
switch (simplifySystemLanguages( nLang))
{
case LANGUAGE_SYSTEM :
if (nConfiguredSystemLanguage == LANGUAGE_SYSTEM)
nLang = getSystemLanguage();
else
nLang = nConfiguredSystemLanguage;
break;
case LANGUAGE_NONE :
if (nConfiguredSystemUILanguage == LANGUAGE_SYSTEM)
nLang = getSystemUILanguage();
else
nLang = nConfiguredSystemUILanguage;
break;
default:
/* TODO: would this be useful here? */
//nLang = MsLangId::getReplacementForObsoleteLanguage( nLang);
; // nothing
}
if (nLang == LANGUAGE_DONTKNOW)
nLang = LANGUAGE_ENGLISH_US;
return nLang;
}
// static
LanguageType MsLangId::resolveSystemLanguageByScriptType( LanguageType nLang, sal_Int16 nType )
{
if (nLang == LANGUAGE_NONE)
return nLang;
nLang = getRealLanguage(nLang);
if (nType != ::com::sun::star::i18n::ScriptType::WEAK && getScriptType(nLang) != nType)
{
switch(nType)
{
case ::com::sun::star::i18n::ScriptType::ASIAN:
if (nConfiguredAsianFallback == LANGUAGE_SYSTEM)
nLang = LANGUAGE_CHINESE_SIMPLIFIED;
else
nLang = nConfiguredAsianFallback;
break;
case ::com::sun::star::i18n::ScriptType::COMPLEX:
if (nConfiguredComplexFallback == LANGUAGE_SYSTEM)
nLang = LANGUAGE_HINDI;
else
nLang = nConfiguredComplexFallback;
break;
default:
if (nConfiguredWesternFallback == LANGUAGE_SYSTEM)
nLang = LANGUAGE_ENGLISH_US;
else
nLang = nConfiguredWesternFallback;
break;
}
}
return nLang;
}
// static
void MsLangId::convertLanguageToLocale( LanguageType nLang,
::com::sun::star::lang::Locale & rLocale )
{
if (rLocale.Variant.getLength())
rLocale.Variant = rtl::OUString();
convertLanguageToIsoNames( nLang, rLocale.Language, rLocale.Country);
}
// static
::com::sun::star::lang::Locale MsLangId::convertLanguageToLocale(
LanguageType nLang, bool bResolveSystem )
{
::com::sun::star::lang::Locale aLocale;
if (!bResolveSystem && simplifySystemLanguages( nLang) == LANGUAGE_SYSTEM)
; // nothing => empty locale
else
{
// Still resolve LANGUAGE_DONTKNOW if resolving is not requested,
// but not LANGUAGE_NONE or others.
if (bResolveSystem || nLang == LANGUAGE_DONTKNOW)
nLang = MsLangId::getRealLanguage( nLang);
convertLanguageToLocale( nLang, aLocale);
}
return aLocale;
}
// static
LanguageType MsLangId::convertLocaleToLanguage(
const ::com::sun::star::lang::Locale& rLocale )
{
// empty language => LANGUAGE_SYSTEM
if (rLocale.Language.getLength() == 0)
return LANGUAGE_SYSTEM;
LanguageType nRet = convertIsoNamesToLanguage( rLocale.Language,
rLocale.Country);
if (nRet == LANGUAGE_DONTKNOW)
nRet = LANGUAGE_SYSTEM;
return nRet;
}
// static
LanguageType MsLangId::convertLocaleToLanguageWithFallback(
const ::com::sun::star::lang::Locale & rLocale )
{
// empty language => LANGUAGE_SYSTEM
if (rLocale.Language.getLength() == 0)
return lookupFallbackLanguage( LANGUAGE_SYSTEM);
return lookupFallbackLanguage( rLocale);
}
// static
::com::sun::star::lang::Locale MsLangId::convertLanguageToLocaleWithFallback(
LanguageType nLang )
{
return lookupFallbackLocale( MsLangId::getRealLanguage( nLang));
}
// static
::com::sun::star::lang::Locale MsLangId::getFallbackLocale(
const ::com::sun::star::lang::Locale & rLocale )
{
// empty language => LANGUAGE_SYSTEM
if (rLocale.Language.getLength() == 0)
return convertLanguageToLocaleWithFallback( LANGUAGE_SYSTEM);
return lookupFallbackLocale( rLocale);
}
// static
LanguageType MsLangId::getFallbackLanguage( LanguageType nLang )
{
return lookupFallbackLanguage( MsLangId::getRealLanguage( nLang));
}
// static
bool MsLangId::isRightToLeft( LanguageType nLang )
{
switch( nLang & LANGUAGE_MASK_PRIMARY )
{
case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_HEBREW & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_YIDDISH & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_URDU & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_FARSI & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_KASHMIRI & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_SINDHI & LANGUAGE_MASK_PRIMARY :
case LANGUAGE_UIGHUR_CHINA & LANGUAGE_MASK_PRIMARY :
return true;
default:
break;
}
return false;
}
// static
bool MsLangId::hasForbiddenCharacters( LanguageType nLang )
{
switch (nLang & LANGUAGE_MASK_PRIMARY)
{
case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
case LANGUAGE_JAPANESE & LANGUAGE_MASK_PRIMARY:
case LANGUAGE_KOREAN & LANGUAGE_MASK_PRIMARY:
return true;
default:
break;
}
return false;
}
// static
bool MsLangId::needsSequenceChecking( LanguageType nLang )
{
switch (nLang & LANGUAGE_MASK_PRIMARY)
{
case LANGUAGE_BURMESE & LANGUAGE_MASK_PRIMARY:
case LANGUAGE_KHMER & LANGUAGE_MASK_PRIMARY:
case LANGUAGE_LAO & LANGUAGE_MASK_PRIMARY:
case LANGUAGE_THAI & LANGUAGE_MASK_PRIMARY:
return true;
default:
break;
}
return false;
}
// static
sal_Int16 MsLangId::getScriptType( LanguageType nLang )
{
sal_Int16 nScript;
switch( nLang )
{
// CJK
// all LANGUAGE_CHINESE_... are caught below
case LANGUAGE_JAPANESE:
case LANGUAGE_KOREAN:
case LANGUAGE_KOREAN_JOHAB:
case LANGUAGE_USER_KOREAN_NORTH:
nScript = ::com::sun::star::i18n::ScriptType::ASIAN;
break;
// CTL
// all LANGUAGE_ARABIC_... are caught below
case LANGUAGE_AMHARIC_ETHIOPIA:
case LANGUAGE_ASSAMESE:
case LANGUAGE_BENGALI:
case LANGUAGE_BENGALI_BANGLADESH:
case LANGUAGE_BURMESE:
case LANGUAGE_FARSI:
case LANGUAGE_HEBREW:
case LANGUAGE_YIDDISH:
case LANGUAGE_USER_YIDDISH_US:
case LANGUAGE_MARATHI:
case LANGUAGE_PUNJABI:
case LANGUAGE_GUJARATI:
case LANGUAGE_HINDI:
case LANGUAGE_KANNADA:
case LANGUAGE_KASHMIRI:
case LANGUAGE_KASHMIRI_INDIA:
case LANGUAGE_KHMER:
case LANGUAGE_LAO:
case LANGUAGE_MALAYALAM:
case LANGUAGE_MANIPURI:
case LANGUAGE_MONGOLIAN_MONGOLIAN:
case LANGUAGE_NEPALI:
case LANGUAGE_NEPALI_INDIA:
case LANGUAGE_ORIYA:
case LANGUAGE_SANSKRIT:
case LANGUAGE_SINDHI:
case LANGUAGE_SINDHI_PAKISTAN:
case LANGUAGE_SINHALESE_SRI_LANKA:
case LANGUAGE_SYRIAC:
case LANGUAGE_TAMIL:
case LANGUAGE_TELUGU:
case LANGUAGE_THAI:
case LANGUAGE_TIBETAN:
case LANGUAGE_DZONGKHA:
case LANGUAGE_URDU:
case LANGUAGE_URDU_PAKISTAN:
case LANGUAGE_URDU_INDIA:
case LANGUAGE_USER_KURDISH_IRAQ:
case LANGUAGE_USER_KURDISH_IRAN:
case LANGUAGE_DHIVEHI:
case LANGUAGE_USER_BODO_INDIA:
case LANGUAGE_USER_DOGRI_INDIA:
case LANGUAGE_USER_MAITHILI_INDIA:
case LANGUAGE_UIGHUR_CHINA:
case LANGUAGE_USER_LIMBU:
nScript = ::com::sun::star::i18n::ScriptType::COMPLEX;
break;
// currently not knowing scripttype - defaulted to LATIN:
/*
#define LANGUAGE_ARMENIAN 0x042B
#define LANGUAGE_INDONESIAN 0x0421
#define LANGUAGE_KAZAK 0x043F
#define LANGUAGE_KONKANI 0x0457
#define LANGUAGE_MACEDONIAN 0x042F
#define LANGUAGE_TATAR 0x0444
*/
default:
switch ( nLang & LANGUAGE_MASK_PRIMARY )
{
// CJK catcher
case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
nScript = ::com::sun::star::i18n::ScriptType::ASIAN;
break;
// CTL catcher
case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY:
nScript = ::com::sun::star::i18n::ScriptType::COMPLEX;
break;
// Western (actually not necessarily Latin but also Cyrillic, for example)
default:
nScript = ::com::sun::star::i18n::ScriptType::LATIN;
}
break;
}
return nScript;
}
// static
LanguageType MsLangId::getReplacementForObsoleteLanguage( LanguageType nLang )
{
switch (nLang)
{
default:
break; // nothing
case LANGUAGE_OBSOLETE_USER_LATIN:
nLang = LANGUAGE_LATIN;
break;
case LANGUAGE_OBSOLETE_USER_MAORI:
nLang = LANGUAGE_MAORI_NEW_ZEALAND;
break;
case LANGUAGE_OBSOLETE_USER_KINYARWANDA:
nLang = LANGUAGE_KINYARWANDA_RWANDA;
break;
case LANGUAGE_OBSOLETE_USER_UPPER_SORBIAN:
nLang = LANGUAGE_UPPER_SORBIAN_GERMANY;
break;
case LANGUAGE_OBSOLETE_USER_LOWER_SORBIAN:
nLang = LANGUAGE_LOWER_SORBIAN_GERMANY;
break;
case LANGUAGE_OBSOLETE_USER_OCCITAN:
nLang = LANGUAGE_OCCITAN_FRANCE;
break;
case LANGUAGE_OBSOLETE_USER_BRETON:
nLang = LANGUAGE_BRETON_FRANCE;
break;
case LANGUAGE_OBSOLETE_USER_KALAALLISUT:
nLang = LANGUAGE_KALAALLISUT_GREENLAND;
break;
case LANGUAGE_OBSOLETE_USER_LUXEMBOURGISH:
nLang = LANGUAGE_LUXEMBOURGISH_LUXEMBOURG;
break;
// The following are not strictly obsolete but should be mapped to a
// replacement locale when encountered.
// no_NO is an alias for nb_NO
case LANGUAGE_NORWEGIAN:
nLang = LANGUAGE_NORWEGIAN_BOKMAL;
break;
// #i94435# A Spanish variant that differs only in collation details we
// do not support.
case LANGUAGE_SPANISH_DATED:
nLang = LANGUAGE_SPANISH_MODERN;
break;
// Do not use ca-XV, ca-XR for document content.
/* TODO: remove in case we implement BCP47 language tags. */
case LANGUAGE_USER_CATALAN_VALENCIAN:
case LANGUAGE_USER_CATALAN_VALENCIAN_RACV:
nLang = LANGUAGE_CATALAN;
break;
}
return nLang;
}