home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / common / intl.cpp < prev    next >
C/C++ Source or Header  |  2002-12-11  |  87KB  |  2,364 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        src/common/intl.cpp
  3. // Purpose:     Internationalization and localisation for wxWindows
  4. // Author:      Vadim Zeitlin
  5. // Modified by:
  6. // Created:     29/01/98
  7. // RCS-ID:      $Id: intl.cpp,v 1.82.2.12 2002/12/07 02:30:34 VZ Exp $
  8. // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. // ============================================================================
  13. // declaration
  14. // ============================================================================
  15.  
  16. // ----------------------------------------------------------------------------
  17. // headers
  18. // ----------------------------------------------------------------------------
  19.  
  20. #ifdef __GNUG__
  21.     #pragma implementation "intl.h"
  22. #endif
  23.  
  24. // For compilers that support precompilation, includes "wx.h".
  25. #include "wx/wxprec.h"
  26.  
  27. #ifdef __BORLANDC__
  28.     #pragma hdrstop
  29. #endif
  30.  
  31. #if wxUSE_INTL
  32.  
  33. // standard headers
  34. #include <locale.h>
  35. #include <ctype.h>
  36. #include <stdlib.h>
  37. #ifdef HAVE_LANGINFO_H
  38.   #include <langinfo.h>
  39. #endif
  40.  
  41. // wxWindows
  42. #ifndef WX_PRECOMP
  43.     #include "wx/string.h"
  44.     #include "wx/intl.h"
  45.     #include "wx/log.h"
  46.     #include "wx/debug.h"
  47.     #include "wx/utils.h"
  48.     #include "wx/dynarray.h"
  49. #endif // WX_PRECOMP
  50.  
  51. #include "wx/file.h"
  52. #include "wx/tokenzr.h"
  53. #include "wx/module.h"
  54. #include "wx/fontmap.h"
  55. #include "wx/encconv.h"
  56. #include "wx/hashmap.h"
  57.  
  58. #ifdef __WIN32__
  59.     #include "wx/msw/private.h"
  60. #elif defined(__UNIX_LIKE__)
  61.     #include "wx/fontmap.h"         // for CharsetToEncoding()
  62. #endif
  63.  
  64. #if defined(__WXMAC__)
  65.   #include  "wx/mac/private.h"  // includes mac headers
  66. #endif
  67.  
  68. // ----------------------------------------------------------------------------
  69. // simple types
  70. // ----------------------------------------------------------------------------
  71.  
  72. // this should *not* be wxChar, this type must have exactly 8 bits!
  73. typedef wxUint8 size_t8;
  74. typedef wxUint32 size_t32;
  75.  
  76. // ----------------------------------------------------------------------------
  77. // constants
  78. // ----------------------------------------------------------------------------
  79.  
  80. // magic number identifying the .mo format file
  81. const size_t32 MSGCATALOG_MAGIC    = 0x950412de;
  82. const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495;
  83.  
  84. // extension of ".mo" files
  85. #define MSGCATALOG_EXTENSION  _T(".mo")
  86.  
  87. // the constants describing the format of lang_LANG locale string
  88. static const size_t LEN_LANG = 2;
  89. static const size_t LEN_SUBLANG = 2;
  90. static const size_t LEN_FULL = LEN_LANG + 1 + LEN_SUBLANG; // 1 for '_'
  91.  
  92. // ----------------------------------------------------------------------------
  93. // global functions
  94. // ----------------------------------------------------------------------------
  95.  
  96. #ifdef __WXDEBUG__
  97.  
  98. // small class to suppress the translation erros until exit from current scope
  99. class NoTransErr
  100. {
  101. public:
  102.     NoTransErr() { ms_suppressCount++; }
  103.    ~NoTransErr() { ms_suppressCount--;  }
  104.  
  105.    static bool Suppress() { return ms_suppressCount > 0; }
  106.  
  107. private:
  108.    static size_t ms_suppressCount;
  109. };
  110.  
  111. size_t NoTransErr::ms_suppressCount = 0;
  112.  
  113. #else // !Debug
  114.  
  115. class NoTransErr
  116. {
  117. public:
  118.     NoTransErr() { }
  119.    ~NoTransErr() { }
  120. };
  121.  
  122. #endif // Debug/!Debug
  123.  
  124. static wxLocale *wxSetLocale(wxLocale *pLocale);
  125.  
  126. // helper functions of GetSystemLanguage()
  127. #ifdef __UNIX__
  128.  
  129. // get just the language part
  130. static inline wxString ExtractLang(const wxString& langFull)
  131. {
  132.     return langFull.Left(LEN_LANG);
  133. }
  134.  
  135. // get everything else (including the leading '_')
  136. static inline wxString ExtractNotLang(const wxString& langFull)
  137. {
  138.     return langFull.Mid(LEN_LANG);
  139. }
  140.  
  141. #endif // __UNIX__
  142.  
  143.  
  144. // ----------------------------------------------------------------------------
  145. // wxMsgCatalogFile corresponds to one disk-file message catalog.
  146. //
  147. // This is a "low-level" class and is used only by wxMsgCatalog
  148. // ----------------------------------------------------------------------------
  149.  
  150. WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxString, wxMessagesHash);
  151.  
  152. class wxMsgCatalogFile
  153. {
  154. public:
  155.     // ctor & dtor
  156.     wxMsgCatalogFile();
  157.    ~wxMsgCatalogFile();
  158.  
  159.     // load the catalog from disk (szDirPrefix corresponds to language)
  160.     bool Load(const wxChar *szDirPrefix, const wxChar *szName);
  161.  
  162.     // fills the hash with string-translation pairs
  163.     void FillHash(wxMessagesHash& hash, bool convertEncoding) const;
  164.  
  165. private:
  166.     // this implementation is binary compatible with GNU gettext() version 0.10
  167.  
  168.     // an entry in the string table
  169.     struct wxMsgTableEntry
  170.     {
  171.       size_t32   nLen;           // length of the string
  172.       size_t32   ofsString;      // pointer to the string
  173.     };
  174.  
  175.     // header of a .mo file
  176.     struct wxMsgCatalogHeader
  177.     {
  178.       size_t32  magic,          // offset +00:  magic id
  179.                 revision,       //        +04:  revision
  180.                 numStrings;     //        +08:  number of strings in the file
  181.       size_t32  ofsOrigTable,   //        +0C:  start of original string table
  182.                 ofsTransTable;  //        +10:  start of translated string table
  183.       size_t32  nHashSize,      //        +14:  hash table size
  184.                 ofsHashTable;   //        +18:  offset of hash table start
  185.     };
  186.  
  187.     // all data is stored here, NULL if no data loaded
  188.     size_t8 *m_pData;
  189.  
  190.     // data description
  191.     size_t32          m_numStrings;   // number of strings in this domain
  192.     wxMsgTableEntry  *m_pOrigTable,   // pointer to original   strings
  193.                      *m_pTransTable;  //            translated
  194.  
  195.     const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const
  196.       { return (const char *)(m_pData + Swap(pTable[index].ofsString)); }
  197.  
  198.     wxString GetCharset() const;
  199.  
  200.     // utility functions
  201.       // big<->little endian
  202.     inline size_t32 Swap(size_t32 ui) const;
  203.  
  204.     bool          m_bSwapped;   // wrong endianness?
  205. };
  206.  
  207.  
  208. // ----------------------------------------------------------------------------
  209. // wxMsgCatalog corresponds to one loaded message catalog.
  210. //
  211. // This is a "low-level" class and is used only by wxLocale (that's why
  212. // it's designed to be stored in a linked list)
  213. // ----------------------------------------------------------------------------
  214.  
  215. class wxMsgCatalog
  216. {
  217. public:
  218.     // load the catalog from disk (szDirPrefix corresponds to language)
  219.     bool Load(const wxChar *szDirPrefix, const wxChar *szName, bool bConvertEncoding = FALSE);
  220.  
  221.     // get name of the catalog
  222.     wxString GetName() const { return m_name; }
  223.  
  224.     // get the translated string: returns NULL if not found
  225.     const wxChar *GetString(const wxChar *sz) const;
  226.  
  227.     // public variable pointing to the next element in a linked list (or NULL)
  228.     wxMsgCatalog *m_pNext;
  229.  
  230. private:
  231.     wxMessagesHash  m_messages; // all messages in the catalog
  232.     wxString        m_name;     // name of the domain
  233. };
  234.  
  235. // ----------------------------------------------------------------------------
  236. // global variables
  237. // ----------------------------------------------------------------------------
  238.  
  239. // the list of the directories to search for message catalog files
  240. static wxArrayString s_searchPrefixes;
  241.  
  242. // ============================================================================
  243. // implementation
  244. // ============================================================================
  245.  
  246. // ----------------------------------------------------------------------------
  247. // wxMsgCatalogFile class
  248. // ----------------------------------------------------------------------------
  249.  
  250. // swap the 2 halves of 32 bit integer if needed
  251. size_t32 wxMsgCatalogFile::Swap(size_t32 ui) const
  252. {
  253.   return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
  254.                       ((ui >> 8) & 0xff00) | (ui >> 24)
  255.                     : ui;
  256. }
  257.  
  258. wxMsgCatalogFile::wxMsgCatalogFile()
  259. {
  260.   m_pData = NULL;
  261. }
  262.  
  263. wxMsgCatalogFile::~wxMsgCatalogFile()
  264. {
  265.   wxDELETEA(m_pData);
  266. }
  267.  
  268. // return all directories to search for given prefix
  269. static wxString GetAllMsgCatalogSubdirs(const wxChar *prefix,
  270.                                         const wxChar *lang)
  271. {
  272.     wxString searchPath;
  273.  
  274.     // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in
  275.     // prefix (assuming the language is 'fr')
  276.     searchPath << prefix << wxFILE_SEP_PATH << lang << wxFILE_SEP_PATH
  277.                          << wxT("LC_MESSAGES") << wxPATH_SEP
  278.                << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP
  279.                << prefix << wxPATH_SEP;
  280.  
  281.     return searchPath;
  282. }
  283.  
  284. // construct the search path for the given language
  285. static wxString GetFullSearchPath(const wxChar *lang)
  286. {
  287.     wxString searchPath;
  288.  
  289.     // first take the entries explicitly added by the program
  290.     size_t count = s_searchPrefixes.Count();
  291.     for ( size_t n = 0; n < count; n++ )
  292.     {
  293.         searchPath << GetAllMsgCatalogSubdirs(s_searchPrefixes[n], lang)
  294.                    << wxPATH_SEP;
  295.     }
  296.  
  297.     // LC_PATH is a standard env var containing the search path for the .mo
  298.     // files
  299.     const wxChar *pszLcPath = wxGetenv(wxT("LC_PATH"));
  300.     if ( pszLcPath != NULL )
  301.         searchPath << GetAllMsgCatalogSubdirs(pszLcPath, lang);
  302.  
  303. #ifdef __UNIX__
  304.     // add some standard ones and the one in the tree where wxWin was installed:
  305.     searchPath
  306.         << GetAllMsgCatalogSubdirs(wxString(wxGetInstallPrefix()) + wxT("/share/locale"), lang)
  307.         << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang)
  308.         << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang)
  309.         << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang);
  310. #endif // __UNIX__
  311.  
  312.     // then take the current directory
  313.     // FIXME it should be the directory of the executable
  314. #ifdef __WXMAC__
  315.     wxChar cwd[512] ;
  316.     wxGetWorkingDirectory( cwd , sizeof( cwd ) ) ;
  317.     searchPath << GetAllMsgCatalogSubdirs(cwd, lang);
  318.     // generic search paths could be somewhere in the system folder preferences
  319. #else // !Mac
  320.     searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang);
  321.  
  322. #endif // platform
  323.  
  324.     return searchPath;
  325. }
  326.  
  327. // open disk file and read in it's contents
  328. bool wxMsgCatalogFile::Load(const wxChar *szDirPrefix, const wxChar *szName0)
  329. {
  330.    /* We need to handle locales like  de_AT.iso-8859-1
  331.       For this we first chop off the .CHARSET specifier and ignore it.
  332.       FIXME: UNICODE SUPPORT: must use CHARSET specifier!
  333.    */
  334.    wxString szName = szName0;
  335.    if(szName.Find(wxT('.')) != -1) // contains a dot
  336.       szName = szName.Left(szName.Find(wxT('.')));
  337.  
  338.   wxString searchPath = GetFullSearchPath(szDirPrefix);
  339.   const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_'));
  340.   if ( sublocale )
  341.   {
  342.       // also add just base locale name: for things like "fr_BE" (belgium
  343.       // french) we should use "fr" if no belgium specific message catalogs
  344.       // exist
  345.       searchPath << GetFullSearchPath(wxString(szDirPrefix).
  346.                                       Left((size_t)(sublocale - szDirPrefix)))
  347.                  << wxPATH_SEP;
  348.   }
  349.  
  350.   wxString strFile = szName;
  351.   strFile += MSGCATALOG_EXTENSION;
  352.  
  353.   // don't give translation errors here because the wxstd catalog might
  354.   // not yet be loaded (and it's normal)
  355.   //
  356.   // (we're using an object because we have several return paths)
  357.  
  358.   NoTransErr noTransErr;
  359.   wxLogVerbose(_("looking for catalog '%s' in path '%s'."),
  360.                szName.c_str(), searchPath.c_str());
  361.  
  362.   wxString strFullName;
  363.   if ( !wxFindFileInPath(&strFullName, searchPath, strFile) ) {
  364.     wxLogVerbose(_("catalog file for domain '%s' not found."), szName.c_str());
  365.     return FALSE;
  366.   }
  367.  
  368.   // open file
  369.   wxLogVerbose(_("using catalog '%s' from '%s'."),
  370.              szName.c_str(), strFullName.c_str());
  371.  
  372.   wxFile fileMsg(strFullName);
  373.   if ( !fileMsg.IsOpened() )
  374.     return FALSE;
  375.  
  376.   // get the file size
  377.   off_t nSize = fileMsg.Length();
  378.   if ( nSize == wxInvalidOffset )
  379.     return FALSE;
  380.  
  381.   // read the whole file in memory
  382.   m_pData = new size_t8[nSize];
  383.   if ( fileMsg.Read(m_pData, nSize) != nSize ) {
  384.     wxDELETEA(m_pData);
  385.     return FALSE;
  386.   }
  387.  
  388.   // examine header
  389.   bool bValid = (size_t)nSize > sizeof(wxMsgCatalogHeader);
  390.  
  391.   wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_pData;
  392.   if ( bValid ) {
  393.     // we'll have to swap all the integers if it's true
  394.     m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW;
  395.  
  396.     // check the magic number
  397.     bValid = m_bSwapped || pHeader->magic == MSGCATALOG_MAGIC;
  398.   }
  399.  
  400.   if ( !bValid ) {
  401.     // it's either too short or has incorrect magic number
  402.     wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str());
  403.  
  404.     wxDELETEA(m_pData);
  405.     return FALSE;
  406.   }
  407.  
  408.   // initialize
  409.   m_numStrings  = Swap(pHeader->numStrings);
  410.   m_pOrigTable  = (wxMsgTableEntry *)(m_pData +
  411.                    Swap(pHeader->ofsOrigTable));
  412.   m_pTransTable = (wxMsgTableEntry *)(m_pData +
  413.                    Swap(pHeader->ofsTransTable));
  414.  
  415.   // everything is fine
  416.   return TRUE;
  417. }
  418.  
  419. void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, bool convertEncoding) const
  420. {
  421.     wxString charset = GetCharset();
  422.  
  423. #if wxUSE_WCHAR_T
  424.     wxCSConv *csConv = NULL;
  425.     if ( !!charset )
  426.         csConv = new wxCSConv(charset);
  427.  
  428.     wxMBConv& inputConv = csConv ? *((wxMBConv*)csConv) : *wxConvCurrent;
  429.  
  430.     for (size_t i = 0; i < m_numStrings; i++)
  431.     {
  432.         wxString key(StringAtOfs(m_pOrigTable, i), inputConv);
  433.  
  434.     #if wxUSE_UNICODE
  435.         hash[key] = wxString(StringAtOfs(m_pTransTable, i), inputConv);
  436.     #else
  437.         if ( convertEncoding )
  438.             hash[key] =
  439.                 wxString(inputConv.cMB2WC(StringAtOfs(m_pTransTable, i)),
  440.                          wxConvLocal);
  441.         else
  442.             hash[key] = StringAtOfs(m_pTransTable, i);
  443.     #endif
  444.     }
  445.  
  446.     delete csConv;
  447. #else // !wxUSE_WCHAR_T
  448.     #if wxUSE_FONTMAP
  449.     if ( convertEncoding )
  450.     {
  451.         wxFontEncoding targetEnc = wxFONTENCODING_SYSTEM;
  452.         wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(charset, FALSE);
  453.         if ( enc == wxFONTENCODING_SYSTEM )
  454.         {
  455.             convertEncoding = FALSE; // unknown encoding
  456.         }
  457.         else
  458.         {
  459.             targetEnc = wxLocale::GetSystemEncoding();
  460.             if (targetEnc == wxFONTENCODING_SYSTEM)
  461.             {
  462.                 wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc);
  463.                 if (a[0] == enc)
  464.                     // no conversion needed, locale uses native encoding
  465.                     convertEncoding = FALSE;
  466.                 if (a.GetCount() == 0)
  467.                     // we don't know common equiv. under this platform
  468.                     convertEncoding = FALSE;
  469.                 targetEnc = a[0];
  470.             }
  471.         }
  472.  
  473.         if ( convertEncoding )
  474.         {
  475.             wxEncodingConverter converter;
  476.             converter.Init(enc, targetEnc);
  477.  
  478.             for (size_t i = 0; i < m_numStrings; i++)
  479.             {
  480.                 wxString key(StringAtOfs(m_pOrigTable, i));
  481.                 hash[key] =
  482.                     converter.Convert(wxString(StringAtOfs(m_pTransTable, i)));
  483.             }
  484.         }
  485.     }
  486.  
  487.     if ( !convertEncoding )
  488.     #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
  489.     {
  490.         for (size_t i = 0; i < m_numStrings; i++)
  491.         {
  492.             wxString key(StringAtOfs(m_pOrigTable, i));
  493.             hash[key] = StringAtOfs(m_pTransTable, i);
  494.         }
  495.     }
  496. #endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T
  497. }
  498.  
  499. wxString wxMsgCatalogFile::GetCharset() const
  500. {
  501.     // first, find encoding header:
  502.     const char *hdr = StringAtOfs(m_pOrigTable, 0);
  503.     if ( hdr == NULL || hdr[0] != 0 )
  504.     {
  505.         // not supported by this catalog, does not have correct header
  506.         return wxEmptyString;
  507.     }
  508.  
  509.     wxString header = wxString::FromAscii( StringAtOfs(m_pTransTable, 0));
  510.     wxString charset;
  511.     int pos = header.Find(wxT("Content-Type: text/plain; charset="));
  512.     if ( pos == wxNOT_FOUND )
  513.     {
  514.         // incorrectly filled Content-Type header
  515.         return wxEmptyString;
  516.     }
  517.  
  518.     size_t n = pos + 34; /*strlen("Content-Type: text/plain; charset=")*/
  519.     while ( header[n] != wxT('\n') )
  520.         charset << header[n++];
  521.  
  522.     if ( charset == wxT("CHARSET") )
  523.     {
  524.         // "CHARSET" is not valid charset, but lazy translator
  525.         return wxEmptyString;
  526.     }
  527.  
  528.     return charset;
  529. }
  530.  
  531. // ----------------------------------------------------------------------------
  532. // wxMsgCatalog class
  533. // ----------------------------------------------------------------------------
  534.  
  535. bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName,
  536.                         bool bConvertEncoding)
  537. {
  538.     wxMsgCatalogFile file;
  539.  
  540.     m_name = szName;
  541.  
  542.     if ( file.Load(szDirPrefix, szName) )
  543.     {
  544.         file.FillHash(m_messages, bConvertEncoding);
  545.         return TRUE;
  546.     }
  547.  
  548.     return FALSE;
  549. }
  550.  
  551. const wxChar *wxMsgCatalog::GetString(const wxChar *sz) const
  552. {
  553.     wxMessagesHash::const_iterator i = m_messages.find(sz);
  554.     if ( i != m_messages.end() )
  555.     {
  556.         return i->second.c_str();
  557.     }
  558.     else
  559.         return NULL;
  560. }
  561.  
  562. // ----------------------------------------------------------------------------
  563. // wxLocale
  564. // ----------------------------------------------------------------------------
  565.  
  566. #include "wx/arrimpl.cpp"
  567. WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo, wxLanguageInfoArray);
  568. WX_DEFINE_OBJARRAY(wxLanguageInfoArray);
  569.  
  570. wxLanguageInfoArray *wxLocale::ms_languagesDB = NULL;
  571.  
  572. /*static*/ void wxLocale::CreateLanguagesDB()
  573. {
  574.     if (ms_languagesDB == NULL)
  575.     {
  576.         ms_languagesDB = new wxLanguageInfoArray;
  577.         InitLanguagesDB();
  578.     }
  579. }
  580.  
  581. /*static*/ void wxLocale::DestroyLanguagesDB()
  582. {
  583.     delete ms_languagesDB;
  584.     ms_languagesDB = NULL;
  585. }
  586.  
  587.  
  588. wxLocale::wxLocale()
  589. {
  590.   m_pszOldLocale = NULL;
  591.   m_pMsgCat = NULL;
  592.   m_language = wxLANGUAGE_UNKNOWN;
  593. }
  594.  
  595. // NB: this function has (desired) side effect of changing current locale
  596. bool wxLocale::Init(const wxChar *szName,
  597.                     const wxChar *szShort,
  598.                     const wxChar *szLocale,
  599.                     bool        bLoadDefault,
  600.                     bool        bConvertEncoding)
  601. {
  602.   m_strLocale = szName;
  603.   m_strShort = szShort;
  604.   m_bConvertEncoding = bConvertEncoding;
  605.   m_language = wxLANGUAGE_UNKNOWN;
  606.  
  607.   // change current locale (default: same as long name)
  608.   if ( szLocale == NULL )
  609.   {
  610.     // the argument to setlocale()
  611.     szLocale = szShort;
  612.   }
  613.   m_pszOldLocale = wxSetlocale(LC_ALL, szLocale);
  614.   if ( m_pszOldLocale == NULL )
  615.     wxLogError(_("locale '%s' can not be set."), szLocale);
  616.  
  617.   // the short name will be used to look for catalog files as well,
  618.   // so we need something here
  619.   if ( m_strShort.IsEmpty() ) {
  620.     // FIXME I don't know how these 2 letter abbreviations are formed,
  621.     //       this wild guess is surely wrong
  622.     if ( szLocale[0] )
  623.     {
  624.         m_strShort += (wxChar)wxTolower(szLocale[0]);
  625.         if ( szLocale[1] )
  626.             m_strShort += (wxChar)wxTolower(szLocale[1]);
  627.     }
  628.   }
  629.  
  630.   // save the old locale to be able to restore it later
  631.   m_pOldLocale = wxSetLocale(this);
  632.  
  633.   // load the default catalog with wxWindows standard messages
  634.   m_pMsgCat = NULL;
  635.   bool bOk = TRUE;
  636.   if ( bLoadDefault )
  637.     bOk = AddCatalog(wxT("wxstd"));
  638.  
  639.   return bOk;
  640. }
  641.  
  642. bool wxLocale::Init(int language, int flags)
  643. {
  644.     int lang = language;
  645.     if (lang == wxLANGUAGE_DEFAULT)
  646.     {
  647.         // auto detect the language
  648.         lang = GetSystemLanguage();
  649.     }
  650.  
  651.     // We failed to detect system language, so we will use English:
  652.     if (lang == wxLANGUAGE_UNKNOWN)
  653.     {
  654.        return FALSE;
  655.     }
  656.  
  657.     const wxLanguageInfo *info = GetLanguageInfo(lang);
  658.  
  659.     // Unknown language:
  660.     if (info == NULL)
  661.     {
  662.         wxLogError(wxT("Unknown language %i."), lang);
  663.         return FALSE;
  664.     }
  665.  
  666.     wxString name = info->Description;
  667.     wxString canonical = info->CanonicalName;
  668.     wxString locale;
  669.  
  670.     // Set the locale:
  671. #if defined(__UNIX__) && !defined(__WXMAC__)
  672.     if (language == wxLANGUAGE_DEFAULT)
  673.         locale = wxEmptyString;
  674.     else
  675.         locale = info->CanonicalName;
  676.  
  677.     wxMB2WXbuf retloc = wxSetlocale(LC_ALL, locale);
  678.  
  679.     if ( !retloc )
  680.     {
  681.         // Some C libraries don't like xx_YY form and require xx only
  682.         retloc = wxSetlocale(LC_ALL, locale.Mid(0,2));
  683.     }
  684.     if ( !retloc )
  685.     {
  686.         // Some C libraries (namely glibc) still use old ISO 639,
  687.         // so will translate the abbrev for them
  688.         wxString mid = locale.Mid(0,2);
  689.         if (mid == wxT("he"))
  690.             locale = wxT("iw") + locale.Mid(3);
  691.         else if (mid == wxT("id"))
  692.             locale = wxT("in") + locale.Mid(3);
  693.         else if (mid == wxT("yi"))
  694.             locale = wxT("ji") + locale.Mid(3);
  695.  
  696.         retloc = wxSetlocale(LC_ALL, locale);
  697.     }
  698.     if ( !retloc )
  699.     {
  700.         // (This time, we changed locale in previous if-branch, so try again.)
  701.         // Some C libraries don't like xx_YY form and require xx only
  702.         retloc = wxSetlocale(LC_ALL, locale.Mid(0,2));
  703.     }
  704.     if ( !retloc )
  705.     {
  706.         wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str());
  707.         return FALSE;
  708.     }
  709. #elif defined(__WIN32__)
  710.     wxMB2WXbuf retloc = wxT("C");
  711.     if (language != wxLANGUAGE_DEFAULT)
  712.     {
  713.         if (info->WinLang == 0)
  714.         {
  715.             wxLogWarning(wxT("Locale '%s' not supported by OS."), name.c_str());
  716.             // retloc already set to "C"
  717.         }
  718.         else
  719.         {
  720.             wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang),
  721.                                      SORT_DEFAULT);
  722.             if (SetThreadLocale(lcid))
  723.             {
  724.                 retloc = wxSetlocale(LC_ALL, wxEmptyString);
  725.             }
  726.             else
  727.             {
  728.                 // Windows9X doesn't support SetThreadLocale, so we must
  729.                 // translate LCID to CRT's setlocale string ourselves
  730.                 locale.Empty();
  731.                 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
  732.                 {
  733.                     wxChar buffer[256];
  734.                     buffer[0] = wxT('\0');
  735.                     GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256);
  736.                     locale << buffer;
  737.                     if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0)
  738.                         locale << wxT("_") << buffer;
  739.                 }
  740.                 if (locale.IsEmpty())
  741.                 {
  742.                     wxLogLastError(wxT("SetThreadLocale"));
  743.                     wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
  744.                     return FALSE;
  745.                 }
  746.                 else
  747.                 {
  748.                     retloc = wxSetlocale(LC_ALL, locale);
  749.                 }
  750.             }
  751.         }
  752.     }
  753.     else
  754.     {
  755.         retloc = wxSetlocale(LC_ALL, wxEmptyString);
  756.     }
  757.  
  758.     if ( !retloc )
  759.     {
  760.         wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
  761.         return FALSE;
  762.     }
  763. #elif defined(__WXMAC__) || defined(__WXPM__)
  764.     wxMB2WXbuf retloc = wxSetlocale(LC_ALL , wxEmptyString);
  765. #else
  766.     return FALSE;
  767. #endif
  768.  
  769.     return Init(name, canonical, retloc,
  770.                 (flags & wxLOCALE_LOAD_DEFAULT) != 0,
  771.                 (flags & wxLOCALE_CONV_ENCODING) != 0);
  772. }
  773.  
  774.  
  775.  
  776. void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix)
  777. {
  778.     if ( s_searchPrefixes.Index(prefix) == wxNOT_FOUND )
  779.     {
  780.         s_searchPrefixes.Add(prefix);
  781.     }
  782.     //else: already have it
  783. }
  784.  
  785. /*static*/ int wxLocale::GetSystemLanguage()
  786. {
  787.     CreateLanguagesDB();
  788.  
  789.     // init i to avoid compiler warning
  790.     size_t i = 0,
  791.            count = ms_languagesDB->GetCount();
  792.  
  793. #if defined(__UNIX__) && !defined(__WXMAC__)
  794.     // first get the string identifying the language from the environment
  795.     wxString langFull;
  796.     if (!wxGetEnv(wxT("LC_ALL"), &langFull) &&
  797.         !wxGetEnv(wxT("LC_MESSAGES"), &langFull) &&
  798.         !wxGetEnv(wxT("LANG"), &langFull))
  799.     {
  800.         // no language specified, threat it as English
  801.         return wxLANGUAGE_ENGLISH;
  802.     }
  803.  
  804.     if ( langFull == _T("C") || langFull == _T("POSIX") )
  805.     {
  806.         // default C locale
  807.         return wxLANGUAGE_ENGLISH;
  808.     }
  809.  
  810.     // the language string has the following form
  811.     //
  812.     //      lang[_LANG][.encoding][@modifier]
  813.     //
  814.     // (see environ(5) in the Open Unix specification)
  815.     //
  816.     // where lang is the primary language, LANG is a sublang/territory,
  817.     // encoding is the charset to use and modifier "allows the user to select
  818.     // a specific instance of localization data within a single category"
  819.     //
  820.     // for example, the following strings are valid:
  821.     //      fr
  822.     //      fr_FR
  823.     //      de_DE.iso88591
  824.     //      de_DE@euro
  825.     //      de_DE.iso88591@euro
  826.  
  827.     // for now we don't use the encoding, although we probably should (doing
  828.     // translations of the msg catalogs on the fly as required) (TODO)
  829.     //
  830.     // we don't use the modifiers neither but we probably should translate
  831.     // "euro" into iso885915
  832.     size_t posEndLang = langFull.find_first_of(_T("@."));
  833.     if ( posEndLang != wxString::npos )
  834.     {
  835.         langFull.Truncate(posEndLang);
  836.     }
  837.  
  838.     // in addition to the format above, we also can have full language names
  839.     // in LANG env var - for example, SuSE is known to use LANG="german" - so
  840.     // check for this
  841.  
  842.     // do we have just the language (or sublang too)?
  843.     bool justLang = langFull.Len() == LEN_LANG;
  844.     if ( justLang ||
  845.          (langFull.Len() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) )
  846.     {
  847.         // 0. Make sure the lang is according to latest ISO 639
  848.         //    (this is neccessary because glibc uses iw and in instead
  849.         //    of he and id respectively).
  850.  
  851.         // the language itself (second part is the dialect/sublang)
  852.         wxString langOrig = ExtractLang(langFull);
  853.  
  854.         wxString lang;
  855.         if ( langOrig == wxT("iw"))
  856.             lang = _T("he");
  857.         else if ( langOrig == wxT("in") )
  858.             lang = wxT("id");
  859.         else if ( langOrig == wxT("ji") )
  860.             lang = wxT("yi");
  861.         else
  862.             lang = langOrig;
  863.  
  864.         // did we change it?
  865.         if ( lang != langOrig )
  866.         {
  867.             langFull = lang + ExtractNotLang(langFull);
  868.         }
  869.  
  870.         // 1. Try to find the language either as is:
  871.         for ( i = 0; i < count; i++ )
  872.         {
  873.             if ( ms_languagesDB->Item(i).CanonicalName == langFull )
  874.             {
  875.                 break;
  876.             }
  877.         }
  878.  
  879.         // 2. If langFull is of the form xx_YY, try to find xx:
  880.         if ( i == count && !justLang )
  881.         {
  882.             for ( i = 0; i < count; i++ )
  883.             {
  884.                 if ( ms_languagesDB->Item(i).CanonicalName == lang )
  885.                 {
  886.                     break;
  887.                 }
  888.             }
  889.         }
  890.  
  891.         // 3. If langFull is of the form xx, try to find any xx_YY record:
  892.         if ( i == count && justLang )
  893.         {
  894.             for ( i = 0; i < count; i++ )
  895.             {
  896.                 if ( ExtractLang(ms_languagesDB->Item(i).CanonicalName)
  897.                         == langFull )
  898.                 {
  899.                     break;
  900.                 }
  901.             }
  902.         }
  903.     }
  904.     else // not standard format
  905.     {
  906.         // try to find the name in verbose description
  907.         for ( i = 0; i < count; i++ )
  908.         {
  909.             if (ms_languagesDB->Item(i).Description.CmpNoCase(langFull) == 0)
  910.             {
  911.                 break;
  912.             }
  913.         }
  914.     }
  915. #elif defined(__WXMAC__)
  916.     const char* lc = NULL ;
  917.     long lang = GetScriptVariable( smSystemScript, smScriptLang) ;
  918.     switch( GetScriptManagerVariable( smRegionCode ) ) {
  919.       case verUS :
  920.         lc = "en_US" ;
  921.         break ;
  922.       case verFrance :
  923.         lc = "fr_FR" ;
  924.         break ;
  925.       case verBritain :
  926.         lc = "en_GB" ;
  927.         break ;
  928.       case verGermany :
  929.         lc = "de_DE" ;
  930.         break ;
  931.       case verItaly :
  932.         lc = "it_IT" ;
  933.         break ;
  934.       case verNetherlands :
  935.         lc = "nl_NL" ;
  936.         break ;
  937.       case verFlemish :
  938.         lc = "nl_BE" ;
  939.         break ;
  940.       case verSweden :
  941.         lc = "sv_SE" ;
  942.         break ;
  943.       case verSpain :
  944.         lc = "es_ES" ;
  945.         break ;
  946.       case verDenmark :
  947.         lc = "da_DK" ;
  948.         break ;
  949.       case verPortugal :
  950.         lc = "pt_PT" ;
  951.         break ;
  952.       case verFrCanada:
  953.         lc = "fr_CA" ;
  954.         break ;
  955.       case verNorway:
  956.         lc = "no_NO" ;
  957.         break ;
  958.       case verIsrael:
  959.         lc = "iw_IL" ;
  960.         break ;
  961.       case verJapan:
  962.         lc = "ja_JP" ;
  963.         break ;
  964.       case verAustralia:
  965.         lc = "en_AU" ;
  966.         break ;
  967.       case verArabic:
  968.         lc = "ar" ;
  969.         break ;
  970.       case verFinland:
  971.         lc = "fi_FI" ;
  972.         break ;
  973.       case verFrSwiss:
  974.         lc = "fr_CH" ;
  975.         break ;
  976.       case verGrSwiss:
  977.         lc = "de_CH" ;
  978.         break ;
  979.       case verGreece:
  980.         lc = "el_GR" ;
  981.         break ;
  982.       case verIceland:
  983.         lc = "is_IS" ;
  984.         break ;
  985.       case verMalta:
  986.         lc = "mt_MT" ;
  987.         break ;
  988.       case verCyprus:
  989.       // _CY is not part of wx, so we have to translate according to the system language
  990.         if ( lang == langGreek ) {
  991.           lc = "el_GR" ;
  992.         }
  993.         else if ( lang == langTurkish ) {
  994.           lc = "tr_TR" ;
  995.         }
  996.         break ;
  997.       case verTurkey:
  998.         lc = "tr_TR" ;
  999.         break ;
  1000.       case verYugoCroatian:
  1001.         lc = "hr_HR" ;
  1002.         break ;
  1003.       case verIndiaHindi:
  1004.         lc = "hi_IN" ;
  1005.         break ;
  1006.       case verPakistanUrdu:
  1007.         lc = "ur_PK" ;
  1008.         break ;
  1009.       case verTurkishModified:
  1010.         lc = "tr_TR" ;
  1011.         break ;
  1012.       case verItalianSwiss:
  1013.         lc = "it_CH" ;
  1014.         break ;
  1015.       case verInternational:
  1016.         lc = "en" ;
  1017.         break ;
  1018.       case verRomania:
  1019.         lc = "ro_RO" ;
  1020.         break ;
  1021.       case verGreecePoly:
  1022.         lc = "el_GR" ;
  1023.         break ;
  1024.       case verLithuania:
  1025.         lc = "lt_LT" ;
  1026.         break ;
  1027.       case verPoland:
  1028.         lc = "pl_PL" ;
  1029.         break ;
  1030.       case verMagyar :
  1031.       case verHungary:
  1032.         lc = "hu_HU" ;
  1033.         break ;
  1034.       case verEstonia:
  1035.         lc = "et_EE" ;
  1036.         break ;
  1037.       case verLatvia:
  1038.         lc = "lv_LV" ;
  1039.         break ;
  1040.       case verSami:
  1041.         // not known
  1042.         break ;
  1043.       case verFaroeIsl:
  1044.         lc = "fo_FO" ;
  1045.         break ;
  1046.       case verIran:
  1047.         lc = "fa_IR" ;
  1048.         break ;
  1049.       case verRussia:
  1050.         lc = "ru_RU" ;
  1051.         break ;
  1052.        case verIreland:
  1053.         lc = "ga_IE" ;
  1054.         break ;
  1055.       case verKorea:
  1056.         lc = "ko_KR" ;
  1057.         break ;
  1058.       case verChina:
  1059.         lc = "zh_CN" ;
  1060.         break ;
  1061.       case verTaiwan:
  1062.         lc = "zh_TW" ;
  1063.         break ;
  1064.       case verThailand:
  1065.         lc = "th_TH" ;
  1066.         break ;
  1067.       case verCzech:
  1068.         lc = "cs_CZ" ;
  1069.         break ;
  1070.       case verSlovak:
  1071.         lc = "sk_SK" ;
  1072.         break ;
  1073.       case verBengali:
  1074.         lc = "bn" ;
  1075.         break ;
  1076.       case verByeloRussian:
  1077.         lc = "be_BY" ;
  1078.         break ;
  1079.       case verUkraine:
  1080.         lc = "uk_UA" ;
  1081.         break ;
  1082.       case verGreeceAlt:
  1083.         lc = "el_GR" ;
  1084.         break ;
  1085.       case verSerbian:
  1086.         lc = "sr_YU" ;
  1087.         break ;
  1088.       case verSlovenian:
  1089.         lc = "sl_SI" ;
  1090.         break ;
  1091.       case verMacedonian:
  1092.         lc = "mk_MK" ;
  1093.         break ;
  1094.       case verCroatia:
  1095.         lc = "hr_HR" ;
  1096.         break ;
  1097.       case verBrazil:
  1098.         lc = "pt_BR " ;
  1099.         break ;
  1100.       case verBulgaria:
  1101.         lc = "bg_BG" ;
  1102.         break ;
  1103.       case verCatalonia:
  1104.         lc = "ca_ES" ;
  1105.         break ;
  1106.       case verScottishGaelic:
  1107.         lc = "gd" ;
  1108.         break ;
  1109.       case verManxGaelic:
  1110.         lc = "gv" ;
  1111.         break ;
  1112.       case verBreton:
  1113.         lc = "br" ;
  1114.         break ;
  1115.       case verNunavut:
  1116.         lc = "iu_CA" ;
  1117.         break ;
  1118.       case verWelsh:
  1119.         lc = "cy" ;
  1120.         break ;
  1121.       case verIrishGaelicScript:
  1122.         lc = "ga_IE" ;
  1123.         break ;
  1124.       case verEngCanada:
  1125.         lc = "en_CA" ;
  1126.         break ;
  1127.       case verBhutan:
  1128.         lc = "dz_BT" ;
  1129.         break ;
  1130.       case verArmenian:
  1131.         lc = "hy_AM" ;
  1132.         break ;
  1133.       case verGeorgian:
  1134.         lc = "ka_GE" ;
  1135.         break ;
  1136.       case verSpLatinAmerica:
  1137.         lc = "es_AR" ;
  1138.         break ;
  1139.       case verTonga:
  1140.         lc = "to_TO" ;
  1141.         break ;
  1142.       case verFrenchUniversal:
  1143.         lc = "fr_FR" ;
  1144.         break ;
  1145.       case verAustria:
  1146.         lc = "de_AT" ;
  1147.         break ;
  1148.       case verGujarati:
  1149.         lc = "gu_IN" ;
  1150.         break ;
  1151.       case verPunjabi:
  1152.         lc = "pa" ;
  1153.         break ;
  1154.       case verIndiaUrdu:
  1155.         lc = "ur_IN" ;
  1156.         break ;
  1157.       case verVietnam:
  1158.         lc = "vi_VN" ;
  1159.         break ;
  1160.       case verFrBelgium:
  1161.         lc = "fr_BE" ;
  1162.         break ;
  1163.       case verUzbek:
  1164.         lc = "uz_UZ" ;
  1165.         break ;
  1166.       case verSingapore:
  1167.         lc = "zh_SG" ;
  1168.         break ;
  1169.       case verNynorsk:
  1170.         lc = "nn_NO" ;
  1171.         break ;
  1172.       case verAfrikaans:
  1173.         lc = "af_ZA" ;
  1174.         break ;
  1175.       case verEsperanto:
  1176.         lc = "eo" ;
  1177.         break ;
  1178.       case verMarathi:
  1179.         lc = "mr_IN" ;
  1180.         break ;
  1181.       case verTibetan:
  1182.         lc = "bo" ;
  1183.         break ;
  1184.       case verNepal:
  1185.         lc = "ne_NP" ;
  1186.         break ;
  1187.       case verGreenland:
  1188.         lc = "kl_GL" ;
  1189.         break ;
  1190.       default :
  1191.         break ;
  1192.    }
  1193.   for ( i = 0; i < count; i++ )
  1194.   {
  1195.       if ( ms_languagesDB->Item(i).CanonicalName == lc )
  1196.       {
  1197.           break;
  1198.       }
  1199.   }
  1200.  
  1201. #elif defined(__WIN32__)
  1202.     LCID lcid = GetUserDefaultLCID();
  1203.     if ( lcid != 0 )
  1204.     {
  1205.         wxUint32 lang = PRIMARYLANGID(LANGIDFROMLCID(lcid));
  1206.         wxUint32 sublang = SUBLANGID(LANGIDFROMLCID(lcid));
  1207.  
  1208.         for ( i = 0; i < count; i++ )
  1209.         {
  1210.             if (ms_languagesDB->Item(i).WinLang == lang &&
  1211.                 ms_languagesDB->Item(i).WinSublang == sublang)
  1212.             {
  1213.                 break;
  1214.             }
  1215.         }
  1216.     }
  1217.     //else: leave wxlang == wxLANGUAGE_UNKNOWN
  1218. #endif // Unix/Win32
  1219.  
  1220.     if ( i < count )
  1221.     {
  1222.         // we did find a matching entry, use it
  1223.         return ms_languagesDB->Item(i).Language;
  1224.     }
  1225.  
  1226.     // no info about this language in the database
  1227.     return wxLANGUAGE_UNKNOWN;
  1228. }
  1229.  
  1230. // ----------------------------------------------------------------------------
  1231. // encoding stuff
  1232. // ----------------------------------------------------------------------------
  1233.  
  1234. // this is a bit strange as under Windows we get the encoding name using its
  1235. // numeric value and under Unix we do it the other way round, but this just
  1236. // reflects the way different systems provide he encoding info
  1237.  
  1238. /* static */
  1239. wxString wxLocale::GetSystemEncodingName()
  1240. {
  1241.     wxString encname;
  1242.  
  1243. #if defined(__WIN32__) && !defined(__WXMICROWIN__)
  1244.     // FIXME: what is the error return value for GetACP()?
  1245.     UINT codepage = ::GetACP();
  1246.     encname.Printf(_T("windows-%u"), codepage);
  1247. #elif defined(__UNIX_LIKE__)
  1248.  
  1249. #if defined(HAVE_LANGINFO_H) && defined(CODESET)
  1250.     // GNU libc provides current character set this way (this conforms
  1251.     // to Unix98)
  1252.     char *oldLocale = strdup(setlocale(LC_CTYPE, NULL));
  1253.     setlocale(LC_CTYPE, "");
  1254.     char *alang = nl_langinfo(CODESET);
  1255.     setlocale(LC_CTYPE, oldLocale);
  1256.     free(oldLocale);
  1257.  
  1258.     if ( alang )
  1259.     {
  1260.         // 7 bit ASCII encoding has several alternative names which we should
  1261.         // recognize to avoid warnings about unrecognized encoding on each
  1262.         // program startup
  1263.  
  1264.         // nl_langinfo() under Solaris returns 646 by default which stands for
  1265.         // ISO-646, i.e. 7 bit ASCII
  1266.         //
  1267.         // and recent glibc call it ANSI_X3.4-1968...
  1268.         if ( strcmp(alang, "646") == 0 ||
  1269.                strcmp(alang, "ANSI_X3.4-1968") == 0 )
  1270.         {
  1271.             encname = _T("US-ASCII");
  1272.         }
  1273.         else
  1274.         {
  1275.             encname = wxString::FromAscii( alang );
  1276.         }
  1277.     }
  1278.     else
  1279. #endif // HAVE_LANGINFO_H
  1280.     {
  1281.         // if we can't get at the character set directly, try to see if it's in
  1282.         // the environment variables (in most cases this won't work, but I was
  1283.         // out of ideas)
  1284.         char *lang = getenv( "LC_ALL");
  1285.         char *dot = lang ? strchr(lang, '.') : (char *)NULL;
  1286.         if (!dot)
  1287.         {
  1288.             lang = getenv( "LC_CTYPE" );
  1289.             if ( lang )
  1290.                 dot = strchr(lang, '.' );
  1291.         }
  1292.         if (!dot)
  1293.         {
  1294.             lang = getenv( "LANG");
  1295.             if ( lang )
  1296.                 dot = strchr(lang, '.');
  1297.         }
  1298.  
  1299.         if ( dot )
  1300.         {
  1301.             encname = wxString::FromAscii( dot+1 );
  1302.         }
  1303.     }
  1304. #endif // Win32/Unix
  1305.  
  1306.     return encname;
  1307. }
  1308.  
  1309. /* static */
  1310. wxFontEncoding wxLocale::GetSystemEncoding()
  1311. {
  1312. #if defined(__WIN32__) && !defined(__WXMICROWIN__)
  1313.     UINT codepage = ::GetACP();
  1314.  
  1315.     // wxWindows only knows about CP1250-1257, 932, 936, 949, 950
  1316.     if ( codepage >= 1250 && codepage <= 1257 )
  1317.     {
  1318.         return (wxFontEncoding)(wxFONTENCODING_CP1250 + codepage - 1250);
  1319.     }
  1320.  
  1321.     if ( codepage == 932 )
  1322.     {
  1323.         return wxFONTENCODING_CP932;
  1324.     }
  1325.  
  1326.     if ( codepage == 936 )
  1327.     {
  1328.         return wxFONTENCODING_CP936;
  1329.     }
  1330.  
  1331.     if ( codepage == 949 )
  1332.     {
  1333.         return wxFONTENCODING_CP949;
  1334.     }
  1335.  
  1336.     if ( codepage == 950 )
  1337.     {
  1338.         return wxFONTENCODING_CP950;
  1339.     }
  1340. #elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP
  1341.     wxString encname = GetSystemEncodingName();
  1342.     if ( !encname.empty() )
  1343.     {
  1344.         wxFontEncoding enc = wxFontMapper::Get()->
  1345.             CharsetToEncoding(encname, FALSE /* not interactive */);
  1346.  
  1347.         // on some modern Linux systems (RedHat 8) the default system locale
  1348.         // is UTF8 -- but it isn't supported by wxGTK in ANSI build at all so
  1349.         // don't even try to use it in this case
  1350. #if !wxUSE_UNICODE
  1351.         if ( enc == wxFONTENCODING_UTF8 )
  1352.         {
  1353.             // the most similar supported encoding...
  1354.             enc = wxFONTENCODING_ISO8859_1;
  1355.         }
  1356. #endif // !wxUSE_UNICODE
  1357.  
  1358.         // this should probably be considered as a bug in CharsetToEncoding():
  1359.         // it shouldn't return wxFONTENCODING_DEFAULT at all - but it does it
  1360.         // for US-ASCII charset
  1361.         //
  1362.         // we, OTOH, definitely shouldn't return it as it doesn't make sense at
  1363.         // all (which encoding is it?)
  1364.         if ( enc != wxFONTENCODING_DEFAULT )
  1365.         {
  1366.             return enc;
  1367.         }
  1368.         //else: return wxFONTENCODING_SYSTEM below
  1369.     }
  1370. #endif // Win32/Unix
  1371.  
  1372.     return wxFONTENCODING_SYSTEM;
  1373. }
  1374.  
  1375. /* static */
  1376. void wxLocale::AddLanguage(const wxLanguageInfo& info)
  1377. {
  1378.     CreateLanguagesDB();
  1379.     ms_languagesDB->Add(info);
  1380. }
  1381.  
  1382. /* static */
  1383. const wxLanguageInfo *wxLocale::GetLanguageInfo(int lang)
  1384. {
  1385.     CreateLanguagesDB();
  1386.  
  1387.     size_t count = ms_languagesDB->GetCount();
  1388.     for ( size_t i = 0; i < count; i++ )
  1389.     {
  1390.         if ( ms_languagesDB->Item(i).Language == lang )
  1391.         {
  1392.             return &ms_languagesDB->Item(i);
  1393.         }
  1394.     }
  1395.  
  1396.     return NULL;
  1397. }
  1398.  
  1399. wxString wxLocale::GetSysName() const
  1400. {
  1401.     return wxSetlocale(LC_ALL, NULL);
  1402. }
  1403.  
  1404. // clean up
  1405. wxLocale::~wxLocale()
  1406. {
  1407.     // free memory
  1408.     wxMsgCatalog *pTmpCat;
  1409.     while ( m_pMsgCat != NULL ) {
  1410.         pTmpCat = m_pMsgCat;
  1411.         m_pMsgCat = m_pMsgCat->m_pNext;
  1412.         delete pTmpCat;
  1413.     }
  1414.  
  1415.     // restore old locale
  1416.     wxSetLocale(m_pOldLocale);
  1417.     wxSetlocale(LC_ALL, m_pszOldLocale);
  1418. }
  1419.  
  1420. // get the translation of given string in current locale
  1421. const wxChar *wxLocale::GetString(const wxChar *szOrigString,
  1422.                                   const wxChar *szDomain) const
  1423. {
  1424.     if ( wxIsEmpty(szOrigString) )
  1425.         return _T("");
  1426.  
  1427.     const wxChar *pszTrans = NULL;
  1428.     wxMsgCatalog *pMsgCat;
  1429.  
  1430.     if ( szDomain != NULL )
  1431.     {
  1432.         pMsgCat = FindCatalog(szDomain);
  1433.  
  1434.         // does the catalog exist?
  1435.         if ( pMsgCat != NULL )
  1436.             pszTrans = pMsgCat->GetString(szOrigString);
  1437.     }
  1438.     else
  1439.     {
  1440.         // search in all domains
  1441.         for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
  1442.         {
  1443.             pszTrans = pMsgCat->GetString(szOrigString);
  1444.             if ( pszTrans != NULL )   // take the first found
  1445.                 break;
  1446.         }
  1447.     }
  1448.  
  1449.     if ( pszTrans == NULL )
  1450.     {
  1451. #ifdef __WXDEBUG__
  1452.         if ( !NoTransErr::Suppress() )
  1453.         {
  1454.             NoTransErr noTransErr;
  1455.  
  1456.             if ( szDomain != NULL )
  1457.             {
  1458.                 wxLogTrace(_T("i18n"),
  1459.                            _T("string '%s' not found in domain '%s' for locale '%s'."),
  1460.                            szOrigString, szDomain, m_strLocale.c_str());
  1461.             }
  1462.             else
  1463.             {
  1464.                 wxLogTrace(_T("i18n"),
  1465.                            _T("string '%s' not found in locale '%s'."),
  1466.                            szOrigString, m_strLocale.c_str());
  1467.             }
  1468.         }
  1469. #endif // __WXDEBUG__
  1470.  
  1471.         return szOrigString;
  1472.     }
  1473.  
  1474.     return pszTrans;
  1475. }
  1476.  
  1477. // find catalog by name in a linked list, return NULL if !found
  1478. wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const
  1479. {
  1480.     // linear search in the linked list
  1481.     wxMsgCatalog *pMsgCat;
  1482.     for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
  1483.     {
  1484.         if ( wxStricmp(pMsgCat->GetName(), szDomain) == 0 )
  1485.           return pMsgCat;
  1486.     }
  1487.  
  1488.     return NULL;
  1489. }
  1490.  
  1491. // check if the given catalog is loaded
  1492. bool wxLocale::IsLoaded(const wxChar *szDomain) const
  1493. {
  1494.   return FindCatalog(szDomain) != NULL;
  1495. }
  1496.  
  1497. // add a catalog to our linked list
  1498. bool wxLocale::AddCatalog(const wxChar *szDomain)
  1499. {
  1500.   wxMsgCatalog *pMsgCat = new wxMsgCatalog;
  1501.  
  1502.   if ( pMsgCat->Load(m_strShort, szDomain, m_bConvertEncoding) ) {
  1503.     // add it to the head of the list so that in GetString it will
  1504.     // be searched before the catalogs added earlier
  1505.     pMsgCat->m_pNext = m_pMsgCat;
  1506.     m_pMsgCat = pMsgCat;
  1507.  
  1508.     return TRUE;
  1509.   }
  1510.   else {
  1511.     // don't add it because it couldn't be loaded anyway
  1512.     delete pMsgCat;
  1513.  
  1514.     return FALSE;
  1515.   }
  1516. }
  1517.  
  1518. // ----------------------------------------------------------------------------
  1519. // accessors for locale-dependent data
  1520. // ----------------------------------------------------------------------------
  1521.  
  1522. #if 0
  1523.  
  1524. #ifdef __WXMSW__
  1525.  
  1526. /* static */
  1527. wxString wxLocale::GetInfo(wxLocaleInfo index)
  1528. {
  1529.     wxString str;
  1530.     wxChar buffer[256];
  1531.     size_t count;
  1532.     buffer[0] = wxT('\0');
  1533.     switch (index)
  1534.     {
  1535.         case wxSYS_DECIMAL_SEPARATOR:
  1536.             count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buffer, 256);
  1537.             if (!count)
  1538.                 str << ".";
  1539.             else
  1540.                 str << buffer;
  1541.             break;
  1542.         case wxSYS_LIST_SEPARATOR:
  1543.             count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, buffer, 256);
  1544.             if (!count)
  1545.                 str << ",";
  1546.             else
  1547.                 str << buffer;
  1548.             break;
  1549.         case wxSYS_LEADING_ZERO: // 0 means no leading zero, 1 means leading zero
  1550.             count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILZERO, buffer, 256);
  1551.             if (!count)
  1552.                 str << "0";
  1553.             else
  1554.                 str << buffer;
  1555.             break;
  1556.         default:
  1557.             wxFAIL_MSG("Unknown System String !");
  1558.     }
  1559.     return str;
  1560. }
  1561.  
  1562. #else // !__WXMSW__
  1563.  
  1564. /* static */
  1565. wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory)
  1566. {
  1567.     return wxEmptyString;
  1568. }
  1569.  
  1570. #endif // __WXMSW__/!__WXMSW__
  1571.  
  1572. #endif // 0
  1573.  
  1574. // ----------------------------------------------------------------------------
  1575. // global functions and variables
  1576. // ----------------------------------------------------------------------------
  1577.  
  1578. // retrieve/change current locale
  1579. // ------------------------------
  1580.  
  1581. // the current locale object
  1582. static wxLocale *g_pLocale = NULL;
  1583.  
  1584. wxLocale *wxGetLocale()
  1585. {
  1586.   return g_pLocale;
  1587. }
  1588.  
  1589. wxLocale *wxSetLocale(wxLocale *pLocale)
  1590. {
  1591.   wxLocale *pOld = g_pLocale;
  1592.   g_pLocale = pLocale;
  1593.   return pOld;
  1594. }
  1595.  
  1596.  
  1597.  
  1598. // ----------------------------------------------------------------------------
  1599. // wxLocale module (for lazy destruction of languagesDB)
  1600. // ----------------------------------------------------------------------------
  1601.  
  1602. class wxLocaleModule: public wxModule
  1603. {
  1604.     DECLARE_DYNAMIC_CLASS(wxLocaleModule)
  1605.     public:
  1606.         wxLocaleModule() {}
  1607.         bool OnInit() { return TRUE; }
  1608.         void OnExit() { wxLocale::DestroyLanguagesDB(); }
  1609. };
  1610.  
  1611. IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule, wxModule)
  1612.  
  1613.  
  1614.  
  1615. // ----------------------------------------------------------------------------
  1616. // default languages table & initialization
  1617. // ----------------------------------------------------------------------------
  1618.  
  1619.  
  1620.  
  1621. // --- --- --- generated code begins here --- --- ---
  1622.  
  1623. // This table is generated by misc/languages/genlang.py
  1624. // When making changes, please put them into misc/languages/langtabl.txt
  1625.  
  1626. #if !defined(__WIN32__) || defined(__WXMICROWIN__)
  1627.  
  1628. #define SETWINLANG(info,lang,sublang)
  1629.  
  1630. #else
  1631.  
  1632. #define SETWINLANG(info,lang,sublang) \
  1633.     info.WinLang = lang, info.WinSublang = sublang;
  1634.  
  1635. #ifndef LANG_AFRIKAANS
  1636. #define LANG_AFRIKAANS (0)
  1637. #endif
  1638. #ifndef LANG_ALBANIAN
  1639. #define LANG_ALBANIAN (0)
  1640. #endif
  1641. #ifndef LANG_ARABIC
  1642. #define LANG_ARABIC (0)
  1643. #endif
  1644. #ifndef LANG_ARMENIAN
  1645. #define LANG_ARMENIAN (0)
  1646. #endif
  1647. #ifndef LANG_ASSAMESE
  1648. #define LANG_ASSAMESE (0)
  1649. #endif
  1650. #ifndef LANG_AZERI
  1651. #define LANG_AZERI (0)
  1652. #endif
  1653. #ifndef LANG_BASQUE
  1654. #define LANG_BASQUE (0)
  1655. #endif
  1656. #ifndef LANG_BELARUSIAN
  1657. #define LANG_BELARUSIAN (0)
  1658. #endif
  1659. #ifndef LANG_BENGALI
  1660. #define LANG_BENGALI (0)
  1661. #endif
  1662. #ifndef LANG_BULGARIAN
  1663. #define LANG_BULGARIAN (0)
  1664. #endif
  1665. #ifndef LANG_CATALAN
  1666. #define LANG_CATALAN (0)
  1667. #endif
  1668. #ifndef LANG_CHINESE
  1669. #define LANG_CHINESE (0)
  1670. #endif
  1671. #ifndef LANG_CROATIAN
  1672. #define LANG_CROATIAN (0)
  1673. #endif
  1674. #ifndef LANG_CZECH
  1675. #define LANG_CZECH (0)
  1676. #endif
  1677. #ifndef LANG_DANISH
  1678. #define LANG_DANISH (0)
  1679. #endif
  1680. #ifndef LANG_DUTCH
  1681. #define LANG_DUTCH (0)
  1682. #endif
  1683. #ifndef LANG_ENGLISH
  1684. #define LANG_ENGLISH (0)
  1685. #endif
  1686. #ifndef LANG_ESTONIAN
  1687. #define LANG_ESTONIAN (0)
  1688. #endif
  1689. #ifndef LANG_FAEROESE
  1690. #define LANG_FAEROESE (0)
  1691. #endif
  1692. #ifndef LANG_FARSI
  1693. #define LANG_FARSI (0)
  1694. #endif
  1695. #ifndef LANG_FINNISH
  1696. #define LANG_FINNISH (0)
  1697. #endif
  1698. #ifndef LANG_FRENCH
  1699. #define LANG_FRENCH (0)
  1700. #endif
  1701. #ifndef LANG_GEORGIAN
  1702. #define LANG_GEORGIAN (0)
  1703. #endif
  1704. #ifndef LANG_GERMAN
  1705. #define LANG_GERMAN (0)
  1706. #endif
  1707. #ifndef LANG_GREEK
  1708. #define LANG_GREEK (0)
  1709. #endif
  1710. #ifndef LANG_GUJARATI
  1711. #define LANG_GUJARATI (0)
  1712. #endif
  1713. #ifndef LANG_HEBREW
  1714. #define LANG_HEBREW (0)
  1715. #endif
  1716. #ifndef LANG_HINDI
  1717. #define LANG_HINDI (0)
  1718. #endif
  1719. #ifndef LANG_HUNGARIAN
  1720. #define LANG_HUNGARIAN (0)
  1721. #endif
  1722. #ifndef LANG_ICELANDIC
  1723. #define LANG_ICELANDIC (0)
  1724. #endif
  1725. #ifndef LANG_INDONESIAN
  1726. #define LANG_INDONESIAN (0)
  1727. #endif
  1728. #ifndef LANG_ITALIAN
  1729. #define LANG_ITALIAN (0)
  1730. #endif
  1731. #ifndef LANG_JAPANESE
  1732. #define LANG_JAPANESE (0)
  1733. #endif
  1734. #ifndef LANG_KANNADA
  1735. #define LANG_KANNADA (0)
  1736. #endif
  1737. #ifndef LANG_KASHMIRI
  1738. #define LANG_KASHMIRI (0)
  1739. #endif
  1740. #ifndef LANG_KAZAK
  1741. #define LANG_KAZAK (0)
  1742. #endif
  1743. #ifndef LANG_KONKANI
  1744. #define LANG_KONKANI (0)
  1745. #endif
  1746. #ifndef LANG_KOREAN
  1747. #define LANG_KOREAN (0)
  1748. #endif
  1749. #ifndef LANG_LATVIAN
  1750. #define LANG_LATVIAN (0)
  1751. #endif
  1752. #ifndef LANG_LITHUANIAN
  1753. #define LANG_LITHUANIAN (0)
  1754. #endif
  1755. #ifndef LANG_MACEDONIAN
  1756. #define LANG_MACEDONIAN (0)
  1757. #endif
  1758. #ifndef LANG_MALAY
  1759. #define LANG_MALAY (0)
  1760. #endif
  1761. #ifndef LANG_MALAYALAM
  1762. #define LANG_MALAYALAM (0)
  1763. #endif
  1764. #ifndef LANG_MANIPURI
  1765. #define LANG_MANIPURI (0)
  1766. #endif
  1767. #ifndef LANG_MARATHI
  1768. #define LANG_MARATHI (0)
  1769. #endif
  1770. #ifndef LANG_NEPALI
  1771. #define LANG_NEPALI (0)
  1772. #endif
  1773. #ifndef LANG_NORWEGIAN
  1774. #define LANG_NORWEGIAN (0)
  1775. #endif
  1776. #ifndef LANG_ORIYA
  1777. #define LANG_ORIYA (0)
  1778. #endif
  1779. #ifndef LANG_POLISH
  1780. #define LANG_POLISH (0)
  1781. #endif
  1782. #ifndef LANG_PORTUGUESE
  1783. #define LANG_PORTUGUESE (0)
  1784. #endif
  1785. #ifndef LANG_PUNJABI
  1786. #define LANG_PUNJABI (0)
  1787. #endif
  1788. #ifndef LANG_ROMANIAN
  1789. #define LANG_ROMANIAN (0)
  1790. #endif
  1791. #ifndef LANG_RUSSIAN
  1792. #define LANG_RUSSIAN (0)
  1793. #endif
  1794. #ifndef LANG_SANSKRIT
  1795. #define LANG_SANSKRIT (0)
  1796. #endif
  1797. #ifndef LANG_SERBIAN
  1798. #define LANG_SERBIAN (0)
  1799. #endif
  1800. #ifndef LANG_SINDHI
  1801. #define LANG_SINDHI (0)
  1802. #endif
  1803. #ifndef LANG_SLOVAK
  1804. #define LANG_SLOVAK (0)
  1805. #endif
  1806. #ifndef LANG_SLOVENIAN
  1807. #define LANG_SLOVENIAN (0)
  1808. #endif
  1809. #ifndef LANG_SPANISH
  1810. #define LANG_SPANISH (0)
  1811. #endif
  1812. #ifndef LANG_SWAHILI
  1813. #define LANG_SWAHILI (0)
  1814. #endif
  1815. #ifndef LANG_SWEDISH
  1816. #define LANG_SWEDISH (0)
  1817. #endif
  1818. #ifndef LANG_TAMIL
  1819. #define LANG_TAMIL (0)
  1820. #endif
  1821. #ifndef LANG_TATAR
  1822. #define LANG_TATAR (0)
  1823. #endif
  1824. #ifndef LANG_TELUGU
  1825. #define LANG_TELUGU (0)
  1826. #endif
  1827. #ifndef LANG_THAI
  1828. #define LANG_THAI (0)
  1829. #endif
  1830. #ifndef LANG_TURKISH
  1831. #define LANG_TURKISH (0)
  1832. #endif
  1833. #ifndef LANG_UKRAINIAN
  1834. #define LANG_UKRAINIAN (0)
  1835. #endif
  1836. #ifndef LANG_URDU
  1837. #define LANG_URDU (0)
  1838. #endif
  1839. #ifndef LANG_UZBEK
  1840. #define LANG_UZBEK (0)
  1841. #endif
  1842. #ifndef LANG_VIETNAMESE
  1843. #define LANG_VIETNAMESE (0)
  1844. #endif
  1845. #ifndef SUBLANG_ARABIC_ALGERIA
  1846. #define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT
  1847. #endif
  1848. #ifndef SUBLANG_ARABIC_BAHRAIN
  1849. #define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT
  1850. #endif
  1851. #ifndef SUBLANG_ARABIC_EGYPT
  1852. #define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT
  1853. #endif
  1854. #ifndef SUBLANG_ARABIC_IRAQ
  1855. #define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT
  1856. #endif
  1857. #ifndef SUBLANG_ARABIC_JORDAN
  1858. #define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT
  1859. #endif
  1860. #ifndef SUBLANG_ARABIC_KUWAIT
  1861. #define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT
  1862. #endif
  1863. #ifndef SUBLANG_ARABIC_LEBANON
  1864. #define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT
  1865. #endif
  1866. #ifndef SUBLANG_ARABIC_LIBYA
  1867. #define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT
  1868. #endif
  1869. #ifndef SUBLANG_ARABIC_MOROCCO
  1870. #define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT
  1871. #endif
  1872. #ifndef SUBLANG_ARABIC_OMAN
  1873. #define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT
  1874. #endif
  1875. #ifndef SUBLANG_ARABIC_QATAR
  1876. #define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT
  1877. #endif
  1878. #ifndef SUBLANG_ARABIC_SAUDI_ARABIA
  1879. #define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT
  1880. #endif
  1881. #ifndef SUBLANG_ARABIC_SYRIA
  1882. #define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT
  1883. #endif
  1884. #ifndef SUBLANG_ARABIC_TUNISIA
  1885. #define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT
  1886. #endif
  1887. #ifndef SUBLANG_ARABIC_UAE
  1888. #define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT
  1889. #endif
  1890. #ifndef SUBLANG_ARABIC_YEMEN
  1891. #define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT
  1892. #endif
  1893. #ifndef SUBLANG_AZERI_CYRILLIC
  1894. #define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT
  1895. #endif
  1896. #ifndef SUBLANG_AZERI_LATIN
  1897. #define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT
  1898. #endif
  1899. #ifndef SUBLANG_CHINESE_SIMPLIFIED
  1900. #define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT
  1901. #endif
  1902. #ifndef SUBLANG_CHINESE_TRADITIONAL
  1903. #define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT
  1904. #endif
  1905. #ifndef SUBLANG_CHINESE_HONGKONG
  1906. #define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT
  1907. #endif
  1908. #ifndef SUBLANG_CHINESE_MACAU
  1909. #define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT
  1910. #endif
  1911. #ifndef SUBLANG_CHINESE_SINGAPORE
  1912. #define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT
  1913. #endif
  1914. #ifndef SUBLANG_DUTCH
  1915. #define SUBLANG_DUTCH SUBLANG_DEFAULT
  1916. #endif
  1917. #ifndef SUBLANG_DUTCH_BELGIAN
  1918. #define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT
  1919. #endif
  1920. #ifndef SUBLANG_ENGLISH_UK
  1921. #define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT
  1922. #endif
  1923. #ifndef SUBLANG_ENGLISH_US
  1924. #define SUBLANG_ENGLISH_US SUBLANG_DEFAULT
  1925. #endif
  1926. #ifndef SUBLANG_ENGLISH_AUS
  1927. #define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT
  1928. #endif
  1929. #ifndef SUBLANG_ENGLISH_BELIZE
  1930. #define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT
  1931. #endif
  1932. #ifndef SUBLANG_ENGLISH_CAN
  1933. #define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT
  1934. #endif
  1935. #ifndef SUBLANG_ENGLISH_CARIBBEAN
  1936. #define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT
  1937. #endif
  1938. #ifndef SUBLANG_ENGLISH_EIRE
  1939. #define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT
  1940. #endif
  1941. #ifndef SUBLANG_ENGLISH_JAMAICA
  1942. #define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT
  1943. #endif
  1944. #ifndef SUBLANG_ENGLISH_NZ
  1945. #define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT
  1946. #endif
  1947. #ifndef SUBLANG_ENGLISH_PHILIPPINES
  1948. #define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT
  1949. #endif
  1950. #ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
  1951. #define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT
  1952. #endif
  1953. #ifndef SUBLANG_ENGLISH_TRINIDAD
  1954. #define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT
  1955. #endif
  1956. #ifndef SUBLANG_ENGLISH_ZIMBABWE
  1957. #define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT
  1958. #endif
  1959. #ifndef SUBLANG_FRENCH
  1960. #define SUBLANG_FRENCH SUBLANG_DEFAULT
  1961. #endif
  1962. #ifndef SUBLANG_FRENCH_BELGIAN
  1963. #define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT
  1964. #endif
  1965. #ifndef SUBLANG_FRENCH_CANADIAN
  1966. #define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT
  1967. #endif
  1968. #ifndef SUBLANG_FRENCH_LUXEMBOURG
  1969. #define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT
  1970. #endif
  1971. #ifndef SUBLANG_FRENCH_MONACO
  1972. #define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT
  1973. #endif
  1974. #ifndef SUBLANG_FRENCH_SWISS
  1975. #define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT
  1976. #endif
  1977. #ifndef SUBLANG_GERMAN
  1978. #define SUBLANG_GERMAN SUBLANG_DEFAULT
  1979. #endif
  1980. #ifndef SUBLANG_GERMAN_AUSTRIAN
  1981. #define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT
  1982. #endif
  1983. #ifndef SUBLANG_GERMAN_LIECHTENSTEIN
  1984. #define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT
  1985. #endif
  1986. #ifndef SUBLANG_GERMAN_LUXEMBOURG
  1987. #define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT
  1988. #endif
  1989. #ifndef SUBLANG_GERMAN_SWISS
  1990. #define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT
  1991. #endif
  1992. #ifndef SUBLANG_ITALIAN
  1993. #define SUBLANG_ITALIAN SUBLANG_DEFAULT
  1994. #endif
  1995. #ifndef SUBLANG_ITALIAN_SWISS
  1996. #define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT
  1997. #endif
  1998. #ifndef SUBLANG_KASHMIRI_INDIA
  1999. #define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT
  2000. #endif
  2001. #ifndef SUBLANG_KOREAN
  2002. #define SUBLANG_KOREAN SUBLANG_DEFAULT
  2003. #endif
  2004. #ifndef SUBLANG_LITHUANIAN
  2005. #define SUBLANG_LITHUANIAN SUBLANG_DEFAULT
  2006. #endif
  2007. #ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
  2008. #define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT
  2009. #endif
  2010. #ifndef SUBLANG_MALAY_MALAYSIA
  2011. #define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT
  2012. #endif
  2013. #ifndef SUBLANG_NEPALI_INDIA
  2014. #define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT
  2015. #endif
  2016. #ifndef SUBLANG_NORWEGIAN_BOKMAL
  2017. #define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT
  2018. #endif
  2019. #ifndef SUBLANG_NORWEGIAN_NYNORSK
  2020. #define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT
  2021. #endif
  2022. #ifndef SUBLANG_PORTUGUESE
  2023. #define SUBLANG_PORTUGUESE SUBLANG_DEFAULT
  2024. #endif
  2025. #ifndef SUBLANG_PORTUGUESE_BRAZILIAN
  2026. #define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT
  2027. #endif
  2028. #ifndef SUBLANG_SERBIAN_CYRILLIC
  2029. #define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT
  2030. #endif
  2031. #ifndef SUBLANG_SERBIAN_LATIN
  2032. #define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT
  2033. #endif
  2034. #ifndef SUBLANG_SPANISH
  2035. #define SUBLANG_SPANISH SUBLANG_DEFAULT
  2036. #endif
  2037. #ifndef SUBLANG_SPANISH_ARGENTINA
  2038. #define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT
  2039. #endif
  2040. #ifndef SUBLANG_SPANISH_BOLIVIA
  2041. #define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT
  2042. #endif
  2043. #ifndef SUBLANG_SPANISH_CHILE
  2044. #define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT
  2045. #endif
  2046. #ifndef SUBLANG_SPANISH_COLOMBIA
  2047. #define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT
  2048. #endif
  2049. #ifndef SUBLANG_SPANISH_COSTA_RICA
  2050. #define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT
  2051. #endif
  2052. #ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
  2053. #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT
  2054. #endif
  2055. #ifndef SUBLANG_SPANISH_ECUADOR
  2056. #define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT
  2057. #endif
  2058. #ifndef SUBLANG_SPANISH_EL_SALVADOR
  2059. #define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT
  2060. #endif
  2061. #ifndef SUBLANG_SPANISH_GUATEMALA
  2062. #define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT
  2063. #endif
  2064. #ifndef SUBLANG_SPANISH_HONDURAS
  2065. #define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT
  2066. #endif
  2067. #ifndef SUBLANG_SPANISH_MEXICAN
  2068. #define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT
  2069. #endif
  2070. #ifndef SUBLANG_SPANISH_MODERN
  2071. #define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT
  2072. #endif
  2073. #ifndef SUBLANG_SPANISH_NICARAGUA
  2074. #define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT
  2075. #endif
  2076. #ifndef SUBLANG_SPANISH_PANAMA
  2077. #define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT
  2078. #endif
  2079. #ifndef SUBLANG_SPANISH_PARAGUAY
  2080. #define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT
  2081. #endif
  2082. #ifndef SUBLANG_SPANISH_PERU
  2083. #define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT
  2084. #endif
  2085. #ifndef SUBLANG_SPANISH_PUERTO_RICO
  2086. #define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT
  2087. #endif
  2088. #ifndef SUBLANG_SPANISH_URUGUAY
  2089. #define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT
  2090. #endif
  2091. #ifndef SUBLANG_SPANISH_VENEZUELA
  2092. #define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT
  2093. #endif
  2094. #ifndef SUBLANG_SWEDISH
  2095. #define SUBLANG_SWEDISH SUBLANG_DEFAULT
  2096. #endif
  2097. #ifndef SUBLANG_SWEDISH_FINLAND
  2098. #define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT
  2099. #endif
  2100. #ifndef SUBLANG_URDU_INDIA
  2101. #define SUBLANG_URDU_INDIA SUBLANG_DEFAULT
  2102. #endif
  2103. #ifndef SUBLANG_URDU_PAKISTAN
  2104. #define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT
  2105. #endif
  2106. #ifndef SUBLANG_UZBEK_CYRILLIC
  2107. #define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT
  2108. #endif
  2109. #ifndef SUBLANG_UZBEK_LATIN
  2110. #define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT
  2111. #endif
  2112.  
  2113.  
  2114. #endif // __WIN32__
  2115.  
  2116. #define LNG(wxlang, canonical, winlang, winsublang, desc) \
  2117.     info.Language = wxlang;                               \
  2118.     info.CanonicalName = wxT(canonical);                  \
  2119.     info.Description = wxT(desc);                         \
  2120.     SETWINLANG(info, winlang, winsublang)                 \
  2121.     AddLanguage(info);
  2122.  
  2123. void wxLocale::InitLanguagesDB()
  2124. {
  2125.    wxLanguageInfo info;
  2126.    wxStringTokenizer tkn;
  2127.  
  2128.    LNG(wxLANGUAGE_ABKHAZIAN,                  "ab"   , 0              , 0                                 , "Abkhazian")
  2129.    LNG(wxLANGUAGE_AFAR,                       "aa"   , 0              , 0                                 , "Afar")
  2130.    LNG(wxLANGUAGE_AFRIKAANS,                  "af_ZA", LANG_AFRIKAANS , SUBLANG_DEFAULT                   , "Afrikaans")
  2131.    LNG(wxLANGUAGE_ALBANIAN,                   "sq_AL", LANG_ALBANIAN  , SUBLANG_DEFAULT                   , "Albanian")
  2132.    LNG(wxLANGUAGE_AMHARIC,                    "am"   , 0              , 0                                 , "Amharic")
  2133.    LNG(wxLANGUAGE_ARABIC,                     "ar"   , LANG_ARABIC    , SUBLANG_DEFAULT                   , "Arabic")
  2134.    LNG(wxLANGUAGE_ARABIC_ALGERIA,             "ar_DZ", LANG_ARABIC    , SUBLANG_ARABIC_ALGERIA            , "Arabic (Algeria)")
  2135.    LNG(wxLANGUAGE_ARABIC_BAHRAIN,             "ar_BH", LANG_ARABIC    , SUBLANG_ARABIC_BAHRAIN            , "Arabic (Bahrain)")
  2136.    LNG(wxLANGUAGE_ARABIC_EGYPT,               "ar_EG", LANG_ARABIC    , SUBLANG_ARABIC_EGYPT              , "Arabic (Egypt)")
  2137.    LNG(wxLANGUAGE_ARABIC_IRAQ,                "ar_IQ", LANG_ARABIC    , SUBLANG_ARABIC_IRAQ               , "Arabic (Iraq)")
  2138.    LNG(wxLANGUAGE_ARABIC_JORDAN,              "ar_JO", LANG_ARABIC    , SUBLANG_ARABIC_JORDAN             , "Arabic (Jordan)")
  2139.    LNG(wxLANGUAGE_ARABIC_KUWAIT,              "ar_KW", LANG_ARABIC    , SUBLANG_ARABIC_KUWAIT             , "Arabic (Kuwait)")
  2140.    LNG(wxLANGUAGE_ARABIC_LEBANON,             "ar_LB", LANG_ARABIC    , SUBLANG_ARABIC_LEBANON            , "Arabic (Lebanon)")
  2141.    LNG(wxLANGUAGE_ARABIC_LIBYA,               "ar_LY", LANG_ARABIC    , SUBLANG_ARABIC_LIBYA              , "Arabic (Libya)")
  2142.    LNG(wxLANGUAGE_ARABIC_MOROCCO,             "ar_MA", LANG_ARABIC    , SUBLANG_ARABIC_MOROCCO            , "Arabic (Morocco)")
  2143.    LNG(wxLANGUAGE_ARABIC_OMAN,                "ar_OM", LANG_ARABIC    , SUBLANG_ARABIC_OMAN               , "Arabic (Oman)")
  2144.    LNG(wxLANGUAGE_ARABIC_QATAR,               "ar_QA", LANG_ARABIC    , SUBLANG_ARABIC_QATAR              , "Arabic (Qatar)")
  2145.    LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA,        "ar_SA", LANG_ARABIC    , SUBLANG_ARABIC_SAUDI_ARABIA       , "Arabic (Saudi Arabia)")
  2146.    LNG(wxLANGUAGE_ARABIC_SUDAN,               "ar_SD", 0              , 0                                 , "Arabic (Sudan)")
  2147.    LNG(wxLANGUAGE_ARABIC_SYRIA,               "ar_SY", LANG_ARABIC    , SUBLANG_ARABIC_SYRIA              , "Arabic (Syria)")
  2148.    LNG(wxLANGUAGE_ARABIC_TUNISIA,             "ar_TN", LANG_ARABIC    , SUBLANG_ARABIC_TUNISIA            , "Arabic (Tunisia)")
  2149.    LNG(wxLANGUAGE_ARABIC_UAE,                 "ar_AE", LANG_ARABIC    , SUBLANG_ARABIC_UAE                , "Arabic (Uae)")
  2150.    LNG(wxLANGUAGE_ARABIC_YEMEN,               "ar_YE", LANG_ARABIC    , SUBLANG_ARABIC_YEMEN              , "Arabic (Yemen)")
  2151.    LNG(wxLANGUAGE_ARMENIAN,                   "hy"   , LANG_ARMENIAN  , SUBLANG_DEFAULT                   , "Armenian")
  2152.    LNG(wxLANGUAGE_ASSAMESE,                   "as"   , LANG_ASSAMESE  , SUBLANG_DEFAULT                   , "Assamese")
  2153.    LNG(wxLANGUAGE_AYMARA,                     "ay"   , 0              , 0                                 , "Aymara")
  2154.    LNG(wxLANGUAGE_AZERI,                      "az"   , LANG_AZERI     , SUBLANG_DEFAULT                   , "Azeri")
  2155.    LNG(wxLANGUAGE_AZERI_CYRILLIC,             "az"   , LANG_AZERI     , SUBLANG_AZERI_CYRILLIC            , "Azeri (Cyrillic)")
  2156.    LNG(wxLANGUAGE_AZERI_LATIN,                "az"   , LANG_AZERI     , SUBLANG_AZERI_LATIN               , "Azeri (Latin)")
  2157.    LNG(wxLANGUAGE_BASHKIR,                    "ba"   , 0              , 0                                 , "Bashkir")
  2158.    LNG(wxLANGUAGE_BASQUE,                     "eu_ES", LANG_BASQUE    , SUBLANG_DEFAULT                   , "Basque")
  2159.    LNG(wxLANGUAGE_BELARUSIAN,                 "be_BY", LANG_BELARUSIAN, SUBLANG_DEFAULT                   , "Belarusian")
  2160.    LNG(wxLANGUAGE_BENGALI,                    "bn"   , LANG_BENGALI   , SUBLANG_DEFAULT                   , "Bengali")
  2161.    LNG(wxLANGUAGE_BHUTANI,                    "dz"   , 0              , 0                                 , "Bhutani")
  2162.    LNG(wxLANGUAGE_BIHARI,                     "bh"   , 0              , 0                                 , "Bihari")
  2163.    LNG(wxLANGUAGE_BISLAMA,                    "bi"   , 0              , 0                                 , "Bislama")
  2164.    LNG(wxLANGUAGE_BRETON,                     "br"   , 0              , 0                                 , "Breton")
  2165.    LNG(wxLANGUAGE_BULGARIAN,                  "bg_BG", LANG_BULGARIAN , SUBLANG_DEFAULT                   , "Bulgarian")
  2166.    LNG(wxLANGUAGE_BURMESE,                    "my"   , 0              , 0                                 , "Burmese")
  2167.    LNG(wxLANGUAGE_CAMBODIAN,                  "km"   , 0              , 0                                 , "Cambodian")
  2168.    LNG(wxLANGUAGE_CATALAN,                    "ca_ES", LANG_CATALAN   , SUBLANG_DEFAULT                   , "Catalan")
  2169.    LNG(wxLANGUAGE_CHINESE,                    "zh_CN", LANG_CHINESE   , SUBLANG_DEFAULT                   , "Chinese")
  2170.    LNG(wxLANGUAGE_CHINESE_SIMPLIFIED,         "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_SIMPLIFIED        , "Chinese (Simplified)")
  2171.    LNG(wxLANGUAGE_CHINESE_TRADITIONAL,        "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , "Chinese (Traditional)")
  2172.    LNG(wxLANGUAGE_CHINESE_HONGKONG,           "zh_HK", LANG_CHINESE   , SUBLANG_CHINESE_HONGKONG          , "Chinese (Hongkong)")
  2173.    LNG(wxLANGUAGE_CHINESE_MACAU,              "zh_MO", LANG_CHINESE   , SUBLANG_CHINESE_MACAU             , "Chinese (Macau)")
  2174.    LNG(wxLANGUAGE_CHINESE_SINGAPORE,          "zh_SG", LANG_CHINESE   , SUBLANG_CHINESE_SINGAPORE         , "Chinese (Singapore)")
  2175.    LNG(wxLANGUAGE_CHINESE_TAIWAN,             "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , "Chinese (Taiwan)")
  2176.    LNG(wxLANGUAGE_CORSICAN,                   "co"   , 0              , 0                                 , "Corsican")
  2177.    LNG(wxLANGUAGE_CROATIAN,                   "hr_HR", LANG_CROATIAN  , SUBLANG_DEFAULT                   , "Croatian")
  2178.    LNG(wxLANGUAGE_CZECH,                      "cs_CZ", LANG_CZECH     , SUBLANG_DEFAULT                   , "Czech")
  2179.    LNG(wxLANGUAGE_DANISH,                     "da_DK", LANG_DANISH    , SUBLANG_DEFAULT                   , "Danish")
  2180.    LNG(wxLANGUAGE_DUTCH,                      "nl_NL", LANG_DUTCH     , SUBLANG_DUTCH                     , "Dutch")
  2181.    LNG(wxLANGUAGE_DUTCH_BELGIAN,              "nl_BE", LANG_DUTCH     , SUBLANG_DUTCH_BELGIAN             , "Dutch (Belgian)")
  2182.    LNG(wxLANGUAGE_ENGLISH,                    "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , "English")
  2183.    LNG(wxLANGUAGE_ENGLISH_UK,                 "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , "English (U.K.)")
  2184.    LNG(wxLANGUAGE_ENGLISH_US,                 "en_US", LANG_ENGLISH   , SUBLANG_ENGLISH_US                , "English (U.S.)")
  2185.    LNG(wxLANGUAGE_ENGLISH_AUSTRALIA,          "en_AU", LANG_ENGLISH   , SUBLANG_ENGLISH_AUS               , "English (Australia)")
  2186.    LNG(wxLANGUAGE_ENGLISH_BELIZE,             "en_BZ", LANG_ENGLISH   , SUBLANG_ENGLISH_BELIZE            , "English (Belize)")
  2187.    LNG(wxLANGUAGE_ENGLISH_BOTSWANA,           "en_BW", 0              , 0                                 , "English (Botswana)")
  2188.    LNG(wxLANGUAGE_ENGLISH_CANADA,             "en_CA", LANG_ENGLISH   , SUBLANG_ENGLISH_CAN               , "English (Canada)")
  2189.    LNG(wxLANGUAGE_ENGLISH_CARIBBEAN,          "en_CB", LANG_ENGLISH   , SUBLANG_ENGLISH_CARIBBEAN         , "English (Caribbean)")
  2190.    LNG(wxLANGUAGE_ENGLISH_DENMARK,            "en_DK", 0              , 0                                 , "English (Denmark)")
  2191.    LNG(wxLANGUAGE_ENGLISH_EIRE,               "en_IE", LANG_ENGLISH   , SUBLANG_ENGLISH_EIRE              , "English (Eire)")
  2192.    LNG(wxLANGUAGE_ENGLISH_JAMAICA,            "en_JM", LANG_ENGLISH   , SUBLANG_ENGLISH_JAMAICA           , "English (Jamaica)")
  2193.    LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND,        "en_NZ", LANG_ENGLISH   , SUBLANG_ENGLISH_NZ                , "English (New Zealand)")
  2194.    LNG(wxLANGUAGE_ENGLISH_PHILIPPINES,        "en_PH", LANG_ENGLISH   , SUBLANG_ENGLISH_PHILIPPINES       , "English (Philippines)")
  2195.    LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA,       "en_ZA", LANG_ENGLISH   , SUBLANG_ENGLISH_SOUTH_AFRICA      , "English (South Africa)")
  2196.    LNG(wxLANGUAGE_ENGLISH_TRINIDAD,           "en_TT", LANG_ENGLISH   , SUBLANG_ENGLISH_TRINIDAD          , "English (Trinidad)")
  2197.    LNG(wxLANGUAGE_ENGLISH_ZIMBABWE,           "en_ZW", LANG_ENGLISH   , SUBLANG_ENGLISH_ZIMBABWE          , "English (Zimbabwe)")
  2198.    LNG(wxLANGUAGE_ESPERANTO,                  "eo"   , 0              , 0                                 , "Esperanto")
  2199.    LNG(wxLANGUAGE_ESTONIAN,                   "et_EE", LANG_ESTONIAN  , SUBLANG_DEFAULT                   , "Estonian")
  2200.    LNG(wxLANGUAGE_FAEROESE,                   "fo_FO", LANG_FAEROESE  , SUBLANG_DEFAULT                   , "Faeroese")
  2201.    LNG(wxLANGUAGE_FARSI,                      "fa_IR", LANG_FARSI     , SUBLANG_DEFAULT                   , "Farsi")
  2202.    LNG(wxLANGUAGE_FIJI,                       "fj"   , 0              , 0                                 , "Fiji")
  2203.    LNG(wxLANGUAGE_FINNISH,                    "fi_FI", LANG_FINNISH   , SUBLANG_DEFAULT                   , "Finnish")
  2204.    LNG(wxLANGUAGE_FRENCH,                     "fr_FR", LANG_FRENCH    , SUBLANG_FRENCH                    , "French")
  2205.    LNG(wxLANGUAGE_FRENCH_BELGIAN,             "fr_BE", LANG_FRENCH    , SUBLANG_FRENCH_BELGIAN            , "French (Belgian)")
  2206.    LNG(wxLANGUAGE_FRENCH_CANADIAN,            "fr_CA", LANG_FRENCH    , SUBLANG_FRENCH_CANADIAN           , "French (Canadian)")
  2207.    LNG(wxLANGUAGE_FRENCH_LUXEMBOURG,          "fr_LU", LANG_FRENCH    , SUBLANG_FRENCH_LUXEMBOURG         , "French (Luxembourg)")
  2208.    LNG(wxLANGUAGE_FRENCH_MONACO,              "fr_MC", LANG_FRENCH    , SUBLANG_FRENCH_MONACO             , "French (Monaco)")
  2209.    LNG(wxLANGUAGE_FRENCH_SWISS,               "fr_CH", LANG_FRENCH    , SUBLANG_FRENCH_SWISS              , "French (Swiss)")
  2210.    LNG(wxLANGUAGE_FRISIAN,                    "fy"   , 0              , 0                                 , "Frisian")
  2211.    LNG(wxLANGUAGE_GALICIAN,                   "gl_ES", 0              , 0                                 , "Galician")
  2212.    LNG(wxLANGUAGE_GEORGIAN,                   "ka"   , LANG_GEORGIAN  , SUBLANG_DEFAULT                   , "Georgian")
  2213.    LNG(wxLANGUAGE_GERMAN,                     "de_DE", LANG_GERMAN    , SUBLANG_GERMAN                    , "German")
  2214.    LNG(wxLANGUAGE_GERMAN_AUSTRIAN,            "de_AT", LANG_GERMAN    , SUBLANG_GERMAN_AUSTRIAN           , "German (Austrian)")
  2215.    LNG(wxLANGUAGE_GERMAN_BELGIUM,             "de_BE", 0              , 0                                 , "German (Belgium)")
  2216.    LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN,       "de_LI", LANG_GERMAN    , SUBLANG_GERMAN_LIECHTENSTEIN      , "German (Liechtenstein)")
  2217.    LNG(wxLANGUAGE_GERMAN_LUXEMBOURG,          "de_LU", LANG_GERMAN    , SUBLANG_GERMAN_LUXEMBOURG         , "German (Luxembourg)")
  2218.    LNG(wxLANGUAGE_GERMAN_SWISS,               "de_CH", LANG_GERMAN    , SUBLANG_GERMAN_SWISS              , "German (Swiss)")
  2219.    LNG(wxLANGUAGE_GREEK,                      "el_GR", LANG_GREEK     , SUBLANG_DEFAULT                   , "Greek")
  2220.    LNG(wxLANGUAGE_GREENLANDIC,                "kl_GL", 0              , 0                                 , "Greenlandic")
  2221.    LNG(wxLANGUAGE_GUARANI,                    "gn"   , 0              , 0                                 , "Guarani")
  2222.    LNG(wxLANGUAGE_GUJARATI,                   "gu"   , LANG_GUJARATI  , SUBLANG_DEFAULT                   , "Gujarati")
  2223.    LNG(wxLANGUAGE_HAUSA,                      "ha"   , 0              , 0                                 , "Hausa")
  2224.    LNG(wxLANGUAGE_HEBREW,                     "he_IL", LANG_HEBREW    , SUBLANG_DEFAULT                   , "Hebrew")
  2225.    LNG(wxLANGUAGE_HINDI,                      "hi_IN", LANG_HINDI     , SUBLANG_DEFAULT                   , "Hindi")
  2226.    LNG(wxLANGUAGE_HUNGARIAN,                  "hu_HU", LANG_HUNGARIAN , SUBLANG_DEFAULT                   , "Hungarian")
  2227.    LNG(wxLANGUAGE_ICELANDIC,                  "is_IS", LANG_ICELANDIC , SUBLANG_DEFAULT                   , "Icelandic")
  2228.    LNG(wxLANGUAGE_INDONESIAN,                 "id_ID", LANG_INDONESIAN, SUBLANG_DEFAULT                   , "Indonesian")
  2229.    LNG(wxLANGUAGE_INTERLINGUA,                "ia"   , 0              , 0                                 , "Interlingua")
  2230.    LNG(wxLANGUAGE_INTERLINGUE,                "ie"   , 0              , 0                                 , "Interlingue")
  2231.    LNG(wxLANGUAGE_INUKTITUT,                  "iu"   , 0              , 0                                 , "Inuktitut")
  2232.    LNG(wxLANGUAGE_INUPIAK,                    "ik"   , 0              , 0                                 , "Inupiak")
  2233.    LNG(wxLANGUAGE_IRISH,                      "ga_IE", 0              , 0                                 , "Irish")
  2234.    LNG(wxLANGUAGE_ITALIAN,                    "it_IT", LANG_ITALIAN   , SUBLANG_ITALIAN                   , "Italian")
  2235.    LNG(wxLANGUAGE_ITALIAN_SWISS,              "it_CH", LANG_ITALIAN   , SUBLANG_ITALIAN_SWISS             , "Italian (Swiss)")
  2236.    LNG(wxLANGUAGE_JAPANESE,                   "ja_JP", LANG_JAPANESE  , SUBLANG_DEFAULT                   , "Japanese")
  2237.    LNG(wxLANGUAGE_JAVANESE,                   "jw"   , 0              , 0                                 , "Javanese")
  2238.    LNG(wxLANGUAGE_KANNADA,                    "kn"   , LANG_KANNADA   , SUBLANG_DEFAULT                   , "Kannada")
  2239.    LNG(wxLANGUAGE_KASHMIRI,                   "ks"   , LANG_KASHMIRI  , SUBLANG_DEFAULT                   , "Kashmiri")
  2240.    LNG(wxLANGUAGE_KASHMIRI_INDIA,             "ks_IN", LANG_KASHMIRI  , SUBLANG_KASHMIRI_INDIA            , "Kashmiri (India)")
  2241.    LNG(wxLANGUAGE_KAZAKH,                     "kk"   , LANG_KAZAK     , SUBLANG_DEFAULT                   , "Kazakh")
  2242.    LNG(wxLANGUAGE_KERNEWEK,                   "kw_GB", 0              , 0                                 , "Kernewek")
  2243.    LNG(wxLANGUAGE_KINYARWANDA,                "rw"   , 0              , 0                                 , "Kinyarwanda")
  2244.    LNG(wxLANGUAGE_KIRGHIZ,                    "ky"   , 0              , 0                                 , "Kirghiz")
  2245.    LNG(wxLANGUAGE_KIRUNDI,                    "rn"   , 0              , 0                                 , "Kirundi")
  2246.    LNG(wxLANGUAGE_KONKANI,                    ""     , LANG_KONKANI   , SUBLANG_DEFAULT                   , "Konkani")
  2247.    LNG(wxLANGUAGE_KOREAN,                     "ko_KR", LANG_KOREAN    , SUBLANG_KOREAN                    , "Korean")
  2248.    LNG(wxLANGUAGE_KURDISH,                    "ku"   , 0              , 0                                 , "Kurdish")
  2249.    LNG(wxLANGUAGE_LAOTHIAN,                   "lo"   , 0              , 0                                 , "Laothian")
  2250.    LNG(wxLANGUAGE_LATIN,                      "la"   , 0              , 0                                 , "Latin")
  2251.    LNG(wxLANGUAGE_LATVIAN,                    "lv_LV", LANG_LATVIAN   , SUBLANG_DEFAULT                   , "Latvian")
  2252.    LNG(wxLANGUAGE_LINGALA,                    "ln"   , 0              , 0                                 , "Lingala")
  2253.    LNG(wxLANGUAGE_LITHUANIAN,                 "lt_LT", LANG_LITHUANIAN, SUBLANG_LITHUANIAN                , "Lithuanian")
  2254.    LNG(wxLANGUAGE_MACEDONIAN,                 "mk_MK", LANG_MACEDONIAN, SUBLANG_DEFAULT                   , "Macedonian")
  2255.    LNG(wxLANGUAGE_MALAGASY,                   "mg"   , 0              , 0                                 , "Malagasy")
  2256.    LNG(wxLANGUAGE_MALAY,                      "ms_MY", LANG_MALAY     , SUBLANG_DEFAULT                   , "Malay")
  2257.    LNG(wxLANGUAGE_MALAYALAM,                  "ml"   , LANG_MALAYALAM , SUBLANG_DEFAULT                   , "Malayalam")
  2258.    LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM,    "ms_BN", LANG_MALAY     , SUBLANG_MALAY_BRUNEI_DARUSSALAM   , "Malay (Brunei Darussalam)")
  2259.    LNG(wxLANGUAGE_MALAY_MALAYSIA,             "ms_MY", LANG_MALAY     , SUBLANG_MALAY_MALAYSIA            , "Malay (Malaysia)")
  2260.    LNG(wxLANGUAGE_MALTESE,                    "mt_MT", 0              , 0                                 , "Maltese")
  2261.    LNG(wxLANGUAGE_MANIPURI,                   ""     , LANG_MANIPURI  , SUBLANG_DEFAULT                   , "Manipuri")
  2262.    LNG(wxLANGUAGE_MAORI,                      "mi"   , 0              , 0                                 , "Maori")
  2263.    LNG(wxLANGUAGE_MARATHI,                    "mr_IN", LANG_MARATHI   , SUBLANG_DEFAULT                   , "Marathi")
  2264.    LNG(wxLANGUAGE_MOLDAVIAN,                  "mo"   , 0              , 0                                 , "Moldavian")
  2265.    LNG(wxLANGUAGE_MONGOLIAN,                  "mn"   , 0              , 0                                 , "Mongolian")
  2266.    LNG(wxLANGUAGE_NAURU,                      "na"   , 0              , 0                                 , "Nauru")
  2267.    LNG(wxLANGUAGE_NEPALI,                     "ne"   , LANG_NEPALI    , SUBLANG_DEFAULT                   , "Nepali")
  2268.    LNG(wxLANGUAGE_NEPALI_INDIA,               "ne_IN", LANG_NEPALI    , SUBLANG_NEPALI_INDIA              , "Nepali (India)")
  2269.    LNG(wxLANGUAGE_NORWEGIAN_BOKMAL,           "no_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_BOKMAL          , "Norwegian (Bokmal)")
  2270.    LNG(wxLANGUAGE_NORWEGIAN_NYNORSK,          "nn_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_NYNORSK         , "Norwegian (Nynorsk)")
  2271.    LNG(wxLANGUAGE_OCCITAN,                    "oc"   , 0              , 0                                 , "Occitan")
  2272.    LNG(wxLANGUAGE_ORIYA,                      "or"   , LANG_ORIYA     , SUBLANG_DEFAULT                   , "Oriya")
  2273.    LNG(wxLANGUAGE_OROMO,                      "om"   , 0              , 0                                 , "(Afan) Oromo")
  2274.    LNG(wxLANGUAGE_PASHTO,                     "ps"   , 0              , 0                                 , "Pashto, Pushto")
  2275.    LNG(wxLANGUAGE_POLISH,                     "pl_PL", LANG_POLISH    , SUBLANG_DEFAULT                   , "Polish")
  2276.    LNG(wxLANGUAGE_PORTUGUESE,                 "pt_PT", LANG_PORTUGUESE, SUBLANG_PORTUGUESE                , "Portuguese")
  2277.    LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN,       "pt_BR", LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN      , "Portuguese (Brazilian)")
  2278.    LNG(wxLANGUAGE_PUNJABI,                    "pa"   , LANG_PUNJABI   , SUBLANG_DEFAULT                   , "Punjabi")
  2279.    LNG(wxLANGUAGE_QUECHUA,                    "qu"   , 0              , 0                                 , "Quechua")
  2280.    LNG(wxLANGUAGE_RHAETO_ROMANCE,             "rm"   , 0              , 0                                 , "Rhaeto-Romance")
  2281.    LNG(wxLANGUAGE_ROMANIAN,                   "ro_RO", LANG_ROMANIAN  , SUBLANG_DEFAULT                   , "Romanian")
  2282.    LNG(wxLANGUAGE_RUSSIAN,                    "ru_RU", LANG_RUSSIAN   , SUBLANG_DEFAULT                   , "Russian")
  2283.    LNG(wxLANGUAGE_RUSSIAN_UKRAINE,            "ru_UA", 0              , 0                                 , "Russian (Ukraine)")
  2284.    LNG(wxLANGUAGE_SAMOAN,                     "sm"   , 0              , 0                                 , "Samoan")
  2285.    LNG(wxLANGUAGE_SANGHO,                     "sg"   , 0              , 0                                 , "Sangho")
  2286.    LNG(wxLANGUAGE_SANSKRIT,                   "sa"   , LANG_SANSKRIT  , SUBLANG_DEFAULT                   , "Sanskrit")
  2287.    LNG(wxLANGUAGE_SCOTS_GAELIC,               "gd"   , 0              , 0                                 , "Scots Gaelic")
  2288.    LNG(wxLANGUAGE_SERBIAN,                    "sr_YU", LANG_SERBIAN   , SUBLANG_DEFAULT                   , "Serbian")
  2289.    LNG(wxLANGUAGE_SERBIAN_CYRILLIC,           "sr_YU", LANG_SERBIAN   , SUBLANG_SERBIAN_CYRILLIC          , "Serbian (Cyrillic)")
  2290.    LNG(wxLANGUAGE_SERBIAN_LATIN,              "sr_YU", LANG_SERBIAN   , SUBLANG_SERBIAN_LATIN             , "Serbian (Latin)")
  2291.    LNG(wxLANGUAGE_SERBO_CROATIAN,             "sh"   , 0              , 0                                 , "Serbo-Croatian")
  2292.    LNG(wxLANGUAGE_SESOTHO,                    "st"   , 0              , 0                                 , "Sesotho")
  2293.    LNG(wxLANGUAGE_SETSWANA,                   "tn"   , 0              , 0                                 , "Setswana")
  2294.    LNG(wxLANGUAGE_SHONA,                      "sn"   , 0              , 0                                 , "Shona")
  2295.    LNG(wxLANGUAGE_SINDHI,                     "sd"   , LANG_SINDHI    , SUBLANG_DEFAULT                   , "Sindhi")
  2296.    LNG(wxLANGUAGE_SINHALESE,                  "si"   , 0              , 0                                 , "Sinhalese")
  2297.    LNG(wxLANGUAGE_SISWATI,                    "ss"   , 0              , 0                                 , "Siswati")
  2298.    LNG(wxLANGUAGE_SLOVAK,                     "sk_SK", LANG_SLOVAK    , SUBLANG_DEFAULT                   , "Slovak")
  2299.    LNG(wxLANGUAGE_SLOVENIAN,                  "sl_SI", LANG_SLOVENIAN , SUBLANG_DEFAULT                   , "Slovenian")
  2300.    LNG(wxLANGUAGE_SOMALI,                     "so"   , 0              , 0                                 , "Somali")
  2301.    LNG(wxLANGUAGE_SPANISH,                    "es_ES", LANG_SPANISH   , SUBLANG_SPANISH                   , "Spanish")
  2302.    LNG(wxLANGUAGE_SPANISH_ARGENTINA,          "es_AR", LANG_SPANISH   , SUBLANG_SPANISH_ARGENTINA         , "Spanish (Argentina)")
  2303.    LNG(wxLANGUAGE_SPANISH_BOLIVIA,            "es_BO", LANG_SPANISH   , SUBLANG_SPANISH_BOLIVIA           , "Spanish (Bolivia)")
  2304.    LNG(wxLANGUAGE_SPANISH_CHILE,              "es_CL", LANG_SPANISH   , SUBLANG_SPANISH_CHILE             , "Spanish (Chile)")
  2305.    LNG(wxLANGUAGE_SPANISH_COLOMBIA,           "es_CO", LANG_SPANISH   , SUBLANG_SPANISH_COLOMBIA          , "Spanish (Colombia)")
  2306.    LNG(wxLANGUAGE_SPANISH_COSTA_RICA,         "es_CR", LANG_SPANISH   , SUBLANG_SPANISH_COSTA_RICA        , "Spanish (Costa Rica)")
  2307.    LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, "es_DO", LANG_SPANISH   , SUBLANG_SPANISH_DOMINICAN_REPUBLIC, "Spanish (Dominican republic)")
  2308.    LNG(wxLANGUAGE_SPANISH_ECUADOR,            "es_EC", LANG_SPANISH   , SUBLANG_SPANISH_ECUADOR           , "Spanish (Ecuador)")
  2309.    LNG(wxLANGUAGE_SPANISH_EL_SALVADOR,        "es_SV", LANG_SPANISH   , SUBLANG_SPANISH_EL_SALVADOR       , "Spanish (El Salvador)")
  2310.    LNG(wxLANGUAGE_SPANISH_GUATEMALA,          "es_GT", LANG_SPANISH   , SUBLANG_SPANISH_GUATEMALA         , "Spanish (Guatemala)")
  2311.    LNG(wxLANGUAGE_SPANISH_HONDURAS,           "es_HN", LANG_SPANISH   , SUBLANG_SPANISH_HONDURAS          , "Spanish (Honduras)")
  2312.    LNG(wxLANGUAGE_SPANISH_MEXICAN,            "es_MX", LANG_SPANISH   , SUBLANG_SPANISH_MEXICAN           , "Spanish (Mexican)")
  2313.    LNG(wxLANGUAGE_SPANISH_MODERN,             "es_ES", LANG_SPANISH   , SUBLANG_SPANISH_MODERN            , "Spanish (Modern)")
  2314.    LNG(wxLANGUAGE_SPANISH_NICARAGUA,          "es_NI", LANG_SPANISH   , SUBLANG_SPANISH_NICARAGUA         , "Spanish (Nicaragua)")
  2315.    LNG(wxLANGUAGE_SPANISH_PANAMA,             "es_PA", LANG_SPANISH   , SUBLANG_SPANISH_PANAMA            , "Spanish (Panama)")
  2316.    LNG(wxLANGUAGE_SPANISH_PARAGUAY,           "es_PY", LANG_SPANISH   , SUBLANG_SPANISH_PARAGUAY          , "Spanish (Paraguay)")
  2317.    LNG(wxLANGUAGE_SPANISH_PERU,               "es_PE", LANG_SPANISH   , SUBLANG_SPANISH_PERU              , "Spanish (Peru)")
  2318.    LNG(wxLANGUAGE_SPANISH_PUERTO_RICO,        "es_PR", LANG_SPANISH   , SUBLANG_SPANISH_PUERTO_RICO       , "Spanish (Puerto Rico)")
  2319.    LNG(wxLANGUAGE_SPANISH_URUGUAY,            "es_UY", LANG_SPANISH   , SUBLANG_SPANISH_URUGUAY           , "Spanish (Uruguay)")
  2320.    LNG(wxLANGUAGE_SPANISH_US,                 "es_US", 0              , 0                                 , "Spanish (U.S.)")
  2321.    LNG(wxLANGUAGE_SPANISH_VENEZUELA,          "es_VE", LANG_SPANISH   , SUBLANG_SPANISH_VENEZUELA         , "Spanish (Venezuela)")
  2322.    LNG(wxLANGUAGE_SUNDANESE,                  "su"   , 0              , 0                                 , "Sundanese")
  2323.    LNG(wxLANGUAGE_SWAHILI,                    "sw_KE", LANG_SWAHILI   , SUBLANG_DEFAULT                   , "Swahili")
  2324.    LNG(wxLANGUAGE_SWEDISH,                    "sv_SE", LANG_SWEDISH   , SUBLANG_SWEDISH                   , "Swedish")
  2325.    LNG(wxLANGUAGE_SWEDISH_FINLAND,            "sv_FI", LANG_SWEDISH   , SUBLANG_SWEDISH_FINLAND           , "Swedish (Finland)")
  2326.    LNG(wxLANGUAGE_TAGALOG,                    "tl"   , 0              , 0                                 , "Tagalog")
  2327.    LNG(wxLANGUAGE_TAJIK,                      "tg"   , 0              , 0                                 , "Tajik")
  2328.    LNG(wxLANGUAGE_TAMIL,                      "ta"   , LANG_TAMIL     , SUBLANG_DEFAULT                   , "Tamil")
  2329.    LNG(wxLANGUAGE_TATAR,                      "tt"   , LANG_TATAR     , SUBLANG_DEFAULT                   , "Tatar")
  2330.    LNG(wxLANGUAGE_TELUGU,                     "te"   , LANG_TELUGU    , SUBLANG_DEFAULT                   , "Telugu")
  2331.    LNG(wxLANGUAGE_THAI,                       "th_TH", LANG_THAI      , SUBLANG_DEFAULT                   , "Thai")
  2332.    LNG(wxLANGUAGE_TIBETAN,                    "bo"   , 0              , 0                                 , "Tibetan")
  2333.    LNG(wxLANGUAGE_TIGRINYA,                   "ti"   , 0              , 0                                 , "Tigrinya")
  2334.    LNG(wxLANGUAGE_TONGA,                      "to"   , 0              , 0                                 , "Tonga")
  2335.    LNG(wxLANGUAGE_TSONGA,                     "ts"   , 0              , 0                                 , "Tsonga")
  2336.    LNG(wxLANGUAGE_TURKISH,                    "tr_TR", LANG_TURKISH   , SUBLANG_DEFAULT                   , "Turkish")
  2337.    LNG(wxLANGUAGE_TURKMEN,                    "tk"   , 0              , 0                                 , "Turkmen")
  2338.    LNG(wxLANGUAGE_TWI,                        "tw"   , 0              , 0                                 , "Twi")
  2339.    LNG(wxLANGUAGE_UIGHUR,                     "ug"   , 0              , 0                                 , "Uighur")
  2340.    LNG(wxLANGUAGE_UKRAINIAN,                  "uk_UA", LANG_UKRAINIAN , SUBLANG_DEFAULT                   , "Ukrainian")
  2341.    LNG(wxLANGUAGE_URDU,                       "ur"   , LANG_URDU      , SUBLANG_DEFAULT                   , "Urdu")
  2342.    LNG(wxLANGUAGE_URDU_INDIA,                 "ur_IN", LANG_URDU      , SUBLANG_URDU_INDIA                , "Urdu (India)")
  2343.    LNG(wxLANGUAGE_URDU_PAKISTAN,              "ur_PK", LANG_URDU      , SUBLANG_URDU_PAKISTAN             , "Urdu (Pakistan)")
  2344.    LNG(wxLANGUAGE_UZBEK,                      "uz"   , LANG_UZBEK     , SUBLANG_DEFAULT                   , "Uzbek")
  2345.    LNG(wxLANGUAGE_UZBEK_CYRILLIC,             "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_CYRILLIC            , "Uzbek (Cyrillic)")
  2346.    LNG(wxLANGUAGE_UZBEK_LATIN,                "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_LATIN               , "Uzbek (Latin)")
  2347.    LNG(wxLANGUAGE_VIETNAMESE,                 "vi_VN", LANG_VIETNAMESE, SUBLANG_DEFAULT                   , "Vietnamese")
  2348.    LNG(wxLANGUAGE_VOLAPUK,                    "vo"   , 0              , 0                                 , "Volapuk")
  2349.    LNG(wxLANGUAGE_WELSH,                      "cy"   , 0              , 0                                 , "Welsh")
  2350.    LNG(wxLANGUAGE_WOLOF,                      "wo"   , 0              , 0                                 , "Wolof")
  2351.    LNG(wxLANGUAGE_XHOSA,                      "xh"   , 0              , 0                                 , "Xhosa")
  2352.    LNG(wxLANGUAGE_YIDDISH,                    "yi"   , 0              , 0                                 , "Yiddish")
  2353.    LNG(wxLANGUAGE_YORUBA,                     "yo"   , 0              , 0                                 , "Yoruba")
  2354.    LNG(wxLANGUAGE_ZHUANG,                     "za"   , 0              , 0                                 , "Zhuang")
  2355.    LNG(wxLANGUAGE_ZULU,                       "zu"   , 0              , 0                                 , "Zulu")
  2356.  
  2357. };
  2358. #undef LNG
  2359.  
  2360. // --- --- --- generated code ends here --- --- ---
  2361.  
  2362. #endif // wxUSE_INTL
  2363.  
  2364.