From 4178000933f0618d2cc9dc2f80dfed91b0c61464 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sun, 25 Mar 2001 22:19:44 +0000 Subject: [PATCH] made wxLocale::GetSystemLanguage and wxLocale::AddLanguage static; wxLocale now converts strings according to LC_CTYPE if it contains charset information (and uses old code otherwise) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9578 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/locale.tex | 11 +++- include/wx/intl.h | 23 +++++--- src/common/intl.cpp | 124 +++++++++++++++++++++++++++------------ 3 files changed, 113 insertions(+), 45 deletions(-) diff --git a/docs/latex/wx/locale.tex b/docs/latex/wx/locale.tex index 571dc9cb62..f82583c617 100644 --- a/docs/latex/wx/locale.tex +++ b/docs/latex/wx/locale.tex @@ -41,6 +41,10 @@ The following wxLanguage constants may be used to specify the language in \helpref{Init}{wxlocaleinit} and are returned by \helpref{GetSystemLanguage}{wxlocalegetsystemlanguage}: + + +%% --- --- --- generated code begins here --- --- --- + %% This enum is generated by misc/languages/genlang.py %% When making changes, please put them into misc/languages/langtabl.txt \begin{itemize}\itemsep=0pt @@ -279,6 +283,9 @@ this \item wxLANGUAGE\_ZULU \end{itemize} +%% --- --- --- generated code ends here --- --- --- + + \membersection{wxLocale::wxLocale}\label{wxlocaledefctor} @@ -340,7 +347,7 @@ This only applies to subsequent invocations of AddCatalog()! \membersection{wxLocale::AddLanguage}\label{wxlocaleaddlanguage} -\func{void}{AddLanguage}{\param{const wxLanguageInfo\& }{info}} +\func{static void}{AddLanguage}{\param{const wxLanguageInfo\& }{info}} Adds custom, user-defined language to the database of known languages. This database is used in conjuction with the first form of @@ -433,7 +440,7 @@ Compare \helpref{GetCanonicalName}{wxlocalegetcanonicalname}. \membersection{wxLocale::GetSystemLanguage}\label{wxlocalegetsystemlanguage} -\constfunc{int}{GetSystemLanguage}{\void} +\constfunc{static int}{GetSystemLanguage}{\void} Tries to detect the user's default language setting. Returns \helpref{wxLanguage}{wxlanguage} value or diff --git a/include/wx/intl.h b/include/wx/intl.h index a4468a948c..89128347c7 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -55,6 +55,7 @@ class WXDLLEXPORT wxLanguageInfoArray; // wxLanguage: defines all supported languages // ---------------------------------------------------------------------------- +// --- --- --- generated code begins here --- --- --- // This enum is generated by misc/languages/genlang.py // When making changes, please put them into misc/languages/langtabl.txt @@ -62,7 +63,6 @@ enum wxLanguage { // user's default/preffered language as got from OS: wxLANGUAGE_DEFAULT, - // unknown language, if wxLocale::GetSystemLanguage fails: wxLANGUAGE_UNKNOWN, @@ -299,6 +299,10 @@ enum wxLanguage wxLANGUAGE_USER_DEFINED }; +// --- --- --- generated code ends here --- --- --- + + + // ---------------------------------------------------------------------------- // wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc. // translation information @@ -341,7 +345,6 @@ public: bool bLoadDefault = TRUE, // preload wxstd.mo? bool bConvertEncoding = FALSE) // convert Win<->Unix if neccessary? { - m_languagesDB = NULL; Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding); } @@ -365,7 +368,7 @@ public: // Try to get user's (or OS's) prefered language setting. // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed - int GetSystemLanguage() const; + static int GetSystemLanguage(); // return TRUE if the locale was set successfully bool IsOk() const { return m_pszOldLocale != NULL; } @@ -406,7 +409,7 @@ public: // Add custom language to the list of known languages. // Notes: 1) wxLanguageInfo contains platform-specific data // 2) must be called before Init to have effect - void AddLanguage(const wxLanguageInfo& info); + static void AddLanguage(const wxLanguageInfo& info); // retrieve the translation for a string in all loaded domains unless // the szDomain parameter is specified (and then only this domain is @@ -424,13 +427,19 @@ public: // Returns the current short name for the locale const wxString& GetName() const { return m_strShort; } + // These two methods are for internal use only. First one creates + // ms_languagesDB if it doesn't already exist, second one destroys + // it. + static void CreateLanguagesDB(); + static void DestroyLanguagesDB(); + private: // find catalog by name in a linked list, return NULL if !found wxMsgCatalog *FindCatalog(const wxChar *szDomain) const; // copy default table of languages from global static array to - // m_langugagesInfo - void InitLanguagesDB(); + // m_langugagesInfo, called by InitLanguagesDB + static void InitLanguagesDB(); wxString m_strLocale, // this locale name m_strShort; // short name for the locale @@ -443,7 +452,7 @@ private: bool m_bConvertEncoding; - wxLanguageInfoArray *m_languagesDB; + static wxLanguageInfoArray *ms_languagesDB; }; // ---------------------------------------------------------------------------- diff --git a/src/common/intl.cpp b/src/common/intl.cpp index d3cf3e156a..be3b4f65b9 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -44,6 +44,7 @@ #include "wx/debug.h" #include "wx/utils.h" #include "wx/dynarray.h" +#include "wx/module.h" #ifdef __WIN32__ #include "wx/msw/private.h" #endif @@ -535,16 +536,32 @@ void wxMsgCatalog::ConvertEncoding() if ( enc == wxFONTENCODING_SYSTEM ) return; // unknown encoding - wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc); - if (a[0] == enc) - return; // no conversion needed, locale uses native encoding + wxFontEncoding targetEnc = wxFONTENCODING_SYSTEM; +#ifdef __UNIX__ + wxString langFull; + if (wxGetEnv(wxT("LC_ALL"), &langFull) || + wxGetEnv(wxT("LC_CTYPE"), &langFull) || + wxGetEnv(wxT("LANG"), &langFull)) + { + wxString lcharset = langFull.AfterFirst(wxT('.')).BeforeFirst(wxT('@')); + if (!lcharset.IsEmpty()) + targetEnc = wxTheFontMapper->CharsetToEncoding(lcharset, FALSE); + } +#endif - if (a.GetCount() == 0) - return; // we don't know common equiv. under this platform + if (targetEnc == wxFONTENCODING_SYSTEM) + { + wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc); + if (a[0] == enc) + return; // no conversion needed, locale uses native encoding + if (a.GetCount() == 0) + return; // we don't know common equiv. under this platform + targetEnc = a[0]; + } wxEncodingConverter converter; + converter.Init(enc, targetEnc); - converter.Init(enc, a[0]); for (size_t i = 0; i < m_numStrings; i++) converter.Convert((char*)StringAtOfs(m_pTransTable, i)); #endif // wxUSE_GUI @@ -559,11 +576,28 @@ void wxMsgCatalog::ConvertEncoding() WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo, wxLanguageInfoArray); WX_DEFINE_OBJARRAY(wxLanguageInfoArray); +wxLanguageInfoArray *wxLocale::ms_languagesDB = NULL; + +/*static*/ void wxLocale::CreateLanguagesDB() +{ + if (ms_languagesDB == NULL) + { + ms_languagesDB = new wxLanguageInfoArray; + InitLanguagesDB(); + } +} + +/*static*/ void wxLocale::DestroyLanguagesDB() +{ + delete ms_languagesDB; + ms_languagesDB = NULL; +} + + wxLocale::wxLocale() { m_pszOldLocale = NULL; m_pMsgCat = NULL; - m_languagesDB = NULL; m_language = wxLANGUAGE_UNKNOWN; } @@ -614,11 +648,7 @@ bool wxLocale::Init(int language, int flags) wxLanguageInfo *info = NULL; int lang = language; - if (m_languagesDB == NULL) - { - m_languagesDB = new wxLanguageInfoArray; - InitLanguagesDB(); - } + CreateLanguagesDB(); if (lang == wxLANGUAGE_DEFAULT) { @@ -634,11 +664,11 @@ bool wxLocale::Init(int language, int flags) if (lang != wxLANGUAGE_DEFAULT) { - for (size_t i = 0; i < m_languagesDB->GetCount(); i++) + for (size_t i = 0; i < ms_languagesDB->GetCount(); i++) { - if (m_languagesDB->Item(i).Language == lang) + if (ms_languagesDB->Item(i).Language == lang) { - info = &m_languagesDB->Item(i); + info = &ms_languagesDB->Item(i); break; } } @@ -759,14 +789,13 @@ void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix) //else: already have it } -int wxLocale::GetSystemLanguage() const +/*static*/ int wxLocale::GetSystemLanguage() { - wxCHECK_MSG( m_languagesDB != NULL, wxLANGUAGE_UNKNOWN, - _T("Languages DB not initialized, call wxLocale::Init!") ); + CreateLanguagesDB(); // init i to avoid compiler warning size_t i = 0, - count = m_languagesDB->GetCount(); + count = ms_languagesDB->GetCount(); #if defined(__UNIX__) // first get the string identifying the language from the environment @@ -775,14 +804,14 @@ int wxLocale::GetSystemLanguage() const !wxGetEnv(wxT("LC_MESSAGES"), &langFull) && !wxGetEnv(wxT("LANG"), &langFull)) { - // no language specified - return wxLANGUAGE_UNKNOWN; + // no language specified, threat it as English + return wxLANGUAGE_ENGLISH; } if ( langFull == _T("C") ) { // default C locale - return wxLANGUAGE_DEFAULT; + return wxLANGUAGE_ENGLISH; } // the language string has the following form @@ -835,7 +864,7 @@ int wxLocale::GetSystemLanguage() const // 1. Try to find the language either as is: for ( i = 0; i < count; i++ ) { - if ( m_languagesDB->Item(i).CanonicalName == langFull ) + if ( ms_languagesDB->Item(i).CanonicalName == langFull ) { break; } @@ -846,7 +875,7 @@ int wxLocale::GetSystemLanguage() const { for ( i = 0; i < count; i++ ) { - if ( m_languagesDB->Item(i).CanonicalName == lang ) + if ( ms_languagesDB->Item(i).CanonicalName == lang ) { break; } @@ -858,7 +887,7 @@ int wxLocale::GetSystemLanguage() const { for ( i = 0; i < count; i++ ) { - if ( ExtractLang(m_languagesDB->Item(i).CanonicalName) + if ( ExtractLang(ms_languagesDB->Item(i).CanonicalName) == langFull ) { break; @@ -871,7 +900,7 @@ int wxLocale::GetSystemLanguage() const // try to find the name in verbose description for ( i = 0; i < count; i++ ) { - if (m_languagesDB->Item(i).Description.CmpNoCase(langFull) == 0) + if (ms_languagesDB->Item(i).Description.CmpNoCase(langFull) == 0) { break; } @@ -886,8 +915,8 @@ int wxLocale::GetSystemLanguage() const for ( i = 0; i < count; i++ ) { - if (m_languagesDB->Item(i).WinLang == lang && - m_languagesDB->Item(i).WinSublang == sublang) + if (ms_languagesDB->Item(i).WinLang == lang && + ms_languagesDB->Item(i).WinSublang == sublang) { break; } @@ -899,17 +928,17 @@ int wxLocale::GetSystemLanguage() const if ( i < count ) { // we did find a matching entry, use it - return m_languagesDB->Item(i).Language; + return ms_languagesDB->Item(i).Language; } // no info about this language in the database return wxLANGUAGE_UNKNOWN; } -void wxLocale::AddLanguage(const wxLanguageInfo& info) +/*static*/ void wxLocale::AddLanguage(const wxLanguageInfo& info) { - wxASSERT_MSG(m_languagesDB != NULL, "Languages DB not initialized, call wxLocale::Init!"); - m_languagesDB->Add(info); + CreateLanguagesDB(); + ms_languagesDB->Add(info); } wxString wxLocale::GetSysName() const @@ -928,8 +957,6 @@ wxLocale::~wxLocale() delete pTmpCat; } - delete m_languagesDB; - // restore old locale wxSetLocale(m_pOldLocale); wxSetlocale(LC_ALL, m_pszOldLocale); @@ -1057,11 +1084,33 @@ wxLocale *wxSetLocale(wxLocale *pLocale) return pOld; } + + +// ---------------------------------------------------------------------------- +// wxLocale module (for lazy destruction of languagesDB) +// ---------------------------------------------------------------------------- + +class wxLocaleModule: public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxLocaleModule) + public: + wxLocaleModule() {} + bool OnInit() { return TRUE; } + void OnExit() { wxLocale::DestroyLanguagesDB(); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule, wxModule) + + + // ---------------------------------------------------------------------------- // default languages table & initialization // ---------------------------------------------------------------------------- + +// --- --- --- generated code begins here --- --- --- + // This table is generated by misc/languages/genlang.py // When making changes, please put them into misc/languages/langtabl.txt @@ -1567,7 +1616,7 @@ void wxLocale::InitLanguagesDB() wxLanguageInfo info; wxStringTokenizer tkn; - LNG(wxLANGUAGE_ABKHAZIAN, "ab" , 0 , 0 , "Abkhazian") + LNG(wxLANGUAGE_ABKHAZIAN, "ab" , 0 , 0 , "Abkhazian") LNG(wxLANGUAGE_AFAR, "aa" , 0 , 0 , "Afar") LNG(wxLANGUAGE_AFRIKAANS, "af_ZA", LANG_AFRIKAANS , SUBLANG_DEFAULT , "Afrikaans") LNG(wxLANGUAGE_ALBANIAN, "sq_AL", LANG_ALBANIAN , SUBLANG_DEFAULT , "Albanian") @@ -1795,10 +1844,13 @@ void wxLocale::InitLanguagesDB() LNG(wxLANGUAGE_YORUBA, "yo" , 0 , 0 , "Yoruba") LNG(wxLANGUAGE_ZHUANG, "za" , 0 , 0 , "Zhuang") LNG(wxLANGUAGE_ZULU, "zu" , 0 , 0 , "Zulu") - + }; #undef LNG +// --- --- --- generated code ends here --- --- --- + + #endif // wxUSE_INTL -- 2.45.2