intl.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,270 行 · 第 1/5 页
CPP
2,270 行
{
// no language specified, threat it as English
return wxLANGUAGE_ENGLISH;
}
if ( langFull == _T("C") || langFull == _T("POSIX") )
{
// default C locale
return wxLANGUAGE_ENGLISH;
}
// the language string has the following form
//
// lang[_LANG][.encoding][@modifier]
//
// (see environ(5) in the Open Unix specification)
//
// where lang is the primary language, LANG is a sublang/territory,
// encoding is the charset to use and modifier "allows the user to select
// a specific instance of localization data within a single category"
//
// for example, the following strings are valid:
// fr
// fr_FR
// de_DE.iso88591
// de_DE@euro
// de_DE.iso88591@euro
// for now we don't use the encoding, although we probably should (doing
// translations of the msg catalogs on the fly as required) (TODO)
//
// we don't use the modifiers neither but we probably should translate
// "euro" into iso885915
size_t posEndLang = langFull.find_first_of(_T("@."));
if ( posEndLang != wxString::npos )
{
langFull.Truncate(posEndLang);
}
// in addition to the format above, we also can have full language names
// in LANG env var - for example, SuSE is known to use LANG="german" - so
// check for this
// do we have just the language (or sublang too)?
bool justLang = langFull.Len() == LEN_LANG;
if ( justLang ||
(langFull.Len() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) )
{
// 0. Make sure the lang is according to latest ISO 639
// (this is necessary because glibc uses iw and in instead
// of he and id respectively).
// the language itself (second part is the dialect/sublang)
wxString langOrig = ExtractLang(langFull);
wxString lang;
if ( langOrig == wxT("iw"))
lang = _T("he");
else if (langOrig == wxT("in"))
lang = wxT("id");
else if (langOrig == wxT("ji"))
lang = wxT("yi");
else if (langOrig == wxT("no_NO"))
lang = wxT("nb_NO");
else if (langOrig == wxT("no_NY"))
lang = wxT("nn_NO");
else if (langOrig == wxT("no"))
lang = wxT("nb_NO");
else
lang = langOrig;
// did we change it?
if ( lang != langOrig )
{
langFull = lang + ExtractNotLang(langFull);
}
// 1. Try to find the language either as is:
for ( i = 0; i < count; i++ )
{
if ( ms_languagesDB->Item(i).CanonicalName == langFull )
{
break;
}
}
// 2. If langFull is of the form xx_YY, try to find xx:
if ( i == count && !justLang )
{
for ( i = 0; i < count; i++ )
{
if ( ms_languagesDB->Item(i).CanonicalName == lang )
{
break;
}
}
}
// 3. If langFull is of the form xx, try to find any xx_YY record:
if ( i == count && justLang )
{
for ( i = 0; i < count; i++ )
{
if ( ExtractLang(ms_languagesDB->Item(i).CanonicalName)
== langFull )
{
break;
}
}
}
}
else // not standard format
{
// try to find the name in verbose description
for ( i = 0; i < count; i++ )
{
if (ms_languagesDB->Item(i).Description.CmpNoCase(langFull) == 0)
{
break;
}
}
}
#elif defined(__WXMAC__)
const wxChar * lc = NULL ;
long lang = GetScriptVariable( smSystemScript, smScriptLang) ;
switch( GetScriptManagerVariable( smRegionCode ) ) {
case verUS :
lc = wxT("en_US") ;
break ;
case verFrance :
lc = wxT("fr_FR") ;
break ;
case verBritain :
lc = wxT("en_GB") ;
break ;
case verGermany :
lc = wxT("de_DE") ;
break ;
case verItaly :
lc = wxT("it_IT") ;
break ;
case verNetherlands :
lc = wxT("nl_NL") ;
break ;
case verFlemish :
lc = wxT("nl_BE") ;
break ;
case verSweden :
lc = wxT("sv_SE" );
break ;
case verSpain :
lc = wxT("es_ES" );
break ;
case verDenmark :
lc = wxT("da_DK") ;
break ;
case verPortugal :
lc = wxT("pt_PT") ;
break ;
case verFrCanada:
lc = wxT("fr_CA") ;
break ;
case verNorway:
lc = wxT("nb_NO") ;
break ;
case verIsrael:
lc = wxT("iw_IL") ;
break ;
case verJapan:
lc = wxT("ja_JP") ;
break ;
case verAustralia:
lc = wxT("en_AU") ;
break ;
case verArabic:
lc = wxT("ar") ;
break ;
case verFinland:
lc = wxT("fi_FI") ;
break ;
case verFrSwiss:
lc = wxT("fr_CH") ;
break ;
case verGrSwiss:
lc = wxT("de_CH") ;
break ;
case verGreece:
lc = wxT("el_GR") ;
break ;
case verIceland:
lc = wxT("is_IS") ;
break ;
case verMalta:
lc = wxT("mt_MT") ;
break ;
case verCyprus:
// _CY is not part of wx, so we have to translate according to the system language
if ( lang == langGreek ) {
lc = wxT("el_GR") ;
}
else if ( lang == langTurkish ) {
lc = wxT("tr_TR") ;
}
break ;
case verTurkey:
lc = wxT("tr_TR") ;
break ;
case verYugoCroatian:
lc = wxT("hr_HR") ;
break ;
case verIndiaHindi:
lc = wxT("hi_IN") ;
break ;
case verPakistanUrdu:
lc = wxT("ur_PK") ;
break ;
case verTurkishModified:
lc = wxT("tr_TR") ;
break ;
case verItalianSwiss:
lc = wxT("it_CH") ;
break ;
case verInternational:
lc = wxT("en") ;
break ;
case verRomania:
lc = wxT("ro_RO") ;
break ;
case verGreecePoly:
lc = wxT("el_GR") ;
break ;
case verLithuania:
lc = wxT("lt_LT") ;
break ;
case verPoland:
lc = wxT("pl_PL") ;
break ;
case verMagyar :
case verHungary:
lc = wxT("hu_HU") ;
break ;
case verEstonia:
lc = wxT("et_EE") ;
break ;
case verLatvia:
lc = wxT("lv_LV") ;
break ;
case verSami:
// not known
break ;
case verFaroeIsl:
lc = wxT("fo_FO") ;
break ;
case verIran:
lc = wxT("fa_IR") ;
break ;
case verRussia:
lc = wxT("ru_RU") ;
break ;
case verIreland:
lc = wxT("ga_IE") ;
break ;
case verKorea:
lc = wxT("ko_KR") ;
break ;
case verChina:
lc = wxT("zh_CN") ;
break ;
case verTaiwan:
lc = wxT("zh_TW") ;
break ;
case verThailand:
lc = wxT("th_TH") ;
break ;
case verCzech:
lc = wxT("cs_CZ") ;
break ;
case verSlovak:
lc = wxT("sk_SK") ;
break ;
case verBengali:
lc = wxT("bn") ;
break ;
case verByeloRussian:
lc = wxT("be_BY") ;
break ;
case verUkraine:
lc = wxT("uk_UA") ;
break ;
case verGreeceAlt:
lc = wxT("el_GR") ;
break ;
case verSerbian:
lc = wxT("sr_YU") ;
break ;
case verSlovenian:
lc = wxT("sl_SI") ;
break ;
case verMacedonian:
lc = wxT("mk_MK") ;
break ;
case verCroatia:
lc = wxT("hr_HR") ;
break ;
case verBrazil:
lc = wxT("pt_BR ") ;
break ;
case verBulgaria:
lc = wxT("bg_BG") ;
break ;
case verCatalonia:
lc = wxT("ca_ES") ;
break ;
case verScottishGaelic:
lc = wxT("gd") ;
break ;
case verManxGaelic:
lc = wxT("gv") ;
break ;
case verBreton:
lc = wxT("br") ;
break ;
case verNunavut:
lc = wxT("iu_CA") ;
break ;
case verWelsh:
lc = wxT("cy") ;
break ;
case verIrishGaelicScript:
lc = wxT("ga_IE") ;
break ;
case verEngCanada:
lc = wxT("en_CA") ;
break ;
case verBhutan:
lc = wxT("dz_BT") ;
break ;
case verArmenian:
lc = wxT("hy_AM") ;
break ;
case verGeorgian:
lc = wxT("ka_GE") ;
break ;
case verSpLatinAmerica:
lc = wxT("es_AR") ;
break ;
case verTonga:
lc = wxT("to_TO" );
break ;
case verFrenchUniversal:
lc = wxT("fr_FR") ;
break ;
case verAustria:
lc = wxT("de_AT") ;
break ;
case verGujarati:
lc = wxT("gu_IN") ;
break ;
case verPunjabi:
lc = wxT("pa") ;
break ;
case verIndiaUrdu:
lc = wxT("ur_IN") ;
break ;
case verVietnam:
lc = wxT("vi_VN") ;
break ;
case verFrBelgium:
lc = wxT("fr_BE") ;
break ;
case verUzbek:
lc = wxT("uz_UZ") ;
break ;
case verSingapore:
lc = wxT("zh_SG") ;
break ;
case verNynorsk:
lc = wxT("nn_NO") ;
break ;
case verAfrikaans:
lc = wxT("af_ZA") ;
break ;
case verEsperanto:
lc = wxT("eo") ;
break ;
case verMarathi:
lc = wxT("mr_IN") ;
break ;
case verTibetan:
lc = wxT("bo") ;
break ;
case verNepal:
lc = wxT("ne_NP") ;
break ;
case verGreenland:
lc = wxT("kl_GL") ;
break ;
default :
break ;
}
for ( i = 0; i < count; i++ )
{
if ( ms_languagesDB->Item(i).CanonicalName == lc )
{
break;
}
}
#elif defined(__WIN32__)
LCID lcid = GetUserDefaultLCID();
if ( lcid != 0 )
{
wxUint32 lang = PRIMARYLANGID(LANGIDFROMLCID(lcid));
wxUint32 sublang = SUBLANGID(LANGIDFROMLCID(lcid));
for ( i = 0; i < count; i++ )
{
if (ms_languagesDB->Item(i).WinLang == lang &&
ms_languagesDB->Item(i).WinSublang == sublang)
{
break;
}
}
}
//else: leave wxlang == wxLANGUAGE_UNKNOWN
#endif // Unix/Win32
if ( i < count )
{
// we did find a matching entry, use it
return ms_languagesDB->Item(i).Language;
}
// no info about this language in the database
return wxLANGUAGE_UNKNOWN;
}
// ----------------------------------------------------------------------------
// encoding stuff
// ----------------------------------------------------------------------------
// this is a bit strange as under Windows we get the encoding name using its
// numeric value and under Unix we do it the other way round, but this just
// reflects the way different systems provide the encoding info
/* static */
wxString wxLocale::GetSystemEncodingName()
{
wxString encname;
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
// FIXME: what is the error return value for GetACP()?
UINT codepage = ::GetACP();
encname.Printf(_T("
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?