1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/common/intl.cpp 
   3 // Purpose:     Internationalization and localisation for wxWindows 
   4 // Author:      Vadim Zeitlin 
   8 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  21     #pragma implementation "intl.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  37 #ifdef HAVE_LANGINFO_H 
  43     #include "wx/string.h" 
  48     #include "wx/dynarray.h" 
  52 #include "wx/tokenzr.h" 
  53 #include "wx/module.h" 
  56     #include "wx/msw/private.h" 
  57 #elif defined(__UNIX_LIKE__) 
  58     #include "wx/fontmap.h"         // for CharsetToEncoding() 
  61 // ---------------------------------------------------------------------------- 
  63 // ---------------------------------------------------------------------------- 
  65 // this should *not* be wxChar, this type must have exactly 8 bits! 
  66 typedef unsigned char size_t8
; 
  69     #if defined(__WIN16__) 
  70         typedef unsigned long size_t32
; 
  71     #elif defined(__WIN32__) 
  72         typedef unsigned int size_t32
; 
  74         // Win64 will have different type sizes 
  75         #error "Please define a 32 bit type" 
  78     // SIZEOF_XXX are defined by configure 
  79     #if defined(SIZEOF_INT) && (SIZEOF_INT == 4) 
  80         typedef unsigned int size_t32
; 
  81     #elif defined(SIZEOF_LONG) && (SIZEOF_LONG == 4) 
  82         typedef unsigned long size_t32
; 
  84         // assume sizeof(int) == 4 - what else can we do 
  85         typedef unsigned int size_t32
; 
  87         // ... but at least check it during run time 
  88         static class IntSizeChecker
 
  93                 // Asserting a sizeof directly causes some compilers to 
  94                 // issue a "using constant in a conditional expression" warning 
  95                 size_t intsize 
= sizeof(int); 
  97                 wxASSERT_MSG( intsize 
== 4, 
  98                               "size_t32 is incorrectly defined!" ); 
 104 // ---------------------------------------------------------------------------- 
 106 // ---------------------------------------------------------------------------- 
 108 // magic number identifying the .mo format file 
 109 const size_t32 MSGCATALOG_MAGIC    
= 0x950412de; 
 110 const size_t32 MSGCATALOG_MAGIC_SW 
= 0xde120495; 
 112 // extension of ".mo" files 
 113 #define MSGCATALOG_EXTENSION  _T(".mo") 
 115 // the constants describing the format of lang_LANG locale string 
 116 static const size_t LEN_LANG 
= 2; 
 117 static const size_t LEN_SUBLANG 
= 2; 
 118 static const size_t LEN_FULL 
= LEN_LANG 
+ 1 + LEN_SUBLANG
; // 1 for '_' 
 120 // ---------------------------------------------------------------------------- 
 122 // ---------------------------------------------------------------------------- 
 126 // small class to suppress the translation erros until exit from current scope 
 130     NoTransErr() { ms_suppressCount
++; } 
 131    ~NoTransErr() { ms_suppressCount
--;  } 
 133    static bool Suppress() { return ms_suppressCount 
> 0; } 
 136    static size_t ms_suppressCount
; 
 139 size_t NoTransErr::ms_suppressCount 
= 0; 
 150 #endif // Debug/!Debug 
 152 static wxLocale 
*wxSetLocale(wxLocale 
*pLocale
); 
 154 // helper functions of GetSystemLanguage() 
 157 // get just the language part 
 158 static inline wxString 
ExtractLang(const wxString
& langFull
) 
 160     return langFull
.Left(LEN_LANG
); 
 163 // get everything else (including the leading '_') 
 164 static inline wxString 
ExtractNotLang(const wxString
& langFull
) 
 166     return langFull
.Mid(LEN_LANG
); 
 171 // ---------------------------------------------------------------------------- 
 172 // wxMsgCatalog corresponds to one disk-file message catalog. 
 174 // This is a "low-level" class and is used only by wxLocale (that's why 
 175 // it's designed to be stored in a linked list) 
 176 // ---------------------------------------------------------------------------- 
 185   // load the catalog from disk (szDirPrefix corresponds to language) 
 186   bool Load(const wxChar 
*szDirPrefix
, const wxChar 
*szName
, bool bConvertEncoding 
= FALSE
); 
 187   bool IsLoaded() const { return m_pData 
!= NULL
; } 
 189   // get name of the catalog 
 190   const wxChar 
*GetName() const { return m_pszName
; } 
 192   // get the translated string: returns NULL if not found 
 193   const char *GetString(const char *sz
) const; 
 195   // public variable pointing to the next element in a linked list (or NULL) 
 196   wxMsgCatalog 
*m_pNext
; 
 199   // this implementation is binary compatible with GNU gettext() version 0.10 
 201   // an entry in the string table 
 202   struct wxMsgTableEntry
 
 204     size_t32   nLen
;           // length of the string 
 205     size_t32   ofsString
;      // pointer to the string 
 208   // header of a .mo file 
 209   struct wxMsgCatalogHeader
 
 211     size_t32  magic
,          // offset +00:  magic id 
 212               revision
,       //        +04:  revision 
 213               numStrings
;     //        +08:  number of strings in the file 
 214     size_t32  ofsOrigTable
,   //        +0C:  start of original string table 
 215               ofsTransTable
;  //        +10:  start of translated string table 
 216     size_t32  nHashSize
,      //        +14:  hash table size 
 217               ofsHashTable
;   //        +18:  offset of hash table start 
 220   // all data is stored here, NULL if no data loaded 
 224   size_t32          m_numStrings
,   // number of strings in this domain 
 225                     m_nHashSize
;    // number of entries in hash table 
 226   size_t32         
*m_pHashTable
;   // pointer to hash table 
 227   wxMsgTableEntry  
*m_pOrigTable
,   // pointer to original   strings 
 228                    *m_pTransTable
;  //            translated 
 230   const char *StringAtOfs(wxMsgTableEntry 
*pTable
, size_t32 index
) const 
 231     { return (const char *)(m_pData 
+ Swap(pTable
[index
].ofsString
)); } 
 233   // convert encoding to platform native one, if neccessary 
 234   void ConvertEncoding(); 
 237     // calculate the hash value of given string 
 238   static size_t32 
GetHash(const char *sz
); 
 239     // big<->little endian 
 240   inline size_t32 
Swap(size_t32 ui
) const; 
 243   bool HasHashTable() const // true if hash table is present 
 244     { return m_nHashSize 
> 2 && m_pHashTable 
!= NULL
; } 
 246   bool          m_bSwapped
;   // wrong endianness? 
 248   wxChar       
*m_pszName
;    // name of the domain 
 251 // ---------------------------------------------------------------------------- 
 253 // ---------------------------------------------------------------------------- 
 255 // the list of the directories to search for message catalog files 
 256 static wxArrayString s_searchPrefixes
; 
 258 // ============================================================================ 
 260 // ============================================================================ 
 262 // ---------------------------------------------------------------------------- 
 263 // wxMsgCatalog class 
 264 // ---------------------------------------------------------------------------- 
 266 // calculate hash value using the so called hashpjw function by P.J. Weinberger 
 267 // [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools] 
 268 size_t32 
