1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/common/intl.cpp 
   3 // Purpose:     Internationalization and localisation for wxWidgets 
   4 // Author:      Vadim Zeitlin 
   5 // Modified by: Michael N. Filippov <michael@idisys.iae.nsk.su> 
   6 //              (2003/09/30 - PluralForms support) 
   9 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> 
  10 // Licence:     wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////////// 
  13 // ============================================================================ 
  15 // ============================================================================ 
  17 // ---------------------------------------------------------------------------- 
  19 // ---------------------------------------------------------------------------- 
  21 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  22     #pragma implementation "intl.h" 
  25 #if defined(__BORLAND__) && !defined(__WXDEBUG__) 
  26     // There's a bug in Borland's compiler that breaks wxLocale with -O2, 
  27     // so make sure that flag is not used for this file: 
  32 // The following define is needed by Innotek's libc to 
  33 // make the definition of struct localeconv available. 
  34 #define __INTERNAL_DEFS 
  37 // For compilers that support precompilation, includes "wx.h". 
  38 #include "wx/wxprec.h" 
  54 #ifdef HAVE_LANGINFO_H 
  60     #include "wx/string.h" 
  65     #include "wx/dynarray.h" 
  69     #include "wx/msw/private.h" 
  70 #elif defined(__UNIX_LIKE__) 
  71     #include "wx/fontmap.h"         // for CharsetToEncoding() 
  75 #include "wx/tokenzr.h" 
  76 #include "wx/module.h" 
  77 #include "wx/fontmap.h" 
  78 #include "wx/encconv.h" 
  79 #include "wx/hashmap.h" 
  80 #include "wx/ptr_scpd.h" 
  82 #if defined(__WXMAC__) 
  83   #include  "wx/mac/private.h"  // includes mac headers 
  86 // ---------------------------------------------------------------------------- 
  88 // ---------------------------------------------------------------------------- 
  90 // this should *not* be wxChar, this type must have exactly 8 bits! 
  91 typedef wxUint8 size_t8
; 
  92 typedef wxUint32 size_t32
; 
  94 // ---------------------------------------------------------------------------- 
  96 // ---------------------------------------------------------------------------- 
  98 // magic number identifying the .mo format file 
  99 const size_t32 MSGCATALOG_MAGIC    
= 0x950412de; 
 100 const size_t32 MSGCATALOG_MAGIC_SW 
= 0xde120495; 
 102 // extension of ".mo" files 
 103 #define MSGCATALOG_EXTENSION  _T(".mo") 
 105 // the constants describing the format of lang_LANG locale string 
 106 static const size_t LEN_LANG 
= 2; 
 107 static const size_t LEN_SUBLANG 
= 2; 
 108 static const size_t LEN_FULL 
= LEN_LANG 
+ 1 + LEN_SUBLANG
; // 1 for '_' 
 110 // ---------------------------------------------------------------------------- 
 112 // ---------------------------------------------------------------------------- 
 116 // small class to suppress the translation erros until exit from current scope 
 120     NoTransErr() { ms_suppressCount
++; } 
 121    ~NoTransErr() { ms_suppressCount
--;  } 
 123    static bool Suppress() { return ms_suppressCount 
> 0; } 
 126    static size_t ms_suppressCount
; 
 129 size_t NoTransErr::ms_suppressCount 
= 0; 
 140 #endif // Debug/!Debug 
 142 static wxLocale 
*wxSetLocale(wxLocale 
*pLocale
); 
 144 // helper functions of GetSystemLanguage() 
 147 // get just the language part 
 148 static inline wxString 
ExtractLang(const wxString
& langFull
) 
 150     return langFull
.Left(LEN_LANG
); 
 153 // get everything else (including the leading '_') 
 154 static inline wxString 
ExtractNotLang(const wxString
& langFull
) 
 156     return langFull
.Mid(LEN_LANG
); 
 162 // ---------------------------------------------------------------------------- 
 163 // Plural forms parser 
 164 // ---------------------------------------------------------------------------- 
 170     LogicalOrExpression '?' Expression ':' Expression 
 174     LogicalAndExpression "||" LogicalOrExpression   // to (a || b) || c 
 177 LogicalAndExpression: 
 178     EqualityExpression "&&" LogicalAndExpression    // to (a && b) && c 
 182     RelationalExpression "==" RelationalExperession 
 183     RelationalExpression "!=" RelationalExperession 
 186 RelationalExpression: 
 187     MultiplicativeExpression '>' MultiplicativeExpression 
 188     MultiplicativeExpression '<' MultiplicativeExpression 
 189     MultiplicativeExpression ">=" MultiplicativeExpression 
 190     MultiplicativeExpression "<=" MultiplicativeExpression 
 191     MultiplicativeExpression 
 193 MultiplicativeExpression: 
 194     PmExpression '%' PmExpression 
 203 class wxPluralFormsToken
 
 208         T_ERROR
, T_EOF
, T_NUMBER
, T_N
, T_PLURAL
, T_NPLURALS
, T_EQUAL
, T_ASSIGN
, 
 209         T_GREATER
, T_GREATER_OR_EQUAL
, T_LESS
, T_LESS_OR_EQUAL
, 
 210         T_REMINDER
, T_NOT_EQUAL
, 
 211         T_LOGICAL_AND
, T_LOGICAL_OR
, T_QUESTION
, T_COLON
, T_SEMICOLON
, 
 212         T_LEFT_BRACKET
, T_RIGHT_BRACKET
 
 214     Type 
type() const { return m_type
; } 
 215     void setType(Type type
) { m_type 
= type
; } 
 218     Number 
number() const { return m_number
; } 
 219     void setNumber(Number num
) { m_number 
= num
; } 
 226 class wxPluralFormsScanner
 
 229     wxPluralFormsScanner(const char* s
); 
 230     const wxPluralFormsToken
& token() const { return m_token
; } 
 231     bool nextToken();  // returns false if error 
 234     wxPluralFormsToken m_token
; 
 237 wxPluralFormsScanner::wxPluralFormsScanner(const char* s
) : m_s(s
) 
 242 bool wxPluralFormsScanner::nextToken() 
 244     wxPluralFormsToken::Type type 
= wxPluralFormsToken::T_ERROR
; 
 245     while (isspace(*m_s
)) 
 251         type 
= wxPluralFormsToken::T_EOF
; 
 253     else if (isdigit(*m_s
)) 
 255         wxPluralFormsToken::Number number 
= *m_s
++ - '0'; 
 256         while (isdigit(*m_s
)) 
 258             number 
= number 
* 10 + (*m_s
++ - '0'); 
 260         m_token
.setNumber(number
); 
 261         type 
= wxPluralFormsToken::T_NUMBER
; 
 263     else if (isalpha(*m_s
)) 
 265         const char* begin 
= m_s
++; 
 266         while (isalnum(*m_s
)) 
 270         size_t size 
= m_s 
- begin
; 
 271         if (size 
== 1 && memcmp(begin
, "n", size
) == 0) 
 273             type 
= wxPluralFormsToken::T_N
; 
 275         else if (size 
== 6 && memcmp(begin
, "plural", size
) == 0) 
 277             type 
= wxPluralFormsToken::T_PLURAL
; 
 279         else if (size 
== 8 && memcmp(begin
, "nplurals", size
) == 0) 
 281             type 
= wxPluralFormsToken::T_NPLURALS
; 
 284     else if (*m_s 
== '=') 
 290             type 
= wxPluralFormsToken::T_EQUAL
; 
 294             type 
= wxPluralFormsToken::T_ASSIGN
; 
 297     else if (*m_s 
== '>') 
 303             type 
= wxPluralFormsToken::T_GREATER_OR_EQUAL
; 
 307             type 
= wxPluralFormsToken::T_GREATER
; 
 310     else if (*m_s 
== '<') 
 316             type 
= wxPluralFormsToken::T_LESS_OR_EQUAL
; 
 320             type 
= wxPluralFormsToken::T_LESS
; 
 323     else if (*m_s 
== '%') 
 326         type 
= wxPluralFormsToken::T_REMINDER
; 
 328     else if (*m_s 
== '!' && m_s
[1] == '=') 
 331         type 
= wxPluralFormsToken::T_NOT_EQUAL
; 
 333     else if (*m_s 
== '&' && m_s
[1] == '&') 
 336         type 
= wxPluralFormsToken::T_LOGICAL_AND
; 
 338     else if (*m_s 
== '|' && m_s
[1] == '|') 
 341         type 
= wxPluralFormsToken::T_LOGICAL_OR
; 
 343     else if (*m_s 
== '?') 
 346         type 
= wxPluralFormsToken::T_QUESTION
; 
 348     else if (*m_s 
== ':') 
 351         type 
