X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b34b163019430b9e6f715020695f85ede79602f..091e74e76b63f04a4058995c5dcc6f5b8b6db362:/src/common/intl.cpp diff --git a/src/common/intl.cpp b/src/common/intl.cpp index bac6f22053..f8129005d8 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -962,14 +962,14 @@ public: ~wxMsgCatalog(); // load the catalog from disk (szDirPrefix corresponds to language) - bool Load(const wxChar *szDirPrefix, const wxChar *szName, - const wxChar *msgIdCharset = NULL, bool bConvertEncoding = false); + bool Load(const wxString& dirPrefix, const wxString& name, + const wxString& msgIdCharset, bool bConvertEncoding = false); // get name of the catalog wxString GetName() const { return m_name; } // get the translated string: returns NULL if not found - const wxChar *GetString(const wxChar *sz, size_t n = size_t(-1)) const; + const wxString *GetString(const wxString& sz, size_t n = size_t(-1)) const; // public variable pointing to the next element in a linked list (or NULL) wxMsgCatalog *m_pNext; @@ -1304,7 +1304,7 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, : new wxCSConv(msgIdCharset); #elif wxUSE_FONTMAP - wxASSERT_MSG( msgIdCharset == NULL, + wxASSERT_MSG( msgIdCharset.empty(), _T("non-ASCII msgid languages only supported if wxUSE_WCHAR_T=1") ); wxEncodingConverter converter; @@ -1374,7 +1374,7 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, msgstr = str; #else // !wxUSE_WCHAR_T #if wxUSE_FONTMAP - if ( convertEncoding ) + if ( bConvertEncoding ) msgstr = wxString(converter.Convert(str)); else #endif @@ -1418,14 +1418,14 @@ wxMsgCatalog::~wxMsgCatalog() } } -bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName, - const wxChar *msgIdCharset, bool bConvertEncoding) +bool wxMsgCatalog::Load(const wxString& dirPrefix, const wxString& name, + const wxString& msgIdCharset, bool bConvertEncoding) { wxMsgCatalogFile file; - m_name = szName; + m_name = name; - if ( !file.Load(szDirPrefix, szName, m_pluralFormsCalculator) ) + if ( !file.Load(dirPrefix, name, m_pluralFormsCalculator) ) return false; file.FillHash(m_messages, msgIdCharset, bConvertEncoding); @@ -1449,7 +1449,7 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName, return true; } -const wxChar *wxMsgCatalog::GetString(const wxChar *sz, size_t n) const +const wxString *wxMsgCatalog::GetString(const wxString& str, size_t n) const { int index = 0; if (n != size_t(-1)) @@ -1459,16 +1459,16 @@ const wxChar *wxMsgCatalog::GetString(const wxChar *sz, size_t n) const wxMessagesHash::const_iterator i; if (index != 0) { - i = m_messages.find(wxString(sz) + wxChar(index)); // plural + i = m_messages.find(wxString(str) + wxChar(index)); // plural } else { - i = m_messages.find(sz); + i = m_messages.find(str); } if ( i != m_messages.end() ) { - return i->second.c_str(); + return &i->second; } else return NULL; @@ -1512,28 +1512,30 @@ void wxLocale::DoCommonInit() } // NB: this function has (desired) side effect of changing current locale -bool wxLocale::Init(const wxChar *szName, - const wxChar *szShort, - const wxChar *szLocale, - bool bLoadDefault, - bool bConvertEncoding) +bool wxLocale::Init(const wxString& name, + const wxString& shortName, + const wxString& locale, + bool bLoadDefault, + bool bConvertEncoding) { wxASSERT_MSG( !m_initialized, _T("you can't call wxLocale::Init more than once") ); m_initialized = true; - m_strLocale = szName; - m_strShort = szShort; + m_strLocale = name; + m_strShort = shortName; m_bConvertEncoding = bConvertEncoding; m_language = wxLANGUAGE_UNKNOWN; // change current locale (default: same as long name) - if ( szLocale == NULL ) + wxString szLocale(locale); + if ( szLocale.empty() ) { // the argument to setlocale() - szLocale = szShort; + 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__ @@ -1566,10 +1568,10 @@ bool wxLocale::Init(const wxChar *szName, if ( m_strShort.empty() ) { // FIXME I don't know how these 2 letter abbreviations are formed, // this wild guess is surely wrong - if ( szLocale && szLocale[0] ) + if ( !szLocale.empty() ) { m_strShort += (wxChar)wxTolower(szLocale[0]); - if ( szLocale[1] ) + if ( szLocale.length() > 1 ) m_strShort += (wxChar)wxTolower(szLocale[1]); } } @@ -1598,10 +1600,14 @@ bool wxLocale::Init(const wxChar *szName, #if defined(__UNIX__) && wxUSE_UNICODE && !defined(__WXMAC__) -static wxWCharBuffer wxSetlocaleTryUTF(int c, const wxChar *lc) +static wxWCharBuffer wxSetlocaleTryUTF8(int c, const wxChar *lc) { - wxMB2WXbuf l = wxSetlocale(c, lc); - if ( !l && lc && lc[0] != 0 ) + wxMB2WXbuf l; + + // 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 && lc[0] != 0 ) { wxString buf(lc); wxString buf2; @@ -1623,10 +1629,15 @@ static wxWCharBuffer wxSetlocaleTryUTF(int c, const wxChar *lc) l = wxSetlocale(c, buf2.c_str()); } } + + // 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) @@ -1664,13 +1675,13 @@ bool wxLocale::Init(int language, int flags) if (language != wxLANGUAGE_DEFAULT) locale = info->CanonicalName; - wxMB2WXbuf retloc = wxSetlocaleTryUTF(LC_ALL, locale); + wxMB2WXbuf 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 @@ -1711,9 +1722,9 @@ bool wxLocale::Init(int language, int flags) 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)); } } @@ -1724,12 +1735,13 @@ bool wxLocale::Init(int language, int flags) } #ifdef __AIX__ - // at least in AIX 5.2 libc is buggy and the string returned from setlocale(LC_ALL) - // can't be passed back to it because it returns 6 strings (one for each locale - // category), i.e. for C locale we get back "C C C C C C" + // at least in AIX 5.2 libc is buggy and the string returned from + // setlocale(LC_ALL) can't be passed back to it because it returns 6 + // strings (one for each locale category), i.e. for C locale we get back + // "C C C C C C" // - // this contradicts IBM own docs but this is not of much help, so just work around - // it in the crudest possible manner + // 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(' ')); if ( p ) *p = _T('\0'); @@ -1859,11 +1871,9 @@ bool wxLocale::Init(int language, int flags) #endif #ifndef WX_NO_LOCALE_SUPPORT - wxChar *szLocale = retloc ? wxStrdup(retloc) : NULL; - bool ret = Init(name, canonical, szLocale, + bool ret = Init(name, canonical, retloc, (flags & wxLOCALE_LOAD_DEFAULT) != 0, (flags & wxLOCALE_CONV_ENCODING) != 0); - free(szLocale); if (IsOk()) // setlocale() succeeded m_language = lang; @@ -2592,43 +2602,43 @@ wxLocale::~wxLocale() } // get the translation of given string in current locale -const wxChar *wxLocale::GetString(const wxChar *szOrigString, - const wxChar *szDomain) const +const wxString& wxLocale::GetString(const wxString& origString, + const wxString& domain) const { - return GetString(szOrigString, szOrigString, size_t(-1), szDomain); + return GetString(origString, origString, size_t(-1), domain); } -const wxChar *wxLocale::GetString(const wxChar *szOrigString, - const wxChar *szOrigString2, - size_t n, - const wxChar *szDomain) const +const wxString& wxLocale::GetString(const wxString& origString, + const wxString& origString2, + size_t n, + const wxString& domain) const { - if ( wxIsEmpty(szOrigString) ) - return wxEmptyString; + if ( origString.empty() ) + return origString; - const wxChar *pszTrans = NULL; + const wxString *trans = NULL; wxMsgCatalog *pMsgCat; - if ( szDomain != NULL ) + if ( !domain.empty() ) { - pMsgCat = FindCatalog(szDomain); + pMsgCat = FindCatalog(domain); // does the catalog exist? if ( pMsgCat != NULL ) - pszTrans = pMsgCat->GetString(szOrigString, n); + trans = pMsgCat->GetString(origString, n); } else { // search in all domains for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) { - pszTrans = pMsgCat->GetString(szOrigString, n); - if ( pszTrans != NULL ) // take the first found + trans = pMsgCat->GetString(origString, n); + if ( trans != NULL ) // take the first found break; } } - if ( pszTrans == NULL ) + if ( trans == NULL ) { #ifdef __WXDEBUG__ if ( !NoTransErr::Suppress() ) @@ -2637,83 +2647,80 @@ const wxChar *wxLocale::GetString(const wxChar *szOrigString, wxLogTrace(TRACE_I18N, _T("string \"%s\"[%ld] not found in %slocale '%s'."), - szOrigString, (long)n, - szDomain - ? (const wxChar*)wxString::Format(_T("domain '%s' "), szDomain).c_str() + origString, (long)n, + domain.empty() + ? (const wxChar*)wxString::Format(_T("domain '%s' "), domain).c_str() : _T(""), m_strLocale.c_str()); } #endif // __WXDEBUG__ if (n == size_t(-1)) - return szOrigString; + return origString; else - return n == 1 ? szOrigString : szOrigString2; + return n == 1 ? origString : origString2; } - return pszTrans; + return *trans; } -wxString wxLocale::GetHeaderValue( const wxChar* szHeader, - const wxChar* szDomain ) const +wxString wxLocale::GetHeaderValue(const wxString& header, + const wxString& domain) const { - if ( wxIsEmpty(szHeader) ) + if ( header.empty() ) return wxEmptyString; - wxChar const * pszTrans = NULL; + const wxString *trans = NULL; wxMsgCatalog *pMsgCat; - if ( szDomain != NULL ) + if ( !domain.empty() ) { - pMsgCat = FindCatalog(szDomain); + pMsgCat = FindCatalog(domain); // does the catalog exist? if ( pMsgCat == NULL ) return wxEmptyString; - pszTrans = pMsgCat->GetString(wxEmptyString, (size_t)-1); + trans = pMsgCat->GetString(wxEmptyString, (size_t)-1); } else { // search in all domains for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) { - pszTrans = pMsgCat->GetString(wxEmptyString, (size_t)-1); - if ( pszTrans != NULL ) // take the first found + trans = pMsgCat->GetString(wxEmptyString, (size_t)-1); + if ( trans != NULL ) // take the first found break; } } - if ( wxIsEmpty(pszTrans) ) + if ( !trans || trans->empty() ) return wxEmptyString; - wxChar const * pszFound = wxStrstr(pszTrans, szHeader); - if ( pszFound == NULL ) + size_t found = trans->find(header); + if ( found == wxString::npos ) return wxEmptyString; - pszFound += wxStrlen(szHeader) + 2 /* ': ' */; + found += header.length() + 2 /* ': ' */; // Every header is separated by \n - wxChar const * pszEndLine = wxStrchr(pszFound, wxT('\n')); - if ( pszEndLine == NULL ) pszEndLine = pszFound + wxStrlen(pszFound); - - - // wxString( wxChar*, length); - wxString retVal( pszFound, pszEndLine - pszFound ); + size_t endLine = trans->find(wxT('\n'), found); + size_t len = (endLine == wxString::npos) ? + wxString::npos : (endLine - found); - return retVal; + return trans->substr(found, len); } // find catalog by name in a linked list, return NULL if !found -wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const +wxMsgCatalog *wxLocale::FindCatalog(const wxString& domain) const { // linear search in the linked list wxMsgCatalog *pMsgCat; for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) { - if ( wxStricmp(pMsgCat->GetName(), szDomain) == 0 ) + if ( pMsgCat->GetName() == domain ) return pMsgCat; } @@ -2743,11 +2750,11 @@ bool wxLocale::IsAvailable(int lang) // Test if setting the locale works, then set it back. wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, wxEmptyString); - wxMB2WXbuf tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName); + wxMB2WXbuf 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; } @@ -2759,21 +2766,21 @@ bool wxLocale::IsAvailable(int lang) } // check if the given catalog is loaded -bool wxLocale::IsLoaded(const wxChar *szDomain) const +bool wxLocale::IsLoaded(const wxString& szDomain) const { return FindCatalog(szDomain) != NULL; } // add a catalog to our linked list -bool wxLocale::AddCatalog(const wxChar *szDomain) +bool wxLocale::AddCatalog(const wxString& szDomain) { - return AddCatalog(szDomain, wxLANGUAGE_ENGLISH_US, NULL); + return AddCatalog(szDomain, wxLANGUAGE_ENGLISH_US, wxEmptyString); } // add a catalog to our linked list -bool wxLocale::AddCatalog(const wxChar *szDomain, - wxLanguage msgIdLanguage, - const wxChar *msgIdCharset) +bool wxLocale::AddCatalog(const wxString& szDomain, + wxLanguage msgIdLanguage, + const wxString& msgIdCharset) { wxMsgCatalog *pMsgCat = new wxMsgCatalog;