#include "wx/ptr_scpd.h"
#include "wx/apptrait.h"
#include "wx/stdpaths.h"
+#include "wx/hashset.h"
#if defined(__WXMAC__)
#include "wx/mac/private.h" // includes mac headers
~wxMsgCatalogFile();
// load the catalog from disk (szDirPrefix corresponds to language)
- bool Load(const wxChar *szDirPrefix, const wxChar *szName,
+ bool Load(const wxString& szDirPrefix, const wxString& szName,
wxPluralFormsCalculatorPtr& rPluralFormsCalculator);
// fills the hash with string-translation pairs
// return the directories to search for message catalogs under the given
// prefix, separated by wxPATH_SEP
static
-wxString GetMsgCatalogSubdirs(const wxChar *prefix, const wxChar *lang)
+wxString GetMsgCatalogSubdirs(const wxString& prefix, const wxString& lang)
{
wxString searchPath;
searchPath << prefix << wxFILE_SEP_PATH << lang;
}
// construct the search path for the given language
-static wxString GetFullSearchPath(const wxChar *lang)
+static wxString GetFullSearchPath(const wxString& lang)
{
// first take the entries explicitly added by the program
wxArrayString paths;
}
// open disk file and read in it's contents
-bool wxMsgCatalogFile::Load(const wxChar *szDirPrefix, const wxChar *szName,
+bool wxMsgCatalogFile::Load(const wxString& szDirPrefix, const wxString& szName,
wxPluralFormsCalculatorPtr& rPluralFormsCalculator)
{
wxString searchPath;
searchPath += GetFullSearchPath(szDirPrefix);
- const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_'));
- if ( sublocale )
+ size_t sublocaleIndex = szDirPrefix.find(wxT('_'));
+ if ( sublocaleIndex != wxString::npos )
{
// also add just base locale name: for things like "fr_BE" (belgium
// french) we should use "fr" if no belgium specific message catalogs
// exist
searchPath << wxPATH_SEP
- << GetFullSearchPath(wxString(szDirPrefix).
- Left((size_t)(sublocale - szDirPrefix)));
+ << GetFullSearchPath(szDirPrefix.Left(sublocaleIndex));
}
// don't give translation errors here because the wxstd catalog might
// the argument to setlocale()
szLocale = shortName;
- wxCHECK_MSG( szLocale, false, _T("no locale to set in wxLocale::Init()") );
+ wxCHECK_MSG( !szLocale.empty(), false,
+ _T("no locale to set in wxLocale::Init()") );
}
#ifdef __WXWINCE__
256);
if (ret != 0)
{
- m_pszOldLocale = wxStrdup(localeName);
+ m_pszOldLocale = wxStrdup(wxConvLibc.cWC2MB(localeName));
}
else
m_pszOldLocale = NULL;
// TODO: how to find languageId
// SetLocaleInfo(languageId, SORT_DEFAULT, localeName);
#else
- wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, szLocale);
+ const char *oldLocale = wxSetlocale(LC_ALL, szLocale);
if ( oldLocale )
m_pszOldLocale = wxStrdup(oldLocale);
else
#if defined(__UNIX__) && wxUSE_UNICODE && !defined(__WXMAC__)
-static wxWCharBuffer wxSetlocaleTryUTF(int c, const wxChar *lc)
+static const char *wxSetlocaleTryUTF8(int c, const wxString& lc)
{
- wxMB2WXbuf l = wxSetlocale(c, lc);
- if ( !l && lc && lc[0] != 0 )
+ const char *l = NULL;
+
+ // NB: We prefer to set UTF-8 locale if it's possible and only fall back to
+ // non-UTF-8 locale if it fails
+
+ if ( !lc.empty() )
{
wxString buf(lc);
wxString buf2;
buf2 = buf + wxT(".UTF-8");
- l = wxSetlocale(c, buf2.c_str());
+ l = wxSetlocale(c, buf2);
if ( !l )
{
buf2 = buf + wxT(".utf-8");
- l = wxSetlocale(c, buf2.c_str());
+ l = wxSetlocale(c, buf2);
}
if ( !l )
{
buf2 = buf + wxT(".UTF8");
- l = wxSetlocale(c, buf2.c_str());
+ l = wxSetlocale(c, buf2);
}
if ( !l )
{
buf2 = buf + wxT(".utf8");
- l = wxSetlocale(c, buf2.c_str());
+ l = wxSetlocale(c, buf2);
}
}
+
+ // if we can't set UTF-8 locale, try non-UTF-8 one:
+ if ( !l )
+ l = wxSetlocale(c, lc);
+
return l;
}
#else
-#define wxSetlocaleTryUTF(c, lc) wxSetlocale(c, lc)
+#define wxSetlocaleTryUTF8(c, lc) wxSetlocale(c, lc)
#endif
bool wxLocale::Init(int language, int flags)
// Set the locale:
#if defined(__OS2__)
- wxMB2WXbuf retloc = wxSetlocale(LC_ALL , wxEmptyString);
+ const char *retloc = wxSetlocale(LC_ALL , wxEmptyString);
#elif defined(__UNIX__) && !defined(__WXMAC__)
if (language != wxLANGUAGE_DEFAULT)
locale = info->CanonicalName;
- wxMB2WXbuf retloc = wxSetlocaleTryUTF(LC_ALL, locale);
+ const char *retloc = wxSetlocaleTryUTF8(LC_ALL, locale);
const wxString langOnly = locale.Left(2);
if ( !retloc )
{
// Some C libraries don't like xx_YY form and require xx only
- retloc = wxSetlocaleTryUTF(LC_ALL, langOnly);
+ retloc = wxSetlocaleTryUTF8(LC_ALL, langOnly);
}
#if wxUSE_FONTMAP
if ( !localeAlt.empty() )
{
- retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt);
+ retloc = wxSetlocaleTryUTF8(LC_ALL, localeAlt);
if ( !retloc )
- retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt.Left(2));
+ retloc = wxSetlocaleTryUTF8(LC_ALL, localeAlt.Left(2));
}
}
//
// this contradicts IBM own docs but this is not of much help, so just work
// around it in the crudest possible manner
- wxChar *p = wxStrchr((wxChar *)retloc, _T(' '));
+ char *p = wxStrchr(retloc, ' ');
if ( p )
- *p = _T('\0');
+ *p = '\0';
#endif // __AIX__
#elif defined(__WIN32__)
#define SETLOCALE_FAILS_ON_UNICODE_LANGS
#endif
-#if !wxUSE_UNICODE
- const
-#endif
- wxMB2WXbuf retloc = wxT("C");
+ const char *retloc = "C";
if (language != wxLANGUAGE_DEFAULT)
{
if (info->WinLang == 0)
retloc = wxSetlocale(LC_ALL, locale);
#endif
#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
- if (codepage == 0 && (const wxChar*)retloc == NULL)
+ if (codepage == 0 && retloc == NULL)
{
- retloc = wxT("C");
+ retloc = "C";
}
#endif
}
retloc = NULL;
#endif
#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
- if ((const wxChar*)retloc == NULL)
+ if (retloc == NULL)
{
wxChar buffer[16];
if (GetLocaleInfo(LOCALE_USER_DEFAULT,
LOCALE_IDEFAULTANSICODEPAGE, buffer, 16) > 0 &&
wxStrcmp(buffer, wxT("0")) == 0)
{
- retloc = wxT("C");
+ retloc = "C";
}
}
#endif
else
locale = info->CanonicalName;
- wxMB2WXbuf retloc = wxSetlocale(LC_ALL, locale);
+ const char *retloc = wxSetlocale(LC_ALL, locale);
if ( !retloc )
{
// looking
//
// OTOH, maybe we had already found a language match and in this
- // case don't overwrite it becauce the entry for the default
+ // case don't overwrite it because the entry for the default
// country always appears first in ms_languagesDB
if ( !infoRet )
infoRet = info;
const wxString& domain) const
{
if ( origString.empty() )
- return origString;
+ return GetUntranslatedString(origString);
const wxString *trans = NULL;
wxMsgCatalog *pMsgCat;
#endif // __WXDEBUG__
if (n == size_t(-1))
- return origString;
+ return GetUntranslatedString(origString);
else
- return n == 1 ? origString : origString2;
+ return GetUntranslatedString(n == 1 ? origString : origString2);
}
return *trans;
}
+WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual,
+ wxLocaleUntranslatedStrings);
+
+/* static */
+const wxString& wxLocale::GetUntranslatedString(const wxString& str)
+{
+ static wxLocaleUntranslatedStrings s_strings;
+
+ wxLocaleUntranslatedStrings::iterator i = s_strings.find(str);
+ if ( i == s_strings.end() )
+ return *s_strings.insert(str).first;
+
+ return *i;
+}
+
wxString wxLocale::GetHeaderValue(const wxString& header,
const wxString& domain) const
{
return false;
#elif defined(__UNIX__)
-
- // Test if setting the locale works, then set it back.
- wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, wxEmptyString);
- wxMB2WXbuf tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName);
+
+ // Test if setting the locale works, then set it back.
+ const char *oldLocale = wxSetlocale(LC_ALL, "");
+ const char *tmp = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName);
if ( !tmp )
{
// Some C libraries don't like xx_YY form and require xx only
- tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName.Left(2));
+ tmp = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName.Left(2));
if ( !tmp )
return false;
}
// restore the original locale
- wxSetlocale(LC_ALL, oldLocale);
-#endif
+ wxSetlocale(LC_ALL, oldLocale);
+#endif
return true;
}