= wxPluralFormsToken::T_COLON
; 
 352     } else if (*m_s 
== ';') { 
 354         type 
= wxPluralFormsToken::T_SEMICOLON
; 
 356     else if (*m_s 
== '(') 
 359         type 
= wxPluralFormsToken::T_LEFT_BRACKET
; 
 361     else if (*m_s 
== ')') 
 364         type 
= wxPluralFormsToken::T_RIGHT_BRACKET
; 
 366     m_token
.setType(type
); 
 367     return type 
!= wxPluralFormsToken::T_ERROR
; 
 370 class wxPluralFormsNode
; 
 372 // NB: Can't use wxDEFINE_SCOPED_PTR_TYPE because wxPluralFormsNode is not 
 373 //     fully defined yet: 
 374 class wxPluralFormsNodePtr
 
 377     wxPluralFormsNodePtr(wxPluralFormsNode 
*p 
= NULL
) : m_p(p
) {} 
 378     ~wxPluralFormsNodePtr(); 
 379     wxPluralFormsNode
& operator*() const { return *m_p
; } 
 380     wxPluralFormsNode
* operator->() const { return m_p
; } 
 381     wxPluralFormsNode
* get() const { return m_p
; } 
 382     wxPluralFormsNode
* release(); 
 383     void reset(wxPluralFormsNode 
*p
); 
 386     wxPluralFormsNode 
*m_p
; 
 389 class wxPluralFormsNode
 
 392     wxPluralFormsNode(const wxPluralFormsToken
& token
) : m_token(token
) {} 
 393     const wxPluralFormsToken
& token() const { return m_token
; } 
 394     const wxPluralFormsNode
* node(size_t i
) const 
 395         { return m_nodes
[i
].get(); } 
 396     void setNode(size_t i
, wxPluralFormsNode
* n
); 
 397     wxPluralFormsNode
* releaseNode(size_t i
); 
 398     wxPluralFormsToken::Number 
evaluate(wxPluralFormsToken::Number n
) const; 
 401     wxPluralFormsToken m_token
; 
 402     wxPluralFormsNodePtr m_nodes
[3]; 
 405 wxPluralFormsNodePtr::~wxPluralFormsNodePtr() 
 409 wxPluralFormsNode
* wxPluralFormsNodePtr::release() 
 411     wxPluralFormsNode 
*p 
= m_p
; 
 415 void wxPluralFormsNodePtr::reset(wxPluralFormsNode 
*p
) 
 425 void wxPluralFormsNode::setNode(size_t i
, wxPluralFormsNode
* n
) 
 430 wxPluralFormsNode
*  wxPluralFormsNode::releaseNode(size_t i
) 
 432     return m_nodes
[i
].release(); 
 435 wxPluralFormsToken::Number
 
 436 wxPluralFormsNode::evaluate(wxPluralFormsToken::Number n
) const 
 438     switch (token().type()) 
 441         case wxPluralFormsToken::T_NUMBER
: 
 442             return token().number(); 
 443         case wxPluralFormsToken::T_N
: 
 446         case wxPluralFormsToken::T_EQUAL
: 
 447             return node(0)->evaluate(n
) == node(1)->evaluate(n
); 
 448         case wxPluralFormsToken::T_NOT_EQUAL
: 
 449             return node(0)->evaluate(n
) != node(1)->evaluate(n
); 
 450         case wxPluralFormsToken::T_GREATER
: 
 451             return node(0)->evaluate(n
) > node(1)->evaluate(n
); 
 452         case wxPluralFormsToken::T_GREATER_OR_EQUAL
: 
 453             return node(0)->evaluate(n
) >= node(1)->evaluate(n
); 
 454         case wxPluralFormsToken::T_LESS
: 
 455             return node(0)->evaluate(n
) < node(1)->evaluate(n
); 
 456         case wxPluralFormsToken::T_LESS_OR_EQUAL
: 
 457             return node(0)->evaluate(n
) <= node(1)->evaluate(n
); 
 458         case wxPluralFormsToken::T_REMINDER
: 
 460                 wxPluralFormsToken::Number number 
= node(1)->evaluate(n
); 
 463                     return node(0)->evaluate(n
) % number
; 
 470         case wxPluralFormsToken::T_LOGICAL_AND
: 
 471             return node(0)->evaluate(n
) && node(1)->evaluate(n
); 
 472         case wxPluralFormsToken::T_LOGICAL_OR
: 
 473             return node(0)->evaluate(n
) || node(1)->evaluate(n
); 
 475         case wxPluralFormsToken::T_QUESTION
: 
 476             return node(0)->evaluate(n
) 
 477                 ? node(1)->evaluate(n
) 
 478                 : node(2)->evaluate(n
); 
 485 class wxPluralFormsCalculator
 
 488     wxPluralFormsCalculator() : m_nplurals(0), m_plural(0) {} 
 490     // input: number, returns msgstr index 
 491     int evaluate(int n
) const; 
 493     // input: text after "Plural-Forms:" (e.g. "nplurals=2; plural=(n != 1);"), 
 494     // if s == 0, creates default handler 
 495     // returns 0 if error 
 496     static wxPluralFormsCalculator
* make(const char* s 
= 0); 
 498     ~wxPluralFormsCalculator() {} 
 500     void  init(wxPluralFormsToken::Number nplurals
, wxPluralFormsNode
* plural
); 
 501     wxString 
getString() const; 
 504     wxPluralFormsToken::Number m_nplurals
; 
 505     wxPluralFormsNodePtr m_plural
; 
 508 wxDEFINE_SCOPED_PTR_TYPE(wxPluralFormsCalculator
); 
 510 void wxPluralFormsCalculator::init(wxPluralFormsToken::Number nplurals
, 
 511                                    wxPluralFormsNode
* plural
) 
 513     m_nplurals 
= nplurals
; 
 514     m_plural
.reset(plural
); 
 517 int wxPluralFormsCalculator::evaluate(int n
) const 
 519     if (m_plural
.get() == 0) 
 523     wxPluralFormsToken::Number number 
= m_plural
->evaluate(n
); 
 524     if (number 
< 0 || number 
> m_nplurals
) 
 532 class wxPluralFormsParser
 
 535     wxPluralFormsParser(wxPluralFormsScanner
& scanner
) : m_scanner(scanner
) {} 
 536     bool parse(wxPluralFormsCalculator
& rCalculator
); 
 539     wxPluralFormsNode
* parsePlural(); 
 540     // stops at T_SEMICOLON, returns 0 if error 
 541     wxPluralFormsScanner
& m_scanner
; 
 542     const wxPluralFormsToken
& token() const; 
 545     wxPluralFormsNode
* expression(); 
 546     wxPluralFormsNode
* logicalOrExpression(); 
 547     wxPluralFormsNode
* logicalAndExpression(); 
 548     wxPluralFormsNode
* equalityExpression(); 
 549     wxPluralFormsNode
* multiplicativeExpression(); 
 550     wxPluralFormsNode
* relationalExpression(); 
 551     wxPluralFormsNode
* pmExpression(); 
 554 bool wxPluralFormsParser::parse(wxPluralFormsCalculator
& rCalculator
) 
 556     if (token().type() != wxPluralFormsToken::T_NPLURALS
) 
 560     if (token().type() != wxPluralFormsToken::T_ASSIGN
) 
 564     if (token().type() != wxPluralFormsToken::T_NUMBER
) 
 566     wxPluralFormsToken::Number nplurals 
= token().number(); 
 569     if (token().type() != wxPluralFormsToken::T_SEMICOLON
) 
 573     if (token().type() != wxPluralFormsToken::T_PLURAL
) 
 577     if (token().type() != wxPluralFormsToken::T_ASSIGN
) 
 581     wxPluralFormsNode
* plural 
= parsePlural(); 
 584     if (token().type() != wxPluralFormsToken::T_SEMICOLON
) 
 588     if (token().type() != wxPluralFormsToken::T_EOF
) 
 590     rCalculator
.init(nplurals
, plural
); 
 594 wxPluralFormsNode
* wxPluralFormsParser::parsePlural() 
 596     wxPluralFormsNode
* p 
= expression(); 
 601     wxPluralFormsNodePtr 
n(p
); 
 602     if (token().type() != wxPluralFormsToken::T_SEMICOLON
) 
 609 const wxPluralFormsToken
& wxPluralFormsParser::token() const 
 611     return m_scanner
.token(); 
 614 bool wxPluralFormsParser::nextToken() 
 616     if (!m_scanner
.nextToken()) 
 621 wxPluralFormsNode
* wxPluralFormsParser::expression() 
 623     wxPluralFormsNode
* p 
= logicalOrExpression(); 
 626     wxPluralFormsNodePtr 
n(p
); 
 627     if (token().type() == wxPluralFormsToken::T_QUESTION
) 
 629         wxPluralFormsNodePtr 
qn(new wxPluralFormsNode(token())); 
 640         if (token().type() != wxPluralFormsToken::T_COLON
) 
 654         qn
->setNode(0, n
.release()); 
 660 wxPluralFormsNode
*wxPluralFormsParser::logicalOrExpression() 
 662     wxPluralFormsNode
* p 
= logicalAndExpression(); 
 665     wxPluralFormsNodePtr 
ln(p
); 
 666     if (token().type() == wxPluralFormsToken::T_LOGICAL_OR
) 
 668         wxPluralFormsNodePtr 
un(new wxPluralFormsNode(token())); 
 673         p 
= logicalOrExpression(); 
 678         wxPluralFormsNodePtr 
rn(p
);    // right 
 679         if (rn
->token().type() == wxPluralFormsToken::T_LOGICAL_OR
) 
 681             // see logicalAndExpression comment 
 682             un
->setNode(0, ln
.release()); 
 683             un
->setNode(1, rn
->releaseNode(0)); 
 684             rn
->setNode(0, un
.release()); 
 689         un
->setNode(0, ln
.release()); 
 690         un
->setNode(1, rn
.release()); 
 696 wxPluralFormsNode
* wxPluralFormsParser::logicalAndExpression() 
 698     wxPluralFormsNode
* p 
= equalityExpression(); 
 701     wxPluralFormsNodePtr 
ln(p
);   // left 
 702     if (token().type() == wxPluralFormsToken::T_LOGICAL_AND
) 
 704         wxPluralFormsNodePtr 
un(new wxPluralFormsNode(token()));  // up 
 709         p 
= logicalAndExpression(); 
 714         wxPluralFormsNodePtr 
rn(p
);    // right 
 715         if (rn
->token().type() == wxPluralFormsToken::T_LOGICAL_AND
) 
 717 // transform 1 && (2 && 3) -> (1 && 2) && 3 
 721             un
->setNode(0, ln
.release()); 
 722             un
->setNode(1, rn
->releaseNode(0)); 
 723             rn
->setNode(0, un
.release()); 
 727         un
->setNode(0, ln
.release()); 
 728         un
->setNode(1, rn
.release()); 
 734 wxPluralFormsNode
* wxPluralFormsParser::equalityExpression() 
 736     wxPluralFormsNode
* p 
= relationalExpression(); 
 739     wxPluralFormsNodePtr 
n(p
); 
 740     if (token().type() == wxPluralFormsToken::T_EQUAL
 
 741         || token().type() == wxPluralFormsToken::T_NOT_EQUAL
) 
 743         wxPluralFormsNodePtr 
qn(new wxPluralFormsNode(token())); 
 748         p 
= relationalExpression(); 
 754         qn
->setNode(0, n
.release()); 
 760 wxPluralFormsNode
* wxPluralFormsParser::relationalExpression() 
 762     wxPluralFormsNode
* p 
= multiplicativeExpression(); 
 765     wxPluralFormsNodePtr 
n(p
); 
 766     if (token().type() == wxPluralFormsToken::T_GREATER
 
 767             || token().type() == wxPluralFormsToken::T_LESS
 
 768             || token().type() == wxPluralFormsToken::T_GREATER_OR_EQUAL
 
 769             || token().type() == wxPluralFormsToken::T_LESS_OR_EQUAL
) 
 771         wxPluralFormsNodePtr 
qn(new wxPluralFormsNode(token())); 
 776         p 
= multiplicativeExpression(); 
 782         qn
->setNode(0, n
.release()); 
 788 wxPluralFormsNode
* wxPluralFormsParser::multiplicativeExpression() 
 790     wxPluralFormsNode
* p 
= pmExpression(); 
 793     wxPluralFormsNodePtr 
n(p
); 
 794     if (token().type() == wxPluralFormsToken::T_REMINDER
) 
 796         wxPluralFormsNodePtr 
qn(new wxPluralFormsNode(token())); 
 807         qn
->setNode(0, n
.release()); 
 813 wxPluralFormsNode
* wxPluralFormsParser::pmExpression() 
 815     wxPluralFormsNodePtr n
; 
 816     if (token().type() == wxPluralFormsToken::T_N
 
 817         || token().type() == wxPluralFormsToken::T_NUMBER
) 
 819         n
.reset(new wxPluralFormsNode(token())); 
 825     else if (token().type() == wxPluralFormsToken::T_LEFT_BRACKET
) { 
 830         wxPluralFormsNode
* p 
= expression(); 
 836         if (token().type() != wxPluralFormsToken::T_RIGHT_BRACKET
) 
 852 wxPluralFormsCalculator
* wxPluralFormsCalculator::make(const char* s
) 
 854     wxPluralFormsCalculatorPtr 
calculator(new wxPluralFormsCalculator
); 
 857         wxPluralFormsScanner 
scanner(s
); 
 858         wxPluralFormsParser 
p(scanner
); 
 859         if (!p
.parse(*calculator
)) 
 864     return calculator
.release(); 
 870 // ---------------------------------------------------------------------------- 
 871 // wxMsgCatalogFile corresponds to one disk-file message catalog. 
 873 // This is a "low-level" class and is used only by wxMsgCatalog 
 874 // ---------------------------------------------------------------------------- 
 876 WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxString
, wxMessagesHash
); 
 878 class wxMsgCatalogFile
 
 885     // load the catalog from disk (szDirPrefix corresponds to language) 
 886     bool Load(const wxChar 
*szDirPrefix
, const wxChar 
*szName
, 
 887               wxPluralFormsCalculatorPtr
& rPluralFormsCalculator
); 
 889     // fills the hash with string-translation pairs 
 890     void FillHash(wxMessagesHash
& hash
, const wxString
& msgIdCharset
, 
 891                   bool convertEncoding
) const; 
 894     // this implementation is binary compatible with GNU gettext() version 0.10 
 896     // an entry in the string table 
 897     struct wxMsgTableEntry
 
 899       size_t32   nLen
;           // length of the string 
 900       size_t32   ofsString
;      // pointer to the string 
 903     // header of a .mo file 
 904     struct wxMsgCatalogHeader
 
 906       size_t32  magic
,          // offset +00:  magic id 
 907                 revision
,       //        +04:  revision 
 908                 numStrings
;     //        +08:  number of strings in the file 
 909       size_t32  ofsOrigTable
,   //        +0C:  start of original string table 
 910                 ofsTransTable
;  //        +10:  start of translated string table 
 911       size_t32  nHashSize
,      //        +14:  hash table size 
 912                 ofsHashTable
;   //        +18:  offset of hash table start 
 915     // all data is stored here, NULL if no data loaded 
 918     // amount of memory pointed to by m_pData. 
 922     size_t32          m_numStrings
;   // number of strings in this domain 
 923     wxMsgTableEntry  
*m_pOrigTable
,   // pointer to original   strings 
 924                      *m_pTransTable
;  //            translated 
 928     // swap the 2 halves of 32 bit integer if needed 
 929     size_t32 
Swap(size_t32 ui
) const 
 931           return m_bSwapped 
? (ui 
<< 24) | ((ui 
& 0xff00) << 8) | 
 932                               ((ui 
>> 8) & 0xff00) | (ui 
>> 24) 
 936     const char *StringAtOfs(wxMsgTableEntry 
*pTable
, size_t32 n
) const 
 938         const wxMsgTableEntry 
* const ent 
= pTable 
+ n
; 
 940         // this check could fail for a corrupt message catalog 
 941         size_t32 ofsString 
= Swap(ent
->ofsString
); 
 942         if ( ofsString 
+ Swap(ent
->nLen
) > m_nSize
) 
 947         return (const char *)(m_pData 
+ ofsString
); 
 950     bool m_bSwapped
;   // wrong endianness? 
 952     DECLARE_NO_COPY_CLASS(wxMsgCatalogFile
) 
 956 // ---------------------------------------------------------------------------- 
 957 // wxMsgCatalog corresponds to one loaded message catalog. 
 959 // This is a "low-level" class and is used only by wxLocale (that's why 
 960 // it's designed to be stored in a linked list) 
 961 // ---------------------------------------------------------------------------- 
 966     // load the catalog from disk (szDirPrefix corresponds to language) 
 967     bool Load(const wxChar 
*szDirPrefix
, const wxChar 
*szName
, 
 968               const wxChar 
*msgIdCharset 
= NULL
, bool bConvertEncoding 
= false); 
 970     // get name of the catalog 
 971     wxString 
GetName() const { return m_name
; } 
 973     // get the translated string: returns NULL if not found 
 974     const wxChar 
*GetString(const wxChar 
*sz
, size_t n 
= size_t(-1)) const; 
 976     // public variable pointing to the next element in a linked list (or NULL) 
 977     wxMsgCatalog 
*m_pNext
; 
 980     wxMessagesHash  m_messages
; // all messages in the catalog 
 981     wxString        m_name
;     // name of the domain 
 982     wxPluralFormsCalculatorPtr  m_pluralFormsCalculator
; 
 985 // ---------------------------------------------------------------------------- 
 987 // ---------------------------------------------------------------------------- 
 989 // the list of the directories to search for message catalog files 
 990 static wxArrayString s_searchPrefixes
; 
 992 // ============================================================================ 
 994 // ============================================================================ 
 996 // ---------------------------------------------------------------------------- 
 997 // wxMsgCatalogFile class 
 998 // ---------------------------------------------------------------------------- 
1000 wxMsgCatalogFile::wxMsgCatalogFile() 
1006 wxMsgCatalogFile::~wxMsgCatalogFile() 
1011 // return all directories to search for given prefix 
1012 static wxString 
GetAllMsgCatalogSubdirs(const wxChar 
*prefix
, 
1015     wxString searchPath
; 
1017     // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in 
1018     // prefix (assuming the language is 'fr') 
1019     searchPath 
<< prefix 
<< wxFILE_SEP_PATH 
<< lang 
<< wxFILE_SEP_PATH
 
1020                          << wxT("LC_MESSAGES") << wxPATH_SEP
 
1021                << prefix 
<< wxFILE_SEP_PATH 
<< lang 
<< wxPATH_SEP
 
1022                << prefix 
<< wxPATH_SEP
; 
1027 // construct the search path for the given language 
1028 static wxString 
GetFullSearchPath(const wxChar 
*lang
) 
1030     wxString searchPath
; 
1032     // first take the entries explicitly added by the program 
1033     size_t count 
= s_searchPrefixes
.Count(); 
1034     for ( size_t n 
= 0; n 
< count
; n
++ ) 
1036         searchPath 
<< GetAllMsgCatalogSubdirs(s_searchPrefixes
[n
], lang
) 
1040     // LC_PATH is a standard env var containing the search path for the .mo 
1043     const wxChar 
*pszLcPath 
= wxGetenv(wxT("LC_PATH")); 
1044     if ( pszLcPath 
!= NULL 
) 
1045         searchPath 
<< GetAllMsgCatalogSubdirs(pszLcPath
, lang
); 
1049     // add some standard ones and the one in the tree where wxWin was installed: 
1051         << GetAllMsgCatalogSubdirs(wxString(wxGetInstallPrefix()) + wxT("/share/locale"), lang
) 
1052         << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang
) 
1053         << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang
) 
1054         << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang
); 
1057     // then take the current directory 
1058     // FIXME it should be the directory of the executable 
1061     wxGetWorkingDirectory( cwd 
, sizeof( cwd 
) ) ; 
1062     searchPath 
<< GetAllMsgCatalogSubdirs(cwd
, lang
); 
1063     // generic search paths could be somewhere in the system folder preferences 
1065     searchPath 
<< GetAllMsgCatalogSubdirs(wxT("."), lang
); 
1072 // open disk file and read in it's contents 
1073 bool wxMsgCatalogFile::Load(const wxChar 
*szDirPrefix
, const wxChar 
*szName0
, 
1074                             wxPluralFormsCalculatorPtr
& rPluralFormsCalculator
) 
1076    /* We need to handle locales like  de_AT.iso-8859-1 
1077       For this we first chop off the .CHARSET specifier and ignore it. 
1078       FIXME: UNICODE SUPPORT: must use CHARSET specifier! 
1080    wxString szName 
= szName0
; 
1081    if(szName
.Find(wxT('.')) != wxNOT_FOUND
) // contains a dot 
1082       szName 
= szName
.Left(szName
.Find(wxT('.'))); 
1084   wxString searchPath 
= GetFullSearchPath(szDirPrefix
); 
1085   const wxChar 
*sublocale 
= wxStrchr(szDirPrefix
, wxT('_')); 
1088       // also add just base locale name: for things like "fr_BE" (belgium 
1089       // french) we should use "fr" if no belgium specific message catalogs 
1091       searchPath 
<< GetFullSearchPath(wxString(szDirPrefix
). 
1092                                       Left((size_t)(sublocale 
- szDirPrefix
))) 
1096   wxString strFile 
= szName
; 
1097   strFile 
+= MSGCATALOG_EXTENSION
; 
1099   // don't give translation errors here because the wxstd catalog might 
1100   // not yet be loaded (and it's normal) 
1102   // (we're using an object because we have several return paths) 
1104   NoTransErr noTransErr
; 
1105   wxLogVerbose(_("looking for catalog '%s' in path '%s'."), 
1106                szName
.c_str(), searchPath
.c_str()); 
1108   wxString strFullName
; 
1109   if ( !wxFindFileInPath(&strFullName
, searchPath
, strFile
) ) { 
1110     wxLogVerbose(_("catalog file for domain '%s' not found."), szName
.c_str()); 
1115   wxLogVerbose(_("using catalog '%s' from '%s'."), 
1116              szName
.c_str(), strFullName
.c_str()); 
1118   wxFile 
fileMsg(strFullName
); 
1119   if ( !fileMsg
.IsOpened() ) 
1122   // get the file size 
1123   size_t nSize 
= fileMsg
.Length(); 
1124   if ( nSize 
== wxInvalidOffset 
) 
1127   // read the whole file in memory 
1128   m_pData 
= new size_t8
[nSize
]; 
1129   if ( fileMsg
.Read(m_pData
, nSize
) != nSize 
) { 
1135   bool bValid 
= (size_t)nSize 
> sizeof(wxMsgCatalogHeader
); 
1137   wxMsgCatalogHeader 
*pHeader 
= (wxMsgCatalogHeader 
*)m_pData
; 
1139     // we'll have to swap all the integers if it's true 
1140     m_bSwapped 
= pHeader
->magic 
== MSGCATALOG_MAGIC_SW
; 
1142     // check the magic number 
1143     bValid 
= m_bSwapped 
|| pHeader
->magic 
== MSGCATALOG_MAGIC
; 
1147     // it's either too short or has incorrect magic number 
1148     wxLogWarning(_("'%s' is not a valid message catalog."), strFullName
.c_str()); 
1155   m_numStrings  
= Swap(pHeader
->numStrings
); 
1156   m_pOrigTable  
= (wxMsgTableEntry 
*)(m_pData 
+ 
1157                    Swap(pHeader
->ofsOrigTable
)); 
1158   m_pTransTable 
= (wxMsgTableEntry 
*)(m_pData 
+ 
1159                    Swap(pHeader
->ofsTransTable
)); 
1162   // now parse catalog's header and try to extract catalog charset and 
1163   // plural forms formula from it: 
1165   const char* headerData 
= StringAtOfs(m_pOrigTable
, 0); 
1166   if (headerData 
&& headerData
[0] == 0) 
1168       // Extract the charset: 
1169       wxString header 
= wxString::FromAscii(StringAtOfs(m_pTransTable
, 0)); 
1170       int begin 
= header
.Find(wxT("Content-Type: text/plain; charset=")); 
1171       if (begin 
!= wxNOT_FOUND
) 
1173           begin 
+= 34; //strlen("Content-Type: text/plain; charset=") 
1174           size_t end 
= header
.find('\n', begin
); 
1175           if (end 
!= size_t(-1)) 
1177               m_charset
.assign(header
, begin
, end 
- begin
); 
1178               if (m_charset 
== wxT("CHARSET")) 
1180                   // "CHARSET" is not valid charset, but lazy translator 
1185       // else: incorrectly filled Content-Type header 
1187       // Extract plural forms: 
1188       begin 
= header
.Find(wxT("Plural-Forms:")); 
1189       if (begin 
!= wxNOT_FOUND
) 
1192           size_t end 
= header
.find('\n', begin
); 
1193           if (end 
!= size_t(-1)) 
1195               wxString 
pfs(header
, begin
, end 
- begin
); 
1196               wxPluralFormsCalculator
* pCalculator 
= wxPluralFormsCalculator
 
1197                   ::make(pfs
.ToAscii()); 
1198               if (pCalculator 
!= 0) 
1200                   rPluralFormsCalculator
.reset(pCalculator
); 
1204                    wxLogVerbose(_("Cannot parse Plural-Forms:'%s'"), 
1209       if (rPluralFormsCalculator
.get() == NULL
) 
1211           rPluralFormsCalculator
.reset(wxPluralFormsCalculator::make()); 
1215   // everything is fine 
1219 void wxMsgCatalogFile::FillHash(wxMessagesHash
& hash
, 
1220                                 const wxString
& msgIdCharset
, 
1221                                 bool convertEncoding
) const 
1224     wxCSConv 
*csConv 
= NULL
; 
1225     if ( !m_charset
.IsEmpty() ) 
1226         csConv 
= new wxCSConv(m_charset
); 
1228     wxMBConv
& inputConv 
= csConv 
? *((wxMBConv
*)csConv
) : *wxConvCurrent
; 
1230     wxCSConv 
*sourceConv 
= NULL
; 
1231     if ( !msgIdCharset
.empty() && (m_charset 
!= msgIdCharset
) ) 
1232         sourceConv 
= new wxCSConv(msgIdCharset
); 
1235     wxASSERT_MSG( msgIdCharset 
== NULL
, 
1236                   _T("non-ASCII msgid languages only supported if wxUSE_WCHAR_T=1") ); 
1238     wxEncodingConverter converter
; 
1239     if ( convertEncoding 
) 
1241         wxFontEncoding targetEnc 
= wxFONTENCODING_SYSTEM
; 
1242         wxFontEncoding enc 
= wxFontMapper::Get()->CharsetToEncoding(m_charset
, false); 
1243         if ( enc 
== wxFONTENCODING_SYSTEM 
) 
1245             convertEncoding 
= false; // unknown encoding 
1249             targetEnc 
= wxLocale::GetSystemEncoding(); 
1250             if (targetEnc 
== wxFONTENCODING_SYSTEM
) 
1252                 wxFontEncodingArray a 
= wxEncodingConverter::GetPlatformEquivalents(enc
); 
1254                     // no conversion needed, locale uses native encoding 
1255                     convertEncoding 
= false; 
1256                 if (a
.GetCount() == 0) 
1257                     // we don't know common equiv. under this platform 
1258                     convertEncoding 
= false; 
1263         if ( convertEncoding 
) 
1265             converter
.Init(enc
, targetEnc
); 
1268 #endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T 
1269     (void)convertEncoding
; // get rid of warnings about unused parameter 
1271     for (size_t i 
= 0; i 
< m_numStrings
; i
++) 
1273         const char *data 
= StringAtOfs(m_pOrigTable
, i
); 
1275         wxString 
msgid(data
, inputConv
); 
1279         if ( convertEncoding 
&& sourceConv 
) 
1280             msgid 
= wxString(inputConv
.cMB2WC(data
), *sourceConv
); 
1284 #endif // wxUSE_UNICODE 
1286         data 
= StringAtOfs(m_pTransTable
, i
); 
1287         size_t length 
= Swap(m_pTransTable
[i
].nLen
); 
1290         while (offset 
< length
) 
1295             msgstr 
= wxString(data 
+ offset
, inputConv
); 
1297             if ( convertEncoding 
) 
1298                 msgstr 
= wxString(inputConv
.cMB2WC(data 
+ offset
), wxConvLocal
); 
1300                 msgstr 
= wxString(data 
+ offset
); 
1302 #else // !wxUSE_WCHAR_T 
1304             if ( convertEncoding 
) 
1305                 msgstr 
= wxString(converter
.Convert(data 
+ offset
)); 
1308                 msgstr 
= wxString(data 
+ offset
); 
1309 #endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T 
1311             if ( !msgstr
.empty() ) 
1313                 hash
[index 
== 0 ? msgid 
: msgid 
+ wxChar(index
)] = msgstr
; 
1315             offset 
+= strlen(data 
+ offset
) + 1; 
1327 // ---------------------------------------------------------------------------- 
1328 // wxMsgCatalog class 
1329 // ---------------------------------------------------------------------------- 
1331 bool wxMsgCatalog::Load(const wxChar 
*szDirPrefix
, const wxChar 
*szName
, 
1332                         const wxChar 
*msgIdCharset
, bool bConvertEncoding
) 
1334     wxMsgCatalogFile file
; 
1338     if ( file
.Load(szDirPrefix
, szName
, m_pluralFormsCalculator
) ) 
1340         file
.FillHash(m_messages
, msgIdCharset
, bConvertEncoding
); 
1347 const wxChar 
*wxMsgCatalog::GetString(const wxChar 
*sz
, size_t n
) const 
1350     if (n 
!= size_t(-1)) 
1352         index 
= m_pluralFormsCalculator
->evaluate(n
); 
1354     wxMessagesHash::const_iterator i
; 
1357         i 
= m_messages
.find(wxString(sz
) + wxChar(index
));   // plural 
1361         i 
= m_messages
.find(sz
); 
1364     if ( i 
!= m_messages
.end() ) 
1366         return i
->second
.c_str(); 
1372 // ---------------------------------------------------------------------------- 
1374 // ---------------------------------------------------------------------------- 
1376 #include "wx/arrimpl.cpp" 
1377 WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo
, wxLanguageInfoArray
); 
1378 WX_DEFINE_OBJARRAY(wxLanguageInfoArray
); 
1380 wxLanguageInfoArray 
*wxLocale::ms_languagesDB 
= NULL
; 
1382 /*static*/ void wxLocale::CreateLanguagesDB() 
1384     if (ms_languagesDB 
== NULL
) 
1386         ms_languagesDB 
= new wxLanguageInfoArray
; 
1391 /*static*/ void wxLocale::DestroyLanguagesDB() 
1393     delete ms_languagesDB
; 
1394     ms_languagesDB 
= NULL
; 
1398 void wxLocale::DoCommonInit() 
1400   m_pszOldLocale 
= NULL
; 
1402   m_language 
= wxLANGUAGE_UNKNOWN
; 
1403   m_initialized 
= false; 
1406 // NB: this function has (desired) side effect of changing current locale 
1407 bool wxLocale::Init(const wxChar 
*szName
, 
1408                     const wxChar 
*szShort
, 
1409                     const wxChar 
*szLocale
, 
1411                     bool        bConvertEncoding
) 
1413   wxASSERT_MSG( !m_initialized
, 
1414                 _T("you can't call wxLocale::Init more than once") ); 
1416   m_initialized 
= true; 
1417   m_strLocale 
= szName
; 
1418   m_strShort 
= szShort
; 
1419   m_bConvertEncoding 
= bConvertEncoding
; 
1420   m_language 
= wxLANGUAGE_UNKNOWN
; 
1422   // change current locale (default: same as long name) 
1423   if ( szLocale 
== NULL 
) 
1425     // the argument to setlocale() 
1428     wxCHECK_MSG( szLocale
, false, _T("no locale to set in wxLocale::Init()") ); 
1432   // FIXME: I'm guessing here 
1433   wxChar localeName
[256]; 
1434   int ret 
= GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SLANGUAGE
, localeName
, 
1438     m_pszOldLocale 
= wxStrdup(localeName
); 
1441     m_pszOldLocale 
= NULL
; 
1443   // TODO: how to find languageId 
1444   // SetLocaleInfo(languageId, SORT_DEFAULT, localeName); 
1446   wxMB2WXbuf oldLocale 
= wxSetlocale(LC_ALL
, szLocale
); 
1448       m_pszOldLocale 
= wxStrdup(oldLocale
); 
1450       m_pszOldLocale 
= NULL
; 
1453   if ( m_pszOldLocale 
== NULL 
) 
1454     wxLogError(_("locale '%s' can not be set."), szLocale
); 
1456   // the short name will be used to look for catalog files as well, 
1457   // so we need something here 
1458   if ( m_strShort
.IsEmpty() ) { 
1459     // FIXME I don't know how these 2 letter abbreviations are formed, 
1460     //       this wild guess is surely wrong 
1461     if ( szLocale 
&& szLocale
[0] ) 
1463         m_strShort 
+= (wxChar
)wxTolower(szLocale
[0]); 
1465             m_strShort 
+= (wxChar
)wxTolower(szLocale
[1]); 
1469   // save the old locale to be able to restore it later 
1470   m_pOldLocale 
= wxSetLocale(this); 
1472   // load the default catalog with wxWidgets standard messages 
1476     bOk 
= AddCatalog(wxT("wxstd")); 
1482 #if defined(__UNIX__) && wxUSE_UNICODE && !defined(__WXMAC__) 
1483 static wxWCharBuffer 
wxSetlocaleTryUTF(int c
, const wxChar 
*lc
) 
1485     wxMB2WXbuf l 
= wxSetlocale(c
, lc
); 
1486     if ( !l 
&& lc 
&& lc
[0] != 0 ) 
1490         buf2 
= buf 
+ wxT(".UTF-8"); 
1491         l 
= wxSetlocale(c
, buf2
.c_str()); 
1494             buf2 
= buf 
+ wxT(".utf-8"); 
1495             l 
= wxSetlocale(c
, buf2
.c_str()); 
1499             buf2 
= buf 
+ wxT(".UTF8"); 
1500             l 
= wxSetlocale(c
, buf2
.c_str()); 
1504             buf2 
= buf 
+ wxT(".utf8"); 
1505             l 
= wxSetlocale(c
, buf2
.c_str()); 
1511 #define wxSetlocaleTryUTF(c, lc)  wxSetlocale(c, lc) 
1514 bool wxLocale::Init(int language
, int flags
) 
1516     int lang 
= language
; 
1517     if (lang 
== wxLANGUAGE_DEFAULT
) 
1519         // auto detect the language 
1520         lang 
= GetSystemLanguage(); 
1523     // We failed to detect system language, so we will use English: 
1524     if (lang 
== wxLANGUAGE_UNKNOWN
) 
1529     const wxLanguageInfo 
*info 
= GetLanguageInfo(lang
); 
1531     // Unknown language: 
1534         wxLogError(wxT("Unknown language %i."), lang
); 
1538     wxString name 
= info
->Description
; 
1539     wxString canonical 
= info
->CanonicalName
; 
1543 #if defined(__UNIX__) && !defined(__WXMAC__) 
1544     if (language 
== wxLANGUAGE_DEFAULT
) 
1545         locale 
= wxEmptyString
; 
1547         locale 
= info
->CanonicalName
; 
1549     wxMB2WXbuf retloc 
= wxSetlocaleTryUTF(LC_ALL
, locale
); 
1553         // Some C libraries don't like xx_YY form and require xx only 
1554         retloc 
= wxSetlocaleTryUTF(LC_ALL
, locale
.Mid(0,2)); 
1558         // Some C libraries (namely glibc) still use old ISO 639, 
1559         // so will translate the abbrev for them 
1560         wxString mid 
= locale
.Mid(0,2); 
1561         if (mid 
== wxT("he")) 
1562             locale 
= wxT("iw") + locale
.Mid(3); 
1563         else if (mid 
== wxT("id")) 
1564             locale 
= wxT("in") + locale
.Mid(3); 
1565         else if (mid 
== wxT("yi")) 
1566             locale 
= wxT("ji") + locale
.Mid(3); 
1567         else if (mid 
== wxT("nb")) 
1568             locale 
= wxT("no_NO"); 
1569         else if (mid 
== wxT("nn")) 
1570             locale 
= wxT("no_NY"); 
1572         retloc 
= wxSetlocaleTryUTF(LC_ALL
, locale
); 
1576         // (This time, we changed locale in previous if-branch, so try again.) 
1577         // Some C libraries don't like xx_YY form and require xx only 
1578         retloc 
= wxSetlocaleTryUTF(LC_ALL
, locale
.Mid(0,2)); 
1582         wxLogError(wxT("Cannot set locale to '%s'."), locale
.c_str()); 
1585 #elif defined(__WIN32__) 
1587     #if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__)) 
1588         // NB: setlocale() from msvcrt.dll (used by VC++ and Mingw) 
1589         //     can't set locale to language that can only be written using 
1590         //     Unicode.  Therefore wxSetlocale call failed, but we don't want 
1591         //     to report it as an error -- so that at least message catalogs 
1592         //     can be used. Watch for code marked with 
1593         //     #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS bellow. 
1594         #define SETLOCALE_FAILS_ON_UNICODE_LANGS 
1600     wxMB2WXbuf retloc 
= wxT("C"); 
1601     if (language 
!= wxLANGUAGE_DEFAULT
) 
1603         if (info
->WinLang 
== 0) 
1605             wxLogWarning(wxT("Locale '%s' not supported by OS."), name
.c_str()); 
1606             // retloc already set to "C" 
1611                          #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS 
1615             wxUint32 lcid 
= MAKELCID(MAKELANGID(info
->WinLang
, info
->WinSublang
), 
1619             SetThreadLocale(lcid
); 
1621             // NB: we must translate LCID to CRT's setlocale string ourselves, 
1622             //     because SetThreadLocale does not modify change the 
1623             //     interpretation of setlocale(LC_ALL, "") call: 
1625             buffer
[0] = wxT('\0'); 
1626             GetLocaleInfo(lcid
, LOCALE_SENGLANGUAGE
, buffer
, 256); 
1628             if (GetLocaleInfo(lcid
, LOCALE_SENGCOUNTRY
, buffer
, 256) > 0) 
1629                 locale 
<< wxT("_") << buffer
; 
1630             if (GetLocaleInfo(lcid
, LOCALE_IDEFAULTANSICODEPAGE
, buffer
, 256) > 0) 
1632                 codepage 
= wxAtoi(buffer
); 
1634                     locale 
<< wxT(".") << buffer
; 
1636             if (locale
.IsEmpty()) 
1638                 wxLogLastError(wxT("SetThreadLocale")); 
1639                 wxLogError(wxT("Cannot set locale to language %s."), name
.c_str()); 
1646                 retloc 
= wxSetlocale(LC_ALL
, locale
); 
1648 #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS 
1649                 if (codepage 
== 0 && (const wxChar
*)retloc 
== NULL
) 
1661         retloc 
= wxSetlocale(LC_ALL
, wxEmptyString
); 
1665 #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS 
1666         if ((const wxChar
*)retloc 
== NULL
) 
1669             if (GetLocaleInfo(LOCALE_USER_DEFAULT
, 
1670                               LOCALE_IDEFAULTANSICODEPAGE
, buffer
, 16) > 0 && 
1671                  wxStrcmp(buffer
, wxT("0")) == 0) 
1681         wxLogError(wxT("Cannot set locale to language %s."), name
.c_str()); 
1684 #elif defined(__WXMAC__) || defined(__WXPM__) 
1685     wxMB2WXbuf retloc 
= wxSetlocale(LC_ALL 
, wxEmptyString
); 
1688     #define WX_NO_LOCALE_SUPPORT 
1691 #ifndef WX_NO_LOCALE_SUPPORT 
1692     wxChar 
*szLocale 
= retloc 
? wxStrdup(retloc
) : NULL
; 
1693     bool ret 
= Init(name
, canonical
, retloc
, 
1694                     (flags 
& wxLOCALE_LOAD_DEFAULT
) != 0, 
1695                     (flags 
& wxLOCALE_CONV_ENCODING
) != 0); 
1698     if (IsOk()) // setlocale() succeeded 
1707 void wxLocale::AddCatalogLookupPathPrefix(const wxString
& prefix
) 
1709     if ( s_searchPrefixes
.Index(prefix
) == wxNOT_FOUND 
) 
1711         s_searchPrefixes
.Add(prefix
); 
1713     //else: already have it 
1716 /*static*/ int wxLocale::GetSystemLanguage() 
1718     CreateLanguagesDB(); 
1720     // init i to avoid compiler warning 
1722            count 
= ms_languagesDB
->GetCount(); 
1724 #if defined(__UNIX__) && !defined(__WXMAC__) 
1725     // first get the string identifying the language from the environment 
1727     if (!wxGetEnv(wxT("LC_ALL"), &langFull
) && 
1728         !wxGetEnv(wxT("LC_MESSAGES"), &langFull
) && 
1729         !wxGetEnv(wxT("LANG"), &langFull
)) 
1731         // no language specified, threat it as English 
1732         return wxLANGUAGE_ENGLISH
; 
1735     if ( langFull 
== _T("C") || langFull 
== _T("POSIX") ) 
1738         return wxLANGUAGE_ENGLISH
; 
1741     // the language string has the following form 
1743     //      lang[_LANG][.encoding][@modifier] 
1745     // (see environ(5) in the Open Unix specification) 
1747     // where lang is the primary language, LANG is a sublang/territory, 
1748     // encoding is the charset to use and modifier "allows the user to select 
1749     // a specific instance of localization data within a single category" 
1751     // for example, the following strings are valid: 
1756     //      de_DE.iso88591@euro 
1758     // for now we don't use the encoding, although we probably should (doing 
1759     // translations of the msg catalogs on the fly as required) (TODO) 
1761     // we don't use the modifiers neither but we probably should translate 
1762     // "euro" into iso885915 
1763     size_t posEndLang 
= langFull
.find_first_of(_T("@.")); 
1764     if ( posEndLang 
!= wxString::npos 
) 
1766         langFull
.Truncate(posEndLang
); 
1769     // in addition to the format above, we also can have full language names 
1770     // in LANG env var - for example, SuSE is known to use LANG="german" - so 
1773     // do we have just the language (or sublang too)? 
1774     bool justLang 
= langFull
.Len() == LEN_LANG
; 
1776          (langFull
.Len() == LEN_FULL 
&& langFull
[LEN_LANG
] == wxT('_')) ) 
1778         // 0. Make sure the lang is according to latest ISO 639 
1779         //    (this is neccessary because glibc uses iw and in instead 
1780         //    of he and id respectively). 
1782         // the language itself (second part is the dialect/sublang) 
1783         wxString langOrig 
= ExtractLang(langFull
); 
1786         if ( langOrig 
== wxT("iw")) 
1788         else if (langOrig 
== wxT("in")) 
1790         else if (langOrig 
== wxT("ji")) 
1792         else if (langOrig 
== wxT("no_NO")) 
1793             lang 
= wxT("nb_NO"); 
1794         else if (langOrig 
== wxT("no_NY")) 
1795             lang 
= wxT("nn_NO"); 
1796         else if (langOrig 
== wxT("no")) 
1797             lang 
= wxT("nb_NO"); 
1801         // did we change it? 
1802         if ( lang 
!= langOrig 
) 
1804             langFull 
= lang 
+ ExtractNotLang(langFull
); 
1807         // 1. Try to find the language either as is: 
1808         for ( i 
= 0; i 
< count
; i
++ ) 
1810             if ( ms_languagesDB
->Item(i
).CanonicalName 
== langFull 
) 
1816         // 2. If langFull is of the form xx_YY, try to find xx: 
1817         if ( i 
== count 
&& !justLang 
) 
1819             for ( i 
= 0; i 
< count
; i
++ ) 
1821                 if ( ms_languagesDB
->Item(i
).CanonicalName 
== lang 
) 
1828         // 3. If langFull is of the form xx, try to find any xx_YY record: 
1829         if ( i 
== count 
&& justLang 
) 
1831             for ( i 
= 0; i 
< count
; i
++ ) 
1833                 if ( ExtractLang(ms_languagesDB
->Item(i
).CanonicalName
) 
1841     else // not standard format 
1843         // try to find the name in verbose description 
1844         for ( i 
= 0; i 
< count
; i
++ ) 
1846             if (ms_languagesDB
->Item(i
).Description
.CmpNoCase(langFull
) == 0) 
1852 #elif defined(__WXMAC__) 
1853     const wxChar 
* lc 
= NULL 
; 
1854     long lang 
= GetScriptVariable( smSystemScript
, smScriptLang
) ; 
1855     switch( GetScriptManagerVariable( smRegionCode 
) ) { 
1871       case verNetherlands 
: 
1926       // _CY is not part of wx, so we have to translate according to the system language 
1927         if ( lang 
== langGreek 
) { 
1930         else if ( lang 
== langTurkish 
) { 
1937       case verYugoCroatian
: 
1943       case verPakistanUrdu
: 
1946       case verTurkishModified
: 
1949       case verItalianSwiss
: 
1952       case verInternational
: 
2013       case verByeloRussian
: 
2035         lc 
= wxT("pt_BR ") ; 
2043       case verScottishGaelic
: 
2058       case verIrishGaelicScript
: 
2073       case verSpLatinAmerica
: 
2079       case verFrenchUniversal
: 
2130   for ( i 
= 0; i 
< count
; i
++ ) 
2132       if ( ms_languagesDB
->Item(i
).CanonicalName 
== lc 
) 
2138 #elif defined(__WIN32__) 
2139     LCID lcid 
= GetUserDefaultLCID(); 
2142         wxUint32 lang 
= PRIMARYLANGID(LANGIDFROMLCID(lcid
)); 
2143         wxUint32 sublang 
= SUBLANGID(LANGIDFROMLCID(lcid
)); 
2145         for ( i 
= 0; i 
< count
; i
++ ) 
2147             if (ms_languagesDB
->Item(i
).WinLang 
== lang 
&& 
2148                 ms_languagesDB
->Item(i
).WinSublang 
== sublang
) 
2154     //else: leave wxlang == wxLANGUAGE_UNKNOWN 
2155 #endif // Unix/Win32 
2159         // we did find a matching entry, use it 
2160         return ms_languagesDB
->Item(i
).Language
; 
2163     // no info about this language in the database 
2164     return wxLANGUAGE_UNKNOWN
; 
2167 // ---------------------------------------------------------------------------- 
2169 // ---------------------------------------------------------------------------- 
2171 // this is a bit strange as under Windows we get the encoding name using its 
2172 // numeric value and under Unix we do it the other way round, but this just 
2173 // reflects the way different systems provide the encoding info 
2176 wxString 
wxLocale::GetSystemEncodingName() 
2180 #if defined(__WIN32__) && !defined(__WXMICROWIN__) 
2181     // FIXME: what is the error return value for GetACP()? 
2182     UINT codepage 
= ::GetACP(); 
2183     encname
.Printf(_T("windows-%u"), codepage
); 
2184 #elif defined(__UNIX_LIKE__) 
2186 #if defined(HAVE_LANGINFO_H) && defined(CODESET) 
2187     // GNU libc provides current character set this way (this conforms 
2189     char *oldLocale 
= strdup(setlocale(LC_CTYPE
, NULL
)); 
2190     setlocale(LC_CTYPE
, ""); 
2191     const char *alang 
= nl_langinfo(CODESET
); 
2192     setlocale(LC_CTYPE
, oldLocale
); 
2197         // 7 bit ASCII encoding has several alternative names which we should 
2198         // recognize to avoid warnings about unrecognized encoding on each 
2201         // nl_langinfo() under Solaris returns 646 by default which stands for 
2202         // ISO-646, i.e. 7 bit ASCII 
2204         // and recent glibc call it ANSI_X3.4-1968... 
2206         // HP-UX uses HP-Roman8 cset which is not the same as ASCII (see RFC 
2207         // 1345 for its definition) but must be recognized as otherwise HP 
2208         // users get a warning about it on each program startup, so handle it 
2209         // here -- but it would be obviously better to add real supprot to it, 
2211         if ( strcmp(alang
, "646") == 0 
2212                 || strcmp(alang
, "ANSI_X3.4-1968") == 0 
2214                     || strcmp(alang
, "roman8") == 0 
2218             encname 
= _T("US-ASCII"); 
2222             encname 
= wxString::FromAscii( alang 
); 
2226 #endif // HAVE_LANGINFO_H 
2228         // if we can't get at the character set directly, try to see if it's in 
2229         // the environment variables (in most cases this won't work, but I was 
2231         char *lang 
= getenv( "LC_ALL"); 
2232         char *dot 
= lang 
? strchr(lang
, '.') : (char *)NULL
; 
2235             lang 
= getenv( "LC_CTYPE" ); 
2237                 dot 
= strchr(lang
, '.' ); 
2241             lang 
= getenv( "LANG"); 
2243                 dot 
= strchr(lang
, '.'); 
2248             encname 
= wxString::FromAscii( dot
+1 ); 
2251 #endif // Win32/Unix 
2257 wxFontEncoding 
wxLocale::GetSystemEncoding() 
2259 #if defined(__WIN32__) && !defined(__WXMICROWIN__) 
2260     UINT codepage 
= ::GetACP(); 
2262     // wxWidgets only knows about CP1250-1257, 932, 936, 949, 950 
2263     if ( codepage 
>= 1250 && codepage 
<= 1257 ) 
2265         return (wxFontEncoding
)(wxFONTENCODING_CP1250 
+ codepage 
- 1250); 
2268     if ( codepage 
== 932 ) 
2270         return wxFONTENCODING_CP932
; 
2273     if ( codepage 
== 936 ) 
2275         return wxFONTENCODING_CP936
; 
2278     if ( codepage 
== 949 ) 
2280         return wxFONTENCODING_CP949
; 
2283     if ( codepage 
== 950 ) 
2285         return wxFONTENCODING_CP950
; 
2287 #elif defined(__WXMAC__) 
2288     TextEncoding encoding 
= 0 ; 
2290     encoding 
= CFStringGetSystemEncoding() ; 
2292     UpgradeScriptInfoToTextEncoding ( smSystemScript 
, kTextLanguageDontCare 
, kTextRegionDontCare 
, NULL 
, &encoding 
) ; 
2294     return wxMacGetFontEncFromSystemEnc( encoding 
) ; 
2295 #elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP 
2296     wxString encname 
= GetSystemEncodingName(); 
2297     if ( !encname
.empty() ) 
2299         wxFontEncoding enc 
= wxFontMapper::Get()-> 
2300             CharsetToEncoding(encname
, false /* not interactive */); 
2302         // on some modern Linux systems (RedHat 8) the default system locale 
2303         // is UTF8 -- but it isn't supported by wxGTK in ANSI build at all so 
2304         // don't even try to use it in this case 
2306         if ( enc 
== wxFONTENCODING_UTF8 
) 
2308             // the most similar supported encoding... 
2309             enc 
= wxFONTENCODING_ISO8859_1
; 
2311 #endif // !wxUSE_UNICODE 
2313         // this should probably be considered as a bug in CharsetToEncoding(): 
2314         // it shouldn't return wxFONTENCODING_DEFAULT at all - but it does it 
2315         // for US-ASCII charset 
2317         // we, OTOH, definitely shouldn't return it as it doesn't make sense at 
2318         // all (which encoding is it?) 
2319         if ( enc 
!= wxFONTENCODING_DEFAULT 
) 
2323         //else: return wxFONTENCODING_SYSTEM below 
2325 #endif // Win32/Unix 
2327     return wxFONTENCODING_SYSTEM
; 
2331 void wxLocale::AddLanguage(const wxLanguageInfo
& info
) 
2333     CreateLanguagesDB(); 
2334     ms_languagesDB
->Add(info
); 
2338 const wxLanguageInfo 
*wxLocale::GetLanguageInfo(int lang
) 
2340     CreateLanguagesDB(); 
2342     // calling GetLanguageInfo(wxLANGUAGE_DEFAULT) is a natural thing to do, so 
2344     if ( lang 
== wxLANGUAGE_DEFAULT 
) 
2345         lang 
= GetSystemLanguage(); 
2347     const size_t count 
= ms_languagesDB
->GetCount(); 
2348     for ( size_t i 
= 0; i 
< count
; i
++ ) 
2350         if ( ms_languagesDB
->Item(i
).Language 
== lang 
) 
2352             return &ms_languagesDB
->Item(i
); 
2360 wxString 
wxLocale::GetLanguageName(int lang
) 
2362     const wxLanguageInfo 
*info 
= GetLanguageInfo(lang
); 
2364         return wxEmptyString
; 
2366         return info
->Description
; 
2370 const wxLanguageInfo 
*wxLocale::FindLanguageInfo(const wxString
& locale
) 
2372     CreateLanguagesDB(); 
2374     const wxLanguageInfo 
*infoRet 
= NULL
; 
2376     const size_t count 
= ms_languagesDB
->GetCount(); 
2377     for ( size_t i 
= 0; i 
< count
; i
++ ) 
2379         const wxLanguageInfo 
*info 
= &ms_languagesDB
->Item(i
); 
2381         if ( wxStricmp(locale
, info
->CanonicalName
) == 0 || 
2382                 wxStricmp(locale
, info
->Description
) == 0 ) 
2384             // exact match, stop searching 
2389         if ( wxStricmp(locale
, info
->CanonicalName
.BeforeFirst(_T('_'))) == 0 ) 
2391             // a match -- but maybe we'll find an exact one later, so continue 
2394             // OTOH, maybe we had already found a language match and in this 
2395             // case don't overwrite it becauce the entry for the default 
2396             // country always appears first in ms_languagesDB 
2405 wxString 
wxLocale::GetSysName() const 
2409     return wxSetlocale(LC_ALL
, NULL
); 
2411     return wxEmptyString
; 
2416 wxLocale::~wxLocale() 
2419     wxMsgCatalog 
*pTmpCat
; 
2420     while ( m_pMsgCat 
!= NULL 
) { 
2421         pTmpCat 
= m_pMsgCat
; 
2422         m_pMsgCat 
= m_pMsgCat
->m_pNext
; 
2426     // restore old locale 
2427     wxSetLocale(m_pOldLocale
); 
2430     wxSetlocale(LC_ALL
, m_pszOldLocale
); 
2432     free((wxChar 
*)m_pszOldLocale
);     // const_cast 
2435 // get the translation of given string in current locale 
2436 const wxChar 
*wxLocale::GetString(const wxChar 
*szOrigString
, 
2437                                   const wxChar 
*szDomain
) const 
2439     return GetString(szOrigString
, szOrigString
, size_t(-1), szDomain
); 
2442 const wxChar 
*wxLocale::GetString(const wxChar 
*szOrigString
, 
2443                                   const wxChar 
*szOrigString2
, 
2445                                   const wxChar 
*szDomain
) const 
2447     if ( wxIsEmpty(szOrigString
) ) 
2448         return wxEmptyString
; 
2450     const wxChar 
*pszTrans 
= NULL
; 
2451     wxMsgCatalog 
*pMsgCat
; 
2453     if ( szDomain 
!= NULL 
) 
2455         pMsgCat 
= FindCatalog(szDomain
); 
2457         // does the catalog exist? 
2458         if ( pMsgCat 
!= NULL 
) 
2459             pszTrans 
= pMsgCat
->GetString(szOrigString
, n
); 
2463         // search in all domains 
2464         for ( pMsgCat 
= m_pMsgCat
; pMsgCat 
!= NULL
; pMsgCat 
= pMsgCat
->m_pNext 
) 
2466             pszTrans 
= pMsgCat
->GetString(szOrigString
, n
); 
2467             if ( pszTrans 
!= NULL 
)   // take the first found 
2472     if ( pszTrans 
== NULL 
) 
2475         if ( !NoTransErr::Suppress() ) 
2477             NoTransErr noTransErr
; 
2479             if ( szDomain 
!= NULL 
) 
2481                 wxLogTrace(_T("i18n"), 
2482                            _T("string '%s'[%lu] not found in domain '%s' for locale '%s'."), 
2483                            szOrigString
, (unsigned long)n
, 
2484                            szDomain
, m_strLocale
.c_str()); 
2489                 wxLogTrace(_T("i18n"), 
2490                            _T("string '%s'[%lu] not found in locale '%s'."), 
2491                            szOrigString
, (unsigned long)n
, m_strLocale
.c_str()); 
2494 #endif // __WXDEBUG__ 
2496         if (n 
== size_t(-1)) 
2497             return szOrigString
; 
2499             return n 
== 1 ? szOrigString 
: szOrigString2
; 
2505 wxString 
wxLocale::GetHeaderValue( const wxChar
* szHeader
, 
2506                                    const wxChar
* szDomain 
) const 
2508     if ( wxIsEmpty(szHeader
) ) 
2509         return wxEmptyString
; 
2511     wxChar 
const * pszTrans 
= NULL
; 
2512     wxMsgCatalog 
*pMsgCat
; 
2514     if ( szDomain 
!= NULL 
) 
2516         pMsgCat 
= FindCatalog(szDomain
); 
2518         // does the catalog exist? 
2519         if ( pMsgCat 
== NULL 
) 
2520             return wxEmptyString
; 
2522         pszTrans 
= pMsgCat
->GetString(wxT(""), (size_t)-1); 
2526         // search in all domains 
2527         for ( pMsgCat 
= m_pMsgCat
; pMsgCat 
!= NULL
; pMsgCat 
= pMsgCat
->m_pNext 
) 
2529             pszTrans 
= pMsgCat
->GetString(wxT(""), (size_t)-1); 
2530             if ( pszTrans 
!= NULL 
)   // take the first found 
2535     if ( wxIsEmpty(pszTrans
) ) 
2536       return wxEmptyString
; 
2538     wxChar 
const * pszFound 
= wxStrstr(pszTrans
, szHeader
); 
2539     if ( pszFound 
== NULL 
) 
2540       return wxEmptyString
; 
2542     pszFound 
+= wxStrlen(szHeader
) + 2 /* ': ' */; 
2544     // Every header is separated by \n 
2546     wxChar 
const * pszEndLine 
= wxStrchr(pszFound
, wxT('\n')); 
2547     if ( pszEndLine 
== NULL 
) pszEndLine 
= pszFound 
+ wxStrlen(pszFound
); 
2550     // wxString( wxChar*, length); 
2551     wxString 
retVal( pszFound
, pszEndLine 
- pszFound 
); 
2557 // find catalog by name in a linked list, return NULL if !found 
2558 wxMsgCatalog 
*wxLocale::FindCatalog(const wxChar 
*szDomain
) const 
2560     // linear search in the linked list 
2561     wxMsgCatalog 
*pMsgCat
; 
2562     for ( pMsgCat 
= m_pMsgCat
; pMsgCat 
!= NULL
; pMsgCat 
= pMsgCat
->m_pNext 
) 
2564         if ( wxStricmp(pMsgCat
->GetName(), szDomain
) == 0 ) 
2571 // check if the given catalog is loaded 
2572 bool wxLocale::IsLoaded(const wxChar 
*szDomain
) const 
2574   return FindCatalog(szDomain
) != NULL
; 
2577 // add a catalog to our linked list 
2578 bool wxLocale::AddCatalog(const wxChar 
*szDomain
) 
2580     return AddCatalog(szDomain
, wxLANGUAGE_ENGLISH
, NULL
); 
2583 // add a catalog to our linked list 
2584 bool wxLocale::AddCatalog(const wxChar 
*szDomain
, 
2585                           wxLanguage    msgIdLanguage
, 
2586                           const wxChar 
*msgIdCharset
) 
2589   wxMsgCatalog 
*pMsgCat 
= new wxMsgCatalog
; 
2591   if ( pMsgCat
->Load(m_strShort
, szDomain
, msgIdCharset
, m_bConvertEncoding
) ) { 
2592     // add it to the head of the list so that in GetString it will 
2593     // be searched before the catalogs added earlier 
2594     pMsgCat
->m_pNext 
= m_pMsgCat
; 
2595     m_pMsgCat 
= pMsgCat
; 
2600     // don't add it because it couldn't be loaded anyway 
2603     // It is OK to not load catalog if the msgid language and m_language match, 
2604     // in which case we can directly display the texts embedded in program's 
2606     if (m_language 
== msgIdLanguage
) 
2609     // If there's no exact match, we may still get partial match where the 
2610     // (basic) language is same, but the country differs. For example, it's 
2611     // permitted to use en_US strings from sources even if m_language is en_GB: 
2612     const wxLanguageInfo 
*msgIdLangInfo 
= GetLanguageInfo(msgIdLanguage
); 
2613     if ( msgIdLangInfo 
&& 
2614          msgIdLangInfo
->CanonicalName
.Mid(0, 2) == m_strShort
.Mid(0, 2) ) 
2623 // ---------------------------------------------------------------------------- 
2624 // accessors for locale-dependent data 
2625 // ---------------------------------------------------------------------------- 
2630 wxString 
wxLocale::GetInfo(wxLocaleInfo index
, wxLocaleCategory 
WXUNUSED(cat
)) 
2635     buffer
[0] = wxT('\0'); 
2638         case wxLOCALE_DECIMAL_POINT
: 
2639             count 
= ::GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SDECIMAL
, buffer
, 256); 
2646         case wxSYS_LIST_SEPARATOR
: 
2647             count 
= ::GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SLIST
, buffer
, 256); 
2653         case wxSYS_LEADING_ZERO
: // 0 means no leading zero, 1 means leading zero 
2654             count 
= ::GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_ILZERO
, buffer
, 256); 
2662             wxFAIL_MSG(wxT("Unknown System String !")); 
2670 wxString 
wxLocale::GetInfo(wxLocaleInfo index
, wxLocaleCategory cat
) 
2672     struct lconv 
*locale_info 
= localeconv(); 
2675         case wxLOCALE_CAT_NUMBER
: 
2678                 case wxLOCALE_THOUSANDS_SEP
: 
2679                     return wxString(locale_info
->thousands_sep
, 
2681                 case wxLOCALE_DECIMAL_POINT
: 
2682                     return wxString(locale_info
->decimal_point
, 
2685                     return wxEmptyString
; 
2687         case wxLOCALE_CAT_MONEY
: 
2690                 case wxLOCALE_THOUSANDS_SEP
: 
2691                     return wxString(locale_info
->mon_thousands_sep
, 
2693                 case wxLOCALE_DECIMAL_POINT
: 
2694                     return wxString(locale_info
->mon_decimal_point
, 
2697                     return wxEmptyString
; 
2700             return wxEmptyString
; 
2704 #endif // __WXMSW__/!__WXMSW__ 
2706 // ---------------------------------------------------------------------------- 
2707 // global functions and variables 
2708 // ---------------------------------------------------------------------------- 
2710 // retrieve/change current locale 
2711 // ------------------------------ 
2713 // the current locale object 
2714 static wxLocale 
*g_pLocale 
= NULL
; 
2716 wxLocale 
*wxGetLocale() 
2721 wxLocale 
*wxSetLocale(wxLocale 
*pLocale
) 
2723   wxLocale 
*pOld 
= g_pLocale
; 
2724   g_pLocale 
= pLocale
; 
2730 // ---------------------------------------------------------------------------- 
2731 // wxLocale module (for lazy destruction of languagesDB) 
2732 // ---------------------------------------------------------------------------- 
2734 class wxLocaleModule
: public wxModule
 
2736     DECLARE_DYNAMIC_CLASS(wxLocaleModule
) 
2739         bool OnInit() { return true; } 
2740         void OnExit() { wxLocale::DestroyLanguagesDB(); } 
2743 IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule
, wxModule
) 
2747 // ---------------------------------------------------------------------------- 
2748 // default languages table & initialization 
2749 // ---------------------------------------------------------------------------- 
2753 // --- --- --- generated code begins here --- --- --- 
2755 // This table is generated by misc/languages/genlang.py 
2756 // When making changes, please put them into misc/languages/langtabl.txt 
2758 #if !defined(__WIN32__) || defined(__WXMICROWIN__) 
2760 #define SETWINLANG(info,lang,sublang) 
2764 #define SETWINLANG(info,lang,sublang) \ 
2765     info.WinLang = lang, info.WinSublang = sublang; 
2767 #ifndef LANG_AFRIKAANS 
2768 #define LANG_AFRIKAANS (0) 
2770 #ifndef LANG_ALBANIAN 
2771 #define LANG_ALBANIAN (0) 
2774 #define LANG_ARABIC (0) 
2776 #ifndef LANG_ARMENIAN 
2777 #define LANG_ARMENIAN (0) 
2779 #ifndef LANG_ASSAMESE 
2780 #define LANG_ASSAMESE (0) 
2783 #define LANG_AZERI (0) 
2786 #define LANG_BASQUE (0) 
2788 #ifndef LANG_BELARUSIAN 
2789 #define LANG_BELARUSIAN (0) 
2791 #ifndef LANG_BENGALI 
2792 #define LANG_BENGALI (0) 
2794 #ifndef LANG_BULGARIAN 
2795 #define LANG_BULGARIAN (0) 
2797 #ifndef LANG_CATALAN 
2798 #define LANG_CATALAN (0) 
2800 #ifndef LANG_CHINESE 
2801 #define LANG_CHINESE (0) 
2803 #ifndef LANG_CROATIAN 
2804 #define LANG_CROATIAN (0) 
2807 #define LANG_CZECH (0) 
2810 #define LANG_DANISH (0) 
2813 #define LANG_DUTCH (0) 
2815 #ifndef LANG_ENGLISH 
2816 #define LANG_ENGLISH (0) 
2818 #ifndef LANG_ESTONIAN 
2819 #define LANG_ESTONIAN (0) 
2821 #ifndef LANG_FAEROESE 
2822 #define LANG_FAEROESE (0) 
2825 #define LANG_FARSI (0) 
2827 #ifndef LANG_FINNISH 
2828 #define LANG_FINNISH (0) 
2831 #define LANG_FRENCH (0) 
2833 #ifndef LANG_GEORGIAN 
2834 #define LANG_GEORGIAN (0) 
2837 #define LANG_GERMAN (0) 
2840 #define LANG_GREEK (0) 
2842 #ifndef LANG_GUJARATI 
2843 #define LANG_GUJARATI (0) 
2846 #define LANG_HEBREW (0) 
2849 #define LANG_HINDI (0) 
2851 #ifndef LANG_HUNGARIAN 
2852 #define LANG_HUNGARIAN (0) 
2854 #ifndef LANG_ICELANDIC 
2855 #define LANG_ICELANDIC (0) 
2857 #ifndef LANG_INDONESIAN 
2858 #define LANG_INDONESIAN (0) 
2860 #ifndef LANG_ITALIAN 
2861 #define LANG_ITALIAN (0) 
2863 #ifndef LANG_JAPANESE 
2864 #define LANG_JAPANESE (0) 
2866 #ifndef LANG_KANNADA 
2867 #define LANG_KANNADA (0) 
2869 #ifndef LANG_KASHMIRI 
2870 #define LANG_KASHMIRI (0) 
2873 #define LANG_KAZAK (0) 
2875 #ifndef LANG_KONKANI 
2876 #define LANG_KONKANI (0) 
2879 #define LANG_KOREAN (0) 
2881 #ifndef LANG_LATVIAN 
2882 #define LANG_LATVIAN (0) 
2884 #ifndef LANG_LITHUANIAN 
2885 #define LANG_LITHUANIAN (0) 
2887 #ifndef LANG_MACEDONIAN 
2888 #define LANG_MACEDONIAN (0) 
2891 #define LANG_MALAY (0) 
2893 #ifndef LANG_MALAYALAM 
2894 #define LANG_MALAYALAM (0) 
2896 #ifndef LANG_MANIPURI 
2897 #define LANG_MANIPURI (0) 
2899 #ifndef LANG_MARATHI 
2900 #define LANG_MARATHI (0) 
2903 #define LANG_NEPALI (0) 
2905 #ifndef LANG_NORWEGIAN 
2906 #define LANG_NORWEGIAN (0) 
2909 #define LANG_ORIYA (0) 
2912 #define LANG_POLISH (0) 
2914 #ifndef LANG_PORTUGUESE 
2915 #define LANG_PORTUGUESE (0) 
2917 #ifndef LANG_PUNJABI 
2918 #define LANG_PUNJABI (0) 
2920 #ifndef LANG_ROMANIAN 
2921 #define LANG_ROMANIAN (0) 
2923 #ifndef LANG_RUSSIAN 
2924 #define LANG_RUSSIAN (0) 
2926 #ifndef LANG_SANSKRIT 
2927 #define LANG_SANSKRIT (0) 
2929 #ifndef LANG_SERBIAN 
2930 #define LANG_SERBIAN (0) 
2933 #define LANG_SINDHI (0) 
2936 #define LANG_SLOVAK (0) 
2938 #ifndef LANG_SLOVENIAN 
2939 #define LANG_SLOVENIAN (0) 
2941 #ifndef LANG_SPANISH 
2942 #define LANG_SPANISH (0) 
2944 #ifndef LANG_SWAHILI 
2945 #define LANG_SWAHILI (0) 
2947 #ifndef LANG_SWEDISH 
2948 #define LANG_SWEDISH (0) 
2951 #define LANG_TAMIL (0) 
2954 #define LANG_TATAR (0) 
2957 #define LANG_TELUGU (0) 
2960 #define LANG_THAI (0) 
2962 #ifndef LANG_TURKISH 
2963 #define LANG_TURKISH (0) 
2965 #ifndef LANG_UKRAINIAN 
2966 #define LANG_UKRAINIAN (0) 
2969 #define LANG_URDU (0) 
2972 #define LANG_UZBEK (0) 
2974 #ifndef LANG_VIETNAMESE 
2975 #define LANG_VIETNAMESE (0) 
2977 #ifndef SUBLANG_ARABIC_ALGERIA 
2978 #define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT 
2980 #ifndef SUBLANG_ARABIC_BAHRAIN 
2981 #define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT 
2983 #ifndef SUBLANG_ARABIC_EGYPT 
2984 #define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT 
2986 #ifndef SUBLANG_ARABIC_IRAQ 
2987 #define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT 
2989 #ifndef SUBLANG_ARABIC_JORDAN 
2990 #define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT 
2992 #ifndef SUBLANG_ARABIC_KUWAIT 
2993 #define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT 
2995 #ifndef SUBLANG_ARABIC_LEBANON 
2996 #define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT 
2998 #ifndef SUBLANG_ARABIC_LIBYA 
2999 #define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT 
3001 #ifndef SUBLANG_ARABIC_MOROCCO 
3002 #define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT 
3004 #ifndef SUBLANG_ARABIC_OMAN 
3005 #define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT 
3007 #ifndef SUBLANG_ARABIC_QATAR 
3008 #define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT 
3010 #ifndef SUBLANG_ARABIC_SAUDI_ARABIA 
3011 #define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT 
3013 #ifndef SUBLANG_ARABIC_SYRIA 
3014 #define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT 
3016 #ifndef SUBLANG_ARABIC_TUNISIA 
3017 #define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT 
3019 #ifndef SUBLANG_ARABIC_UAE 
3020 #define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT 
3022 #ifndef SUBLANG_ARABIC_YEMEN 
3023 #define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT 
3025 #ifndef SUBLANG_AZERI_CYRILLIC 
3026 #define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT 
3028 #ifndef SUBLANG_AZERI_LATIN 
3029 #define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT 
3031 #ifndef SUBLANG_CHINESE_SIMPLIFIED 
3032 #define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT 
3034 #ifndef SUBLANG_CHINESE_TRADITIONAL 
3035 #define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT 
3037 #ifndef SUBLANG_CHINESE_HONGKONG 
3038 #define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT 
3040 #ifndef SUBLANG_CHINESE_MACAU 
3041 #define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT 
3043 #ifndef SUBLANG_CHINESE_SINGAPORE 
3044 #define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT 
3046 #ifndef SUBLANG_DUTCH 
3047 #define SUBLANG_DUTCH SUBLANG_DEFAULT 
3049 #ifndef SUBLANG_DUTCH_BELGIAN 
3050 #define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT 
3052 #ifndef SUBLANG_ENGLISH_UK 
3053 #define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT 
3055 #ifndef SUBLANG_ENGLISH_US 
3056 #define SUBLANG_ENGLISH_US SUBLANG_DEFAULT 
3058 #ifndef SUBLANG_ENGLISH_AUS 
3059 #define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT 
3061 #ifndef SUBLANG_ENGLISH_BELIZE 
3062 #define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT 
3064 #ifndef SUBLANG_ENGLISH_CAN 
3065 #define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT 
3067 #ifndef SUBLANG_ENGLISH_CARIBBEAN 
3068 #define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT 
3070 #ifndef SUBLANG_ENGLISH_EIRE 
3071 #define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT 
3073 #ifndef SUBLANG_ENGLISH_JAMAICA 
3074 #define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT 
3076 #ifndef SUBLANG_ENGLISH_NZ 
3077 #define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT 
3079 #ifndef SUBLANG_ENGLISH_PHILIPPINES 
3080 #define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT 
3082 #ifndef SUBLANG_ENGLISH_SOUTH_AFRICA 
3083 #define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT 
3085 #ifndef SUBLANG_ENGLISH_TRINIDAD 
3086 #define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT 
3088 #ifndef SUBLANG_ENGLISH_ZIMBABWE 
3089 #define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT 
3091 #ifndef SUBLANG_FRENCH 
3092 #define SUBLANG_FRENCH SUBLANG_DEFAULT 
3094 #ifndef SUBLANG_FRENCH_BELGIAN 
3095 #define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT 
3097 #ifndef SUBLANG_FRENCH_CANADIAN 
3098 #define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT 
3100 #ifndef SUBLANG_FRENCH_LUXEMBOURG 
3101 #define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT 
3103 #ifndef SUBLANG_FRENCH_MONACO 
3104 #define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT 
3106 #ifndef SUBLANG_FRENCH_SWISS 
3107 #define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT 
3109 #ifndef SUBLANG_GERMAN 
3110 #define SUBLANG_GERMAN SUBLANG_DEFAULT 
3112 #ifndef SUBLANG_GERMAN_AUSTRIAN 
3113 #define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT 
3115 #ifndef SUBLANG_GERMAN_LIECHTENSTEIN 
3116 #define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT 
3118 #ifndef SUBLANG_GERMAN_LUXEMBOURG 
3119 #define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT 
3121 #ifndef SUBLANG_GERMAN_SWISS 
3122 #define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT 
3124 #ifndef SUBLANG_ITALIAN 
3125 #define SUBLANG_ITALIAN SUBLANG_DEFAULT 
3127 #ifndef SUBLANG_ITALIAN_SWISS 
3128 #define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT 
3130 #ifndef SUBLANG_KASHMIRI_INDIA 
3131 #define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT 
3133 #ifndef SUBLANG_KOREAN 
3134 #define SUBLANG_KOREAN SUBLANG_DEFAULT 
3136 #ifndef SUBLANG_LITHUANIAN 
3137 #define SUBLANG_LITHUANIAN SUBLANG_DEFAULT 
3139 #ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM 
3140 #define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT 
3142 #ifndef SUBLANG_MALAY_MALAYSIA 
3143 #define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT 
3145 #ifndef SUBLANG_NEPALI_INDIA 
3146 #define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT 
3148 #ifndef SUBLANG_NORWEGIAN_BOKMAL 
3149 #define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT 
3151 #ifndef SUBLANG_NORWEGIAN_NYNORSK 
3152 #define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT 
3154 #ifndef SUBLANG_PORTUGUESE 
3155 #define SUBLANG_PORTUGUESE SUBLANG_DEFAULT 
3157 #ifndef SUBLANG_PORTUGUESE_BRAZILIAN 
3158 #define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT 
3160 #ifndef SUBLANG_SERBIAN_CYRILLIC 
3161 #define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT 
3163 #ifndef SUBLANG_SERBIAN_LATIN 
3164 #define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT 
3166 #ifndef SUBLANG_SPANISH 
3167 #define SUBLANG_SPANISH SUBLANG_DEFAULT 
3169 #ifndef SUBLANG_SPANISH_ARGENTINA 
3170 #define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT 
3172 #ifndef SUBLANG_SPANISH_BOLIVIA 
3173 #define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT 
3175 #ifndef SUBLANG_SPANISH_CHILE 
3176 #define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT 
3178 #ifndef SUBLANG_SPANISH_COLOMBIA 
3179 #define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT 
3181 #ifndef SUBLANG_SPANISH_COSTA_RICA 
3182 #define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT 
3184 #ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC 
3185 #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT 
3187 #ifndef SUBLANG_SPANISH_ECUADOR 
3188 #define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT 
3190 #ifndef SUBLANG_SPANISH_EL_SALVADOR 
3191 #define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT 
3193 #ifndef SUBLANG_SPANISH_GUATEMALA 
3194 #define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT 
3196 #ifndef SUBLANG_SPANISH_HONDURAS 
3197 #define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT 
3199 #ifndef SUBLANG_SPANISH_MEXICAN 
3200 #define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT 
3202 #ifndef SUBLANG_SPANISH_MODERN 
3203 #define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT 
3205 #ifndef SUBLANG_SPANISH_NICARAGUA 
3206 #define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT 
3208 #ifndef SUBLANG_SPANISH_PANAMA 
3209 #define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT 
3211 #ifndef SUBLANG_SPANISH_PARAGUAY 
3212 #define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT 
3214 #ifndef SUBLANG_SPANISH_PERU 
3215 #define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT 
3217 #ifndef SUBLANG_SPANISH_PUERTO_RICO 
3218 #define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT 
3220 #ifndef SUBLANG_SPANISH_URUGUAY 
3221 #define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT 
3223 #ifndef SUBLANG_SPANISH_VENEZUELA 
3224 #define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT 
3226 #ifndef SUBLANG_SWEDISH 
3227 #define SUBLANG_SWEDISH SUBLANG_DEFAULT 
3229 #ifndef SUBLANG_SWEDISH_FINLAND 
3230 #define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT 
3232 #ifndef SUBLANG_URDU_INDIA 
3233 #define SUBLANG_URDU_INDIA SUBLANG_DEFAULT 
3235 #ifndef SUBLANG_URDU_PAKISTAN 
3236 #define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT 
3238 #ifndef SUBLANG_UZBEK_CYRILLIC 
3239 #define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT 
3241 #ifndef SUBLANG_UZBEK_LATIN 
3242 #define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT 
3248 #define LNG(wxlang, canonical, winlang, winsublang, desc) \ 
3249     info.Language = wxlang;                               \ 
3250     info.CanonicalName = wxT(canonical);                  \ 
3251     info.Description = wxT(desc);                         \ 
3252     SETWINLANG(info, winlang, winsublang)                 \ 
3255 void wxLocale::InitLanguagesDB() 
3257    wxLanguageInfo info
; 
3258    wxStringTokenizer tkn
; 
3260    LNG(wxLANGUAGE_ABKHAZIAN
,                  "ab"   , 0              , 0                                 , "Abkhazian") 
3261    LNG(wxLANGUAGE_AFAR
,                       "aa"   , 0              , 0                                 , "Afar") 
3262    LNG(wxLANGUAGE_AFRIKAANS
,                  "af_ZA", LANG_AFRIKAANS 
, SUBLANG_DEFAULT                   
, "Afrikaans") 
3263    LNG(wxLANGUAGE_ALBANIAN
,                   "sq_AL", LANG_ALBANIAN  
, SUBLANG_DEFAULT                   
, "Albanian") 
3264    LNG(wxLANGUAGE_AMHARIC
,                    "am"   , 0              , 0                                 , "Amharic") 
3265    LNG(wxLANGUAGE_ARABIC
,                     "ar"   , LANG_ARABIC    
, SUBLANG_DEFAULT                   
, "Arabic") 
3266    LNG(wxLANGUAGE_ARABIC_ALGERIA
,             "ar_DZ", LANG_ARABIC    
, SUBLANG_ARABIC_ALGERIA            
, "Arabic (Algeria)") 
3267    LNG(wxLANGUAGE_ARABIC_BAHRAIN
,             "ar_BH", LANG_ARABIC    
, SUBLANG_ARABIC_BAHRAIN            
, "Arabic (Bahrain)") 
3268    LNG(wxLANGUAGE_ARABIC_EGYPT
,               "ar_EG", LANG_ARABIC    
, SUBLANG_ARABIC_EGYPT              
, "Arabic (Egypt)") 
3269    LNG(wxLANGUAGE_ARABIC_IRAQ
,                "ar_IQ", LANG_ARABIC    
, SUBLANG_ARABIC_IRAQ               
, "Arabic (Iraq)") 
3270    LNG(wxLANGUAGE_ARABIC_JORDAN
,              "ar_JO", LANG_ARABIC    
, SUBLANG_ARABIC_JORDAN             
, "Arabic (Jordan)") 
3271    LNG(wxLANGUAGE_ARABIC_KUWAIT
,              "ar_KW", LANG_ARABIC    
, SUBLANG_ARABIC_KUWAIT             
, "Arabic (Kuwait)") 
3272    LNG(wxLANGUAGE_ARABIC_LEBANON
,             "ar_LB", LANG_ARABIC    
, SUBLANG_ARABIC_LEBANON            
, "Arabic (Lebanon)") 
3273    LNG(wxLANGUAGE_ARABIC_LIBYA
,               "ar_LY", LANG_ARABIC    
, SUBLANG_ARABIC_LIBYA              
, "Arabic (Libya)") 
3274    LNG(wxLANGUAGE_ARABIC_MOROCCO
,             "ar_MA", LANG_ARABIC    
, SUBLANG_ARABIC_MOROCCO            
, "Arabic (Morocco)") 
3275    LNG(wxLANGUAGE_ARABIC_OMAN
,                "ar_OM", LANG_ARABIC    
, SUBLANG_ARABIC_OMAN               
, "Arabic (Oman)") 
3276    LNG(wxLANGUAGE_ARABIC_QATAR
,               "ar_QA", LANG_ARABIC    
, SUBLANG_ARABIC_QATAR              
, "Arabic (Qatar)") 
3277    LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA
,        "ar_SA", LANG_ARABIC    
, SUBLANG_ARABIC_SAUDI_ARABIA       
, "Arabic (Saudi Arabia)") 
3278    LNG(wxLANGUAGE_ARABIC_SUDAN
,               "ar_SD", 0              , 0                                 , "Arabic (Sudan)") 
3279    LNG(wxLANGUAGE_ARABIC_SYRIA
,               "ar_SY", LANG_ARABIC    
, SUBLANG_ARABIC_SYRIA              
, "Arabic (Syria)") 
3280    LNG(wxLANGUAGE_ARABIC_TUNISIA
,             "ar_TN", LANG_ARABIC    
, SUBLANG_ARABIC_TUNISIA            
, "Arabic (Tunisia)") 
3281    LNG(wxLANGUAGE_ARABIC_UAE
,                 "ar_AE", LANG_ARABIC    
, SUBLANG_ARABIC_UAE                
, "Arabic (Uae)") 
3282    LNG(wxLANGUAGE_ARABIC_YEMEN
,               "ar_YE", LANG_ARABIC    
, SUBLANG_ARABIC_YEMEN              
, "Arabic (Yemen)") 
3283    LNG(wxLANGUAGE_ARMENIAN
,                   "hy"   , LANG_ARMENIAN  
, SUBLANG_DEFAULT                   
, "Armenian") 
3284    LNG(wxLANGUAGE_ASSAMESE
,                   "as"   , LANG_ASSAMESE  
, SUBLANG_DEFAULT                   
, "Assamese") 
3285    LNG(wxLANGUAGE_AYMARA
,                     "ay"   , 0              , 0                                 , "Aymara") 
3286    LNG(wxLANGUAGE_AZERI
,                      "az"   , LANG_AZERI     
, SUBLANG_DEFAULT                   
, "Azeri") 
3287    LNG(wxLANGUAGE_AZERI_CYRILLIC
,             "az"   , LANG_AZERI     
, SUBLANG_AZERI_CYRILLIC            
, "Azeri (Cyrillic)") 
3288    LNG(wxLANGUAGE_AZERI_LATIN
,                "az"   , LANG_AZERI     
, SUBLANG_AZERI_LATIN               
, "Azeri (Latin)") 
3289    LNG(wxLANGUAGE_BASHKIR
,                    "ba"   , 0              , 0                                 , "Bashkir") 
3290    LNG(wxLANGUAGE_BASQUE
,                     "eu_ES", LANG_BASQUE    
, SUBLANG_DEFAULT                   
, "Basque") 
3291    LNG(wxLANGUAGE_BELARUSIAN
,                 "be_BY", LANG_BELARUSIAN
, SUBLANG_DEFAULT                   
, "Belarusian") 
3292    LNG(wxLANGUAGE_BENGALI
,                    "bn"   , LANG_BENGALI   
, SUBLANG_DEFAULT                   
, "Bengali") 
3293    LNG(wxLANGUAGE_BHUTANI
,                    "dz"   , 0              , 0                                 , "Bhutani") 
3294    LNG(wxLANGUAGE_BIHARI
,                     "bh"   , 0              , 0                                 , "Bihari") 
3295    LNG(wxLANGUAGE_BISLAMA
,                    "bi"   , 0              , 0                                 , "Bislama") 
3296    LNG(wxLANGUAGE_BRETON
,                     "br"   , 0              , 0                                 , "Breton") 
3297    LNG(wxLANGUAGE_BULGARIAN
,                  "bg_BG", LANG_BULGARIAN 
, SUBLANG_DEFAULT                   
, "Bulgarian") 
3298    LNG(wxLANGUAGE_BURMESE
,                    "my"   , 0              , 0                                 , "Burmese") 
3299    LNG(wxLANGUAGE_CAMBODIAN
,                  "km"   , 0              , 0                                 , "Cambodian") 
3300    LNG(wxLANGUAGE_CATALAN
,                    "ca_ES", LANG_CATALAN   
, SUBLANG_DEFAULT                   
, "Catalan") 
3301    LNG(wxLANGUAGE_CHINESE
,                    "zh_TW", LANG_CHINESE   
, SUBLANG_DEFAULT                   
, "Chinese") 
3302    LNG(wxLANGUAGE_CHINESE_SIMPLIFIED
,         "zh_CN", LANG_CHINESE   
, SUBLANG_CHINESE_SIMPLIFIED        
, "Chinese (Simplified)") 
3303    LNG(wxLANGUAGE_CHINESE_TRADITIONAL
,        "zh_TW", LANG_CHINESE   
, SUBLANG_CHINESE_TRADITIONAL       
, "Chinese (Traditional)") 
3304    LNG(wxLANGUAGE_CHINESE_HONGKONG
,           "zh_HK", LANG_CHINESE   
, SUBLANG_CHINESE_HONGKONG          
, "Chinese (Hongkong)") 
3305    LNG(wxLANGUAGE_CHINESE_MACAU
,              "zh_MO", LANG_CHINESE   
, SUBLANG_CHINESE_MACAU             
, "Chinese (Macau)") 
3306    LNG(wxLANGUAGE_CHINESE_SINGAPORE
,          "zh_SG", LANG_CHINESE   
, SUBLANG_CHINESE_SINGAPORE         
, "Chinese (Singapore)") 
3307    LNG(wxLANGUAGE_CHINESE_TAIWAN
,             "zh_TW", LANG_CHINESE   
, SUBLANG_CHINESE_TRADITIONAL       
, "Chinese (Taiwan)") 
3308    LNG(wxLANGUAGE_CORSICAN
,                   "co"   , 0              , 0                                 , "Corsican") 
3309    LNG(wxLANGUAGE_CROATIAN
,                   "hr_HR", LANG_CROATIAN  
, SUBLANG_DEFAULT                   
, "Croatian") 
3310    LNG(wxLANGUAGE_CZECH
,                      "cs_CZ", LANG_CZECH     
, SUBLANG_DEFAULT                   
, "Czech") 
3311    LNG(wxLANGUAGE_DANISH
,                     "da_DK", LANG_DANISH    
, SUBLANG_DEFAULT                   
, "Danish") 
3312    LNG(wxLANGUAGE_DUTCH
,                      "nl_NL", LANG_DUTCH     
, SUBLANG_DUTCH                     
, "Dutch") 
3313    LNG(wxLANGUAGE_DUTCH_BELGIAN
,              "nl_BE", LANG_DUTCH     
, SUBLANG_DUTCH_BELGIAN             
, "Dutch (Belgian)") 
3314    LNG(wxLANGUAGE_ENGLISH
,                    "en_GB", LANG_ENGLISH   
, SUBLANG_ENGLISH_UK                
, "English") 
3315    LNG(wxLANGUAGE_ENGLISH_UK
,                 "en_GB", LANG_ENGLISH   
, SUBLANG_ENGLISH_UK                
, "English (U.K.)") 
3316    LNG(wxLANGUAGE_ENGLISH_US
,                 "en_US", LANG_ENGLISH   
, SUBLANG_ENGLISH_US                
, "English (U.S.)") 
3317    LNG(wxLANGUAGE_ENGLISH_AUSTRALIA
,          "en_AU", LANG_ENGLISH   
, SUBLANG_ENGLISH_AUS               
, "English (Australia)") 
3318    LNG(wxLANGUAGE_ENGLISH_BELIZE
,             "en_BZ", LANG_ENGLISH   
, SUBLANG_ENGLISH_BELIZE            
, "English (Belize)") 
3319    LNG(wxLANGUAGE_ENGLISH_BOTSWANA
,           "en_BW", 0              , 0                                 , "English (Botswana)") 
3320    LNG(wxLANGUAGE_ENGLISH_CANADA
,             "en_CA", LANG_ENGLISH   
, SUBLANG_ENGLISH_CAN               
, "English (Canada)") 
3321    LNG(wxLANGUAGE_ENGLISH_CARIBBEAN
,          "en_CB", LANG_ENGLISH   
, SUBLANG_ENGLISH_CARIBBEAN         
, "English (Caribbean)") 
3322    LNG(wxLANGUAGE_ENGLISH_DENMARK
,            "en_DK", 0              , 0                                 , "English (Denmark)") 
3323    LNG(wxLANGUAGE_ENGLISH_EIRE
,               "en_IE", LANG_ENGLISH   
, SUBLANG_ENGLISH_EIRE              
, "English (Eire)") 
3324    LNG(wxLANGUAGE_ENGLISH_JAMAICA
,            "en_JM", LANG_ENGLISH   
, SUBLANG_ENGLISH_JAMAICA           
, "English (Jamaica)") 
3325    LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND
,        "en_NZ", LANG_ENGLISH   
, SUBLANG_ENGLISH_NZ                
, "English (New Zealand)") 
3326    LNG(wxLANGUAGE_ENGLISH_PHILIPPINES
,        "en_PH", LANG_ENGLISH   
, SUBLANG_ENGLISH_PHILIPPINES       
, "English (Philippines)") 
3327    LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA
,       "en_ZA", LANG_ENGLISH   
, SUBLANG_ENGLISH_SOUTH_AFRICA      
, "English (South Africa)") 
3328    LNG(wxLANGUAGE_ENGLISH_TRINIDAD
,           "en_TT", LANG_ENGLISH   
, SUBLANG_ENGLISH_TRINIDAD          
, "English (Trinidad)") 
3329    LNG(wxLANGUAGE_ENGLISH_ZIMBABWE
,           "en_ZW", LANG_ENGLISH   
, SUBLANG_ENGLISH_ZIMBABWE          
, "English (Zimbabwe)") 
3330    LNG(wxLANGUAGE_ESPERANTO
,                  "eo"   , 0              , 0                                 , "Esperanto") 
3331    LNG(wxLANGUAGE_ESTONIAN
,                   "et_EE", LANG_ESTONIAN  
, SUBLANG_DEFAULT                   
, "Estonian") 
3332    LNG(wxLANGUAGE_FAEROESE
,                   "fo_FO", LANG_FAEROESE  
, SUBLANG_DEFAULT                   
, "Faeroese") 
3333    LNG(wxLANGUAGE_FARSI
,                      "fa_IR", LANG_FARSI     
, SUBLANG_DEFAULT                   
, "Farsi") 
3334    LNG(wxLANGUAGE_FIJI
,                       "fj"   , 0              , 0                                 , "Fiji") 
3335    LNG(wxLANGUAGE_FINNISH
,                    "fi_FI", LANG_FINNISH   
, SUBLANG_DEFAULT                   
, "Finnish") 
3336    LNG(wxLANGUAGE_FRENCH
,                     "fr_FR", LANG_FRENCH    
, SUBLANG_FRENCH                    
, "French") 
3337    LNG(wxLANGUAGE_FRENCH_BELGIAN
,             "fr_BE", LANG_FRENCH    
, SUBLANG_FRENCH_BELGIAN            
, "French (Belgian)") 
3338    LNG(wxLANGUAGE_FRENCH_CANADIAN
,            "fr_CA", LANG_FRENCH    
, SUBLANG_FRENCH_CANADIAN           
, "French (Canadian)") 
3339    LNG(wxLANGUAGE_FRENCH_LUXEMBOURG
,          "fr_LU", LANG_FRENCH    
, SUBLANG_FRENCH_LUXEMBOURG         
, "French (Luxembourg)") 
3340    LNG(wxLANGUAGE_FRENCH_MONACO
,              "fr_MC", LANG_FRENCH    
, SUBLANG_FRENCH_MONACO             
, "French (Monaco)") 
3341    LNG(wxLANGUAGE_FRENCH_SWISS
,               "fr_CH", LANG_FRENCH    
, SUBLANG_FRENCH_SWISS              
, "French (Swiss)") 
3342    LNG(wxLANGUAGE_FRISIAN
,                    "fy"   , 0              , 0                                 , "Frisian") 
3343    LNG(wxLANGUAGE_GALICIAN
,                   "gl_ES", 0              , 0                                 , "Galician") 
3344    LNG(wxLANGUAGE_GEORGIAN
,                   "ka"   , LANG_GEORGIAN  
, SUBLANG_DEFAULT                   
, "Georgian") 
3345    LNG(wxLANGUAGE_GERMAN
,                     "de_DE", LANG_GERMAN    
, SUBLANG_GERMAN                    
, "German") 
3346    LNG(wxLANGUAGE_GERMAN_AUSTRIAN
,            "de_AT", LANG_GERMAN    
, SUBLANG_GERMAN_AUSTRIAN           
, "German (Austrian)") 
3347    LNG(wxLANGUAGE_GERMAN_BELGIUM
,             "de_BE", 0              , 0                                 , "German (Belgium)") 
3348    LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN
,       "de_LI", LANG_GERMAN    
, SUBLANG_GERMAN_LIECHTENSTEIN      
, "German (Liechtenstein)") 
3349    LNG(wxLANGUAGE_GERMAN_LUXEMBOURG
,          "de_LU", LANG_GERMAN    
, SUBLANG_GERMAN_LUXEMBOURG         
, "German (Luxembourg)") 
3350    LNG(wxLANGUAGE_GERMAN_SWISS
,               "de_CH", LANG_GERMAN    
, SUBLANG_GERMAN_SWISS              
, "German (Swiss)") 
3351    LNG(wxLANGUAGE_GREEK
,                      "el_GR", LANG_GREEK     
, SUBLANG_DEFAULT                   
, "Greek") 
3352    LNG(wxLANGUAGE_GREENLANDIC
,                "kl_GL", 0              , 0                                 , "Greenlandic") 
3353    LNG(wxLANGUAGE_GUARANI
,                    "gn"   , 0              , 0                                 , "Guarani") 
3354    LNG(wxLANGUAGE_GUJARATI
,                   "gu"   , LANG_GUJARATI  
, SUBLANG_DEFAULT                   
, "Gujarati") 
3355    LNG(wxLANGUAGE_HAUSA
,                      "ha"   , 0              , 0                                 , "Hausa") 
3356    LNG(wxLANGUAGE_HEBREW
,                     "he_IL", LANG_HEBREW    
, SUBLANG_DEFAULT                   
, "Hebrew") 
3357    LNG(wxLANGUAGE_HINDI
,                      "hi_IN", LANG_HINDI     
, SUBLANG_DEFAULT                   
, "Hindi") 
3358    LNG(wxLANGUAGE_HUNGARIAN
,                  "hu_HU", LANG_HUNGARIAN 
, SUBLANG_DEFAULT                   
, "Hungarian") 
3359    LNG(wxLANGUAGE_ICELANDIC
,                  "is_IS", LANG_ICELANDIC 
, SUBLANG_DEFAULT                   
, "Icelandic") 
3360    LNG(wxLANGUAGE_INDONESIAN
,                 "id_ID", LANG_INDONESIAN
, SUBLANG_DEFAULT                   
, "Indonesian") 
3361    LNG(wxLANGUAGE_INTERLINGUA
,                "ia"   , 0              , 0                                 , "Interlingua") 
3362    LNG(wxLANGUAGE_INTERLINGUE
,                "ie"   , 0              , 0                                 , "Interlingue") 
3363    LNG(wxLANGUAGE_INUKTITUT
,                  "iu"   , 0              , 0                                 , "Inuktitut") 
3364    LNG(wxLANGUAGE_INUPIAK
,                    "ik"   , 0              , 0                                 , "Inupiak") 
3365    LNG(wxLANGUAGE_IRISH
,                      "ga_IE", 0              , 0                                 , "Irish") 
3366    LNG(wxLANGUAGE_ITALIAN
,                    "it_IT", LANG_ITALIAN   
, SUBLANG_ITALIAN                   
, "Italian") 
3367    LNG(wxLANGUAGE_ITALIAN_SWISS
,              "it_CH", LANG_ITALIAN   
, SUBLANG_ITALIAN_SWISS             
, "Italian (Swiss)") 
3368    LNG(wxLANGUAGE_JAPANESE
,                   "ja_JP", LANG_JAPANESE  
, SUBLANG_DEFAULT                   
, "Japanese") 
3369    LNG(wxLANGUAGE_JAVANESE
,                   "jw"   , 0              , 0                                 , "Javanese") 
3370    LNG(wxLANGUAGE_KANNADA
,                    "kn"   , LANG_KANNADA   
, SUBLANG_DEFAULT                   
, "Kannada") 
3371    LNG(wxLANGUAGE_KASHMIRI
,                   "ks"   , LANG_KASHMIRI  
, SUBLANG_DEFAULT                   
, "Kashmiri") 
3372    LNG(wxLANGUAGE_KASHMIRI_INDIA
,             "ks_IN", LANG_KASHMIRI  
, SUBLANG_KASHMIRI_INDIA            
, "Kashmiri (India)") 
3373    LNG(wxLANGUAGE_KAZAKH
,                     "kk"   , LANG_KAZAK     
, SUBLANG_DEFAULT                   
, "Kazakh") 
3374    LNG(wxLANGUAGE_KERNEWEK
,                   "kw_GB", 0              , 0                                 , "Kernewek") 
3375    LNG(wxLANGUAGE_KINYARWANDA
,                "rw"   , 0              , 0                                 , "Kinyarwanda") 
3376    LNG(wxLANGUAGE_KIRGHIZ
,                    "ky"   , 0              , 0                                 , "Kirghiz") 
3377    LNG(wxLANGUAGE_KIRUNDI
,                    "rn"   , 0              , 0                                 , "Kirundi") 
3378    LNG(wxLANGUAGE_KONKANI
,                    ""     , LANG_KONKANI   
, SUBLANG_DEFAULT                   
, "Konkani") 
3379    LNG(wxLANGUAGE_KOREAN
,                     "ko_KR", LANG_KOREAN    
, SUBLANG_KOREAN                    
, "Korean") 
3380    LNG(wxLANGUAGE_KURDISH
,                    "ku"   , 0              , 0                                 , "Kurdish") 
3381    LNG(wxLANGUAGE_LAOTHIAN
,                   "lo"   , 0              , 0                                 , "Laothian") 
3382    LNG(wxLANGUAGE_LATIN
,                      "la"   , 0              , 0                                 , "Latin") 
3383    LNG(wxLANGUAGE_LATVIAN
,                    "lv_LV", LANG_LATVIAN   
, SUBLANG_DEFAULT                   
, "Latvian") 
3384    LNG(wxLANGUAGE_LINGALA
,                    "ln"   , 0              , 0                                 , "Lingala") 
3385    LNG(wxLANGUAGE_LITHUANIAN
,                 "lt_LT", LANG_LITHUANIAN
, SUBLANG_LITHUANIAN                
, "Lithuanian") 
3386    LNG(wxLANGUAGE_MACEDONIAN
,                 "mk_MK", LANG_MACEDONIAN
, SUBLANG_DEFAULT                   
, "Macedonian") 
3387    LNG(wxLANGUAGE_MALAGASY
,                   "mg"   , 0              , 0                                 , "Malagasy") 
3388    LNG(wxLANGUAGE_MALAY
,                      "ms_MY", LANG_MALAY     
, SUBLANG_DEFAULT                   
, "Malay") 
3389    LNG(wxLANGUAGE_MALAYALAM
,                  "ml"   , LANG_MALAYALAM 
, SUBLANG_DEFAULT                   
, "Malayalam") 
3390    LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM
,    "ms_BN", LANG_MALAY     
, SUBLANG_MALAY_BRUNEI_DARUSSALAM   
, "Malay (Brunei Darussalam)") 
3391    LNG(wxLANGUAGE_MALAY_MALAYSIA
,             "ms_MY", LANG_MALAY     
, SUBLANG_MALAY_MALAYSIA            
, "Malay (Malaysia)") 
3392    LNG(wxLANGUAGE_MALTESE
,                    "mt_MT", 0              , 0                                 , "Maltese") 
3393    LNG(wxLANGUAGE_MANIPURI
,                   ""     , LANG_MANIPURI  
, SUBLANG_DEFAULT                   
, "Manipuri") 
3394    LNG(wxLANGUAGE_MAORI
,                      "mi"   , 0              , 0                                 , "Maori") 
3395    LNG(wxLANGUAGE_MARATHI
,                    "mr_IN", LANG_MARATHI   
, SUBLANG_DEFAULT                   
, "Marathi") 
3396    LNG(wxLANGUAGE_MOLDAVIAN
,                  "mo"   , 0              , 0                                 , "Moldavian") 
3397    LNG(wxLANGUAGE_MONGOLIAN
,                  "mn"   , 0              , 0                                 , "Mongolian") 
3398    LNG(wxLANGUAGE_NAURU
,                      "na"   , 0              , 0                                 , "Nauru") 
3399    LNG(wxLANGUAGE_NEPALI
,                     "ne"   , LANG_NEPALI    
, SUBLANG_DEFAULT                   
, "Nepali") 
3400    LNG(wxLANGUAGE_NEPALI_INDIA
,               "ne_IN", LANG_NEPALI    
, SUBLANG_NEPALI_INDIA              
, "Nepali (India)") 
3401    LNG(wxLANGUAGE_NORWEGIAN_BOKMAL
,           "nb_NO", LANG_NORWEGIAN 
, SUBLANG_NORWEGIAN_BOKMAL          
, "Norwegian (Bokmal)") 
3402    LNG(wxLANGUAGE_NORWEGIAN_NYNORSK
,          "nn_NO", LANG_NORWEGIAN 
, SUBLANG_NORWEGIAN_NYNORSK         
, "Norwegian (Nynorsk)") 
3403    LNG(wxLANGUAGE_OCCITAN
,                    "oc"   , 0              , 0                                 , "Occitan") 
3404    LNG(wxLANGUAGE_ORIYA
,                      "or"   , LANG_ORIYA     
, SUBLANG_DEFAULT                   
, "Oriya") 
3405    LNG(wxLANGUAGE_OROMO
,                      "om"   , 0              , 0                                 , "(Afan) Oromo") 
3406    LNG(wxLANGUAGE_PASHTO
,                     "ps"   , 0              , 0                                 , "Pashto, Pushto") 
3407    LNG(wxLANGUAGE_POLISH
,                     "pl_PL", LANG_POLISH    
, SUBLANG_DEFAULT                   
, "Polish") 
3408    LNG(wxLANGUAGE_PORTUGUESE
,                 "pt_PT", LANG_PORTUGUESE
, SUBLANG_PORTUGUESE                
, "Portuguese") 
3409    LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN
,       "pt_BR", LANG_PORTUGUESE
, SUBLANG_PORTUGUESE_BRAZILIAN      
, "Portuguese (Brazilian)") 
3410    LNG(wxLANGUAGE_PUNJABI
,                    "pa"   , LANG_PUNJABI   
, SUBLANG_DEFAULT                   
, "Punjabi") 
3411    LNG(wxLANGUAGE_QUECHUA
,                    "qu"   , 0              , 0                                 , "Quechua") 
3412    LNG(wxLANGUAGE_RHAETO_ROMANCE
,             "rm"   , 0              , 0                                 , "Rhaeto-Romance") 
3413    LNG(wxLANGUAGE_ROMANIAN
,                   "ro_RO", LANG_ROMANIAN  
, SUBLANG_DEFAULT                   
, "Romanian") 
3414    LNG(wxLANGUAGE_RUSSIAN
,                    "ru_RU", LANG_RUSSIAN   
, SUBLANG_DEFAULT                   
, "Russian") 
3415    LNG(wxLANGUAGE_RUSSIAN_UKRAINE
,            "ru_UA", 0              , 0                                 , "Russian (Ukraine)") 
3416    LNG(wxLANGUAGE_SAMOAN
,                     "sm"   , 0              , 0                                 , "Samoan") 
3417    LNG(wxLANGUAGE_SANGHO
,                     "sg"   , 0              , 0                                 , "Sangho") 
3418    LNG(wxLANGUAGE_SANSKRIT
,                   "sa"   , LANG_SANSKRIT  
, SUBLANG_DEFAULT                   
, "Sanskrit") 
3419    LNG(wxLANGUAGE_SCOTS_GAELIC
,               "gd"   , 0              , 0                                 , "Scots Gaelic") 
3420    LNG(wxLANGUAGE_SERBIAN
,                    "sr_YU", LANG_SERBIAN   
, SUBLANG_DEFAULT                   
, "Serbian") 
3421    LNG(wxLANGUAGE_SERBIAN_CYRILLIC
,           "sr_YU", LANG_SERBIAN   
, SUBLANG_SERBIAN_CYRILLIC          
, "Serbian (Cyrillic)") 
3422    LNG(wxLANGUAGE_SERBIAN_LATIN
,              "sr_YU", LANG_SERBIAN   
, SUBLANG_SERBIAN_LATIN             
, "Serbian (Latin)") 
3423    LNG(wxLANGUAGE_SERBO_CROATIAN
,             "sh"   , 0              , 0                                 , "Serbo-Croatian") 
3424    LNG(wxLANGUAGE_SESOTHO
,                    "st"   , 0              , 0                                 , "Sesotho") 
3425    LNG(wxLANGUAGE_SETSWANA
,                   "tn"   , 0              , 0                                 , "Setswana") 
3426    LNG(wxLANGUAGE_SHONA
,                      "sn"   , 0              , 0                                 , "Shona") 
3427    LNG(wxLANGUAGE_SINDHI
,                     "sd"   , LANG_SINDHI    
, SUBLANG_DEFAULT                   
, "Sindhi") 
3428    LNG(wxLANGUAGE_SINHALESE
,                  "si"   , 0              , 0                                 , "Sinhalese") 
3429    LNG(wxLANGUAGE_SISWATI
,                    "ss"   , 0              , 0                                 , "Siswati") 
3430    LNG(wxLANGUAGE_SLOVAK
,                     "sk_SK", LANG_SLOVAK    
, SUBLANG_DEFAULT                   
, "Slovak") 
3431    LNG(wxLANGUAGE_SLOVENIAN
,                  "sl_SI", LANG_SLOVENIAN 
, SUBLANG_DEFAULT                   
, "Slovenian") 
3432    LNG(wxLANGUAGE_SOMALI
,                     "so"   , 0              , 0                                 , "Somali") 
3433    LNG(wxLANGUAGE_SPANISH
,                    "es_ES", LANG_SPANISH   
, SUBLANG_SPANISH                   
, "Spanish") 
3434    LNG(wxLANGUAGE_SPANISH_ARGENTINA
,          "es_AR", LANG_SPANISH   
, SUBLANG_SPANISH_ARGENTINA         
, "Spanish (Argentina)") 
3435    LNG(wxLANGUAGE_SPANISH_BOLIVIA
,            "es_BO", LANG_SPANISH   
, SUBLANG_SPANISH_BOLIVIA           
, "Spanish (Bolivia)") 
3436    LNG(wxLANGUAGE_SPANISH_CHILE
,              "es_CL", LANG_SPANISH   
, SUBLANG_SPANISH_CHILE             
, "Spanish (Chile)") 
3437    LNG(wxLANGUAGE_SPANISH_COLOMBIA
,           "es_CO", LANG_SPANISH   
, SUBLANG_SPANISH_COLOMBIA          
, "Spanish (Colombia)") 
3438    LNG(wxLANGUAGE_SPANISH_COSTA_RICA
,         "es_CR", LANG_SPANISH   
, SUBLANG_SPANISH_COSTA_RICA        
, "Spanish (Costa Rica)") 
3439    LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC
, "es_DO", LANG_SPANISH   
, SUBLANG_SPANISH_DOMINICAN_REPUBLIC
, "Spanish (Dominican republic)") 
3440    LNG(wxLANGUAGE_SPANISH_ECUADOR
,            "es_EC", LANG_SPANISH   
, SUBLANG_SPANISH_ECUADOR           
, "Spanish (Ecuador)") 
3441    LNG(wxLANGUAGE_SPANISH_EL_SALVADOR
,        "es_SV", LANG_SPANISH   
, SUBLANG_SPANISH_EL_SALVADOR       
, "Spanish (El Salvador)") 
3442    LNG(wxLANGUAGE_SPANISH_GUATEMALA
,          "es_GT", LANG_SPANISH   
, SUBLANG_SPANISH_GUATEMALA         
, "Spanish (Guatemala)") 
3443    LNG(wxLANGUAGE_SPANISH_HONDURAS
,           "es_HN", LANG_SPANISH   
, SUBLANG_SPANISH_HONDURAS          
, "Spanish (Honduras)") 
3444    LNG(wxLANGUAGE_SPANISH_MEXICAN
,            "es_MX", LANG_SPANISH   
, SUBLANG_SPANISH_MEXICAN           
, "Spanish (Mexican)") 
3445    LNG(wxLANGUAGE_SPANISH_MODERN
,             "es_ES", LANG_SPANISH   
, SUBLANG_SPANISH_MODERN            
, "Spanish (Modern)") 
3446    LNG(wxLANGUAGE_SPANISH_NICARAGUA
,          "es_NI", LANG_SPANISH   
, SUBLANG_SPANISH_NICARAGUA         
, "Spanish (Nicaragua)") 
3447    LNG(wxLANGUAGE_SPANISH_PANAMA
,             "es_PA", LANG_SPANISH   
, SUBLANG_SPANISH_PANAMA            
, "Spanish (Panama)") 
3448    LNG(wxLANGUAGE_SPANISH_PARAGUAY
,           "es_PY", LANG_SPANISH   
, SUBLANG_SPANISH_PARAGUAY          
, "Spanish (Paraguay)") 
3449    LNG(wxLANGUAGE_SPANISH_PERU
,               "es_PE", LANG_SPANISH   
, SUBLANG_SPANISH_PERU              
, "Spanish (Peru)") 
3450    LNG(wxLANGUAGE_SPANISH_PUERTO_RICO
,        "es_PR", LANG_SPANISH   
, SUBLANG_SPANISH_PUERTO_RICO       
, "Spanish (Puerto Rico)") 
3451    LNG(wxLANGUAGE_SPANISH_URUGUAY
,            "es_UY", LANG_SPANISH   
, SUBLANG_SPANISH_URUGUAY           
, "Spanish (Uruguay)") 
3452    LNG(wxLANGUAGE_SPANISH_US
,                 "es_US", 0              , 0                                 , "Spanish (U.S.)") 
3453    LNG(wxLANGUAGE_SPANISH_VENEZUELA
,          "es_VE", LANG_SPANISH   
, SUBLANG_SPANISH_VENEZUELA         
, "Spanish (Venezuela)") 
3454    LNG(wxLANGUAGE_SUNDANESE
,                  "su"   , 0              , 0                                 , "Sundanese") 
3455    LNG(wxLANGUAGE_SWAHILI
,                    "sw_KE", LANG_SWAHILI   
, SUBLANG_DEFAULT                   
, "Swahili") 
3456    LNG(wxLANGUAGE_SWEDISH
,                    "sv_SE", LANG_SWEDISH   
, SUBLANG_SWEDISH                   
, "Swedish") 
3457    LNG(wxLANGUAGE_SWEDISH_FINLAND
,            "sv_FI", LANG_SWEDISH   
, SUBLANG_SWEDISH_FINLAND           
, "Swedish (Finland)") 
3458    LNG(wxLANGUAGE_TAGALOG
,                    "tl_PH", 0              , 0                                 , "Tagalog") 
3459    LNG(wxLANGUAGE_TAJIK
,                      "tg"   , 0              , 0                                 , "Tajik") 
3460    LNG(wxLANGUAGE_TAMIL
,                      "ta"   , LANG_TAMIL     
, SUBLANG_DEFAULT                   
, "Tamil") 
3461    LNG(wxLANGUAGE_TATAR
,                      "tt"   , LANG_TATAR     
, SUBLANG_DEFAULT                   
, "Tatar") 
3462    LNG(wxLANGUAGE_TELUGU
,                     "te"   , LANG_TELUGU    
, SUBLANG_DEFAULT                   
, "Telugu") 
3463    LNG(wxLANGUAGE_THAI
,                       "th_TH", LANG_THAI      
, SUBLANG_DEFAULT                   
, "Thai") 
3464    LNG(wxLANGUAGE_TIBETAN
,                    "bo"   , 0              , 0                                 , "Tibetan") 
3465    LNG(wxLANGUAGE_TIGRINYA
,                   "ti"   , 0              , 0                                 , "Tigrinya") 
3466    LNG(wxLANGUAGE_TONGA
,                      "to"   , 0              , 0                                 , "Tonga") 
3467    LNG(wxLANGUAGE_TSONGA
,                     "ts"   , 0              , 0                                 , "Tsonga") 
3468    LNG(wxLANGUAGE_TURKISH
,                    "tr_TR", LANG_TURKISH   
, SUBLANG_DEFAULT                   
, "Turkish") 
3469    LNG(wxLANGUAGE_TURKMEN
,                    "tk"   , 0              , 0                                 , "Turkmen") 
3470    LNG(wxLANGUAGE_TWI
,                        "tw"   , 0              , 0                                 , "Twi") 
3471    LNG(wxLANGUAGE_UIGHUR
,                     "ug"   , 0              , 0                                 , "Uighur") 
3472    LNG(wxLANGUAGE_UKRAINIAN
,                  "uk_UA", LANG_UKRAINIAN 
, SUBLANG_DEFAULT                   
, "Ukrainian") 
3473    LNG(wxLANGUAGE_URDU
,                       "ur"   , LANG_URDU      
, SUBLANG_DEFAULT                   
, "Urdu") 
3474    LNG(wxLANGUAGE_URDU_INDIA
,                 "ur_IN", LANG_URDU      
, SUBLANG_URDU_INDIA                
, "Urdu (India)") 
3475    LNG(wxLANGUAGE_URDU_PAKISTAN
,              "ur_PK", LANG_URDU      
, SUBLANG_URDU_PAKISTAN             
, "Urdu (Pakistan)") 
3476    LNG(wxLANGUAGE_UZBEK
,                      "uz"   , LANG_UZBEK     
, SUBLANG_DEFAULT                   
, "Uzbek") 
3477    LNG(wxLANGUAGE_UZBEK_CYRILLIC
,             "uz"   , LANG_UZBEK     
, SUBLANG_UZBEK_CYRILLIC            
, "Uzbek (Cyrillic)") 
3478    LNG(wxLANGUAGE_UZBEK_LATIN
,                "uz"   , LANG_UZBEK     
, SUBLANG_UZBEK_LATIN               
, "Uzbek (Latin)") 
3479    LNG(wxLANGUAGE_VIETNAMESE
,                 "vi_VN", LANG_VIETNAMESE
, SUBLANG_DEFAULT                   
, "Vietnamese") 
3480    LNG(wxLANGUAGE_VOLAPUK
,                    "vo"   , 0              , 0                                 , "Volapuk") 
3481    LNG(wxLANGUAGE_WELSH
,                      "cy"   , 0              , 0                                 , "Welsh") 
3482    LNG(wxLANGUAGE_WOLOF
,                      "wo"   , 0              , 0                                 , "Wolof") 
3483    LNG(wxLANGUAGE_XHOSA
,                      "xh"   , 0              , 0                                 , "Xhosa") 
3484    LNG(wxLANGUAGE_YIDDISH
,                    "yi"   , 0              , 0                                 , "Yiddish") 
3485    LNG(wxLANGUAGE_YORUBA
,                     "yo"   , 0              , 0                                 , "Yoruba") 
3486    LNG(wxLANGUAGE_ZHUANG
,                     "za"   , 0              , 0                                 , "Zhuang") 
3487    LNG(wxLANGUAGE_ZULU
,                       "zu"   , 0              , 0                                 , "Zulu") 
3492 // --- --- --- generated code ends here --- --- --- 
3494 #endif // wxUSE_INTL