wxMsgCatalog::GetHash(const char *sz
) 
 270   #define HASHWORDBITS 32     // the length of size_t32 
 274   while ( *sz 
!= '\0' ) { 
 276     hval 
+= (size_t32
)*sz
++; 
 277     g 
= hval 
& ((size_t32
)0xf << (HASHWORDBITS 
- 4)); 
 279       hval 
^= g 
>> (HASHWORDBITS 
- 8); 
 287 // swap the 2 halves of 32 bit integer if needed 
 288 size_t32 
wxMsgCatalog::Swap(size_t32 ui
) const 
 290   return m_bSwapped 
? (ui 
<< 24) | ((ui 
& 0xff00) << 8) | 
 291                       ((ui 
>> 8) & 0xff00) | (ui 
>> 24) 
 295 wxMsgCatalog::wxMsgCatalog() 
 301 wxMsgCatalog::~wxMsgCatalog() 
 304   wxDELETEA(m_pszName
); 
 307 // return all directories to search for given prefix 
 308 static wxString 
GetAllMsgCatalogSubdirs(const wxChar 
*prefix
, 
 313     // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in 
 314     // prefix (assuming the language is 'fr') 
 315     searchPath 
<< prefix 
<< wxFILE_SEP_PATH 
<< lang 
<< wxFILE_SEP_PATH
 
 316                          << wxT("LC_MESSAGES") << wxPATH_SEP
 
 317                << prefix 
<< wxFILE_SEP_PATH 
<< lang 
<< wxPATH_SEP
 
 318                << prefix 
<< wxPATH_SEP
; 
 323 // construct the search path for the given language 
 324 static wxString 
GetFullSearchPath(const wxChar 
*lang
) 
 328     // first take the entries explicitly added by the program 
 329     size_t count 
= s_searchPrefixes
.Count(); 
 330     for ( size_t n 
= 0; n 
< count
; n
++ ) 
 332         searchPath 
<< GetAllMsgCatalogSubdirs(s_searchPrefixes
[n
], lang
) 
 336     // LC_PATH is a standard env var containing the search path for the .mo 
 338     const wxChar 
*pszLcPath 
= wxGetenv(wxT("LC_PATH")); 
 339     if ( pszLcPath 
!= NULL 
) 
 340         searchPath 
<< GetAllMsgCatalogSubdirs(pszLcPath
, lang
); 
 342     // then take the current directory 
 343     // FIXME it should be the directory of the executable 
 344     searchPath 
<< GetAllMsgCatalogSubdirs(wxT("."), lang
); 
 346     // and finally add some standard ones 
 348         << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang
) 
 349         << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang
) 
 350         << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang
); 
 355 // open disk file and read in it's contents 
 356 bool wxMsgCatalog::Load(const wxChar 
*szDirPrefix
, const wxChar 
*szName0
, bool bConvertEncoding
) 
 358    /* We need to handle locales like  de_AT.iso-8859-1 
 359       For this we first chop off the .CHARSET specifier and ignore it. 
 360       FIXME: UNICODE SUPPORT: must use CHARSET specifier! 
 362    wxString szName 
= szName0
; 
 363    if(szName
.Find(wxT('.')) != -1) // contains a dot 
 364       szName 
= szName
.Left(szName
.Find(wxT('.'))); 
 366   wxString searchPath 
= GetFullSearchPath(szDirPrefix
); 
 367   const wxChar 
*sublocale 
= wxStrchr(szDirPrefix
, wxT('_')); 
 370       // also add just base locale name: for things like "fr_BE" (belgium 
 371       // french) we should use "fr" if no belgium specific message catalogs 
 373       searchPath 
<< GetFullSearchPath(wxString(szDirPrefix
). 
 374                                       Left((size_t)(sublocale 
- szDirPrefix
))) 
 378   wxString strFile 
= szName
; 
 379   strFile 
+= MSGCATALOG_EXTENSION
; 
 381   // don't give translation errors here because the wxstd catalog might 
 382   // not yet be loaded (and it's normal) 
 384   // (we're using an object because we have several return paths) 
 386   NoTransErr noTransErr
; 
 387   wxLogVerbose(_("looking for catalog '%s' in path '%s'."), 
 388                szName
.c_str(), searchPath
.c_str()); 
 390   wxString strFullName
; 
 391   if ( !wxFindFileInPath(&strFullName
, searchPath
, strFile
) ) { 
 392     wxLogVerbose(_("catalog file for domain '%s' not found."), szName
.c_str()); 
 397   wxLogVerbose(_("using catalog '%s' from '%s'."), 
 398              szName
.c_str(), strFullName
.c_str()); 
 400   wxFile 
fileMsg(strFullName
); 
 401   if ( !fileMsg
.IsOpened() ) 
 405   off_t nSize 
= fileMsg
.Length(); 
 406   if ( nSize 
== wxInvalidOffset 
) 
 409   // read the whole file in memory 
 410   m_pData 
= new size_t8
[nSize
]; 
 411   if ( fileMsg
.Read(m_pData
, nSize
) != nSize 
) { 
 417   bool bValid 
= (size_t)nSize 
> sizeof(wxMsgCatalogHeader
); 
 419   wxMsgCatalogHeader 
*pHeader 
= (wxMsgCatalogHeader 
*)m_pData
; 
 421     // we'll have to swap all the integers if it's true 
 422     m_bSwapped 
= pHeader
->magic 
== MSGCATALOG_MAGIC_SW
; 
 424     // check the magic number 
 425     bValid 
= m_bSwapped 
|| pHeader
->magic 
== MSGCATALOG_MAGIC
; 
 429     // it's either too short or has incorrect magic number 
 430     wxLogWarning(_("'%s' is not a valid message catalog."), strFullName
.c_str()); 
 437   m_numStrings  
= Swap(pHeader
->numStrings
); 
 438   m_pOrigTable  
= (wxMsgTableEntry 
*)(m_pData 
+ 
 439                    Swap(pHeader
->ofsOrigTable
)); 
 440   m_pTransTable 
= (wxMsgTableEntry 
*)(m_pData 
+ 
 441                    Swap(pHeader
->ofsTransTable
)); 
 443   m_nHashSize   
= Swap(pHeader
->nHashSize
); 
 444   m_pHashTable  
= (size_t32 
*)(m_pData 
+ Swap(pHeader
->ofsHashTable
)); 
 446   m_pszName 
= new wxChar
[wxStrlen(szName
) + 1]; 
 447   wxStrcpy(m_pszName
, szName
); 
 449   if (bConvertEncoding
) 
 452   // everything is fine 
 456 // search for a string 
 457 const char *wxMsgCatalog::GetString(const char *szOrig
) const 
 459   if ( szOrig 
== NULL 
) 
 462   if ( HasHashTable() ) {   // use hash table for lookup if possible 
 463     size_t32 nHashVal 
= GetHash(szOrig
); 
 464     size_t32 nIndex   
= nHashVal 
% m_nHashSize
; 
 466     size_t32 nIncr 
= 1 + (nHashVal 
% (m_nHashSize 
- 2)); 
 469       size_t32 nStr 
= Swap(m_pHashTable
[nIndex
]); 
 473       if ( strcmp(szOrig
, StringAtOfs(m_pOrigTable
, nStr 
- 1)) == 0 ) { 
 474         // work around for BC++ 5.5 bug: without a temp var, the optimizer 
 475         // breaks the code and the return value is incorrect 
 476         const char *tmp 
= StringAtOfs(m_pTransTable
, nStr 
- 1); 
 480       if ( nIndex 
>= m_nHashSize 
- nIncr
) 
 481         nIndex 
-= m_nHashSize 
- nIncr
; 
 486   else {                    // no hash table: use default binary search 
 490     while ( bottom 
< top 
) { 
 491       current 
= (bottom 
+ top
) / 2; 
 492       int res 
= strcmp(szOrig
, StringAtOfs(m_pOrigTable
, current
)); 
 496         bottom 
= current 
+ 1; 
 498         // work around the same BC++ 5.5 bug as above 
 499         const char *tmp 
= StringAtOfs(m_pTransTable
, current
); 
 511 #include "wx/fontmap.h" 
 512 #include "wx/encconv.h" 
 515 void wxMsgCatalog::ConvertEncoding() 
 520     // first, find encoding header: 
 521     const char *hdr 
= StringAtOfs(m_pOrigTable
, 0); 
 522     if ( hdr 
== NULL 
|| hdr
[0] != 0 ) { 
 523         // not supported by this catalog, does not have correct header 
 527     wxString 
header(StringAtOfs(m_pTransTable
, 0)); 
 529     int pos 
= header
.Find(wxT("Content-Type: text/plain; charset=")); 
 530     if (pos 
== wxNOT_FOUND
) 
 531         return; // incorrectly filled Content-Type header 
 532     size_t n 
= pos 
+ 34; /*strlen("Content-Type: text/plain; charset=")*/ 
 533     while (header
[n
] != wxT('\n')) 
 534         charset 
<< header
[n
++]; 
 536     enc 
= wxTheFontMapper
->CharsetToEncoding(charset
, FALSE
); 
 537     if ( enc 
== wxFONTENCODING_SYSTEM 
) 
 538         return; // unknown encoding 
 540     wxFontEncoding targetEnc 
= wxFONTENCODING_SYSTEM
; 
 543     if (wxGetEnv(wxT("LC_ALL"), &langFull
) || 
 544         wxGetEnv(wxT("LC_CTYPE"), &langFull
) || 
 545         wxGetEnv(wxT("LANG"), &langFull
)) 
 547         wxString lcharset 
= langFull
.AfterFirst(wxT('.')).BeforeFirst(wxT('@')); 
 548         if (!lcharset
.IsEmpty()) 
 549             targetEnc 
= wxTheFontMapper
->CharsetToEncoding(lcharset
, FALSE
); 
 553     if (targetEnc 
== wxFONTENCODING_SYSTEM
) 
 555         wxFontEncodingArray a 
= wxEncodingConverter::GetPlatformEquivalents(enc
); 
 557             return; // no conversion needed, locale uses native encoding 
 558         if (a
.GetCount() == 0) 
 559             return; // we don't know common equiv. under this platform 
 563     wxEncodingConverter converter
; 
 564     converter
.Init(enc
, targetEnc
); 
 566     for (size_t i 
= 0; i 
< m_numStrings
; i
++) 
 567         converter
.Convert((char*)StringAtOfs(m_pTransTable
, i
)); 
 572 // ---------------------------------------------------------------------------- 
 574 // ---------------------------------------------------------------------------- 
 576 #include "wx/arrimpl.cpp" 
 577 WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo
, wxLanguageInfoArray
); 
 578 WX_DEFINE_OBJARRAY(wxLanguageInfoArray
); 
 580 wxLanguageInfoArray 
*wxLocale::ms_languagesDB 
= NULL
; 
 582 /*static*/ void wxLocale::CreateLanguagesDB() 
 584     if (ms_languagesDB 
== NULL
) 
 586         ms_languagesDB 
= new wxLanguageInfoArray
; 
 591 /*static*/ void wxLocale::DestroyLanguagesDB() 
 593     delete ms_languagesDB
; 
 594     ms_languagesDB 
= NULL
; 
 600   m_pszOldLocale 
= NULL
; 
 602   m_language 
= wxLANGUAGE_UNKNOWN
; 
 605 // NB: this function has (desired) side effect of changing current locale 
 606 bool wxLocale::Init(const wxChar 
*szName
, 
 607                     const wxChar 
*szShort
, 
 608                     const wxChar 
*szLocale
, 
 610                     bool        bConvertEncoding
) 
 612   m_strLocale 
= szName
; 
 613   m_strShort 
= szShort
; 
 614   m_bConvertEncoding 
= bConvertEncoding
; 
 615   m_language 
= wxLANGUAGE_UNKNOWN
; 
 617   // change current locale (default: same as long name) 
 618   if ( szLocale 
== NULL 
) 
 620     // the argument to setlocale() 
 623   m_pszOldLocale 
= wxSetlocale(LC_ALL
, szLocale
); 
 624   if ( m_pszOldLocale 
== NULL 
) 
 625     wxLogError(_("locale '%s' can not be set."), szLocale
); 
 627   // the short name will be used to look for catalog files as well, 
 628   // so we need something here 
 629   if ( m_strShort
.IsEmpty() ) { 
 630     // FIXME I don't know how these 2 letter abbreviations are formed, 
 631     //       this wild guess is surely wrong 
 632     m_strShort 
= tolower(szLocale
[0]) + tolower(szLocale
[1]); 
 635   // save the old locale to be able to restore it later 
 636   m_pOldLocale 
= wxSetLocale(this); 
 638   // load the default catalog with wxWindows standard messages 
 642     bOk 
= AddCatalog(wxT("wxstd")); 
 647 bool wxLocale::Init(int language
, int flags
) 
 649     wxLanguageInfo 
*info 
= NULL
; 
 654     if (lang 
== wxLANGUAGE_DEFAULT
) 
 656         // auto detect the language 
 657         lang 
= GetSystemLanguage(); 
 660     // We failed to detect system language, so we will use English: 
 661     if (lang 
== wxLANGUAGE_UNKNOWN
) 
 666     if (lang 
!= wxLANGUAGE_DEFAULT
) 
 668         for (size_t i 
= 0; i 
< ms_languagesDB
->GetCount(); i
++) 
 670             if (ms_languagesDB
->Item(i
).Language 
== lang
) 
 672                 info 
= &ms_languagesDB
->Item(i
); 
 681         wxLogError(wxT("Unknown language %i."), lang
); 
 685     wxString name 
= info
->Description
; 
 686     wxString canonical 
= info
->CanonicalName
; 
 692     if (language 
== wxLANGUAGE_DEFAULT
) 
 693         locale 
= wxEmptyString
; 
 695         locale 
= info
->CanonicalName
; 
 697     retloc 
= wxSetlocale(LC_ALL
, locale
); 
 701         // Some C libraries don't like xx_YY form and require xx only 
 702         retloc 
= wxSetlocale(LC_ALL
, locale
.Mid(0,2)); 
 706         // Some C libraries (namely glibc) still use old ISO 639, 
 707         // so will translate the abbrev for them 
 708         wxString mid 
= locale
.Mid(0,2); 
 709         if (mid 
== wxT("he")) locale 
= wxT("iw") + locale
.Mid(3); 
 710         else if (mid 
== wxT("id")) locale 
= wxT("in") + locale
.Mid(3); 
 711         else if (mid 
== wxT("yi")) locale 
= wxT("ji") + locale
.Mid(3); 
 712         retloc 
= wxSetlocale(LC_ALL
, locale
); 
 716         // (This time, we changed locale in previous if-branch, so try again.) 
 717         // Some C libraries don't like xx_YY form and require xx only 
 718         retloc 
= wxSetlocale(LC_ALL
, locale
.Mid(0,2)); 
 722         wxLogError(wxT("Cannot set locale to '%s'."), locale
.c_str()); 
 725 #elif defined(__WIN32__) 
 726     if (language 
!= wxLANGUAGE_DEFAULT
) 
 728         if (info
->WinLang 
== 0) 
 730             wxLogWarning(wxT("Locale '%s' not supported by OS."), name
.c_str()); 
 735             wxUint32 lcid 
= MAKELCID(MAKELANGID(info
->WinLang
, info
->WinSublang
), 
 737             if (SetThreadLocale(lcid
)) 
 738                 retloc 
= wxSetlocale(LC_ALL
, wxEmptyString
); 
 741                 // Windows9X doesn't support SetThreadLocale, so we must 
 742                 // translate LCID to CRT's setlocale string ourselves 
 744                 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
) 
 747                     buffer
[0] = wxT('\0'); 
 748                     GetLocaleInfo(lcid
, LOCALE_SENGLANGUAGE
, buffer
, 256); 
 750                     if (GetLocaleInfo(lcid
, LOCALE_SENGCOUNTRY
, buffer
, 256) > 0) 
 751                         locale 
<< wxT("_") << buffer
; 
 753                 if (locale
.IsEmpty()) 
 755                     wxLogLastError(wxT("SetThreadLocale")); 
 756                     wxLogError(wxT("Cannot set locale to language %s."), name
.c_str()); 
 760                     retloc 
= wxSetlocale(LC_ALL
, locale
); 
 765         retloc 
= wxSetlocale(LC_ALL
, wxEmptyString
); 
 769         wxLogError(wxT("Cannot set locale to language %s."), name
.c_str()); 
 777     return Init(name
, canonical
, wxString(retloc
), 
 778                 (flags 
& wxLOCALE_LOAD_DEFAULT
) != 0, 
 779                 (flags 
& wxLOCALE_CONV_ENCODING
) != 0); 
 784 void wxLocale::AddCatalogLookupPathPrefix(const wxString
& prefix
) 
 786     if ( s_searchPrefixes
.Index(prefix
) == wxNOT_FOUND 
) 
 788         s_searchPrefixes
.Add(prefix
); 
 790     //else: already have it 
 793 /*static*/ int wxLocale::GetSystemLanguage() 
 797     // init i to avoid compiler warning 
 799            count 
= ms_languagesDB
->GetCount(); 
 801 #if defined(__UNIX__) 
 802     // first get the string identifying the language from the environment 
 804     if (!wxGetEnv(wxT("LC_ALL"), &langFull
) && 
 805         !wxGetEnv(wxT("LC_MESSAGES"), &langFull
) && 
 806         !wxGetEnv(wxT("LANG"), &langFull
)) 
 808         // no language specified, threat it as English 
 809         return wxLANGUAGE_ENGLISH
; 
 812     if ( langFull 
== _T("C") ) 
 815         return wxLANGUAGE_ENGLISH
; 
 818     // the language string has the following form 
 820     //      lang[_LANG[.encoding]] 
 822     // where lang is the primary language, LANG is a sublang 
 824     // for example, the following strings are valid: 
 829     // for now we don't use the encoding, although we probably should (doing 
 830     // translations of the msg catalogs on the fly as required) (TODO) 
 831     langFull 
= langFull
.BeforeFirst(_T('.')); 
 833     // in addition to the format above, we also can have full language names 
 834     // in LANG env var - for example, SuSE is known to use LANG="german" - so 
 837     // do we have just the language (or sublang too)? 
 838     bool justLang 
= langFull
.Len() == LEN_LANG
; 
 840          (langFull
.Len() == LEN_FULL 
&& langFull
[LEN_LANG
] == wxT('_')) ) 
 842         // 0. Make sure the lang is according to latest ISO 639 
 843         //    (this is neccessary because glibc uses iw and in instead 
 844         //    of he and id respectively). 
 846         // the language itself (second part is the dialect/sublang) 
 847         wxString langOrig 
