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 + -
显示快捷键?