home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / src / common / intl.cpp < prev    next >
C/C++ Source or Header  |  2002-09-08  |  86KB  |  2,343 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 2002/09/07 22:53:04 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(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.     const wxChar *retloc;
  670.  
  671.     // Set the locale:
  672. #if defined(__UNIX__) && !defined(__WXMAC__)
  673.     if (language == wxLANGUAGE_DEFAULT)
  674.         locale = wxEmptyString;
  675.     else
  676.         locale = info->CanonicalName;
  677.  
  678.     retloc = wxSetlocale(LC_ALL, locale);
  679.  
  680.     if (retloc == NULL)
  681.     {
  682.         // Some C libraries don't like xx_YY form and require xx only
  683.         retloc = wxSetlocale(LC_ALL, locale.Mid(0,2));
  684.     }
  685.     if (retloc == NULL)
  686.     {
  687.         // Some C libraries (namely glibc) still use old ISO 639,
  688.         // so will translate the abbrev for them
  689.         wxString mid = locale.Mid(0,2);
  690.         if (mid == wxT("he")) locale = wxT("iw") + locale.Mid(3);
  691.         else if (mid == wxT("id")) locale = wxT("in") + locale.Mid(3);
  692.         else if (mid == wxT("yi")) locale = wxT("ji") + locale.Mid(3);
  693.         retloc = wxSetlocale(LC_ALL, locale);
  694.     }
  695.     if (retloc == NULL)
  696.     {
  697.         // (This time, we changed locale in previous if-branch, so try again.)
  698.         // Some C libraries don't like xx_YY form and require xx only
  699.         retloc = wxSetlocale(LC_ALL, locale.Mid(0,2));
  700.     }
  701.     if (retloc == NULL)
  702.     {
  703.         wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str());
  704.         return FALSE;
  705.     }
  706. #elif defined(__WIN32__)
  707.     if (language != wxLANGUAGE_DEFAULT)
  708.     {
  709.         if (info->WinLang == 0)
  710.         {
  711.             wxLogWarning(wxT("Locale '%s' not supported by OS."), name.c_str());
  712.             retloc = wxT("C");
  713.         }
  714.         else
  715.         {
  716.             wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang),
  717.                                      SORT_DEFAULT);
  718.             if (SetThreadLocale(lcid))
  719.                 retloc = wxSetlocale(LC_ALL, wxEmptyString);
  720.             else
  721.             {
  722.                 // Windows9X doesn't support SetThreadLocale, so we must
  723.                 // translate LCID to CRT's setlocale string ourselves
  724.                 locale.Empty();
  725.                 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
  726.                 {
  727.                     wxChar buffer[256];
  728.                     buffer[0] = wxT('\0');
  729.                     GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256);
  730.                     locale << buffer;
  731.                     if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0)
  732.                         locale << wxT("_") << buffer;
  733.                 }
  734.                 if (locale.IsEmpty())
  735.                 {
  736.                     wxLogLastError(wxT("SetThreadLocale"));
  737.                     wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
  738.                     return FALSE;
  739.                 }
  740.                 else
  741.                     retloc = wxSetlocale(LC_ALL, locale);
  742.             }
  743.         }
  744.     }
  745.     else
  746.         retloc = wxSetlocale(LC_ALL, wxEmptyString);
  747.  
  748.     if (retloc == NULL)
  749.     {
  750.         wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
  751.         return FALSE;
  752.     }
  753. #elif defined(__WXMAC__)
  754.     retloc = wxSetlocale(LC_ALL , wxEmptyString);
  755. #else
  756.     return FALSE;
  757. #endif
  758.  
  759.     return Init(name, canonical, wxString(retloc),
  760.                 (flags & wxLOCALE_LOAD_DEFAULT) != 0,
  761.                 (flags & wxLOCALE_CONV_ENCODING) != 0);
  762. }
  763.  
  764.  
  765.  
  766. void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix)
  767. {
  768.     if ( s_searchPrefixes.Index(prefix) == wxNOT_FOUND )
  769.     {
  770.         s_searchPrefixes.Add(prefix);
  771.     }
  772.     //else: already have it
  773. }
  774.  
  775. /*static*/ int wxLocale::GetSystemLanguage()
  776. {
  777.     CreateLanguagesDB();
  778.  
  779.     // init i to avoid compiler warning
  780.     size_t i = 0,
  781.            count = ms_languagesDB->GetCount();
  782.  
  783. #if defined(__UNIX__) && !defined(__WXMAC__)
  784.     // first get the string identifying the language from the environment
  785.     wxString langFull;
  786.     if (!wxGetEnv(wxT("LC_ALL"), &langFull) &&
  787.         !wxGetEnv(wxT("LC_MESSAGES"), &langFull) &&
  788.         !wxGetEnv(wxT("LANG"), &langFull))
  789.     {
  790.         // no language specified, threat it as English
  791.         return wxLANGUAGE_ENGLISH;
  792.     }
  793.  
  794.     if ( langFull == _T("C") || langFull == _T("POSIX") )
  795.     {
  796.         // default C locale
  797.         return wxLANGUAGE_ENGLISH;
  798.     }
  799.  
  800.     // the language string has the following form
  801.     //
  802.     //      lang[_LANG][.encoding][@modifier]
  803.     //
  804.     // (see environ(5) in the Open Unix specification)
  805.     //
  806.     // where lang is the primary language, LANG is a sublang/territory,
  807.     // encoding is the charset to use and modifier "allows the user to select
  808.     // a specific instance of localization data within a single category"
  809.     //
  810.     // for example, the following strings are valid:
  811.     //      fr
  812.     //      fr_FR
  813.     //      de_DE.iso88591
  814.     //      de_DE@euro
  815.     //      de_DE.iso88591@euro
  816.  
  817.     // for now we don't use the encoding, although we probably should (doing
  818.     // translations of the msg catalogs on the fly as required) (TODO)
  819.     //
  820.     // we don't use the modifiers neither but we probably should translate
  821.     // "euro" into iso885915
  822.     size_t posEndLang = langFull.find_first_of(_T("@."));
  823.     if ( posEndLang != wxString::npos )
  824.     {
  825.         langFull.Truncate(posEndLang);
  826.     }
  827.  
  828.     // in addition to the format above, we also can have full language names
  829.     // in LANG env var - for example, SuSE is known to use LANG="german" - so
  830.     // check for this
  831.  
  832.     // do we have just the language (or sublang too)?
  833.     bool justLang = langFull.Len() == LEN_LANG;
  834.     if ( justLang ||
  835.          (langFull.Len() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) )
  836.     {
  837.         // 0. Make sure the lang is according to latest ISO 639
  838.         //    (this is neccessary because glibc uses iw and in instead
  839.         //    of he and id respectively).
  840.  
  841.         // the language itself (second part is the dialect/sublang)
  842.         wxString langOrig = ExtractLang(langFull);
  843.  
  844.         wxString lang;
  845.         if ( langOrig == wxT("iw"))
  846.             lang = _T("he");
  847.         else if ( langOrig == wxT("in") )
  848.             lang = wxT("id");
  849.         else if ( langOrig == wxT("ji") )
  850.             lang = wxT("yi");
  851.         else
  852.             lang = langOrig;
  853.  
  854.         // did we change it?
  855.         if ( lang != langOrig )
  856.         {
  857.             langFull = lang + ExtractNotLang(langFull);
  858.         }
  859.  
  860.         // 1. Try to find the language either as is:
  861.         for ( i = 0; i < count; i++ )
  862.         {
  863.             if ( ms_languagesDB->Item(i).CanonicalName == langFull )
  864.             {
  865.                 break;
  866.             }
  867.         }
  868.  
  869.         // 2. If langFull is of the form xx_YY, try to find xx:
  870.         if ( i == count && !justLang )
  871.         {
  872.             for ( i = 0; i < count; i++ )
  873.             {
  874.                 if ( ms_languagesDB->Item(i).CanonicalName == lang )
  875.                 {
  876.                     break;
  877.                 }
  878.             }
  879.         }
  880.  
  881.         // 3. If langFull is of the form xx, try to find any xx_YY record:
  882.         if ( i == count && justLang )
  883.         {
  884.             for ( i = 0; i < count; i++ )
  885.             {
  886.                 if ( ExtractLang(ms_languagesDB->Item(i).CanonicalName)
  887.                         == langFull )
  888.                 {
  889.                     break;
  890.                 }
  891.             }
  892.         }
  893.     }
  894.     else // not standard format
  895.     {
  896.         // try to find the name in verbose description
  897.         for ( i = 0; i < count; i++ )
  898.         {
  899.             if (ms_languagesDB->Item(i).Description.CmpNoCase(langFull) == 0)
  900.             {
  901.                 break;
  902.             }
  903.         }
  904.     }
  905. #elif defined(__WXMAC__)
  906.     const char* lc = NULL ;
  907.     long lang = GetScriptVariable( smSystemScript, smScriptLang) ;
  908.     switch( GetScriptManagerVariable( smRegionCode ) ) {
  909.       case verUS :
  910.         lc = "en_US" ;
  911.         break ;
  912.       case verFrance :
  913.         lc = "fr_FR" ;
  914.         break ;
  915.       case verBritain :
  916.         lc = "en_GB" ;
  917.         break ;
  918.       case verGermany :
  919.         lc = "de_DE" ;
  920.         break ;
  921.       case verItaly :
  922.         lc = "it_IT" ;
  923.         break ;
  924.       case verNetherlands :
  925.         lc = "nl_NL" ;
  926.         break ;
  927.       case verFlemish :
  928.         lc = "nl_BE" ;
  929.         break ;
  930.       case verSweden :
  931.         lc = "sv_SE" ;
  932.         break ;
  933.       case verSpain :
  934.         lc = "es_ES" ;
  935.         break ;
  936.       case verDenmark :
  937.         lc = "da_DK" ;
  938.         break ;
  939.       case verPortugal :
  940.         lc = "pt_PT" ;
  941.         break ;
  942.       case verFrCanada:
  943.         lc = "fr_CA" ;
  944.         break ;
  945.       case verNorway:
  946.         lc = "no_NO" ;
  947.         break ;
  948.       case verIsrael:
  949.         lc = "iw_IL" ;
  950.         break ;
  951.       case verJapan:
  952.         lc = "ja_JP" ;
  953.         break ;
  954.       case verAustralia:
  955.         lc = "en_AU" ;
  956.         break ;
  957.       case verArabic:
  958.         lc = "ar" ;
  959.         break ;
  960.       case verFinland:
  961.         lc = "fi_FI" ;
  962.         break ;
  963.       case verFrSwiss:
  964.         lc = "fr_CH" ;
  965.         break ;
  966.       case verGrSwiss:
  967.         lc = "de_CH" ;
  968.         break ;
  969.       case verGreece:
  970.         lc = "el_GR" ;
  971.         break ;
  972.       case verIceland:
  973.         lc = "is_IS" ;
  974.         break ;
  975.       case verMalta:
  976.         lc = "mt_MT" ;
  977.         break ;
  978.       case verCyprus:
  979.       // _CY is not part of wx, so we have to translate according to the system language
  980.         if ( lang == langGreek ) {
  981.           lc = "el_GR" ;
  982.         }
  983.         else if ( lang == langTurkish ) {
  984.           lc = "tr_TR" ;
  985.         }
  986.         break ;
  987.       case verTurkey:
  988.         lc = "tr_TR" ;
  989.         break ;
  990.       case verYugoCroatian:
  991.         lc = "hr_HR" ;
  992.         break ;
  993.       case verIndiaHindi:
  994.         lc = "hi_IN" ;
  995.         break ;
  996.       case verPakistanUrdu:
  997.         lc = "ur_PK" ;
  998.         break ;
  999.       case verTurkishModified:
  1000.         lc = "tr_TR" ;
  1001.         break ;
  1002.       case verItalianSwiss:
  1003.         lc = "it_CH" ;
  1004.         break ;
  1005.       case verInternational:
  1006.         lc = "en" ;
  1007.         break ;
  1008.       case verRomania:
  1009.         lc = "ro_RO" ;
  1010.         break ;
  1011.       case verGreecePoly:
  1012.         lc = "el_GR" ;
  1013.         break ;
  1014.       case verLithuania:
  1015.         lc = "lt_LT" ;
  1016.         break ;
  1017.       case verPoland:
  1018.         lc = "pl_PL" ;
  1019.         break ;
  1020.       case verMagyar :
  1021.       case verHungary:
  1022.         lc = "hu_HU" ;
  1023.         break ;
  1024.       case verEstonia:
  1025.         lc = "et_EE" ;
  1026.         break ;
  1027.       case verLatvia:
  1028.         lc = "lv_LV" ;
  1029.         break ;
  1030.       case verSami:
  1031.         // not known
  1032.         break ;
  1033.       case verFaroeIsl:
  1034.         lc = "fo_FO" ;
  1035.         break ;
  1036.       case verIran:
  1037.         lc = "fa_IR" ;
  1038.         break ;
  1039.       case verRussia:
  1040.         lc = "ru_RU" ;
  1041.         break ;
  1042.        case verIreland:
  1043.         lc = "ga_IE" ;
  1044.         break ;
  1045.       case verKorea:
  1046.         lc = "ko_KR" ;
  1047.         break ;
  1048.       case verChina:
  1049.         lc = "zh_CN" ;
  1050.         break ;
  1051.       case verTaiwan:
  1052.         lc = "zh_TW" ;
  1053.         break ;
  1054.       case verThailand:
  1055.         lc = "th_TH" ;
  1056.         break ;
  1057.       case verCzech:
  1058.         lc = "cs_CZ" ;
  1059.         break ;
  1060.       case verSlovak:
  1061.         lc = "sk_SK" ;
  1062.         break ;
  1063.       case verBengali:
  1064.         lc = "bn" ;
  1065.         break ;
  1066.       case verByeloRussian:
  1067.         lc = "be_BY" ;
  1068.         break ;
  1069.       case verUkraine:
  1070.         lc = "uk_UA" ;
  1071.         break ;
  1072.       case verGreeceAlt:
  1073.         lc = "el_GR" ;
  1074.         break ;
  1075.       case verSerbian:
  1076.         lc = "sr_YU" ;
  1077.         break ;
  1078.       case verSlovenian:
  1079.         lc = "sl_SI" ;
  1080.         break ;
  1081.       case verMacedonian:
  1082.         lc = "mk_MK" ;
  1083.         break ;
  1084.       case verCroatia:
  1085.         lc = "hr_HR" ;
  1086.         break ;
  1087.       case verBrazil:
  1088.         lc = "pt_BR " ;
  1089.         break ;
  1090.       case verBulgaria:
  1091.         lc = "bg_BG" ;
  1092.         break ;
  1093.       case verCatalonia:
  1094.         lc = "ca_ES" ;
  1095.         break ;
  1096.       case verScottishGaelic:
  1097.         lc = "gd" ;
  1098.         break ;
  1099.       case verManxGaelic:
  1100.         lc = "gv" ;
  1101.         break ;
  1102.       case verBreton:
  1103.         lc = "br" ;
  1104.         break ;
  1105.       case verNunavut:
  1106.         lc = "iu_CA" ;
  1107.         break ;
  1108.       case verWelsh:
  1109.         lc = "cy" ;
  1110.         break ;
  1111.       case verIrishGaelicScript:
  1112.         lc = "ga_IE" ;
  1113.         break ;
  1114.       case verEngCanada:
  1115.         lc = "en_CA" ;
  1116.         break ;
  1117.       case verBhutan:
  1118.         lc = "dz_BT" ;
  1119.         break ;
  1120.       case verArmenian:
  1121.         lc = "hy_AM" ;
  1122.         break ;
  1123.       case verGeorgian:
  1124.         lc = "ka_GE" ;
  1125.         break ;
  1126.       case verSpLatinAmerica:
  1127.         lc = "es_AR" ;
  1128.         break ;
  1129.       case verTonga:
  1130.         lc = "to_TO" ;
  1131.         break ;
  1132.       case verFrenchUniversal:
  1133.         lc = "fr_FR" ;
  1134.         break ;
  1135.       case verAustria:
  1136.         lc = "de_AT" ;
  1137.         break ;
  1138.       case verGujarati:
  1139.         lc = "gu_IN" ;
  1140.         break ;
  1141.       case verPunjabi:
  1142.         lc = "pa" ;
  1143.         break ;
  1144.       case verIndiaUrdu:
  1145.         lc = "ur_IN" ;
  1146.         break ;
  1147.       case verVietnam:
  1148.         lc = "vi_VN" ;
  1149.         break ;
  1150.       case verFrBelgium:
  1151.         lc = "fr_BE" ;
  1152.         break ;
  1153.       case verUzbek:
  1154.         lc = "uz_UZ" ;
  1155.         break ;
  1156.       case verSingapore:
  1157.         lc = "zh_SG" ;
  1158.         break ;
  1159.       case verNynorsk:
  1160.         lc = "nn_NO" ;
  1161.         break ;
  1162.       case verAfrikaans:
  1163.         lc = "af_ZA" ;
  1164.         break ;
  1165.       case verEsperanto:
  1166.         lc = "eo" ;
  1167.         break ;
  1168.       case verMarathi:
  1169.         lc = "mr_IN" ;
  1170.         break ;
  1171.       case verTibetan:
  1172.         lc = "bo" ;
  1173.         break ;
  1174.       case verNepal:
  1175.         lc = "ne_NP" ;
  1176.         break ;
  1177.       case verGreenland:
  1178.         lc = "kl_GL" ;
  1179.         break ;
  1180.       default :
  1181.         break ;
  1182.    }
  1183.   for ( i = 0; i < count; i++ )
  1184.   {
  1185.       if ( ms_languagesDB->Item(i).CanonicalName == lc )
  1186.       {
  1187.           break;
  1188.       }
  1189.   }
  1190.  
  1191. #elif defined(__WIN32__)
  1192.     LCID lcid = GetUserDefaultLCID();
  1193.     if ( lcid != 0 )
  1194.     {
  1195.         wxUint32 lang = PRIMARYLANGID(LANGIDFROMLCID(lcid));
  1196.         wxUint32 sublang = SUBLANGID(LANGIDFROMLCID(lcid));
  1197.  
  1198.         for ( i = 0; i < count; i++ )
  1199.         {
  1200.             if (ms_languagesDB->Item(i).WinLang == lang &&
  1201.                 ms_languagesDB->Item(i).WinSublang == sublang)
  1202.             {
  1203.                 break;
  1204.             }
  1205.         }
  1206.     }
  1207.     //else: leave wxlang == wxLANGUAGE_UNKNOWN
  1208. #endif // Unix/Win32
  1209.  
  1210.     if ( i < count )
  1211.     {
  1212.         // we did find a matching entry, use it
  1213.         return ms_languagesDB->Item(i).Language;
  1214.     }
  1215.  
  1216.     // no info about this language in the database
  1217.     return wxLANGUAGE_UNKNOWN;
  1218. }
  1219.  
  1220. // ----------------------------------------------------------------------------
  1221. // encoding stuff
  1222. // ----------------------------------------------------------------------------
  1223.  
  1224. // this is a bit strange as under Windows we get the encoding name using its
  1225. // numeric value and under Unix we do it the other way round, but this just
  1226. // reflects the way different systems provide he encoding info
  1227.  
  1228. /* static */
  1229. wxString wxLocale::GetSystemEncodingName()
  1230. {
  1231.     wxString encname;
  1232.  
  1233. #if defined(__WIN32__) && !defined(__WXMICROWIN__)
  1234.     // FIXME: what is the error return value for GetACP()?
  1235.     UINT codepage = ::GetACP();
  1236.     encname.Printf(_T("windows-%u"), codepage);
  1237. #elif defined(__UNIX_LIKE__)
  1238.  
  1239. #if defined(HAVE_LANGINFO_H) && defined(CODESET)
  1240.     // GNU libc provides current character set this way (this conforms
  1241.     // to Unix98)
  1242.     char *oldLocale = strdup(setlocale(LC_CTYPE, NULL));
  1243.     setlocale(LC_CTYPE, "");
  1244.     char *alang = nl_langinfo(CODESET);
  1245.     setlocale(LC_CTYPE, oldLocale);
  1246.     free(oldLocale);
  1247.  
  1248.     if ( alang )
  1249.     {
  1250.         // 7 bit ASCII encoding has several alternative names which we should
  1251.         // recognize to avoid warnings about unrecognized encoding on each
  1252.         // program startup
  1253.  
  1254.         // nl_langinfo() under Solaris returns 646 by default which stands for
  1255.         // ISO-646, i.e. 7 bit ASCII
  1256.         //
  1257.         // and recent glibc call it ANSI_X3.4-1968...
  1258.         if ( strcmp(alang, "646") == 0 ||
  1259.                strcmp(alang, "ANSI_X3.4-1968") == 0 )
  1260.         {
  1261.             encname = _T("US-ASCII");
  1262.         }
  1263.         else
  1264.         {
  1265.             encname = wxString::FromAscii( alang );
  1266.         }
  1267.     }
  1268.     else
  1269. #endif // HAVE_LANGINFO_H
  1270.     {
  1271.         // if we can't get at the character set directly, try to see if it's in
  1272.         // the environment variables (in most cases this won't work, but I was
  1273.         // out of ideas)
  1274.         char *lang = getenv( "LC_ALL");
  1275.         char *dot = lang ? strchr(lang, '.') : (char *)NULL;
  1276.         if (!dot)
  1277.         {
  1278.             lang = getenv( "LC_CTYPE" );
  1279.             if ( lang )
  1280.                 dot = strchr(lang, '.' );
  1281.         }
  1282.         if (!dot)
  1283.         {
  1284.             lang = getenv( "LANG");
  1285.             if ( lang )
  1286.                 dot = strchr(lang, '.');
  1287.         }
  1288.  
  1289.         if ( dot )
  1290.         {
  1291.             encname = wxString::FromAscii( dot+1 );
  1292.         }
  1293.     }
  1294. #endif // Win32/Unix
  1295.  
  1296.     return encname;
  1297. }
  1298.  
  1299. /* static */
  1300. wxFontEncoding wxLocale::GetSystemEncoding()
  1301. {
  1302. #if defined(__WIN32__) && !defined(__WXMICROWIN__)
  1303.     UINT codepage = ::GetACP();
  1304.  
  1305.     // wxWindows only knows about CP1250-1257, 932, 936, 949, 950
  1306.     if ( codepage >= 1250 && codepage <= 1257 )
  1307.     {
  1308.         return (wxFontEncoding)(wxFONTENCODING_CP1250 + codepage - 1250);
  1309.     }
  1310.  
  1311.     if ( codepage == 932 )
  1312.     {
  1313.         return wxFONTENCODING_CP932;
  1314.     }
  1315.  
  1316.     if ( codepage == 936 )
  1317.     {
  1318.         return wxFONTENCODING_CP936;
  1319.     }
  1320.  
  1321.     if ( codepage == 949 )
  1322.     {
  1323.         return wxFONTENCODING_CP949;
  1324.     }
  1325.  
  1326.     if ( codepage == 950 )
  1327.     {
  1328.         return wxFONTENCODING_CP950;
  1329.     }
  1330. #elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP
  1331.     wxString encname = GetSystemEncodingName();
  1332.     if ( !encname.empty() )
  1333.     {
  1334.         wxFontEncoding enc = wxFontMapper::Get()->
  1335.             CharsetToEncoding(encname, FALSE /* not interactive */);
  1336.  
  1337.         // this should probably be considered as a bug in CharsetToEncoding():
  1338.         // it shouldn't return wxFONTENCODING_DEFAULT at all - but it does it
  1339.         // for US-ASCII charset
  1340.         //
  1341.         // we, OTOH, definitely shouldn't return it as it doesn't make sense at
  1342.         // all (which encoding is it?)
  1343.         if ( enc != wxFONTENCODING_DEFAULT )
  1344.         {
  1345.             return enc;
  1346.         }
  1347.         //else: return wxFONTENCODING_SYSTEM below
  1348.     }
  1349. #endif // Win32/Unix
  1350.  
  1351.     return wxFONTENCODING_SYSTEM;
  1352. }
  1353.  
  1354. /* static */
  1355. void wxLocale::AddLanguage(const wxLanguageInfo& info)
  1356. {
  1357.     CreateLanguagesDB();
  1358.     ms_languagesDB->Add(info);
  1359. }
  1360.  
  1361. /* static */
  1362. const wxLanguageInfo *wxLocale::GetLanguageInfo(int lang)
  1363. {
  1364.     CreateLanguagesDB();
  1365.  
  1366.     size_t count = ms_languagesDB->GetCount();
  1367.     for ( size_t i = 0; i < count; i++ )
  1368.     {
  1369.         if ( ms_languagesDB->Item(i).Language == lang )
  1370.         {
  1371.             return &ms_languagesDB->Item(i);
  1372.         }
  1373.     }
  1374.  
  1375.     return NULL;
  1376. }
  1377.  
  1378. wxString wxLocale::GetSysName() const
  1379. {
  1380.     return wxSetlocale(LC_ALL, NULL);
  1381. }
  1382.  
  1383. // clean up
  1384. wxLocale::~wxLocale()
  1385. {
  1386.     // free memory
  1387.     wxMsgCatalog *pTmpCat;
  1388.     while ( m_pMsgCat != NULL ) {
  1389.         pTmpCat = m_pMsgCat;
  1390.         m_pMsgCat = m_pMsgCat->m_pNext;
  1391.         delete pTmpCat;
  1392.     }
  1393.  
  1394.     // restore old locale
  1395.     wxSetLocale(m_pOldLocale);
  1396.     wxSetlocale(LC_ALL, m_pszOldLocale);
  1397. }
  1398.  
  1399. // get the translation of given string in current locale
  1400. const wxChar *wxLocale::GetString(const wxChar *szOrigString,
  1401.                                   const wxChar *szDomain) const
  1402. {
  1403.     if ( wxIsEmpty(szOrigString) )
  1404.         return _T("");
  1405.  
  1406.     const wxChar *pszTrans = NULL;
  1407.     wxMsgCatalog *pMsgCat;
  1408.  
  1409.     if ( szDomain != NULL )
  1410.     {
  1411.         pMsgCat = FindCatalog(szDomain);
  1412.  
  1413.         // does the catalog exist?
  1414.         if ( pMsgCat != NULL )
  1415.             pszTrans = pMsgCat->GetString(szOrigString);
  1416.     }
  1417.     else
  1418.     {
  1419.         // search in all domains
  1420.         for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
  1421.         {
  1422.             pszTrans = pMsgCat->GetString(szOrigString);
  1423.             if ( pszTrans != NULL )   // take the first found
  1424.                 break;
  1425.         }
  1426.     }
  1427.  
  1428.     if ( pszTrans == NULL )
  1429.     {
  1430. #ifdef __WXDEBUG__
  1431.         if ( !NoTransErr::Suppress() )
  1432.         {
  1433.             NoTransErr noTransErr;
  1434.  
  1435.             if ( szDomain != NULL )
  1436.             {
  1437.                 wxLogTrace(_T("i18n"),
  1438.                            _T("string '%s' not found in domain '%s' for locale '%s'."),
  1439.                            szOrigString, szDomain, m_strLocale.c_str());
  1440.             }
  1441.             else
  1442.             {
  1443.                 wxLogTrace(_T("i18n"),
  1444.                            _T("string '%s' not found in locale '%s'."),
  1445.                            szOrigString, m_strLocale.c_str());
  1446.             }
  1447.         }
  1448. #endif // __WXDEBUG__
  1449.  
  1450.         return szOrigString;
  1451.     }
  1452.  
  1453.     return pszTrans;
  1454. }
  1455.  
  1456. // find catalog by name in a linked list, return NULL if !found
  1457. wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const
  1458. {
  1459.     // linear search in the linked list
  1460.     wxMsgCatalog *pMsgCat;
  1461.     for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
  1462.     {
  1463.         if ( wxStricmp(pMsgCat->GetName(), szDomain) == 0 )
  1464.           return pMsgCat;
  1465.     }
  1466.  
  1467.     return NULL;
  1468. }
  1469.  
  1470. // check if the given catalog is loaded
  1471. bool wxLocale::IsLoaded(const wxChar *szDomain) const
  1472. {
  1473.   return FindCatalog(szDomain) != NULL;
  1474. }
  1475.  
  1476. // add a catalog to our linked list
  1477. bool wxLocale::AddCatalog(const wxChar *szDomain)
  1478. {
  1479.   wxMsgCatalog *pMsgCat = new wxMsgCatalog;
  1480.  
  1481.   if ( pMsgCat->Load(m_strShort, szDomain, m_bConvertEncoding) ) {
  1482.     // add it to the head of the list so that in GetString it will
  1483.     // be searched before the catalogs added earlier
  1484.     pMsgCat->m_pNext = m_pMsgCat;
  1485.     m_pMsgCat = pMsgCat;
  1486.  
  1487.     return TRUE;
  1488.   }
  1489.   else {
  1490.     // don't add it because it couldn't be loaded anyway
  1491.     delete pMsgCat;
  1492.  
  1493.     return FALSE;
  1494.   }
  1495. }
  1496.  
  1497. // ----------------------------------------------------------------------------
  1498. // accessors for locale-dependent data
  1499. // ----------------------------------------------------------------------------
  1500.  
  1501. #if 0
  1502.  
  1503. #ifdef __WXMSW__
  1504.  
  1505. /* static */
  1506. wxString wxLocale::GetInfo(wxLocaleInfo index)
  1507. {
  1508.     wxString str;
  1509.     wxChar buffer[256];
  1510.     size_t count;
  1511.     buffer[0] = wxT('\0');
  1512.     switch (index)
  1513.     {
  1514.         case wxSYS_DECIMAL_SEPARATOR:
  1515.             count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buffer, 256);
  1516.             if (!count)
  1517.                 str << ".";
  1518.             else
  1519.                 str << buffer;
  1520.             break;
  1521.         case wxSYS_LIST_SEPARATOR:
  1522.             count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, buffer, 256);
  1523.             if (!count)
  1524.                 str << ",";
  1525.             else
  1526.                 str << buffer;
  1527.             break;
  1528.         case wxSYS_LEADING_ZERO: // 0 means no leading zero, 1 means leading zero
  1529.             count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILZERO, buffer, 256);
  1530.             if (!count)
  1531.                 str << "0";
  1532.             else
  1533.                 str << buffer;
  1534.             break;
  1535.         default:
  1536.             wxFAIL_MSG("Unknown System String !");
  1537.     }
  1538.     return str;
  1539. }
  1540.  
  1541. #else // !__WXMSW__
  1542.  
  1543. /* static */
  1544. wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory)
  1545. {
  1546.     return wxEmptyString;
  1547. }
  1548.  
  1549. #endif // __WXMSW__/!__WXMSW__
  1550.  
  1551. #endif // 0
  1552.  
  1553. // ----------------------------------------------------------------------------
  1554. // global functions and variables
  1555. // ----------------------------------------------------------------------------
  1556.  
  1557. // retrieve/change current locale
  1558. // ------------------------------
  1559.  
  1560. // the current locale object
  1561. static wxLocale *g_pLocale = NULL;
  1562.  
  1563. wxLocale *wxGetLocale()
  1564. {
  1565.   return g_pLocale;
  1566. }
  1567.  
  1568. wxLocale *wxSetLocale(wxLocale *pLocale)
  1569. {
  1570.   wxLocale *pOld = g_pLocale;
  1571.   g_pLocale = pLocale;
  1572.   return pOld;
  1573. }
  1574.  
  1575.  
  1576.  
  1577. // ----------------------------------------------------------------------------
  1578. // wxLocale module (for lazy destruction of languagesDB)
  1579. // ----------------------------------------------------------------------------
  1580.  
  1581. class wxLocaleModule: public wxModule
  1582. {
  1583.     DECLARE_DYNAMIC_CLASS(wxLocaleModule)
  1584.     public:
  1585.         wxLocaleModule() {}
  1586.         bool OnInit() { return TRUE; }
  1587.         void OnExit() { wxLocale::DestroyLanguagesDB(); }
  1588. };
  1589.  
  1590. IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule, wxModule)
  1591.  
  1592.  
  1593.  
  1594. // ----------------------------------------------------------------------------
  1595. // default languages table & initialization
  1596. // ----------------------------------------------------------------------------
  1597.  
  1598.  
  1599.  
  1600. // --- --- --- generated code begins here --- --- ---
  1601.  
  1602. // This table is generated by misc/languages/genlang.py
  1603. // When making changes, please put them into misc/languages/langtabl.txt
  1604.  
  1605. #if !defined(__WIN32__) || defined(__WXMICROWIN__)
  1606.  
  1607. #define SETWINLANG(info,lang,sublang)
  1608.  
  1609. #else
  1610.  
  1611. #define SETWINLANG(info,lang,sublang) \
  1612.     info.WinLang = lang, info.WinSublang = sublang;
  1613.  
  1614. #ifndef LANG_AFRIKAANS
  1615. #define LANG_AFRIKAANS (0)
  1616. #endif
  1617. #ifndef LANG_ALBANIAN
  1618. #define LANG_ALBANIAN (0)
  1619. #endif
  1620. #ifndef LANG_ARABIC
  1621. #define LANG_ARABIC (0)
  1622. #endif
  1623. #ifndef LANG_ARMENIAN
  1624. #define LANG_ARMENIAN (0)
  1625. #endif
  1626. #ifndef LANG_ASSAMESE
  1627. #define LANG_ASSAMESE (0)
  1628. #endif
  1629. #ifndef LANG_AZERI
  1630. #define LANG_AZERI (0)
  1631. #endif
  1632. #ifndef LANG_BASQUE
  1633. #define LANG_BASQUE (0)
  1634. #endif
  1635. #ifndef LANG_BELARUSIAN
  1636. #define LANG_BELARUSIAN (0)
  1637. #endif
  1638. #ifndef LANG_BENGALI
  1639. #define LANG_BENGALI (0)
  1640. #endif
  1641. #ifndef LANG_BULGARIAN
  1642. #define LANG_BULGARIAN (0)
  1643. #endif
  1644. #ifndef LANG_CATALAN
  1645. #define LANG_CATALAN (0)
  1646. #endif
  1647. #ifndef LANG_CHINESE
  1648. #define LANG_CHINESE (0)
  1649. #endif
  1650. #ifndef LANG_CROATIAN
  1651. #define LANG_CROATIAN (0)
  1652. #endif
  1653. #ifndef LANG_CZECH
  1654. #define LANG_CZECH (0)
  1655. #endif
  1656. #ifndef LANG_DANISH
  1657. #define LANG_DANISH (0)
  1658. #endif
  1659. #ifndef LANG_DUTCH
  1660. #define LANG_DUTCH (0)
  1661. #endif
  1662. #ifndef LANG_ENGLISH
  1663. #define LANG_ENGLISH (0)
  1664. #endif
  1665. #ifndef LANG_ESTONIAN
  1666. #define LANG_ESTONIAN (0)
  1667. #endif
  1668. #ifndef LANG_FAEROESE
  1669. #define LANG_FAEROESE (0)
  1670. #endif
  1671. #ifndef LANG_FARSI
  1672. #define LANG_FARSI (0)
  1673. #endif
  1674. #ifndef LANG_FINNISH
  1675. #define LANG_FINNISH (0)
  1676. #endif
  1677. #ifndef LANG_FRENCH
  1678. #define LANG_FRENCH (0)
  1679. #endif
  1680. #ifndef LANG_GEORGIAN
  1681. #define LANG_GEORGIAN (0)
  1682. #endif
  1683. #ifndef LANG_GERMAN
  1684. #define LANG_GERMAN (0)
  1685. #endif
  1686. #ifndef LANG_GREEK
  1687. #define LANG_GREEK (0)
  1688. #endif
  1689. #ifndef LANG_GUJARATI
  1690. #define LANG_GUJARATI (0)
  1691. #endif
  1692. #ifndef LANG_HEBREW
  1693. #define LANG_HEBREW (0)
  1694. #endif
  1695. #ifndef LANG_HINDI
  1696. #define LANG_HINDI (0)
  1697. #endif
  1698. #ifndef LANG_HUNGARIAN
  1699. #define LANG_HUNGARIAN (0)
  1700. #endif
  1701. #ifndef LANG_ICELANDIC
  1702. #define LANG_ICELANDIC (0)
  1703. #endif
  1704. #ifndef LANG_INDONESIAN
  1705. #define LANG_INDONESIAN (0)
  1706. #endif
  1707. #ifndef LANG_ITALIAN
  1708. #define LANG_ITALIAN (0)
  1709. #endif
  1710. #ifndef LANG_JAPANESE
  1711. #define LANG_JAPANESE (0)
  1712. #endif
  1713. #ifndef LANG_KANNADA
  1714. #define LANG_KANNADA (0)
  1715. #endif
  1716. #ifndef LANG_KASHMIRI
  1717. #define LANG_KASHMIRI (0)
  1718. #endif
  1719. #ifndef LANG_KAZAK
  1720. #define LANG_KAZAK (0)
  1721. #endif
  1722. #ifndef LANG_KONKANI
  1723. #define LANG_KONKANI (0)
  1724. #endif
  1725. #ifndef LANG_KOREAN
  1726. #define LANG_KOREAN (0)
  1727. #endif
  1728. #ifndef LANG_LATVIAN
  1729. #define LANG_LATVIAN (0)
  1730. #endif
  1731. #ifndef LANG_LITHUANIAN
  1732. #define LANG_LITHUANIAN (0)
  1733. #endif
  1734. #ifndef LANG_MACEDONIAN
  1735. #define LANG_MACEDONIAN (0)
  1736. #endif
  1737. #ifndef LANG_MALAY
  1738. #define LANG_MALAY (0)
  1739. #endif
  1740. #ifndef LANG_MALAYALAM
  1741. #define LANG_MALAYALAM (0)
  1742. #endif
  1743. #ifndef LANG_MANIPURI
  1744. #define LANG_MANIPURI (0)
  1745. #endif
  1746. #ifndef LANG_MARATHI
  1747. #define LANG_MARATHI (0)
  1748. #endif
  1749. #ifndef LANG_NEPALI
  1750. #define LANG_NEPALI (0)
  1751. #endif
  1752. #ifndef LANG_NORWEGIAN
  1753. #define LANG_NORWEGIAN (0)
  1754. #endif
  1755. #ifndef LANG_ORIYA
  1756. #define LANG_ORIYA (0)
  1757. #endif
  1758. #ifndef LANG_POLISH
  1759. #define LANG_POLISH (0)
  1760. #endif
  1761. #ifndef LANG_PORTUGUESE
  1762. #define LANG_PORTUGUESE (0)
  1763. #endif
  1764. #ifndef LANG_PUNJABI
  1765. #define LANG_PUNJABI (0)
  1766. #endif
  1767. #ifndef LANG_ROMANIAN
  1768. #define LANG_ROMANIAN (0)
  1769. #endif
  1770. #ifndef LANG_RUSSIAN
  1771. #define LANG_RUSSIAN (0)
  1772. #endif
  1773. #ifndef LANG_SANSKRIT
  1774. #define LANG_SANSKRIT (0)
  1775. #endif
  1776. #ifndef LANG_SERBIAN
  1777. #define LANG_SERBIAN (0)
  1778. #endif
  1779. #ifndef LANG_SINDHI
  1780. #define LANG_SINDHI (0)
  1781. #endif
  1782. #ifndef LANG_SLOVAK
  1783. #define LANG_SLOVAK (0)
  1784. #endif
  1785. #ifndef LANG_SLOVENIAN
  1786. #define LANG_SLOVENIAN (0)
  1787. #endif
  1788. #ifndef LANG_SPANISH
  1789. #define LANG_SPANISH (0)
  1790. #endif
  1791. #ifndef LANG_SWAHILI
  1792. #define LANG_SWAHILI (0)
  1793. #endif
  1794. #ifndef LANG_SWEDISH
  1795. #define LANG_SWEDISH (0)
  1796. #endif
  1797. #ifndef LANG_TAMIL
  1798. #define LANG_TAMIL (0)
  1799. #endif
  1800. #ifndef LANG_TATAR
  1801. #define LANG_TATAR (0)
  1802. #endif
  1803. #ifndef LANG_TELUGU
  1804. #define LANG_TELUGU (0)
  1805. #endif
  1806. #ifndef LANG_THAI
  1807. #define LANG_THAI (0)
  1808. #endif
  1809. #ifndef LANG_TURKISH
  1810. #define LANG_TURKISH (0)
  1811. #endif
  1812. #ifndef LANG_UKRAINIAN
  1813. #define LANG_UKRAINIAN (0)
  1814. #endif
  1815. #ifndef LANG_URDU
  1816. #define LANG_URDU (0)
  1817. #endif
  1818. #ifndef LANG_UZBEK
  1819. #define LANG_UZBEK (0)
  1820. #endif
  1821. #ifndef LANG_VIETNAMESE
  1822. #define LANG_VIETNAMESE (0)
  1823. #endif
  1824. #ifndef SUBLANG_ARABIC_ALGERIA
  1825. #define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT
  1826. #endif
  1827. #ifndef SUBLANG_ARABIC_BAHRAIN
  1828. #define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT
  1829. #endif
  1830. #ifndef SUBLANG_ARABIC_EGYPT
  1831. #define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT
  1832. #endif
  1833. #ifndef SUBLANG_ARABIC_IRAQ
  1834. #define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT
  1835. #endif
  1836. #ifndef SUBLANG_ARABIC_JORDAN
  1837. #define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT
  1838. #endif
  1839. #ifndef SUBLANG_ARABIC_KUWAIT
  1840. #define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT
  1841. #endif
  1842. #ifndef SUBLANG_ARABIC_LEBANON
  1843. #define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT
  1844. #endif
  1845. #ifndef SUBLANG_ARABIC_LIBYA
  1846. #define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT
  1847. #endif
  1848. #ifndef SUBLANG_ARABIC_MOROCCO
  1849. #define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT
  1850. #endif
  1851. #ifndef SUBLANG_ARABIC_OMAN
  1852. #define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT
  1853. #endif
  1854. #ifndef SUBLANG_ARABIC_QATAR
  1855. #define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT
  1856. #endif
  1857. #ifndef SUBLANG_ARABIC_SAUDI_ARABIA
  1858. #define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT
  1859. #endif
  1860. #ifndef SUBLANG_ARABIC_SYRIA
  1861. #define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT
  1862. #endif
  1863. #ifndef SUBLANG_ARABIC_TUNISIA
  1864. #define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT
  1865. #endif
  1866. #ifndef SUBLANG_ARABIC_UAE
  1867. #define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT
  1868. #endif
  1869. #ifndef SUBLANG_ARABIC_YEMEN
  1870. #define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT
  1871. #endif
  1872. #ifndef SUBLANG_AZERI_CYRILLIC
  1873. #define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT
  1874. #endif
  1875. #ifndef SUBLANG_AZERI_LATIN
  1876. #define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT
  1877. #endif
  1878. #ifndef SUBLANG_CHINESE_SIMPLIFIED
  1879. #define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT
  1880. #endif
  1881. #ifndef SUBLANG_CHINESE_TRADITIONAL
  1882. #define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT
  1883. #endif
  1884. #ifndef SUBLANG_CHINESE_HONGKONG
  1885. #define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT
  1886. #endif
  1887. #ifndef SUBLANG_CHINESE_MACAU
  1888. #define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT
  1889. #endif
  1890. #ifndef SUBLANG_CHINESE_SINGAPORE
  1891. #define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT
  1892. #endif
  1893. #ifndef SUBLANG_DUTCH
  1894. #define SUBLANG_DUTCH SUBLANG_DEFAULT
  1895. #endif
  1896. #ifndef SUBLANG_DUTCH_BELGIAN
  1897. #define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT
  1898. #endif
  1899. #ifndef SUBLANG_ENGLISH_UK
  1900. #define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT
  1901. #endif
  1902. #ifndef SUBLANG_ENGLISH_US
  1903. #define SUBLANG_ENGLISH_US SUBLANG_DEFAULT
  1904. #endif
  1905. #ifndef SUBLANG_ENGLISH_AUS
  1906. #define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT
  1907. #endif
  1908. #ifndef SUBLANG_ENGLISH_BELIZE
  1909. #define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT
  1910. #endif
  1911. #ifndef SUBLANG_ENGLISH_CAN
  1912. #define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT
  1913. #endif
  1914. #ifndef SUBLANG_ENGLISH_CARIBBEAN
  1915. #define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT
  1916. #endif
  1917. #ifndef SUBLANG_ENGLISH_EIRE
  1918. #define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT
  1919. #endif
  1920. #ifndef SUBLANG_ENGLISH_JAMAICA
  1921. #define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT
  1922. #endif
  1923. #ifndef SUBLANG_ENGLISH_NZ
  1924. #define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT
  1925. #endif
  1926. #ifndef SUBLANG_ENGLISH_PHILIPPINES
  1927. #define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT
  1928. #endif
  1929. #ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
  1930. #define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT
  1931. #endif
  1932. #ifndef SUBLANG_ENGLISH_TRINIDAD
  1933. #define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT
  1934. #endif
  1935. #ifndef SUBLANG_ENGLISH_ZIMBABWE
  1936. #define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT
  1937. #endif
  1938. #ifndef SUBLANG_FRENCH
  1939. #define SUBLANG_FRENCH SUBLANG_DEFAULT
  1940. #endif
  1941. #ifndef SUBLANG_FRENCH_BELGIAN
  1942. #define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT
  1943. #endif
  1944. #ifndef SUBLANG_FRENCH_CANADIAN
  1945. #define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT
  1946. #endif
  1947. #ifndef SUBLANG_FRENCH_LUXEMBOURG
  1948. #define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT
  1949. #endif
  1950. #ifndef SUBLANG_FRENCH_MONACO
  1951. #define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT
  1952. #endif
  1953. #ifndef SUBLANG_FRENCH_SWISS
  1954. #define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT
  1955. #endif
  1956. #ifndef SUBLANG_GERMAN
  1957. #define SUBLANG_GERMAN SUBLANG_DEFAULT
  1958. #endif
  1959. #ifndef SUBLANG_GERMAN_AUSTRIAN
  1960. #define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT
  1961. #endif
  1962. #ifndef SUBLANG_GERMAN_LIECHTENSTEIN
  1963. #define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT
  1964. #endif
  1965. #ifndef SUBLANG_GERMAN_LUXEMBOURG
  1966. #define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT
  1967. #endif
  1968. #ifndef SUBLANG_GERMAN_SWISS
  1969. #define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT
  1970. #endif
  1971. #ifndef SUBLANG_ITALIAN
  1972. #define SUBLANG_ITALIAN SUBLANG_DEFAULT
  1973. #endif
  1974. #ifndef SUBLANG_ITALIAN_SWISS
  1975. #define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT
  1976. #endif
  1977. #ifndef SUBLANG_KASHMIRI_INDIA
  1978. #define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT
  1979. #endif
  1980. #ifndef SUBLANG_KOREAN
  1981. #define SUBLANG_KOREAN SUBLANG_DEFAULT
  1982. #endif
  1983. #ifndef SUBLANG_LITHUANIAN
  1984. #define SUBLANG_LITHUANIAN SUBLANG_DEFAULT
  1985. #endif
  1986. #ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
  1987. #define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT
  1988. #endif
  1989. #ifndef SUBLANG_MALAY_MALAYSIA
  1990. #define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT
  1991. #endif
  1992. #ifndef SUBLANG_NEPALI_INDIA
  1993. #define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT
  1994. #endif
  1995. #ifndef SUBLANG_NORWEGIAN_BOKMAL
  1996. #define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT
  1997. #endif
  1998. #ifndef SUBLANG_NORWEGIAN_NYNORSK
  1999. #define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT
  2000. #endif
  2001. #ifndef SUBLANG_PORTUGUESE
  2002. #define SUBLANG_PORTUGUESE SUBLANG_DEFAULT
  2003. #endif
  2004. #ifndef SUBLANG_PORTUGUESE_BRAZILIAN
  2005. #define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT
  2006. #endif
  2007. #ifndef SUBLANG_SERBIAN_CYRILLIC
  2008. #define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT
  2009. #endif
  2010. #ifndef SUBLANG_SERBIAN_LATIN
  2011. #define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT
  2012. #endif
  2013. #ifndef SUBLANG_SPANISH
  2014. #define SUBLANG_SPANISH SUBLANG_DEFAULT
  2015. #endif
  2016. #ifndef SUBLANG_SPANISH_ARGENTINA
  2017. #define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT
  2018. #endif
  2019. #ifndef SUBLANG_SPANISH_BOLIVIA
  2020. #define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT
  2021. #endif
  2022. #ifndef SUBLANG_SPANISH_CHILE
  2023. #define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT
  2024. #endif
  2025. #ifndef SUBLANG_SPANISH_COLOMBIA
  2026. #define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT
  2027. #endif
  2028. #ifndef SUBLANG_SPANISH_COSTA_RICA
  2029. #define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT
  2030. #endif
  2031. #ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
  2032. #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT
  2033. #endif
  2034. #ifndef SUBLANG_SPANISH_ECUADOR
  2035. #define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT
  2036. #endif
  2037. #ifndef SUBLANG_SPANISH_EL_SALVADOR
  2038. #define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT
  2039. #endif
  2040. #ifndef SUBLANG_SPANISH_GUATEMALA
  2041. #define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT
  2042. #endif
  2043. #ifndef SUBLANG_SPANISH_HONDURAS
  2044. #define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT
  2045. #endif
  2046. #ifndef SUBLANG_SPANISH_MEXICAN
  2047. #define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT
  2048. #endif
  2049. #ifndef SUBLANG_SPANISH_MODERN
  2050. #define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT
  2051. #endif
  2052. #ifndef SUBLANG_SPANISH_NICARAGUA
  2053. #define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT
  2054. #endif
  2055. #ifndef SUBLANG_SPANISH_PANAMA
  2056. #define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT
  2057. #endif
  2058. #ifndef SUBLANG_SPANISH_PARAGUAY
  2059. #define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT
  2060. #endif
  2061. #ifndef SUBLANG_SPANISH_PERU
  2062. #define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT
  2063. #endif
  2064. #ifndef SUBLANG_SPANISH_PUERTO_RICO
  2065. #define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT
  2066. #endif
  2067. #ifndef SUBLANG_SPANISH_URUGUAY
  2068. #define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT
  2069. #endif
  2070. #ifndef SUBLANG_SPANISH_VENEZUELA
  2071. #define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT
  2072. #endif
  2073. #ifndef SUBLANG_SWEDISH
  2074. #define SUBLANG_SWEDISH SUBLANG_DEFAULT
  2075. #endif
  2076. #ifndef SUBLANG_SWEDISH_FINLAND
  2077. #define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT
  2078. #endif
  2079. #ifndef SUBLANG_URDU_INDIA
  2080. #define SUBLANG_URDU_INDIA SUBLANG_DEFAULT
  2081. #endif
  2082. #ifndef SUBLANG_URDU_PAKISTAN
  2083. #define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT
  2084. #endif
  2085. #ifndef SUBLANG_UZBEK_CYRILLIC
  2086. #define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT
  2087. #endif
  2088. #ifndef SUBLANG_UZBEK_LATIN
  2089. #define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT
  2090. #endif
  2091.  
  2092.  
  2093. #endif // __WIN32__
  2094.  
  2095. #define LNG(wxlang, canonical, winlang, winsublang, desc) \
  2096.     info.Language = wxlang;                               \
  2097.     info.CanonicalName = wxT(canonical);                  \
  2098.     info.Description = desc;                              \
  2099.     SETWINLANG(info, winlang, winsublang)                 \
  2100.     AddLanguage(info);
  2101.  
  2102. void wxLocale::InitLanguagesDB()
  2103. {
  2104.    wxLanguageInfo info;
  2105.    wxStringTokenizer tkn;
  2106.  
  2107.    LNG(wxLANGUAGE_ABKHAZIAN,                  "ab"   , 0              , 0                                 , "Abkhazian")
  2108.    LNG(wxLANGUAGE_AFAR,                       "aa"   , 0              , 0                                 , "Afar")
  2109.    LNG(wxLANGUAGE_AFRIKAANS,                  "af_ZA", LANG_AFRIKAANS , SUBLANG_DEFAULT                   , "Afrikaans")
  2110.    LNG(wxLANGUAGE_ALBANIAN,                   "sq_AL", LANG_ALBANIAN  , SUBLANG_DEFAULT                   , "Albanian")
  2111.    LNG(wxLANGUAGE_AMHARIC,                    "am"   , 0              , 0                                 , "Amharic")
  2112.    LNG(wxLANGUAGE_ARABIC,                     "ar"   , LANG_ARABIC    , SUBLANG_DEFAULT                   , "Arabic")
  2113.    LNG(wxLANGUAGE_ARABIC_ALGERIA,             "ar_DZ", LANG_ARABIC    , SUBLANG_ARABIC_ALGERIA            , "Arabic (Algeria)")
  2114.    LNG(wxLANGUAGE_ARABIC_BAHRAIN,             "ar_BH", LANG_ARABIC    , SUBLANG_ARABIC_BAHRAIN            , "Arabic (Bahrain)")
  2115.    LNG(wxLANGUAGE_ARABIC_EGYPT,               "ar_EG", LANG_ARABIC    , SUBLANG_ARABIC_EGYPT              , "Arabic (Egypt)")
  2116.    LNG(wxLANGUAGE_ARABIC_IRAQ,                "ar_IQ", LANG_ARABIC    , SUBLANG_ARABIC_IRAQ               , "Arabic (Iraq)")
  2117.    LNG(wxLANGUAGE_ARABIC_JORDAN,              "ar_JO", LANG_ARABIC    , SUBLANG_ARABIC_JORDAN             , "Arabic (Jordan)")
  2118.    LNG(wxLANGUAGE_ARABIC_KUWAIT,              "ar_KW", LANG_ARABIC    , SUBLANG_ARABIC_KUWAIT             , "Arabic (Kuwait)")
  2119.    LNG(wxLANGUAGE_ARABIC_LEBANON,             "ar_LB", LANG_ARABIC    , SUBLANG_ARABIC_LEBANON            , "Arabic (Lebanon)")
  2120.    LNG(wxLANGUAGE_ARABIC_LIBYA,               "ar_LY", LANG_ARABIC    , SUBLANG_ARABIC_LIBYA              , "Arabic (Libya)")
  2121.    LNG(wxLANGUAGE_ARABIC_MOROCCO,             "ar_MA", LANG_ARABIC    , SUBLANG_ARABIC_MOROCCO            , "Arabic (Morocco)")
  2122.    LNG(wxLANGUAGE_ARABIC_OMAN,                "ar_OM", LANG_ARABIC    , SUBLANG_ARABIC_OMAN               , "Arabic (Oman)")
  2123.    LNG(wxLANGUAGE_ARABIC_QATAR,               "ar_QA", LANG_ARABIC    , SUBLANG_ARABIC_QATAR              , "Arabic (Qatar)")
  2124.    LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA,        "ar_SA", LANG_ARABIC    , SUBLANG_ARABIC_SAUDI_ARABIA       , "Arabic (Saudi Arabia)")
  2125.    LNG(wxLANGUAGE_ARABIC_SUDAN,               "ar_SD", 0              , 0                                 , "Arabic (Sudan)")
  2126.    LNG(wxLANGUAGE_ARABIC_SYRIA,               "ar_SY", LANG_ARABIC    , SUBLANG_ARABIC_SYRIA              , "Arabic (Syria)")
  2127.    LNG(wxLANGUAGE_ARABIC_TUNISIA,             "ar_TN", LANG_ARABIC    , SUBLANG_ARABIC_TUNISIA            , "Arabic (Tunisia)")
  2128.    LNG(wxLANGUAGE_ARABIC_UAE,                 "ar_AE", LANG_ARABIC    , SUBLANG_ARABIC_UAE                , "Arabic (Uae)")
  2129.    LNG(wxLANGUAGE_ARABIC_YEMEN,               "ar_YE", LANG_ARABIC    , SUBLANG_ARABIC_YEMEN              , "Arabic (Yemen)")
  2130.    LNG(wxLANGUAGE_ARMENIAN,                   "hy"   , LANG_ARMENIAN  , SUBLANG_DEFAULT                   , "Armenian")
  2131.    LNG(wxLANGUAGE_ASSAMESE,                   "as"   , LANG_ASSAMESE  , SUBLANG_DEFAULT                   , "Assamese")
  2132.    LNG(wxLANGUAGE_AYMARA,                     "ay"   , 0              , 0                                 , "Aymara")
  2133.    LNG(wxLANGUAGE_AZERI,                      "az"   , LANG_AZERI     , SUBLANG_DEFAULT                   , "Azeri")
  2134.    LNG(wxLANGUAGE_AZERI_CYRILLIC,             "az"   , LANG_AZERI     , SUBLANG_AZERI_CYRILLIC            , "Azeri (Cyrillic)")
  2135.    LNG(wxLANGUAGE_AZERI_LATIN,                "az"   , LANG_AZERI     , SUBLANG_AZERI_LATIN               , "Azeri (Latin)")
  2136.    LNG(wxLANGUAGE_BASHKIR,                    "ba"   , 0              , 0                                 , "Bashkir")
  2137.    LNG(wxLANGUAGE_BASQUE,                     "eu_ES", LANG_BASQUE    , SUBLANG_DEFAULT                   , "Basque")
  2138.    LNG(wxLANGUAGE_BELARUSIAN,                 "be_BY", LANG_BELARUSIAN, SUBLANG_DEFAULT                   , "Belarusian")
  2139.    LNG(wxLANGUAGE_BENGALI,                    "bn"   , LANG_BENGALI   , SUBLANG_DEFAULT                   , "Bengali")
  2140.    LNG(wxLANGUAGE_BHUTANI,                    "dz"   , 0              , 0                                 , "Bhutani")
  2141.    LNG(wxLANGUAGE_BIHARI,                     "bh"   , 0              , 0                                 , "Bihari")
  2142.    LNG(wxLANGUAGE_BISLAMA,                    "bi"   , 0              , 0                                 , "Bislama")
  2143.    LNG(wxLANGUAGE_BRETON,                     "br"   , 0              , 0                                 , "Breton")
  2144.    LNG(wxLANGUAGE_BULGARIAN,                  "bg_BG", LANG_BULGARIAN , SUBLANG_DEFAULT                   , "Bulgarian")
  2145.    LNG(wxLANGUAGE_BURMESE,                    "my"   , 0              , 0                                 , "Burmese")
  2146.    LNG(wxLANGUAGE_CAMBODIAN,                  "km"   , 0              , 0                                 , "Cambodian")
  2147.    LNG(wxLANGUAGE_CATALAN,                    "ca_ES", LANG_CATALAN   , SUBLANG_DEFAULT                   , "Catalan")
  2148.    LNG(wxLANGUAGE_CHINESE,                    "zh_CN", LANG_CHINESE   , SUBLANG_DEFAULT                   , "Chinese")
  2149.    LNG(wxLANGUAGE_CHINESE_SIMPLIFIED,         "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_SIMPLIFIED        , "Chinese (Simplified)")
  2150.    LNG(wxLANGUAGE_CHINESE_TRADITIONAL,        "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , "Chinese (Traditional)")
  2151.    LNG(wxLANGUAGE_CHINESE_HONGKONG,           "zh_HK", LANG_CHINESE   , SUBLANG_CHINESE_HONGKONG          , "Chinese (Hongkong)")
  2152.    LNG(wxLANGUAGE_CHINESE_MACAU,              "zh_MO", LANG_CHINESE   , SUBLANG_CHINESE_MACAU             , "Chinese (Macau)")
  2153.    LNG(wxLANGUAGE_CHINESE_SINGAPORE,          "zh_SG", LANG_CHINESE   , SUBLANG_CHINESE_SINGAPORE         , "Chinese (Singapore)")
  2154.    LNG(wxLANGUAGE_CHINESE_TAIWAN,             "zh_TW", 0              , 0                                 , "Chinese (Taiwan)")
  2155.    LNG(wxLANGUAGE_CORSICAN,                   "co"   , 0              , 0                                 , "Corsican")
  2156.    LNG(wxLANGUAGE_CROATIAN,                   "hr_HR", LANG_CROATIAN  , SUBLANG_DEFAULT                   , "Croatian")
  2157.    LNG(wxLANGUAGE_CZECH,                      "cs_CZ", LANG_CZECH     , SUBLANG_DEFAULT                   , "Czech")
  2158.    LNG(wxLANGUAGE_DANISH,                     "da_DK", LANG_DANISH    , SUBLANG_DEFAULT                   , "Danish")
  2159.    LNG(wxLANGUAGE_DUTCH,                      "nl_NL", LANG_DUTCH     , SUBLANG_DUTCH                     , "Dutch")
  2160.    LNG(wxLANGUAGE_DUTCH_BELGIAN,              "nl_BE", LANG_DUTCH     , SUBLANG_DUTCH_BELGIAN             , "Dutch (Belgian)")
  2161.    LNG(wxLANGUAGE_ENGLISH,                    "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , "English")
  2162.    LNG(wxLANGUAGE_ENGLISH_UK,                 "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , "English (U.K.)")
  2163.    LNG(wxLANGUAGE_ENGLISH_US,                 "en_US", LANG_ENGLISH   , SUBLANG_ENGLISH_US                , "English (U.S.)")
  2164.    LNG(wxLANGUAGE_ENGLISH_AUSTRALIA,          "en_AU", LANG_ENGLISH   , SUBLANG_ENGLISH_AUS               , "English (Australia)")
  2165.    LNG(wxLANGUAGE_ENGLISH_BELIZE,             "en_BZ", LANG_ENGLISH   , SUBLANG_ENGLISH_BELIZE            , "English (Belize)")
  2166.    LNG(wxLANGUAGE_ENGLISH_BOTSWANA,           "en_BW", 0              , 0                                 , "English (Botswana)")
  2167.    LNG(wxLANGUAGE_ENGLISH_CANADA,             "en_CA", LANG_ENGLISH   , SUBLANG_ENGLISH_CAN               , "English (Canada)")
  2168.    LNG(wxLANGUAGE_ENGLISH_CARIBBEAN,          "en_CB", LANG_ENGLISH   , SUBLANG_ENGLISH_CARIBBEAN         , "English (Caribbean)")
  2169.    LNG(wxLANGUAGE_ENGLISH_DENMARK,            "en_DK", 0              , 0                                 , "English (Denmark)")
  2170.    LNG(wxLANGUAGE_ENGLISH_EIRE,               "en_IE", LANG_ENGLISH   , SUBLANG_ENGLISH_EIRE              , "English (Eire)")
  2171.    LNG(wxLANGUAGE_ENGLISH_JAMAICA,            "en_JM", LANG_ENGLISH   , SUBLANG_ENGLISH_JAMAICA           , "English (Jamaica)")
  2172.    LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND,        "en_NZ", LANG_ENGLISH   , SUBLANG_ENGLISH_NZ                , "English (New Zealand)")
  2173.    LNG(wxLANGUAGE_ENGLISH_PHILIPPINES,        "en_PH", LANG_ENGLISH   , SUBLANG_ENGLISH_PHILIPPINES       , "English (Philippines)")
  2174.    LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA,       "en_ZA", LANG_ENGLISH   , SUBLANG_ENGLISH_SOUTH_AFRICA      , "English (South Africa)")
  2175.    LNG(wxLANGUAGE_ENGLISH_TRINIDAD,           "en_TT", LANG_ENGLISH   , SUBLANG_ENGLISH_TRINIDAD          , "English (Trinidad)")
  2176.    LNG(wxLANGUAGE_ENGLISH_ZIMBABWE,           "en_ZW", LANG_ENGLISH   , SUBLANG_ENGLISH_ZIMBABWE          , "English (Zimbabwe)")
  2177.    LNG(wxLANGUAGE_ESPERANTO,                  "eo"   , 0              , 0                                 , "Esperanto")
  2178.    LNG(wxLANGUAGE_ESTONIAN,                   "et_EE", LANG_ESTONIAN  , SUBLANG_DEFAULT                   , "Estonian")
  2179.    LNG(wxLANGUAGE_FAEROESE,                   "fo_FO", LANG_FAEROESE  , SUBLANG_DEFAULT                   , "Faeroese")
  2180.    LNG(wxLANGUAGE_FARSI,                      "fa_IR", LANG_FARSI     , SUBLANG_DEFAULT                   , "Farsi")
  2181.    LNG(wxLANGUAGE_FIJI,                       "fj"   , 0              , 0                                 , "Fiji")
  2182.    LNG(wxLANGUAGE_FINNISH,                    "fi_FI", LANG_FINNISH   , SUBLANG_DEFAULT                   , "Finnish")
  2183.    LNG(wxLANGUAGE_FRENCH,                     "fr_FR", LANG_FRENCH    , SUBLANG_FRENCH                    , "French")
  2184.    LNG(wxLANGUAGE_FRENCH_BELGIAN,             "fr_BE", LANG_FRENCH    , SUBLANG_FRENCH_BELGIAN            , "French (Belgian)")
  2185.    LNG(wxLANGUAGE_FRENCH_CANADIAN,            "fr_CA", LANG_FRENCH    , SUBLANG_FRENCH_CANADIAN           , "French (Canadian)")
  2186.    LNG(wxLANGUAGE_FRENCH_LUXEMBOURG,          "fr_LU", LANG_FRENCH    , SUBLANG_FRENCH_LUXEMBOURG         , "French (Luxembourg)")
  2187.    LNG(wxLANGUAGE_FRENCH_MONACO,              "fr_MC", LANG_FRENCH    , SUBLANG_FRENCH_MONACO             , "French (Monaco)")
  2188.    LNG(wxLANGUAGE_FRENCH_SWISS,               "fr_CH", LANG_FRENCH    , SUBLANG_FRENCH_SWISS              , "French (Swiss)")
  2189.    LNG(wxLANGUAGE_FRISIAN,                    "fy"   , 0              , 0                                 , "Frisian")
  2190.    LNG(wxLANGUAGE_GALICIAN,                   "gl_ES", 0              , 0                                 , "Galician")
  2191.    LNG(wxLANGUAGE_GEORGIAN,                   "ka"   , LANG_GEORGIAN  , SUBLANG_DEFAULT                   , "Georgian")
  2192.    LNG(wxLANGUAGE_GERMAN,                     "de_DE", LANG_GERMAN    , SUBLANG_GERMAN                    , "German")
  2193.    LNG(wxLANGUAGE_GERMAN_AUSTRIAN,            "de_AT", LANG_GERMAN    , SUBLANG_GERMAN_AUSTRIAN           , "German (Austrian)")
  2194.    LNG(wxLANGUAGE_GERMAN_BELGIUM,             "de_BE", 0              , 0                                 , "German (Belgium)")
  2195.    LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN,       "de_LI", LANG_GERMAN    , SUBLANG_GERMAN_LIECHTENSTEIN      , "German (Liechtenstein)")
  2196.    LNG(wxLANGUAGE_GERMAN_LUXEMBOURG,          "de_LU", LANG_GERMAN    , SUBLANG_GERMAN_LUXEMBOURG         , "German (Luxembourg)")
  2197.    LNG(wxLANGUAGE_GERMAN_SWISS,               "de_CH", LANG_GERMAN    , SUBLANG_GERMAN_SWISS              , "German (Swiss)")
  2198.    LNG(wxLANGUAGE_GREEK,                      "el_GR", LANG_GREEK     , SUBLANG_DEFAULT                   , "Greek")
  2199.    LNG(wxLANGUAGE_GREENLANDIC,                "kl_GL", 0              , 0                                 , "Greenlandic")
  2200.    LNG(wxLANGUAGE_GUARANI,                    "gn"   , 0              , 0                                 , "Guarani")
  2201.    LNG(wxLANGUAGE_GUJARATI,                   "gu"   , LANG_GUJARATI  , SUBLANG_DEFAULT                   , "Gujarati")
  2202.    LNG(wxLANGUAGE_HAUSA,                      "ha"   , 0              , 0                                 , "Hausa")
  2203.    LNG(wxLANGUAGE_HEBREW,                     "he_IL", LANG_HEBREW    , SUBLANG_DEFAULT                   , "Hebrew")
  2204.    LNG(wxLANGUAGE_HINDI,                      "hi_IN", LANG_HINDI     , SUBLANG_DEFAULT                   , "Hindi")
  2205.    LNG(wxLANGUAGE_HUNGARIAN,                  "hu_HU", LANG_HUNGARIAN , SUBLANG_DEFAULT                   , "Hungarian")
  2206.    LNG(wxLANGUAGE_ICELANDIC,                  "is_IS", LANG_ICELANDIC , SUBLANG_DEFAULT                   , "Icelandic")
  2207.    LNG(wxLANGUAGE_INDONESIAN,                 "id_ID", LANG_INDONESIAN, SUBLANG_DEFAULT                   , "Indonesian")
  2208.    LNG(wxLANGUAGE_INTERLINGUA,                "ia"   , 0              , 0                                 , "Interlingua")
  2209.    LNG(wxLANGUAGE_INTERLINGUE,                "ie"   , 0              , 0                                 , "Interlingue")
  2210.    LNG(wxLANGUAGE_INUKTITUT,                  "iu"   , 0              , 0                                 , "Inuktitut")
  2211.    LNG(wxLANGUAGE_INUPIAK,                    "ik"   , 0              , 0                                 , "Inupiak")
  2212.    LNG(wxLANGUAGE_IRISH,                      "ga_IE", 0              , 0                                 , "Irish")
  2213.    LNG(wxLANGUAGE_ITALIAN,                    "it_IT", LANG_ITALIAN   , SUBLANG_ITALIAN                   , "Italian")
  2214.    LNG(wxLANGUAGE_ITALIAN_SWISS,              "it_CH", LANG_ITALIAN   , SUBLANG_ITALIAN_SWISS             , "Italian (Swiss)")
  2215.    LNG(wxLANGUAGE_JAPANESE,                   "ja_JP", LANG_JAPANESE  , SUBLANG_DEFAULT                   , "Japanese")
  2216.    LNG(wxLANGUAGE_JAVANESE,                   "jw"   , 0              , 0                                 , "Javanese")
  2217.    LNG(wxLANGUAGE_KANNADA,                    "kn"   , LANG_KANNADA   , SUBLANG_DEFAULT                   , "Kannada")
  2218.    LNG(wxLANGUAGE_KASHMIRI,                   "ks"   , LANG_KASHMIRI  , SUBLANG_DEFAULT                   , "Kashmiri")
  2219.    LNG(wxLANGUAGE_KASHMIRI_INDIA,             "ks_IN", LANG_KASHMIRI  , SUBLANG_KASHMIRI_INDIA            , "Kashmiri (India)")
  2220.    LNG(wxLANGUAGE_KAZAKH,                     "kk"   , LANG_KAZAK     , SUBLANG_DEFAULT                   , "Kazakh")
  2221.    LNG(wxLANGUAGE_KERNEWEK,                   "kw_GB", 0              , 0                                 , "Kernewek")
  2222.    LNG(wxLANGUAGE_KINYARWANDA,                "rw"   , 0              , 0                                 , "Kinyarwanda")
  2223.    LNG(wxLANGUAGE_KIRGHIZ,                    "ky"   , 0              , 0                                 , "Kirghiz")
  2224.    LNG(wxLANGUAGE_KIRUNDI,                    "rn"   , 0              , 0                                 , "Kirundi")
  2225.    LNG(wxLANGUAGE_KONKANI,                    ""     , LANG_KONKANI   , SUBLANG_DEFAULT                   , "Konkani")
  2226.    LNG(wxLANGUAGE_KOREAN,                     "ko_KR", LANG_KOREAN    , SUBLANG_KOREAN                    , "Korean")
  2227.    LNG(wxLANGUAGE_KURDISH,                    "ku"   , 0              , 0                                 , "Kurdish")
  2228.    LNG(wxLANGUAGE_LAOTHIAN,                   "lo"   , 0              , 0                                 , "Laothian")
  2229.    LNG(wxLANGUAGE_LATIN,                      "la"   , 0              , 0                                 , "Latin")
  2230.    LNG(wxLANGUAGE_LATVIAN,                    "lv_LV", LANG_LATVIAN   , SUBLANG_DEFAULT                   , "Latvian")
  2231.    LNG(wxLANGUAGE_LINGALA,                    "ln"   , 0              , 0                                 , "Lingala")
  2232.    LNG(wxLANGUAGE_LITHUANIAN,                 "lt_LT", LANG_LITHUANIAN, SUBLANG_LITHUANIAN                , "Lithuanian")
  2233.    LNG(wxLANGUAGE_MACEDONIAN,                 "mk_MK", LANG_MACEDONIAN, SUBLANG_DEFAULT                   , "Macedonian")
  2234.    LNG(wxLANGUAGE_MALAGASY,                   "mg"   , 0              , 0                                 , "Malagasy")
  2235.    LNG(wxLANGUAGE_MALAY,                      "ms_MY", LANG_MALAY     , SUBLANG_DEFAULT                   , "Malay")
  2236.    LNG(wxLANGUAGE_MALAYALAM,                  "ml"   , LANG_MALAYALAM , SUBLANG_DEFAULT                   , "Malayalam")
  2237.    LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM,    "ms_BN", LANG_MALAY     , SUBLANG_MALAY_BRUNEI_DARUSSALAM   , "Malay (Brunei Darussalam)")
  2238.    LNG(wxLANGUAGE_MALAY_MALAYSIA,             "ms_MY", LANG_MALAY     , SUBLANG_MALAY_MALAYSIA            , "Malay (Malaysia)")
  2239.    LNG(wxLANGUAGE_MALTESE,                    "mt_MT", 0              , 0                                 , "Maltese")
  2240.    LNG(wxLANGUAGE_MANIPURI,                   ""     , LANG_MANIPURI  , SUBLANG_DEFAULT                   , "Manipuri")
  2241.    LNG(wxLANGUAGE_MAORI,                      "mi"   , 0              , 0                                 , "Maori")
  2242.    LNG(wxLANGUAGE_MARATHI,                    "mr_IN", LANG_MARATHI   , SUBLANG_DEFAULT                   , "Marathi")
  2243.    LNG(wxLANGUAGE_MOLDAVIAN,                  "mo"   , 0              , 0                                 , "Moldavian")
  2244.    LNG(wxLANGUAGE_MONGOLIAN,                  "mn"   , 0              , 0                                 , "Mongolian")
  2245.    LNG(wxLANGUAGE_NAURU,                      "na"   , 0              , 0                                 , "Nauru")
  2246.    LNG(wxLANGUAGE_NEPALI,                     "ne"   , LANG_NEPALI    , SUBLANG_DEFAULT                   , "Nepali")
  2247.    LNG(wxLANGUAGE_NEPALI_INDIA,               "ne_IN", LANG_NEPALI    , SUBLANG_NEPALI_INDIA              , "Nepali (India)")
  2248.    LNG(wxLANGUAGE_NORWEGIAN_BOKMAL,           "no_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_BOKMAL          , "Norwegian (Bokmal)")
  2249.    LNG(wxLANGUAGE_NORWEGIAN_NYNORSK,          "nn_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_NYNORSK         , "Norwegian (Nynorsk)")
  2250.    LNG(wxLANGUAGE_OCCITAN,                    "oc"   , 0              , 0                                 , "Occitan")
  2251.    LNG(wxLANGUAGE_ORIYA,                      "or"   , LANG_ORIYA     , SUBLANG_DEFAULT                   , "Oriya")
  2252.    LNG(wxLANGUAGE_OROMO,                      "om"   , 0              , 0                                 , "(Afan) Oromo")
  2253.    LNG(wxLANGUAGE_PASHTO,                     "ps"   , 0              , 0                                 , "Pashto, Pushto")
  2254.    LNG(wxLANGUAGE_POLISH,                     "pl_PL", LANG_POLISH    , SUBLANG_DEFAULT                   , "Polish")
  2255.    LNG(wxLANGUAGE_PORTUGUESE,                 "pt_PT", LANG_PORTUGUESE, SUBLANG_PORTUGUESE                , "Portuguese")
  2256.    LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN,       "pt_BR", LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN      , "Portuguese (Brazilian)")
  2257.    LNG(wxLANGUAGE_PUNJABI,                    "pa"   , LANG_PUNJABI   , SUBLANG_DEFAULT                   , "Punjabi")
  2258.    LNG(wxLANGUAGE_QUECHUA,                    "qu"   , 0              , 0                                 , "Quechua")
  2259.    LNG(wxLANGUAGE_RHAETO_ROMANCE,             "rm"   , 0              , 0                                 , "Rhaeto-Romance")
  2260.    LNG(wxLANGUAGE_ROMANIAN,                   "ro_RO", LANG_ROMANIAN  , SUBLANG_DEFAULT                   , "Romanian")
  2261.    LNG(wxLANGUAGE_RUSSIAN,                    "ru_RU", LANG_RUSSIAN   , SUBLANG_DEFAULT                   , "Russian")
  2262.    LNG(wxLANGUAGE_RUSSIAN_UKRAINE,            "ru_UA", 0              , 0                                 , "Russian (Ukraine)")
  2263.    LNG(wxLANGUAGE_SAMOAN,                     "sm"   , 0              , 0                                 , "Samoan")
  2264.    LNG(wxLANGUAGE_SANGHO,                     "sg"   , 0              , 0                                 , "Sangho")
  2265.    LNG(wxLANGUAGE_SANSKRIT,                   "sa"   , LANG_SANSKRIT  , SUBLANG_DEFAULT                   , "Sanskrit")
  2266.    LNG(wxLANGUAGE_SCOTS_GAELIC,               "gd"   , 0              , 0                                 , "Scots Gaelic")
  2267.    LNG(wxLANGUAGE_SERBIAN,                    "sr_YU", LANG_SERBIAN   , SUBLANG_DEFAULT                   , "Serbian")
  2268.    LNG(wxLANGUAGE_SERBIAN_CYRILLIC,           "sr_YU", LANG_SERBIAN   , SUBLANG_SERBIAN_CYRILLIC          , "Serbian (Cyrillic)")
  2269.    LNG(wxLANGUAGE_SERBIAN_LATIN,              "sr_YU", LANG_SERBIAN   , SUBLANG_SERBIAN_LATIN             , "Serbian (Latin)")
  2270.    LNG(wxLANGUAGE_SERBO_CROATIAN,             "sh"   , 0              , 0                                 , "Serbo-Croatian")
  2271.    LNG(wxLANGUAGE_SESOTHO,                    "st"   , 0              , 0                                 , "Sesotho")
  2272.    LNG(wxLANGUAGE_SETSWANA,                   "tn"   , 0              , 0                                 , "Setswana")
  2273.    LNG(wxLANGUAGE_SHONA,                      "sn"   , 0              , 0                                 , "Shona")
  2274.    LNG(wxLANGUAGE_SINDHI,                     "sd"   , LANG_SINDHI    , SUBLANG_DEFAULT                   , "Sindhi")
  2275.    LNG(wxLANGUAGE_SINHALESE,                  "si"   , 0              , 0                                 , "Sinhalese")
  2276.    LNG(wxLANGUAGE_SISWATI,                    "ss"   , 0              , 0                                 , "Siswati")
  2277.    LNG(wxLANGUAGE_SLOVAK,                     "sk_SK", LANG_SLOVAK    , SUBLANG_DEFAULT                   , "Slovak")
  2278.    LNG(wxLANGUAGE_SLOVENIAN,                  "sl_SI", LANG_SLOVENIAN , SUBLANG_DEFAULT                   , "Slovenian")
  2279.    LNG(wxLANGUAGE_SOMALI,                     "so"   , 0              , 0                                 , "Somali")
  2280.    LNG(wxLANGUAGE_SPANISH,                    "es_ES", LANG_SPANISH   , SUBLANG_SPANISH                   , "Spanish")
  2281.    LNG(wxLANGUAGE_SPANISH_ARGENTINA,          "es_AR", LANG_SPANISH   , SUBLANG_SPANISH_ARGENTINA         , "Spanish (Argentina)")
  2282.    LNG(wxLANGUAGE_SPANISH_BOLIVIA,            "es_BO", LANG_SPANISH   , SUBLANG_SPANISH_BOLIVIA           , "Spanish (Bolivia)")
  2283.    LNG(wxLANGUAGE_SPANISH_CHILE,              "es_CL", LANG_SPANISH   , SUBLANG_SPANISH_CHILE             , "Spanish (Chile)")
  2284.    LNG(wxLANGUAGE_SPANISH_COLOMBIA,           "es_CO", LANG_SPANISH   , SUBLANG_SPANISH_COLOMBIA          , "Spanish (Colombia)")
  2285.    LNG(wxLANGUAGE_SPANISH_COSTA_RICA,         "es_CR", LANG_SPANISH   , SUBLANG_SPANISH_COSTA_RICA        , "Spanish (Costa Rica)")
  2286.    LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, "es_DO", LANG_SPANISH   , SUBLANG_SPANISH_DOMINICAN_REPUBLIC, "Spanish (Dominican republic)")
  2287.    LNG(wxLANGUAGE_SPANISH_ECUADOR,            "es_EC", LANG_SPANISH   , SUBLANG_SPANISH_ECUADOR           , "Spanish (Ecuador)")
  2288.    LNG(wxLANGUAGE_SPANISH_EL_SALVADOR,        "es_SV", LANG_SPANISH   , SUBLANG_SPANISH_EL_SALVADOR       , "Spanish (El Salvador)")
  2289.    LNG(wxLANGUAGE_SPANISH_GUATEMALA,          "es_GT", LANG_SPANISH   , SUBLANG_SPANISH_GUATEMALA         , "Spanish (Guatemala)")
  2290.    LNG(wxLANGUAGE_SPANISH_HONDURAS,           "es_HN", LANG_SPANISH   , SUBLANG_SPANISH_HONDURAS          , "Spanish (Honduras)")
  2291.    LNG(wxLANGUAGE_SPANISH_MEXICAN,            "es_MX", LANG_SPANISH   , SUBLANG_SPANISH_MEXICAN           , "Spanish (Mexican)")
  2292.    LNG(wxLANGUAGE_SPANISH_MODERN,             "es_ES", LANG_SPANISH   , SUBLANG_SPANISH_MODERN            , "Spanish (Modern)")
  2293.    LNG(wxLANGUAGE_SPANISH_NICARAGUA,          "es_NI", LANG_SPANISH   , SUBLANG_SPANISH_NICARAGUA         , "Spanish (Nicaragua)")
  2294.    LNG(wxLANGUAGE_SPANISH_PANAMA,             "es_PA", LANG_SPANISH   , SUBLANG_SPANISH_PANAMA            , "Spanish (Panama)")
  2295.    LNG(wxLANGUAGE_SPANISH_PARAGUAY,           "es_PY", LANG_SPANISH   , SUBLANG_SPANISH_PARAGUAY          , "Spanish (Paraguay)")
  2296.    LNG(wxLANGUAGE_SPANISH_PERU,               "es_PE", LANG_SPANISH   , SUBLANG_SPANISH_PERU              , "Spanish (Peru)")
  2297.    LNG(wxLANGUAGE_SPANISH_PUERTO_RICO,        "es_PR", LANG_SPANISH   , SUBLANG_SPANISH_PUERTO_RICO       , "Spanish (Puerto Rico)")
  2298.    LNG(wxLANGUAGE_SPANISH_URUGUAY,            "es_UY", LANG_SPANISH   , SUBLANG_SPANISH_URUGUAY           , "Spanish (Uruguay)")
  2299.    LNG(wxLANGUAGE_SPANISH_US,                 "es_US", 0              , 0                                 , "Spanish (U.S.)")
  2300.    LNG(wxLANGUAGE_SPANISH_VENEZUELA,          "es_VE", LANG_SPANISH   , SUBLANG_SPANISH_VENEZUELA         , "Spanish (Venezuela)")
  2301.    LNG(wxLANGUAGE_SUNDANESE,                  "su"   , 0              , 0                                 , "Sundanese")
  2302.    LNG(wxLANGUAGE_SWAHILI,                    "sw_KE", LANG_SWAHILI   , SUBLANG_DEFAULT                   , "Swahili")
  2303.    LNG(wxLANGUAGE_SWEDISH,                    "sv_SE", LANG_SWEDISH   , SUBLANG_SWEDISH                   , "Swedish")
  2304.    LNG(wxLANGUAGE_SWEDISH_FINLAND,            "sv_FI", LANG_SWEDISH   , SUBLANG_SWEDISH_FINLAND           , "Swedish (Finland)")
  2305.    LNG(wxLANGUAGE_TAGALOG,                    "tl"   , 0              , 0                                 , "Tagalog")
  2306.    LNG(wxLANGUAGE_TAJIK,                      "tg"   , 0              , 0                                 , "Tajik")
  2307.    LNG(wxLANGUAGE_TAMIL,                      "ta"   , LANG_TAMIL     , SUBLANG_DEFAULT                   , "Tamil")
  2308.    LNG(wxLANGUAGE_TATAR,                      "tt"   , LANG_TATAR     , SUBLANG_DEFAULT                   , "Tatar")
  2309.    LNG(wxLANGUAGE_TELUGU,                     "te"   , LANG_TELUGU    , SUBLANG_DEFAULT                   , "Telugu")
  2310.    LNG(wxLANGUAGE_THAI,                       "th_TH", LANG_THAI      , SUBLANG_DEFAULT                   , "Thai")
  2311.    LNG(wxLANGUAGE_TIBETAN,                    "bo"   , 0              , 0                                 , "Tibetan")
  2312.    LNG(wxLANGUAGE_TIGRINYA,                   "ti"   , 0              , 0                                 , "Tigrinya")
  2313.    LNG(wxLANGUAGE_TONGA,                      "to"   , 0              , 0                                 , "Tonga")
  2314.    LNG(wxLANGUAGE_TSONGA,                     "ts"   , 0              , 0                                 , "Tsonga")
  2315.    LNG(wxLANGUAGE_TURKISH,                    "tr_TR", LANG_TURKISH   , SUBLANG_DEFAULT                   , "Turkish")
  2316.    LNG(wxLANGUAGE_TURKMEN,                    "tk"   , 0              , 0                                 , "Turkmen")
  2317.    LNG(wxLANGUAGE_TWI,                        "tw"   , 0              , 0                                 , "Twi")
  2318.    LNG(wxLANGUAGE_UIGHUR,                     "ug"   , 0              , 0                                 , "Uighur")
  2319.    LNG(wxLANGUAGE_UKRAINIAN,                  "uk_UA", LANG_UKRAINIAN , SUBLANG_DEFAULT                   , "Ukrainian")
  2320.    LNG(wxLANGUAGE_URDU,                       "ur"   , LANG_URDU      , SUBLANG_DEFAULT                   , "Urdu")
  2321.    LNG(wxLANGUAGE_URDU_INDIA,                 "ur_IN", LANG_URDU      , SUBLANG_URDU_INDIA                , "Urdu (India)")
  2322.    LNG(wxLANGUAGE_URDU_PAKISTAN,              "ur_PK", LANG_URDU      , SUBLANG_URDU_PAKISTAN             , "Urdu (Pakistan)")
  2323.    LNG(wxLANGUAGE_UZBEK,                      "uz"   , LANG_UZBEK     , SUBLANG_DEFAULT                   , "Uzbek")
  2324.    LNG(wxLANGUAGE_UZBEK_CYRILLIC,             "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_CYRILLIC            , "Uzbek (Cyrillic)")
  2325.    LNG(wxLANGUAGE_UZBEK_LATIN,                "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_LATIN               , "Uzbek (Latin)")
  2326.    LNG(wxLANGUAGE_VIETNAMESE,                 "vi_VN", LANG_VIETNAMESE, SUBLANG_DEFAULT                   , "Vietnamese")
  2327.    LNG(wxLANGUAGE_VOLAPUK,                    "vo"   , 0              , 0                                 , "Volapuk")
  2328.    LNG(wxLANGUAGE_WELSH,                      "cy"   , 0              , 0                                 , "Welsh")
  2329.    LNG(wxLANGUAGE_WOLOF,                      "wo"   , 0              , 0                                 , "Wolof")
  2330.    LNG(wxLANGUAGE_XHOSA,                      "xh"   , 0              , 0                                 , "Xhosa")
  2331.    LNG(wxLANGUAGE_YIDDISH,                    "yi"   , 0              , 0                                 , "Yiddish")
  2332.    LNG(wxLANGUAGE_YORUBA,                     "yo"   , 0              , 0                                 , "Yoruba")
  2333.    LNG(wxLANGUAGE_ZHUANG,                     "za"   , 0              , 0                                 , "Zhuang")
  2334.    LNG(wxLANGUAGE_ZULU,                       "zu"   , 0              , 0                                 , "Zulu")
  2335.  
  2336. };
  2337. #undef LNG
  2338.  
  2339. // --- --- --- generated code ends here --- --- ---
  2340.  
  2341. #endif // wxUSE_INTL
  2342.  
  2343.