= ExtractLang(langFull
); 
 850         if ( langOrig 
== wxT("iw")) 
 852         else if ( langOrig 
== wxT("in") ) 
 854         else if ( langOrig 
== wxT("ji") ) 
 860         if ( lang 
!= langOrig 
) 
 862             langFull 
= lang 
+ ExtractNotLang(langFull
); 
 865         // 1. Try to find the language either as is: 
 866         for ( i 
= 0; i 
< count
; i
++ ) 
 868             if ( ms_languagesDB
->Item(i
).CanonicalName 
== langFull 
) 
 874         // 2. If langFull is of the form xx_YY, try to find xx: 
 875         if ( i 
== count 
&& !justLang 
) 
 877             for ( i 
= 0; i 
< count
; i
++ ) 
 879                 if ( ms_languagesDB
->Item(i
).CanonicalName 
== lang 
) 
 886         // 3. If langFull is of the form xx, try to find any xx_YY record: 
 887         if ( i 
== count 
&& justLang 
) 
 889             for ( i 
= 0; i 
< count
; i
++ ) 
 891                 if ( ExtractLang(ms_languagesDB
->Item(i
).CanonicalName
) 
 899     else // not standard format 
 901         // try to find the name in verbose description 
 902         for ( i 
= 0; i 
< count
; i
++ ) 
 904             if (ms_languagesDB
->Item(i
).Description
.CmpNoCase(langFull
) == 0) 
 910 #elif defined(__WIN32__) 
 911     LCID lcid 
= GetUserDefaultLCID(); 
 914         wxUint32 lang 
= PRIMARYLANGID(LANGIDFROMLCID(lcid
)); 
 915         wxUint32 sublang 
= SUBLANGID(LANGIDFROMLCID(lcid
)); 
 917         for ( i 
= 0; i 
< count
; i
++ ) 
 919             if (ms_languagesDB
->Item(i
).WinLang 
== lang 
&& 
 920                 ms_languagesDB
->Item(i
).WinSublang 
== sublang
) 
 926     //else: leave wxlang == wxLANGUAGE_UNKNOWN 
 931         // we did find a matching entry, use it 
 932         return ms_languagesDB
->Item(i
).Language
; 
 935     // no info about this language in the database 
 936     return wxLANGUAGE_UNKNOWN
; 
 939 // ---------------------------------------------------------------------------- 
 941 // ---------------------------------------------------------------------------- 
 943 // this is a bit strange as under Windows we get the encoding name using its 
 944 // numeric value and under Unix we do it the other way round, but this just 
 945 // reflects the way different systems provide he encoding info 
 948 wxString 
wxLocale::GetSystemEncodingName() 
 953     // FIXME: what is the error return value for GetACP()? 
 954     UINT codepage 
= ::GetACP(); 
 955     encname
.Printf(_T("cp%u"), codepage
); 
 956 #elif defined(__UNIX_LIKE__) 
 958 #if defined(HAVE_LANGINFO_H) && defined(CODESET) 
 959     // GNU libc provides current character set this way (this conforms 
 961     char *oldLocale 
= strdup(setlocale(LC_CTYPE
, NULL
)); 
 962     setlocale(LC_CTYPE
, ""); 
 963     char *alang 
= nl_langinfo(CODESET
); 
 964     setlocale(LC_CTYPE
, oldLocale
); 
 967         encname 
= wxConvLibc
.cMB2WX(alang
); 
 970 #endif // HAVE_LANGINFO_H 
 972         // if we can't get at the character set directly, try to see if it's in 
 973         // the environment variables (in most cases this won't work, but I was 
 975         wxChar 
*lang 
= wxGetenv(wxT("LC_ALL")); 
 976         wxChar 
*dot 
= lang 
? wxStrchr(lang
, wxT('.')) : (wxChar 
*)NULL
; 
 979             lang 
= wxGetenv(wxT("LC_CTYPE")); 
 981                 dot 
= wxStrchr(lang
, wxT('.')); 
 985             lang 
= wxGetenv(wxT("LANG")); 
 987                 dot 
= wxStrchr(lang
, wxT('.')); 
1001 wxFontEncoding 
wxLocale::GetSystemEncoding() 
1004     UINT codepage 
= ::GetACP(); 
1006     // wxWindows only knows about CP1250-1257 
1007     if ( codepage 
>= 1250 && codepage 
<= 1257 ) 
1009         return (wxFontEncoding
)(wxFONTENCODING_CP1250 
+ codepage 
- 1250); 
1011 #elif defined(__UNIX_LIKE__) 
1012     wxString encname 
= GetSystemEncodingName(); 
1013     if ( !encname
.empty() ) 
1015         return wxTheFontMapper
-> 
1016             CharsetToEncoding(encname
, FALSE 
/* not interactive */); 
1018 #endif // Win32/Unix 
1020     return wxFONTENCODING_SYSTEM
; 
1023 /*static*/ void wxLocale::AddLanguage(const wxLanguageInfo
& info
) 
1025     CreateLanguagesDB(); 
1026     ms_languagesDB
->Add(info
); 
1029 wxString 
wxLocale::GetSysName() const 
1031     return wxSetlocale(LC_ALL
, NULL
); 
1035 wxLocale::~wxLocale() 
1038     wxMsgCatalog 
*pTmpCat
; 
1039     while ( m_pMsgCat 
!= NULL 
) { 
1040         pTmpCat 
= m_pMsgCat
; 
1041         m_pMsgCat 
= m_pMsgCat
->m_pNext
; 
1045     // restore old locale 
1046     wxSetLocale(m_pOldLocale
); 
1047     wxSetlocale(LC_ALL
, m_pszOldLocale
); 
1050 // get the translation of given string in current locale 
1051 const wxMB2WXbuf 
wxLocale::GetString(const wxChar 
*szOrigString
, 
1052                                      const wxChar 
*szDomain
) const 
1054   if ( wxIsEmpty(szOrigString
) ) 
1057   const char *pszTrans 
= NULL
; 
1059   const wxWX2MBbuf szOrgString 
= wxConvCurrent
->cWX2MB(szOrigString
); 
1061   #define szOrgString szOrigString 
1062 #endif // Unicode/ANSI 
1064   wxMsgCatalog 
*pMsgCat
; 
1065   if ( szDomain 
!= NULL 
) { 
1066     pMsgCat 
= FindCatalog(szDomain
); 
1068     // does the catalog exist? 
1069     if ( pMsgCat 
!= NULL 
) 
1070       pszTrans 
= pMsgCat
->GetString(szOrgString
); 
1073     // search in all domains 
1074     for ( pMsgCat 
= m_pMsgCat
; pMsgCat 
!= NULL
; pMsgCat 
= pMsgCat
->m_pNext 
) { 
1075       pszTrans 
= pMsgCat
->GetString(szOrgString
); 
1076       if ( pszTrans 
!= NULL 
)   // take the first found 
1081   if ( pszTrans 
== NULL 
) { 
1083     if ( !NoTransErr::Suppress() ) { 
1084       NoTransErr noTransErr
; 
1086       if ( szDomain 
!= NULL 
) 
1088         wxLogDebug(_T("string '%s' not found in domain '%s' for locale '%s'."), 
1089                      szOrigString
, szDomain
, m_strLocale
.c_str()); 
1093         wxLogDebug(_T("string '%s' not found in locale '%s'."), 
1094                    szOrigString
, m_strLocale
.c_str()); 
1097 #endif // __WXDEBUG__ 
1099     return (wxMB2WXbuf
)(szOrigString
); 
1103     return wxConvertMB2WX(pszTrans
); // or preferably wxCSConv(charset).cMB2WX(pszTrans) or something, 
1104                                      // a macro similar to wxConvertMB2WX could be written for that 
1110 // find catalog by name in a linked list, return NULL if !found 
1111 wxMsgCatalog 
*wxLocale::FindCatalog(const wxChar 
*szDomain
) const 
1113 // linear search in the linked list 
1114   wxMsgCatalog 
*pMsgCat
; 
1115   for ( pMsgCat 
= m_pMsgCat
; pMsgCat 
!= NULL
; pMsgCat 
= pMsgCat
->m_pNext 
) { 
1116     if ( wxStricmp(pMsgCat
->GetName(), szDomain
) == 0 ) 
1123 // check if the given catalog is loaded 
1124 bool wxLocale::IsLoaded(const wxChar 
*szDomain
) const 
1126   return FindCatalog(szDomain
) != NULL
; 
1129 // add a catalog to our linked list 
1130 bool wxLocale::AddCatalog(const wxChar 
*szDomain
) 
1132   wxMsgCatalog 
*pMsgCat 
= new wxMsgCatalog
; 
1134   if ( pMsgCat
->Load(m_strShort
, szDomain
, m_bConvertEncoding
) ) { 
1135     // add it to the head of the list so that in GetString it will 
1136     // be searched before the catalogs added earlier 
1137     pMsgCat
->m_pNext 
= m_pMsgCat
; 
1138     m_pMsgCat 
= pMsgCat
; 
1143     // don't add it because it couldn't be loaded anyway 
1150 // ---------------------------------------------------------------------------- 
1151 // global functions and variables 
1152 // ---------------------------------------------------------------------------- 
1154 // retrieve/change current locale 
1155 // ------------------------------ 
1157 // the current locale object 
1158 static wxLocale 
*g_pLocale 
= NULL
; 
1160 wxLocale 
*wxGetLocale() 
1165 wxLocale 
*wxSetLocale(wxLocale 
*pLocale
) 
1167   wxLocale 
*pOld 
= g_pLocale
; 
1168   g_pLocale 
= pLocale
; 
1174 // ---------------------------------------------------------------------------- 
1175 // wxLocale module (for lazy destruction of languagesDB) 
1176 // ---------------------------------------------------------------------------- 
1178 class wxLocaleModule
: public wxModule
 
1180     DECLARE_DYNAMIC_CLASS(wxLocaleModule
) 
1183         bool OnInit() { return TRUE
; } 
1184         void OnExit() { wxLocale::DestroyLanguagesDB(); } 
1187 IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule
, wxModule
) 
1191 // ---------------------------------------------------------------------------- 
1192 // default languages table & initialization 
1193 // ---------------------------------------------------------------------------- 
1197 // --- --- --- generated code begins here --- --- --- 
1199 // This table is generated by misc/languages/genlang.py 
1200 // When making changes, please put them into misc/languages/langtabl.txt 
1204 #define SETWINLANG(info,lang,sublang) 
1208 #define SETWINLANG(info,lang,sublang) \ 
1209     info.WinLang = lang, info.WinSublang = sublang; 
1211 #ifndef LANG_AFRIKAANS 
1212 #define LANG_AFRIKAANS (0) 
1214 #ifndef LANG_ALBANIAN 
1215 #define LANG_ALBANIAN (0) 
1218 #define LANG_ARABIC (0) 
1220 #ifndef LANG_ARMENIAN 
1221 #define LANG_ARMENIAN (0) 
1223 #ifndef LANG_ASSAMESE 
1224 #define LANG_ASSAMESE (0) 
1227 #define LANG_AZERI (0) 
1230 #define LANG_BASQUE (0) 
1232 #ifndef LANG_BELARUSIAN 
1233 #define LANG_BELARUSIAN (0) 
1235 #ifndef LANG_BENGALI 
1236 #define LANG_BENGALI (0) 
1238 #ifndef LANG_BULGARIAN 
1239 #define LANG_BULGARIAN (0) 
1241 #ifndef LANG_CATALAN 
1242 #define LANG_CATALAN (0) 
1244 #ifndef LANG_CHINESE 
1245 #define LANG_CHINESE (0) 
1247 #ifndef LANG_CROATIAN 
1248 #define LANG_CROATIAN (0) 
1251 #define LANG_CZECH (0) 
1254 #define LANG_DANISH (0) 
1257 #define LANG_DUTCH (0) 
1259 #ifndef LANG_ENGLISH 
1260 #define LANG_ENGLISH (0) 
1262 #ifndef LANG_ESTONIAN 
1263 #define LANG_ESTONIAN (0) 
1265 #ifndef LANG_FAEROESE 
1266 #define LANG_FAEROESE (0) 
1269 #define LANG_FARSI (0) 
1271 #ifndef LANG_FINNISH 
1272 #define LANG_FINNISH (0) 
1275 #define LANG_FRENCH (0) 
1277 #ifndef LANG_GEORGIAN 
1278 #define LANG_GEORGIAN (0) 
1281 #define LANG_GERMAN (0) 
1284 #define LANG_GREEK (0) 
1286 #ifndef LANG_GUJARATI 
1287 #define LANG_GUJARATI (0) 
1290 #define LANG_HEBREW (0) 
1293 #define LANG_HINDI (0) 
1295 #ifndef LANG_HUNGARIAN 
1296 #define LANG_HUNGARIAN (0) 
1298 #ifndef LANG_ICELANDIC 
1299 #define LANG_ICELANDIC (0) 
1301 #ifndef LANG_INDONESIAN 
1302 #define LANG_INDONESIAN (0) 
1304 #ifndef LANG_ITALIAN 
1305 #define LANG_ITALIAN (0) 
1307 #ifndef LANG_JAPANESE 
1308 #define LANG_JAPANESE (0) 
1310 #ifndef LANG_KANNADA 
1311 #define LANG_KANNADA (0) 
1313 #ifndef LANG_KASHMIRI 
1314 #define LANG_KASHMIRI (0) 
1317 #define LANG_KAZAK (0) 
1319 #ifndef LANG_KONKANI 
1320 #define LANG_KONKANI (0) 
1323 #define LANG_KOREAN (0) 
1325 #ifndef LANG_LATVIAN 
1326 #define LANG_LATVIAN (0) 
1328 #ifndef LANG_LITHUANIAN 
1329 #define LANG_LITHUANIAN (0) 
1331 #ifndef LANG_MACEDONIAN 
1332 #define LANG_MACEDONIAN (0) 
1335 #define LANG_MALAY (0) 
1337 #ifndef LANG_MALAYALAM 
1338 #define LANG_MALAYALAM (0) 
1340 #ifndef LANG_MANIPURI 
1341 #define LANG_MANIPURI (0) 
1343 #ifndef LANG_MARATHI 
1344 #define LANG_MARATHI (0) 
1347 #define LANG_NEPALI (0) 
1349 #ifndef LANG_NORWEGIAN 
1350 #define LANG_NORWEGIAN (0) 
1353 #define LANG_ORIYA (0) 
1356 #define LANG_POLISH (0) 
1358 #ifndef LANG_PORTUGUESE 
1359 #define LANG_PORTUGUESE (0) 
1361 #ifndef LANG_PUNJABI 
1362 #define LANG_PUNJABI (0) 
1364 #ifndef LANG_ROMANIAN 
1365 #define LANG_ROMANIAN (0) 
1367 #ifndef LANG_RUSSIAN 
1368 #define LANG_RUSSIAN (0) 
1370 #ifndef LANG_SANSKRIT 
1371 #define LANG_SANSKRIT (0) 
1373 #ifndef LANG_SERBIAN 
1374 #define LANG_SERBIAN (0) 
1377 #define LANG_SINDHI (0) 
1380 #define LANG_SLOVAK (0) 
1382 #ifndef LANG_SLOVENIAN 
1383 #define LANG_SLOVENIAN (0) 
1385 #ifndef LANG_SPANISH 
1386 #define LANG_SPANISH (0) 
1388 #ifndef LANG_SWAHILI 
1389 #define LANG_SWAHILI (0) 
1391 #ifndef LANG_SWEDISH 
1392 #define LANG_SWEDISH (0) 
1395 #define LANG_TAMIL (0) 
1398 #define LANG_TATAR (0) 
1401 #define LANG_TELUGU (0) 
1404 #define LANG_THAI (0) 
1406 #ifndef LANG_TURKISH 
1407 #define LANG_TURKISH (0) 
1409 #ifndef LANG_UKRAINIAN 
1410 #define LANG_UKRAINIAN (0) 
1413 #define LANG_URDU (0) 
1416 #define LANG_UZBEK (0) 
1418 #ifndef LANG_VIETNAMESE 
1419 #define LANG_VIETNAMESE (0) 
1421 #ifndef SUBLANG_ARABIC_ALGERIA 
1422 #define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT 
1424 #ifndef SUBLANG_ARABIC_BAHRAIN 
1425 #define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT 
1427 #ifndef SUBLANG_ARABIC_EGYPT 
1428 #define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT 
1430 #ifndef SUBLANG_ARABIC_IRAQ 
1431 #define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT 
1433 #ifndef SUBLANG_ARABIC_JORDAN 
1434 #define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT 
1436 #ifndef SUBLANG_ARABIC_KUWAIT 
1437 #define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT 
1439 #ifndef SUBLANG_ARABIC_LEBANON 
1440 #define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT 
1442 #ifndef SUBLANG_ARABIC_LIBYA 
1443 #define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT 
1445 #ifndef SUBLANG_ARABIC_MOROCCO 
1446 #define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT 
1448 #ifndef SUBLANG_ARABIC_OMAN 
1449 #define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT 
1451 #ifndef SUBLANG_ARABIC_QATAR 
1452 #define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT 
1454 #ifndef SUBLANG_ARABIC_SAUDI_ARABIA 
1455 #define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT 
1457 #ifndef SUBLANG_ARABIC_SYRIA 
1458 #define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT 
1460 #ifndef SUBLANG_ARABIC_TUNISIA 
1461 #define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT 
1463 #ifndef SUBLANG_ARABIC_UAE 
1464 #define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT 
1466 #ifndef SUBLANG_ARABIC_YEMEN 
1467 #define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT 
1469 #ifndef SUBLANG_AZERI_CYRILLIC 
1470 #define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT 
1472 #ifndef SUBLANG_AZERI_LATIN 
1473 #define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT 
1475 #ifndef SUBLANG_CHINESE_SIMPLIFIED 
1476 #define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT 
1478 #ifndef SUBLANG_CHINESE_TRADITIONAL 
1479 #define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT 
1481 #ifndef SUBLANG_CHINESE_HONGKONG 
1482 #define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT 
1484 #ifndef SUBLANG_CHINESE_MACAU 
1485 #define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT 
1487 #ifndef SUBLANG_CHINESE_SINGAPORE 
1488 #define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT 
1490 #ifndef SUBLANG_DUTCH 
1491 #define SUBLANG_DUTCH SUBLANG_DEFAULT 
1493 #ifndef SUBLANG_DUTCH_BELGIAN 
1494 #define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT 
1496 #ifndef SUBLANG_ENGLISH_UK 
1497 #define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT 
1499 #ifndef SUBLANG_ENGLISH_US 
1500 #define SUBLANG_ENGLISH_US SUBLANG_DEFAULT 
1502 #ifndef SUBLANG_ENGLISH_AUS 
1503 #define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT 
1505 #ifndef SUBLANG_ENGLISH_BELIZE 
1506 #define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT 
1508 #ifndef SUBLANG_ENGLISH_CAN 
1509 #define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT 
1511 #ifndef SUBLANG_ENGLISH_CARIBBEAN 
1512 #define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT 
1514 #ifndef SUBLANG_ENGLISH_EIRE 
1515 #define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT 
1517 #ifndef SUBLANG_ENGLISH_JAMAICA 
1518 #define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT 
1520 #ifndef SUBLANG_ENGLISH_NZ 
1521 #define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT 
1523 #ifndef SUBLANG_ENGLISH_PHILIPPINES 
1524 #define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT 
1526 #ifndef SUBLANG_ENGLISH_SOUTH_AFRICA 
1527 #define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT 
1529 #ifndef SUBLANG_ENGLISH_TRINIDAD 
1530 #define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT 
1532 #ifndef SUBLANG_ENGLISH_ZIMBABWE 
1533 #define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT 
1535 #ifndef SUBLANG_FRENCH 
1536 #define SUBLANG_FRENCH SUBLANG_DEFAULT 
1538 #ifndef SUBLANG_FRENCH_BELGIAN 
1539 #define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT 
1541 #ifndef SUBLANG_FRENCH_CANADIAN 
1542 #define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT 
1544 #ifndef SUBLANG_FRENCH_LUXEMBOURG 
1545 #define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT 
1547 #ifndef SUBLANG_FRENCH_MONACO 
1548 #define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT 
1550 #ifndef SUBLANG_FRENCH_SWISS 
1551 #define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT 
1553 #ifndef SUBLANG_GERMAN 
1554 #define SUBLANG_GERMAN SUBLANG_DEFAULT 
1556 #ifndef SUBLANG_GERMAN_AUSTRIAN 
1557 #define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT 
1559 #ifndef SUBLANG_GERMAN_LIECHTENSTEIN 
1560 #define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT 
1562 #ifndef SUBLANG_GERMAN_LUXEMBOURG 
1563 #define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT 
1565 #ifndef SUBLANG_GERMAN_SWISS 
1566 #define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT 
1568 #ifndef SUBLANG_ITALIAN 
1569 #define SUBLANG_ITALIAN SUBLANG_DEFAULT 
1571 #ifndef SUBLANG_ITALIAN_SWISS 
1572 #define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT 
1574 #ifndef SUBLANG_KASHMIRI_INDIA 
1575 #define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT 
1577 #ifndef SUBLANG_KOREAN 
1578 #define SUBLANG_KOREAN SUBLANG_DEFAULT 
1580 #ifndef SUBLANG_LITHUANIAN 
1581 #define SUBLANG_LITHUANIAN SUBLANG_DEFAULT 
1583 #ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM 
1584 #define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT 
1586 #ifndef SUBLANG_MALAY_MALAYSIA 
1587 #define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT 
1589 #ifndef SUBLANG_NEPALI_INDIA 
1590 #define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT 
1592 #ifndef SUBLANG_NORWEGIAN_BOKMAL 
1593 #define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT 
1595 #ifndef SUBLANG_NORWEGIAN_NYNORSK 
1596 #define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT 
1598 #ifndef SUBLANG_PORTUGUESE 
1599 #define SUBLANG_PORTUGUESE SUBLANG_DEFAULT 
1601 #ifndef SUBLANG_PORTUGUESE_BRAZILIAN 
1602 #define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT 
1604 #ifndef SUBLANG_SERBIAN_CYRILLIC 
1605 #define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT 
1607 #ifndef SUBLANG_SERBIAN_LATIN 
1608 #define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT 
1610 #ifndef SUBLANG_SPANISH 
1611 #define SUBLANG_SPANISH SUBLANG_DEFAULT 
1613 #ifndef SUBLANG_SPANISH_ARGENTINA 
1614 #define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT 
1616 #ifndef SUBLANG_SPANISH_BOLIVIA 
1617 #define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT 
1619 #ifndef SUBLANG_SPANISH_CHILE 
1620 #define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT 
1622 #ifndef SUBLANG_SPANISH_COLOMBIA 
1623 #define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT 
1625 #ifndef SUBLANG_SPANISH_COSTA_RICA 
1626 #define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT 
1628 #ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC 
1629 #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT 
1631 #ifndef SUBLANG_SPANISH_ECUADOR 
1632 #define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT 
1634 #ifndef SUBLANG_SPANISH_EL_SALVADOR 
1635 #define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT 
1637 #ifndef SUBLANG_SPANISH_GUATEMALA 
1638 #define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT 
1640 #ifndef SUBLANG_SPANISH_HONDURAS 
1641 #define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT 
1643 #ifndef SUBLANG_SPANISH_MEXICAN 
1644 #define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT 
1646 #ifndef SUBLANG_SPANISH_MODERN 
1647 #define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT 
1649 #ifndef SUBLANG_SPANISH_NICARAGUA 
1650 #define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT 
1652 #ifndef SUBLANG_SPANISH_PANAMA 
1653 #define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT 
1655 #ifndef SUBLANG_SPANISH_PARAGUAY 
1656 #define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT 
1658 #ifndef SUBLANG_SPANISH_PERU 
1659 #define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT 
1661 #ifndef SUBLANG_SPANISH_PUERTO_RICO 
1662 #define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT 
1664 #ifndef SUBLANG_SPANISH_URUGUAY 
1665 #define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT 
1667 #ifndef SUBLANG_SPANISH_VENEZUELA 
1668 #define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT 
1670 #ifndef SUBLANG_SWEDISH 
1671 #define SUBLANG_SWEDISH SUBLANG_DEFAULT 
1673 #ifndef SUBLANG_SWEDISH_FINLAND 
1674 #define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT 
1676 #ifndef SUBLANG_URDU_INDIA 
1677 #define SUBLANG_URDU_INDIA SUBLANG_DEFAULT 
1679 #ifndef SUBLANG_URDU_PAKISTAN 
1680 #define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT 
1682 #ifndef SUBLANG_UZBEK_CYRILLIC 
1683 #define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT 
1685 #ifndef SUBLANG_UZBEK_LATIN 
1686 #define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT 
1692 #define LNG(wxlang, canonical, winlang, winsublang, desc) \ 
1693     info.Language = wxlang;                               \ 
1694     info.CanonicalName = wxT(canonical);                  \ 
1695     info.Description = desc;                              \ 
1696     SETWINLANG(info, winlang, winsublang)                 \ 
1699 void wxLocale::InitLanguagesDB() 
1701    wxLanguageInfo info
; 
1702    wxStringTokenizer tkn
; 
1704       LNG(wxLANGUAGE_ABKHAZIAN
,                  "ab"   , 0              , 0                                 , "Abkhazian") 
1705    LNG(wxLANGUAGE_AFAR
,                       "aa"   , 0              , 0                                 , "Afar") 
1706    LNG(wxLANGUAGE_AFRIKAANS
,                  "af_ZA", LANG_AFRIKAANS 
, SUBLANG_DEFAULT                   
, "Afrikaans") 
1707    LNG(wxLANGUAGE_ALBANIAN
,                   "sq_AL", LANG_ALBANIAN  
, SUBLANG_DEFAULT                   
, "Albanian") 
1708    LNG(wxLANGUAGE_AMHARIC
,                    "am"   , 0              , 0                                 , "Amharic") 
1709    LNG(wxLANGUAGE_ARABIC
,                     "ar"   , LANG_ARABIC    
, SUBLANG_DEFAULT                   
, "Arabic") 
1710    LNG(wxLANGUAGE_ARABIC_ALGERIA
,             "ar_DZ", LANG_ARABIC    
, SUBLANG_ARABIC_ALGERIA            
, "Arabic (Algeria)") 
1711    LNG(wxLANGUAGE_ARABIC_BAHRAIN
,             "ar_BH", LANG_ARABIC    
, SUBLANG_ARABIC_BAHRAIN            
, "Arabic (Bahrain)") 
1712    LNG(wxLANGUAGE_ARABIC_EGYPT
,               "ar_EG", LANG_ARABIC    
, SUBLANG_ARABIC_EGYPT              
, "Arabic (Egypt)") 
1713    LNG(wxLANGUAGE_ARABIC_IRAQ
,                "ar_IQ", LANG_ARABIC    
, SUBLANG_ARABIC_IRAQ               
, "Arabic (Iraq)") 
1714    LNG(wxLANGUAGE_ARABIC_JORDAN
,              "ar_JO", LANG_ARABIC    
, SUBLANG_ARABIC_JORDAN             
, "Arabic (Jordan)") 
1715    LNG(wxLANGUAGE_ARABIC_KUWAIT
,              "ar_KW", LANG_ARABIC    
, SUBLANG_ARABIC_KUWAIT             
, "Arabic (Kuwait)") 
1716    LNG(wxLANGUAGE_ARABIC_LEBANON
,             "ar_LB", LANG_ARABIC    
, SUBLANG_ARABIC_LEBANON            
, "Arabic (Lebanon)") 
1717    LNG(wxLANGUAGE_ARABIC_LIBYA
,               "ar_LY", LANG_ARABIC    
, SUBLANG_ARABIC_LIBYA              
, "Arabic (Libya)") 
1718    LNG(wxLANGUAGE_ARABIC_MOROCCO
,             "ar_MA", LANG_ARABIC    
, SUBLANG_ARABIC_MOROCCO            
, "Arabic (Morocco)") 
1719    LNG(wxLANGUAGE_ARABIC_OMAN
,                "ar_OM", LANG_ARABIC    
, SUBLANG_ARABIC_OMAN               
, "Arabic (Oman)") 
1720    LNG(wxLANGUAGE_ARABIC_QATAR
,               "ar_QA", LANG_ARABIC    
, SUBLANG_ARABIC_QATAR              
, "Arabic (Qatar)") 
1721    LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA
,        "ar_SA", LANG_ARABIC    
, SUBLANG_ARABIC_SAUDI_ARABIA       
, "Arabic (Saudi Arabia)") 
1722    LNG(wxLANGUAGE_ARABIC_SUDAN
,               "ar_SD", 0              , 0                                 , "Arabic (Sudan)") 
1723    LNG(wxLANGUAGE_ARABIC_SYRIA
,               "ar_SY", LANG_ARABIC    
, SUBLANG_ARABIC_SYRIA              
, "Arabic (Syria)") 
1724    LNG(wxLANGUAGE_ARABIC_TUNISIA
,             "ar_TN", LANG_ARABIC    
, SUBLANG_ARABIC_TUNISIA            
, "Arabic (Tunisia)") 
1725    LNG(wxLANGUAGE_ARABIC_UAE
,                 "ar_AE", LANG_ARABIC    
, SUBLANG_ARABIC_UAE                
, "Arabic (Uae)") 
1726    LNG(wxLANGUAGE_ARABIC_YEMEN
,               "ar_YE", LANG_ARABIC    
, SUBLANG_ARABIC_YEMEN              
, "Arabic (Yemen)") 
1727    LNG(wxLANGUAGE_ARMENIAN
,                   "hy"   , LANG_ARMENIAN  
, SUBLANG_DEFAULT                   
, "Armenian") 
1728    LNG(wxLANGUAGE_ASSAMESE
,                   "as"   , LANG_ASSAMESE  
, SUBLANG_DEFAULT                   
, "Assamese") 
1729    LNG(wxLANGUAGE_AYMARA
,                     "ay"   , 0              , 0                                 , "Aymara") 
1730    LNG(wxLANGUAGE_AZERI
,                      "az"   , LANG_AZERI     
, SUBLANG_DEFAULT                   
, "Azeri") 
1731    LNG(wxLANGUAGE_AZERI_CYRILLIC
,             "az"   , LANG_AZERI     
, SUBLANG_AZERI_CYRILLIC            
, "Azeri (Cyrillic)") 
1732    LNG(wxLANGUAGE_AZERI_LATIN
,                "az"   , LANG_AZERI     
, SUBLANG_AZERI_LATIN               
, "Azeri (Latin)") 
1733    LNG(wxLANGUAGE_BASHKIR
,                    "ba"   , 0              , 0                                 , "Bashkir") 
1734    LNG(wxLANGUAGE_BASQUE
,                     "eu_ES", LANG_BASQUE    
, SUBLANG_DEFAULT                   
, "Basque") 
1735    LNG(wxLANGUAGE_BELARUSIAN
,                 "be_BY", LANG_BELARUSIAN
, SUBLANG_DEFAULT                   
, "Belarusian") 
1736    LNG(wxLANGUAGE_BENGALI
,                    "bn"   , LANG_BENGALI   
, SUBLANG_DEFAULT                   
, "Bengali") 
1737    LNG(wxLANGUAGE_BHUTANI
,                    "dz"   , 0              , 0                                 , "Bhutani") 
1738    LNG(wxLANGUAGE_BIHARI
,                     "bh"   , 0              , 0                                 , "Bihari") 
1739    LNG(wxLANGUAGE_BISLAMA
,                    "bi"   , 0              , 0                                 , "Bislama") 
1740    LNG(wxLANGUAGE_BRETON
,                     "br"   , 0              , 0                                 , "Breton") 
1741    LNG(wxLANGUAGE_BULGARIAN
,                  "bg_BG", LANG_BULGARIAN 
, SUBLANG_DEFAULT                   
, "Bulgarian") 
1742    LNG(wxLANGUAGE_BURMESE
,                    "my"   , 0              , 0                                 , "Burmese") 
1743    LNG(wxLANGUAGE_CAMBODIAN
,                  "km"   , 0              , 0                                 , "Cambodian") 
1744    LNG(wxLANGUAGE_CATALAN
,                    "ca_ES", LANG_CATALAN   
, SUBLANG_DEFAULT                   
, "Catalan") 
1745    LNG(wxLANGUAGE_CHINESE
,                    "zh_CN", LANG_CHINESE   
, SUBLANG_DEFAULT                   
, "Chinese") 
1746    LNG(wxLANGUAGE_CHINESE_SIMPLIFIED
,         "zh_CN", LANG_CHINESE   
, SUBLANG_CHINESE_SIMPLIFIED        
, "Chinese (Simplified)") 
1747    LNG(wxLANGUAGE_CHINESE_TRADITIONAL
,        "zh_CN", LANG_CHINESE   
, SUBLANG_CHINESE_TRADITIONAL       
, "Chinese (Traditional)") 
1748    LNG(wxLANGUAGE_CHINESE_HONGKONG
,           "zh_HK", LANG_CHINESE   
, SUBLANG_CHINESE_HONGKONG          
, "Chinese (Hongkong)") 
1749    LNG(wxLANGUAGE_CHINESE_MACAU
,              "zh_MO", LANG_CHINESE   
, SUBLANG_CHINESE_MACAU             
, "Chinese (Macau)") 
1750    LNG(wxLANGUAGE_CHINESE_SINGAPORE
,          "zh_SG", LANG_CHINESE   
, SUBLANG_CHINESE_SINGAPORE         
, "Chinese (Singapore)") 
1751    LNG(wxLANGUAGE_CHINESE_TAIWAN
,             "zh_TW", 0              , 0                                 , "Chinese (Taiwan)") 
1752    LNG(wxLANGUAGE_CORSICAN
,                   "co"   , 0              , 0                                 , "Corsican") 
1753    LNG(wxLANGUAGE_CROATIAN
,                   "hr_HR", LANG_CROATIAN  
, SUBLANG_DEFAULT                   
, "Croatian") 
1754    LNG(wxLANGUAGE_CZECH
,                      "cs_CZ", LANG_CZECH     
, SUBLANG_DEFAULT                   
, "Czech") 
1755    LNG(wxLANGUAGE_DANISH
,                     "da_DK", LANG_DANISH    
, SUBLANG_DEFAULT                   
, "Danish") 
1756    LNG(wxLANGUAGE_DUTCH
,                      "nl_NL", LANG_DUTCH     
, SUBLANG_DUTCH                     
, "Dutch") 
1757    LNG(wxLANGUAGE_DUTCH_BELGIAN
,              "nl_BE", LANG_DUTCH     
, SUBLANG_DUTCH_BELGIAN             
, "Dutch (Belgian)") 
1758    LNG(wxLANGUAGE_ENGLISH
,                    "en_GB", LANG_ENGLISH   
, SUBLANG_ENGLISH_UK                
, "English") 
1759    LNG(wxLANGUAGE_ENGLISH_UK
,                 "en_GB", LANG_ENGLISH   
, SUBLANG_ENGLISH_UK                
, "English (U.K.)") 
1760    LNG(wxLANGUAGE_ENGLISH_US
,                 "en_US", LANG_ENGLISH   
, SUBLANG_ENGLISH_US                
, "English (U.S.)") 
1761    LNG(wxLANGUAGE_ENGLISH_AUSTRALIA
,          "en_AU", LANG_ENGLISH   
, SUBLANG_ENGLISH_AUS               
, "English (Australia)") 
1762    LNG(wxLANGUAGE_ENGLISH_BELIZE
,             "en_BZ", LANG_ENGLISH   
, SUBLANG_ENGLISH_BELIZE            
, "English (Belize)") 
1763    LNG(wxLANGUAGE_ENGLISH_BOTSWANA
,           "en_BW", 0              , 0                                 , "English (Botswana)") 
1764    LNG(wxLANGUAGE_ENGLISH_CANADA
,             "en_CA", LANG_ENGLISH   
, SUBLANG_ENGLISH_CAN               
, "English (Canada)") 
1765    LNG(wxLANGUAGE_ENGLISH_CARIBBEAN
,          "en_CB", LANG_ENGLISH   
, SUBLANG_ENGLISH_CARIBBEAN         
, "English (Caribbean)") 
1766    LNG(wxLANGUAGE_ENGLISH_DENMARK
,            "en_DK", 0              , 0                                 , "English (Denmark)") 
1767    LNG(wxLANGUAGE_ENGLISH_EIRE
,               "en_IE", LANG_ENGLISH   
, SUBLANG_ENGLISH_EIRE              
, "English (Eire)") 
1768    LNG(wxLANGUAGE_ENGLISH_JAMAICA
,            "en_JM", LANG_ENGLISH   
, SUBLANG_ENGLISH_JAMAICA           
, "English (Jamaica)") 
1769    LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND
,        "en_NZ", LANG_ENGLISH   
, SUBLANG_ENGLISH_NZ                
, "English (New Zealand)") 
1770    LNG(wxLANGUAGE_ENGLISH_PHILIPPINES
,        "en_PH", LANG_ENGLISH   
, SUBLANG_ENGLISH_PHILIPPINES       
, "English (Philippines)") 
1771    LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA
,       "en_ZA", LANG_ENGLISH   
, SUBLANG_ENGLISH_SOUTH_AFRICA      
, "English (South Africa)") 
1772    LNG(wxLANGUAGE_ENGLISH_TRINIDAD
,           "en_TT", LANG_ENGLISH   
, SUBLANG_ENGLISH_TRINIDAD          
, "English (Trinidad)") 
1773    LNG(wxLANGUAGE_ENGLISH_ZIMBABWE
,           "en_ZW", LANG_ENGLISH   
, SUBLANG_ENGLISH_ZIMBABWE          
, "English (Zimbabwe)") 
1774    LNG(wxLANGUAGE_ESPERANTO
,                  "eo"   , 0              , 0                                 , "Esperanto") 
1775    LNG(wxLANGUAGE_ESTONIAN
,                   "et_EE", LANG_ESTONIAN  
, SUBLANG_DEFAULT                   
, "Estonian") 
1776    LNG(wxLANGUAGE_FAEROESE
,                   "fo_FO", LANG_FAEROESE  
, SUBLANG_DEFAULT                   
, "Faeroese") 
1777    LNG(wxLANGUAGE_FARSI
,                      "fa_IR", LANG_FARSI     
, SUBLANG_DEFAULT                   
, "Farsi") 
1778    LNG(wxLANGUAGE_FIJI
,                       "fj"   , 0              , 0                                 , "Fiji") 
1779    LNG(wxLANGUAGE_FINNISH
,                    "fi_FI", LANG_FINNISH   
, SUBLANG_DEFAULT                   
, "Finnish") 
1780    LNG(wxLANGUAGE_FRENCH
,                     "fr_FR", LANG_FRENCH    
, SUBLANG_FRENCH                    
, "French") 
1781    LNG(wxLANGUAGE_FRENCH_BELGIAN
,             "fr_BE", LANG_FRENCH    
, SUBLANG_FRENCH_BELGIAN            
, "French (Belgian)") 
1782    LNG(wxLANGUAGE_FRENCH_CANADIAN
,            "fr_CA", LANG_FRENCH    
, SUBLANG_FRENCH_CANADIAN           
, "French (Canadian)") 
1783    LNG(wxLANGUAGE_FRENCH_LUXEMBOURG
,          "fr_LU", LANG_FRENCH    
, SUBLANG_FRENCH_LUXEMBOURG         
, "French (Luxembourg)") 
1784    LNG(wxLANGUAGE_FRENCH_MONACO
,              "fr_MC", LANG_FRENCH    
, SUBLANG_FRENCH_MONACO             
, "French (Monaco)") 
1785    LNG(wxLANGUAGE_FRENCH_SWISS
,               "fr_CH", LANG_FRENCH    
, SUBLANG_FRENCH_SWISS              
, "French (Swiss)") 
1786    LNG(wxLANGUAGE_FRISIAN
,                    "fy"   , 0              , 0                                 , "Frisian") 
1787    LNG(wxLANGUAGE_GALICIAN
,                   "gl_ES", 0              , 0                                 , "Galician") 
1788    LNG(wxLANGUAGE_GEORGIAN
,                   "ka"   , LANG_GEORGIAN  
, SUBLANG_DEFAULT                   
, "Georgian") 
1789    LNG(wxLANGUAGE_GERMAN
,                     "de_DE", LANG_GERMAN    
, SUBLANG_GERMAN                    
, "German") 
1790    LNG(wxLANGUAGE_GERMAN_AUSTRIAN
,            "de_AT", LANG_GERMAN    
, SUBLANG_GERMAN_AUSTRIAN           
, "German (Austrian)") 
1791    LNG(wxLANGUAGE_GERMAN_BELGIUM
,             "de_BE", 0              , 0                                 , "German (Belgium)") 
1792    LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN
,       "de_LI", LANG_GERMAN    
, SUBLANG_GERMAN_LIECHTENSTEIN      
, "German (Liechtenstein)") 
1793    LNG(wxLANGUAGE_GERMAN_LUXEMBOURG
,          "de_LU", LANG_GERMAN    
, SUBLANG_GERMAN_LUXEMBOURG         
, "German (Luxembourg)") 
1794    LNG(wxLANGUAGE_GERMAN_SWISS
,               "de_CH", LANG_GERMAN    
, SUBLANG_GERMAN_SWISS              
, "German (Swiss)") 
1795    LNG(wxLANGUAGE_GREEK
,                      "el_GR", LANG_GREEK     
, SUBLANG_DEFAULT                   
, "Greek") 
1796    LNG(wxLANGUAGE_GREENLANDIC
,                "kl_GL", 0              , 0                                 , "Greenlandic") 
1797    LNG(wxLANGUAGE_GUARANI
,                    "gn"   , 0              , 0                                 , "Guarani") 
1798    LNG(wxLANGUAGE_GUJARATI
,                   "gu"   , LANG_GUJARATI  
, SUBLANG_DEFAULT                   
, "Gujarati") 
1799    LNG(wxLANGUAGE_HAUSA
,                      "ha"   , 0              , 0                                 , "Hausa") 
1800    LNG(wxLANGUAGE_HEBREW
,                     "he_IL", LANG_HEBREW    
, SUBLANG_DEFAULT                   
, "Hebrew") 
1801    LNG(wxLANGUAGE_HINDI
,                      "hi_IN", LANG_HINDI     
, SUBLANG_DEFAULT                   
, "Hindi") 
1802    LNG(wxLANGUAGE_HUNGARIAN
,                  "hu_HU", LANG_HUNGARIAN 
, SUBLANG_DEFAULT                   
, "Hungarian") 
1803    LNG(wxLANGUAGE_ICELANDIC
,                  "is_IS", LANG_ICELANDIC 
, SUBLANG_DEFAULT                   
, "Icelandic") 
1804    LNG(wxLANGUAGE_INDONESIAN
,                 "id_ID", LANG_INDONESIAN
, SUBLANG_DEFAULT                   
, "Indonesian") 
1805    LNG(wxLANGUAGE_INTERLINGUA
,                "ia"   , 0              , 0                                 , "Interlingua") 
1806    LNG(wxLANGUAGE_INTERLINGUE
,                "ie"   , 0              , 0                                 , "Interlingue") 
1807    LNG(wxLANGUAGE_INUKTITUT
,                  "iu"   , 0              , 0                                 , "Inuktitut") 
1808    LNG(wxLANGUAGE_INUPIAK
,                    "ik"   , 0              , 0                                 , "Inupiak") 
1809    LNG(wxLANGUAGE_IRISH
,                      "ga_IE", 0              , 0                                 , "Irish") 
1810    LNG(wxLANGUAGE_ITALIAN
,                    "it_IT", LANG_ITALIAN   
, SUBLANG_ITALIAN                   
, "Italian") 
1811    LNG(wxLANGUAGE_ITALIAN_SWISS
,              "it_CH", LANG_ITALIAN   
, SUBLANG_ITALIAN_SWISS             
, "Italian (Swiss)") 
1812    LNG(wxLANGUAGE_JAPANESE
,                   "ja_JP", LANG_JAPANESE  
, SUBLANG_DEFAULT                   
, "Japanese") 
1813    LNG(wxLANGUAGE_JAVANESE
,                   "jw"   , 0              , 0                                 , "Javanese") 
1814    LNG(wxLANGUAGE_KANNADA
,                    "kn"   , LANG_KANNADA   
, SUBLANG_DEFAULT                   
, "Kannada") 
1815    LNG(wxLANGUAGE_KASHMIRI
,                   "ks"   , LANG_KASHMIRI  
, SUBLANG_DEFAULT                   
, "Kashmiri") 
1816    LNG(wxLANGUAGE_KASHMIRI_INDIA
,             "ks_IN", LANG_KASHMIRI  
, SUBLANG_KASHMIRI_INDIA            
, "Kashmiri (India)") 
1817    LNG(wxLANGUAGE_KAZAKH
,                     "kk"   , LANG_KAZAK     
, SUBLANG_DEFAULT                   
, "Kazakh") 
1818    LNG(wxLANGUAGE_KERNEWEK
,                   "kw_GB", 0              , 0                                 , "Kernewek") 
1819    LNG(wxLANGUAGE_KINYARWANDA
,                "rw"   , 0              , 0                                 , "Kinyarwanda") 
1820    LNG(wxLANGUAGE_KIRGHIZ
,                    "ky"   , 0              , 0                                 , "Kirghiz") 
1821    LNG(wxLANGUAGE_KIRUNDI
,                    "rn"   , 0              , 0                                 , "Kirundi") 
1822    LNG(wxLANGUAGE_KONKANI
,                    ""     , LANG_KONKANI   
, SUBLANG_DEFAULT                   
, "Konkani") 
1823    LNG(wxLANGUAGE_KOREAN
,                     "ko_KR", LANG_KOREAN    
, SUBLANG_KOREAN                    
, "Korean") 
1824    LNG(wxLANGUAGE_KURDISH
,                    "ku"   , 0              , 0                                 , "Kurdish") 
1825    LNG(wxLANGUAGE_LAOTHIAN
,                   "lo"   , 0              , 0                                 , "Laothian") 
1826    LNG(wxLANGUAGE_LATIN
,                      "la"   , 0              , 0                                 , "Latin") 
1827    LNG(wxLANGUAGE_LATVIAN
,                    "lv_LV", LANG_LATVIAN   
, SUBLANG_DEFAULT                   
, "Latvian") 
1828    LNG(wxLANGUAGE_LINGALA
,                    "ln"   , 0              , 0                                 , "Lingala") 
1829    LNG(wxLANGUAGE_LITHUANIAN
,                 "lt_LT", LANG_LITHUANIAN
, SUBLANG_LITHUANIAN                
, "Lithuanian") 
1830    LNG(wxLANGUAGE_MACEDONIAN
,                 "mk_MK", LANG_MACEDONIAN
, SUBLANG_DEFAULT                   
, "Macedonian") 
1831    LNG(wxLANGUAGE_MALAGASY
,                   "mg"   , 0              , 0                                 , "Malagasy") 
1832    LNG(wxLANGUAGE_MALAY
,                      "ms_MY", LANG_MALAY     
, SUBLANG_DEFAULT                   
, "Malay") 
1833    LNG(wxLANGUAGE_MALAYALAM
,                  "ml"   , LANG_MALAYALAM 
, SUBLANG_DEFAULT                   
, "Malayalam") 
1834    LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM
,    "ms_BN", LANG_MALAY     
, SUBLANG_MALAY_BRUNEI_DARUSSALAM   
, "Malay (Brunei Darussalam)") 
1835    LNG(wxLANGUAGE_MALAY_MALAYSIA
,             "ms_MY", LANG_MALAY     
, SUBLANG_MALAY_MALAYSIA            
, "Malay (Malaysia)") 
1836    LNG(wxLANGUAGE_MALTESE
,                    "mt_MT", 0              , 0                                 , "Maltese") 
1837    LNG(wxLANGUAGE_MANIPURI
,                   ""     , LANG_MANIPURI  
, SUBLANG_DEFAULT                   
, "Manipuri") 
1838    LNG(wxLANGUAGE_MAORI
,                      "mi"   , 0              , 0                                 , "Maori") 
1839    LNG(wxLANGUAGE_MARATHI
,                    "mr_IN", LANG_MARATHI   
, SUBLANG_DEFAULT                   
, "Marathi") 
1840    LNG(wxLANGUAGE_MOLDAVIAN
,                  "mo"   , 0              , 0                                 , "Moldavian") 
1841    LNG(wxLANGUAGE_MONGOLIAN
,                  "mn"   , 0              , 0                                 , "Mongolian") 
1842    LNG(wxLANGUAGE_NAURU
,                      "na"   , 0              , 0                                 , "Nauru") 
1843    LNG(wxLANGUAGE_NEPALI
,                     "ne"   , LANG_NEPALI    
, SUBLANG_DEFAULT                   
, "Nepali") 
1844    LNG(wxLANGUAGE_NEPALI_INDIA
,               "ne_IN", LANG_NEPALI    
, SUBLANG_NEPALI_INDIA              
, "Nepali (India)") 
1845    LNG(wxLANGUAGE_NORWEGIAN_BOKMAL
,           "no_NO", LANG_NORWEGIAN 
, SUBLANG_NORWEGIAN_BOKMAL          
, "Norwegian (Bokmal)") 
1846    LNG(wxLANGUAGE_NORWEGIAN_NYNORSK
,          "nn_NO", LANG_NORWEGIAN 
, SUBLANG_NORWEGIAN_NYNORSK         
, "Norwegian (Nynorsk)") 
1847    LNG(wxLANGUAGE_OCCITAN
,                    "oc"   , 0              , 0                                 , "Occitan") 
1848    LNG(wxLANGUAGE_ORIYA
,                      "or"   , LANG_ORIYA     
, SUBLANG_DEFAULT                   
, "Oriya") 
1849    LNG(wxLANGUAGE_OROMO
,                      "om"   , 0              , 0                                 , "(Afan) Oromo") 
1850    LNG(wxLANGUAGE_PASHTO
,                     "ps"   , 0              , 0                                 , "Pashto, Pushto") 
1851    LNG(wxLANGUAGE_POLISH
,                     "pl_PL", LANG_POLISH    
, SUBLANG_DEFAULT                   
, "Polish") 
1852    LNG(wxLANGUAGE_PORTUGUESE
,                 "pt_PT", LANG_PORTUGUESE
, SUBLANG_PORTUGUESE                
, "Portuguese") 
1853    LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN
,       "pt_BR", LANG_PORTUGUESE
, SUBLANG_PORTUGUESE_BRAZILIAN      
, "Portuguese (Brazilian)") 
1854    LNG(wxLANGUAGE_PUNJABI
,                    "pa"   , LANG_PUNJABI   
, SUBLANG_DEFAULT                   
, "Punjabi") 
1855    LNG(wxLANGUAGE_QUECHUA
,                    "qu"   , 0              , 0                                 , "Quechua") 
1856    LNG(wxLANGUAGE_RHAETO_ROMANCE
,             "rm"   , 0              , 0                                 , "Rhaeto-Romance") 
1857    LNG(wxLANGUAGE_ROMANIAN
,                   "ro_RO", LANG_ROMANIAN  
, SUBLANG_DEFAULT                   
, "Romanian") 
1858    LNG(wxLANGUAGE_RUSSIAN
,                    "ru_RU", LANG_RUSSIAN   
, SUBLANG_DEFAULT                   
, "Russian") 
1859    LNG(wxLANGUAGE_RUSSIAN_UKRAINE
,            "ru_UA", 0              , 0                                 , "Russian (Ukraine)") 
1860    LNG(wxLANGUAGE_SAMOAN
,                     "sm"   , 0              , 0                                 , "Samoan") 
1861    LNG(wxLANGUAGE_SANGHO
,                     "sg"   , 0              , 0                                 , "Sangho") 
1862    LNG(wxLANGUAGE_SANSKRIT
,                   "sa"   , LANG_SANSKRIT  
, SUBLANG_DEFAULT                   
, "Sanskrit") 
1863    LNG(wxLANGUAGE_SCOTS_GAELIC
,               "gd"   , 0              , 0                                 , "Scots Gaelic") 
1864    LNG(wxLANGUAGE_SERBIAN
,                    "sr_YU", LANG_SERBIAN   
, SUBLANG_DEFAULT                   
, "Serbian") 
1865    LNG(wxLANGUAGE_SERBIAN_CYRILLIC
,           "sr_YU", LANG_SERBIAN   
, SUBLANG_SERBIAN_CYRILLIC          
, "Serbian (Cyrillic)") 
1866    LNG(wxLANGUAGE_SERBIAN_LATIN
,              "sr_YU", LANG_SERBIAN   
, SUBLANG_SERBIAN_LATIN             
, "Serbian (Latin)") 
1867    LNG(wxLANGUAGE_SERBO_CROATIAN
,             "sh"   , 0              , 0                                 , "Serbo-Croatian") 
1868    LNG(wxLANGUAGE_SESOTHO
,                    "st"   , 0              , 0                                 , "Sesotho") 
1869    LNG(wxLANGUAGE_SETSWANA
,                   "tn"   , 0              , 0                                 , "Setswana") 
1870    LNG(wxLANGUAGE_SHONA
,                      "sn"   , 0              , 0                                 , "Shona") 
1871    LNG(wxLANGUAGE_SINDHI
,                     "sd"   , LANG_SINDHI    
, SUBLANG_DEFAULT                   
, "Sindhi") 
1872    LNG(wxLANGUAGE_SINHALESE
,                  "si"   , 0              , 0                                 , "Sinhalese") 
1873    LNG(wxLANGUAGE_SISWATI
,                    "ss"   , 0              , 0                                 , "Siswati") 
1874    LNG(wxLANGUAGE_SLOVAK
,                     "sk_SK", LANG_SLOVAK    
, SUBLANG_DEFAULT                   
, "Slovak") 
1875    LNG(wxLANGUAGE_SLOVENIAN
,                  "sl_SI", LANG_SLOVENIAN 
, SUBLANG_DEFAULT                   
, "Slovenian") 
1876    LNG(wxLANGUAGE_SOMALI
,                     "so"   , 0              , 0                                 , "Somali") 
1877    LNG(wxLANGUAGE_SPANISH
,                    "es_ES", LANG_SPANISH   
, SUBLANG_SPANISH                   
, "Spanish") 
1878    LNG(wxLANGUAGE_SPANISH_ARGENTINA
,          "es_AR", LANG_SPANISH   
, SUBLANG_SPANISH_ARGENTINA         
, "Spanish (Argentina)") 
1879    LNG(wxLANGUAGE_SPANISH_BOLIVIA
,            "es_BO", LANG_SPANISH   
, SUBLANG_SPANISH_BOLIVIA           
, "Spanish (Bolivia)") 
1880    LNG(wxLANGUAGE_SPANISH_CHILE
,              "es_CL", LANG_SPANISH   
, SUBLANG_SPANISH_CHILE             
, "Spanish (Chile)") 
1881    LNG(wxLANGUAGE_SPANISH_COLOMBIA
,           "es_CO", LANG_SPANISH   
, SUBLANG_SPANISH_COLOMBIA          
, "Spanish (Colombia)") 
1882    LNG(wxLANGUAGE_SPANISH_COSTA_RICA
,         "es_CR", LANG_SPANISH   
, SUBLANG_SPANISH_COSTA_RICA        
, "Spanish (Costa Rica)") 
1883    LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC
, "es_DO", LANG_SPANISH   
, SUBLANG_SPANISH_DOMINICAN_REPUBLIC
, "Spanish (Dominican republic)") 
1884    LNG(wxLANGUAGE_SPANISH_ECUADOR
,            "es_EC", LANG_SPANISH   
, SUBLANG_SPANISH_ECUADOR           
, "Spanish (Ecuador)") 
1885    LNG(wxLANGUAGE_SPANISH_EL_SALVADOR
,        "es_SV", LANG_SPANISH   
, SUBLANG_SPANISH_EL_SALVADOR       
, "Spanish (El Salvador)") 
1886    LNG(wxLANGUAGE_SPANISH_GUATEMALA
,          "es_GT", LANG_SPANISH   
, SUBLANG_SPANISH_GUATEMALA         
, "Spanish (Guatemala)") 
1887    LNG(wxLANGUAGE_SPANISH_HONDURAS
,           "es_HN", LANG_SPANISH   
, SUBLANG_SPANISH_HONDURAS          
, "Spanish (Honduras)") 
1888    LNG(wxLANGUAGE_SPANISH_MEXICAN
,            "es_MX", LANG_SPANISH   
, SUBLANG_SPANISH_MEXICAN           
, "Spanish (Mexican)") 
1889    LNG(wxLANGUAGE_SPANISH_MODERN
,             "es_ES", LANG_SPANISH   
, SUBLANG_SPANISH_MODERN            
, "Spanish (Modern)") 
1890    LNG(wxLANGUAGE_SPANISH_NICARAGUA
,          "es_NI", LANG_SPANISH   
, SUBLANG_SPANISH_NICARAGUA         
, "Spanish (Nicaragua)") 
1891    LNG(wxLANGUAGE_SPANISH_PANAMA
,             "es_PA", LANG_SPANISH   
, SUBLANG_SPANISH_PANAMA            
, "Spanish (Panama)") 
1892    LNG(wxLANGUAGE_SPANISH_PARAGUAY
,           "es_PY", LANG_SPANISH   
, SUBLANG_SPANISH_PARAGUAY          
, "Spanish (Paraguay)") 
1893    LNG(wxLANGUAGE_SPANISH_PERU
,               "es_PE", LANG_SPANISH   
, SUBLANG_SPANISH_PERU              
, "Spanish (Peru)") 
1894    LNG(wxLANGUAGE_SPANISH_PUERTO_RICO
,        "es_PR", LANG_SPANISH   
, SUBLANG_SPANISH_PUERTO_RICO       
, "Spanish (Puerto Rico)") 
1895    LNG(wxLANGUAGE_SPANISH_URUGUAY
,            "es_UY", LANG_SPANISH   
, SUBLANG_SPANISH_URUGUAY           
, "Spanish (Uruguay)") 
1896    LNG(wxLANGUAGE_SPANISH_US
,                 "es_US", 0              , 0                                 , "Spanish (U.S.)") 
1897    LNG(wxLANGUAGE_SPANISH_VENEZUELA
,          "es_VE", LANG_SPANISH   
, SUBLANG_SPANISH_VENEZUELA         
, "Spanish (Venezuela)") 
1898    LNG(wxLANGUAGE_SUNDANESE
,                  "su"   , 0              , 0                                 , "Sundanese") 
1899    LNG(wxLANGUAGE_SWAHILI
,                    "sw_KE", LANG_SWAHILI   
, SUBLANG_DEFAULT                   
, "Swahili") 
1900    LNG(wxLANGUAGE_SWEDISH
,                    "sv_SE", LANG_SWEDISH   
, SUBLANG_SWEDISH                   
, "Swedish") 
1901    LNG(wxLANGUAGE_SWEDISH_FINLAND
,            "sv_FI", LANG_SWEDISH   
, SUBLANG_SWEDISH_FINLAND           
, "Swedish (Finland)") 
1902    LNG(wxLANGUAGE_TAGALOG
,                    "tl"   , 0              , 0                                 , "Tagalog") 
1903    LNG(wxLANGUAGE_TAJIK
,                      "tg"   , 0              , 0                                 , "Tajik") 
1904    LNG(wxLANGUAGE_TAMIL
,                      "ta"   , LANG_TAMIL     
, SUBLANG_DEFAULT                   
, "Tamil") 
1905    LNG(wxLANGUAGE_TATAR
,                      "tt"   , LANG_TATAR     
, SUBLANG_DEFAULT                   
, "Tatar") 
1906    LNG(wxLANGUAGE_TELUGU
,                     "te"   , LANG_TELUGU    
, SUBLANG_DEFAULT                   
, "Telugu") 
1907    LNG(wxLANGUAGE_THAI
,                       "th_TH", LANG_THAI      
, SUBLANG_DEFAULT                   
, "Thai") 
1908    LNG(wxLANGUAGE_TIBETAN
,                    "bo"   , 0              , 0                                 , "Tibetan") 
1909    LNG(wxLANGUAGE_TIGRINYA
,                   "ti"   , 0              , 0                                 , "Tigrinya") 
1910    LNG(wxLANGUAGE_TONGA
,                      "to"   , 0              , 0                                 , "Tonga") 
1911    LNG(wxLANGUAGE_TSONGA
,                     "ts"   , 0              , 0                                 , "Tsonga") 
1912    LNG(wxLANGUAGE_TURKISH
,                    "tr_TR", LANG_TURKISH   
, SUBLANG_DEFAULT                   
, "Turkish") 
1913    LNG(wxLANGUAGE_TURKMEN
,                    "tk"   , 0              , 0                                 , "Turkmen") 
1914    LNG(wxLANGUAGE_TWI
,                        "tw"   , 0              , 0                                 , "Twi") 
1915    LNG(wxLANGUAGE_UIGHUR
,                     "ug"   , 0              , 0                                 , "Uighur") 
1916    LNG(wxLANGUAGE_UKRAINIAN
,                  "uk_UA", LANG_UKRAINIAN 
, SUBLANG_DEFAULT                   
, "Ukrainian") 
1917    LNG(wxLANGUAGE_URDU
,                       "ur"   , LANG_URDU      
, SUBLANG_DEFAULT                   
, "Urdu") 
1918    LNG(wxLANGUAGE_URDU_INDIA
,                 "ur_IN", LANG_URDU      
, SUBLANG_URDU_INDIA                
, "Urdu (India)") 
1919    LNG(wxLANGUAGE_URDU_PAKISTAN
,              "ur_PK", LANG_URDU      
, SUBLANG_URDU_PAKISTAN             
, "Urdu (Pakistan)") 
1920    LNG(wxLANGUAGE_UZBEK
,                      "uz"   , LANG_UZBEK     
, SUBLANG_DEFAULT                   
, "Uzbek") 
1921    LNG(wxLANGUAGE_UZBEK_CYRILLIC
,             "uz"   , LANG_UZBEK     
, SUBLANG_UZBEK_CYRILLIC            
, "Uzbek (Cyrillic)") 
1922    LNG(wxLANGUAGE_UZBEK_LATIN
,                "uz"   , LANG_UZBEK     
, SUBLANG_UZBEK_LATIN               
, "Uzbek (Latin)") 
1923    LNG(wxLANGUAGE_VIETNAMESE
,                 "vi_VN", LANG_VIETNAMESE
, SUBLANG_DEFAULT                   
, "Vietnamese") 
1924    LNG(wxLANGUAGE_VOLAPUK
,                    "vo"   , 0              , 0                                 , "Volapuk") 
1925    LNG(wxLANGUAGE_WELSH
,                      "cy"   , 0              , 0                                 , "Welsh") 
1926    LNG(wxLANGUAGE_WOLOF
,                      "wo"   , 0              , 0                                 , "Wolof") 
1927    LNG(wxLANGUAGE_XHOSA
,                      "xh"   , 0              , 0                                 , "Xhosa") 
1928    LNG(wxLANGUAGE_YIDDISH
,                    "yi"   , 0              , 0                                 , "Yiddish") 
1929    LNG(wxLANGUAGE_YORUBA
,                     "yo"   , 0              , 0                                 , "Yoruba") 
1930    LNG(wxLANGUAGE_ZHUANG
,                     "za"   , 0              , 0                                 , "Zhuang") 
1931    LNG(wxLANGUAGE_ZULU
,                       "zu"   , 0              , 0                                 , "Zulu") 
1936 // --- --- --- generated code ends here --- --- --- 
1940 #endif // wxUSE_INTL