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
This commit is contained in:
Václav Slavík
2001-03-25 22:19:44 +00:00
parent 323af1967c
commit 4178000933
3 changed files with 113 additions and 45 deletions

View File

@@ -41,6 +41,10 @@ The following wxLanguage constants may be used to specify the language
in \helpref{Init}{wxlocaleinit} and are returned by in \helpref{Init}{wxlocaleinit} and are returned by
\helpref{GetSystemLanguage}{wxlocalegetsystemlanguage}: \helpref{GetSystemLanguage}{wxlocalegetsystemlanguage}:
%% --- --- --- generated code begins here --- --- ---
%% This enum is generated by misc/languages/genlang.py %% This enum is generated by misc/languages/genlang.py
%% When making changes, please put them into misc/languages/langtabl.txt %% When making changes, please put them into misc/languages/langtabl.txt
\begin{itemize}\itemsep=0pt \begin{itemize}\itemsep=0pt
@@ -279,6 +283,9 @@ this
\item wxLANGUAGE\_ZULU \item wxLANGUAGE\_ZULU
\end{itemize} \end{itemize}
%% --- --- --- generated code ends here --- --- ---
\membersection{wxLocale::wxLocale}\label{wxlocaledefctor} \membersection{wxLocale::wxLocale}\label{wxlocaledefctor}
@@ -340,7 +347,7 @@ This only applies to subsequent invocations of AddCatalog()!
\membersection{wxLocale::AddLanguage}\label{wxlocaleaddlanguage} \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 Adds custom, user-defined language to the database of known languages. This
database is used in conjuction with the first form of database is used in conjuction with the first form of
@@ -433,7 +440,7 @@ Compare \helpref{GetCanonicalName}{wxlocalegetcanonicalname}.
\membersection{wxLocale::GetSystemLanguage}\label{wxlocalegetsystemlanguage} \membersection{wxLocale::GetSystemLanguage}\label{wxlocalegetsystemlanguage}
\constfunc{int}{GetSystemLanguage}{\void} \constfunc{static int}{GetSystemLanguage}{\void}
Tries to detect the user's default language setting. Tries to detect the user's default language setting.
Returns \helpref{wxLanguage}{wxlanguage} value or Returns \helpref{wxLanguage}{wxlanguage} value or

View File

@@ -55,6 +55,7 @@ class WXDLLEXPORT wxLanguageInfoArray;
// wxLanguage: defines all supported languages // wxLanguage: defines all supported languages
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// This enum is generated by misc/languages/genlang.py // This enum is generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/langtabl.txt // 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: // user's default/preffered language as got from OS:
wxLANGUAGE_DEFAULT, wxLANGUAGE_DEFAULT,
// unknown language, if wxLocale::GetSystemLanguage fails: // unknown language, if wxLocale::GetSystemLanguage fails:
wxLANGUAGE_UNKNOWN, wxLANGUAGE_UNKNOWN,
@@ -299,6 +299,10 @@ enum wxLanguage
wxLANGUAGE_USER_DEFINED wxLANGUAGE_USER_DEFINED
}; };
// --- --- --- generated code ends here --- --- ---
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc. // wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc.
// translation information // translation information
@@ -341,7 +345,6 @@ public:
bool bLoadDefault = TRUE, // preload wxstd.mo? bool bLoadDefault = TRUE, // preload wxstd.mo?
bool bConvertEncoding = FALSE) // convert Win<->Unix if neccessary? bool bConvertEncoding = FALSE) // convert Win<->Unix if neccessary?
{ {
m_languagesDB = NULL;
Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding); Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding);
} }
@@ -365,7 +368,7 @@ public:
// Try to get user's (or OS's) prefered language setting. // Try to get user's (or OS's) prefered language setting.
// Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed
int GetSystemLanguage() const; static int GetSystemLanguage();
// return TRUE if the locale was set successfully // return TRUE if the locale was set successfully
bool IsOk() const { return m_pszOldLocale != NULL; } bool IsOk() const { return m_pszOldLocale != NULL; }
@@ -406,7 +409,7 @@ public:
// Add custom language to the list of known languages. // Add custom language to the list of known languages.
// Notes: 1) wxLanguageInfo contains platform-specific data // Notes: 1) wxLanguageInfo contains platform-specific data
// 2) must be called before Init to have effect // 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 // retrieve the translation for a string in all loaded domains unless
// the szDomain parameter is specified (and then only this domain is // the szDomain parameter is specified (and then only this domain is
@@ -424,13 +427,19 @@ public:
// Returns the current short name for the locale // Returns the current short name for the locale
const wxString& GetName() const { return m_strShort; } 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: private:
// find catalog by name in a linked list, return NULL if !found // find catalog by name in a linked list, return NULL if !found
wxMsgCatalog *FindCatalog(const wxChar *szDomain) const; wxMsgCatalog *FindCatalog(const wxChar *szDomain) const;
// copy default table of languages from global static array to // copy default table of languages from global static array to
// m_langugagesInfo // m_langugagesInfo, called by InitLanguagesDB
void InitLanguagesDB(); static void InitLanguagesDB();
wxString m_strLocale, // this locale name wxString m_strLocale, // this locale name
m_strShort; // short name for the locale m_strShort; // short name for the locale
@@ -443,7 +452,7 @@ private:
bool m_bConvertEncoding; bool m_bConvertEncoding;
wxLanguageInfoArray *m_languagesDB; static wxLanguageInfoArray *ms_languagesDB;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -44,6 +44,7 @@
#include "wx/debug.h" #include "wx/debug.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/dynarray.h" #include "wx/dynarray.h"
#include "wx/module.h"
#ifdef __WIN32__ #ifdef __WIN32__
#include "wx/msw/private.h" #include "wx/msw/private.h"
#endif #endif
@@ -535,16 +536,32 @@ void wxMsgCatalog::ConvertEncoding()
if ( enc == wxFONTENCODING_SYSTEM ) if ( enc == wxFONTENCODING_SYSTEM )
return; // unknown encoding return; // unknown 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 (targetEnc == wxFONTENCODING_SYSTEM)
{
wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc); wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc);
if (a[0] == enc) if (a[0] == enc)
return; // no conversion needed, locale uses native encoding return; // no conversion needed, locale uses native encoding
if (a.GetCount() == 0) if (a.GetCount() == 0)
return; // we don't know common equiv. under this platform return; // we don't know common equiv. under this platform
targetEnc = a[0];
}
wxEncodingConverter converter; wxEncodingConverter converter;
converter.Init(enc, targetEnc);
converter.Init(enc, a[0]);
for (size_t i = 0; i < m_numStrings; i++) for (size_t i = 0; i < m_numStrings; i++)
converter.Convert((char*)StringAtOfs(m_pTransTable, i)); converter.Convert((char*)StringAtOfs(m_pTransTable, i));
#endif // wxUSE_GUI #endif // wxUSE_GUI
@@ -559,11 +576,28 @@ void wxMsgCatalog::ConvertEncoding()
WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo, wxLanguageInfoArray); WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo, wxLanguageInfoArray);
WX_DEFINE_OBJARRAY(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() wxLocale::wxLocale()
{ {
m_pszOldLocale = NULL; m_pszOldLocale = NULL;
m_pMsgCat = NULL; m_pMsgCat = NULL;
m_languagesDB = NULL;
m_language = wxLANGUAGE_UNKNOWN; m_language = wxLANGUAGE_UNKNOWN;
} }
@@ -614,11 +648,7 @@ bool wxLocale::Init(int language, int flags)
wxLanguageInfo *info = NULL; wxLanguageInfo *info = NULL;
int lang = language; int lang = language;
if (m_languagesDB == NULL) CreateLanguagesDB();
{
m_languagesDB = new wxLanguageInfoArray;
InitLanguagesDB();
}
if (lang == wxLANGUAGE_DEFAULT) if (lang == wxLANGUAGE_DEFAULT)
{ {
@@ -634,11 +664,11 @@ bool wxLocale::Init(int language, int flags)
if (lang != wxLANGUAGE_DEFAULT) 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; break;
} }
} }
@@ -759,14 +789,13 @@ void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix)
//else: already have it //else: already have it
} }
int wxLocale::GetSystemLanguage() const /*static*/ int wxLocale::GetSystemLanguage()
{ {
wxCHECK_MSG( m_languagesDB != NULL, wxLANGUAGE_UNKNOWN, CreateLanguagesDB();
_T("Languages DB not initialized, call wxLocale::Init!") );
// init i to avoid compiler warning // init i to avoid compiler warning
size_t i = 0, size_t i = 0,
count = m_languagesDB->GetCount(); count = ms_languagesDB->GetCount();
#if defined(__UNIX__) #if defined(__UNIX__)
// first get the string identifying the language from the environment // 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("LC_MESSAGES"), &langFull) &&
!wxGetEnv(wxT("LANG"), &langFull)) !wxGetEnv(wxT("LANG"), &langFull))
{ {
// no language specified // no language specified, threat it as English
return wxLANGUAGE_UNKNOWN; return wxLANGUAGE_ENGLISH;
} }
if ( langFull == _T("C") ) if ( langFull == _T("C") )
{ {
// default C locale // default C locale
return wxLANGUAGE_DEFAULT; return wxLANGUAGE_ENGLISH;
} }
// the language string has the following form // the language string has the following form
@@ -835,7 +864,7 @@ int wxLocale::GetSystemLanguage() const
// 1. Try to find the language either as is: // 1. Try to find the language either as is:
for ( i = 0; i < count; i++ ) for ( i = 0; i < count; i++ )
{ {
if ( m_languagesDB->Item(i).CanonicalName == langFull ) if ( ms_languagesDB->Item(i).CanonicalName == langFull )
{ {
break; break;
} }
@@ -846,7 +875,7 @@ int wxLocale::GetSystemLanguage() const
{ {
for ( i = 0; i < count; i++ ) for ( i = 0; i < count; i++ )
{ {
if ( m_languagesDB->Item(i).CanonicalName == lang ) if ( ms_languagesDB->Item(i).CanonicalName == lang )
{ {
break; break;
} }
@@ -858,7 +887,7 @@ int wxLocale::GetSystemLanguage() const
{ {
for ( i = 0; i < count; i++ ) for ( i = 0; i < count; i++ )
{ {
if ( ExtractLang(m_languagesDB->Item(i).CanonicalName) if ( ExtractLang(ms_languagesDB->Item(i).CanonicalName)
== langFull ) == langFull )
{ {
break; break;
@@ -871,7 +900,7 @@ int wxLocale::GetSystemLanguage() const
// try to find the name in verbose description // try to find the name in verbose description
for ( i = 0; i < count; i++ ) 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; break;
} }
@@ -886,8 +915,8 @@ int wxLocale::GetSystemLanguage() const
for ( i = 0; i < count; i++ ) for ( i = 0; i < count; i++ )
{ {
if (m_languagesDB->Item(i).WinLang == lang && if (ms_languagesDB->Item(i).WinLang == lang &&
m_languagesDB->Item(i).WinSublang == sublang) ms_languagesDB->Item(i).WinSublang == sublang)
{ {
break; break;
} }
@@ -899,17 +928,17 @@ int wxLocale::GetSystemLanguage() const
if ( i < count ) if ( i < count )
{ {
// we did find a matching entry, use it // 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 // no info about this language in the database
return wxLANGUAGE_UNKNOWN; 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!"); CreateLanguagesDB();
m_languagesDB->Add(info); ms_languagesDB->Add(info);
} }
wxString wxLocale::GetSysName() const wxString wxLocale::GetSysName() const
@@ -928,8 +957,6 @@ wxLocale::~wxLocale()
delete pTmpCat; delete pTmpCat;
} }
delete m_languagesDB;
// restore old locale // restore old locale
wxSetLocale(m_pOldLocale); wxSetLocale(m_pOldLocale);
wxSetlocale(LC_ALL, m_pszOldLocale); wxSetlocale(LC_ALL, m_pszOldLocale);
@@ -1057,11 +1084,33 @@ wxLocale *wxSetLocale(wxLocale *pLocale)
return pOld; 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 // default languages table & initialization
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// This table is generated by misc/languages/genlang.py // This table is generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/langtabl.txt // When making changes, please put them into misc/languages/langtabl.txt
@@ -1799,6 +1848,9 @@ void wxLocale::InitLanguagesDB()
}; };
#undef LNG #undef LNG
// --- --- --- generated code ends here --- --- ---
#endif // wxUSE_INTL #endif // wxUSE_INTL