X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c88c6e94c01df742f16f19fb2dd63a490b4d57bf..700dbceb374774f5207a2daf2b7ea69e08bfd56f:/src/common/intl.cpp diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 31332b83ba..c1055e99e3 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -1137,7 +1137,7 @@ bool wxMsgCatalogFile::Load(const wxChar *szDirPrefix, const wxChar *szName, return false; size_t nSize = wx_truncate_cast(size_t, lenFile); - wxASSERT_MSG( nSize == lenFile, _T("message catalog bigger than 4GB?") ); + wxASSERT_MSG( nSize == lenFile + size_t(0), _T("message catalog bigger than 4GB?") ); // read the whole file in memory m_pData = new size_t8[nSize]; @@ -1254,14 +1254,23 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, if ( convertEncoding ) { if ( m_charset.empty() ) + { inputConv = wxConvCurrent; + } else + { inputConv = csConv = new wxCSConv(m_charset); + } } - else // no conversion needed + else // no need to convert the encoding { + // we still need the conversion for Unicode build +#if wxUSE_UNICODE + inputConv = wxConvCurrent; +#else // !wxUSE_UNICODE inputConv = NULL; +#endif // wxUSE_UNICODE/!wxUSE_UNICODE } // conversion to apply to msgid strings before looking them up: we only @@ -1308,18 +1317,18 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, #endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T (void)convertEncoding; // get rid of warnings about unused parameter - for (size_t i = 0; i < m_numStrings; i++) + for (size_t32 i = 0; i < m_numStrings; i++) { const char *data = StringAtOfs(m_pOrigTable, i); #if wxUSE_UNICODE wxString msgid(data, *inputConv); #else // ASCII wxString msgid; -#if wxUSE_WCHAR_T - if ( inputConv && sourceConv ) - msgid = wxString(inputConv->cMB2WC(data), *sourceConv); - else -#endif + #if wxUSE_WCHAR_T + if ( inputConv && sourceConv ) + msgid = wxString(inputConv->cMB2WC(data), *sourceConv); + else + #endif msgid = data; #endif // wxUSE_UNICODE @@ -1591,60 +1600,83 @@ bool wxLocale::Init(int language, int flags) wxString locale; // Set the locale: -#if defined(__UNIX__) && !defined(__WXMAC__) - if (language == wxLANGUAGE_DEFAULT) - locale = wxEmptyString; - else +#if defined(__OS2__) + wxMB2WXbuf retloc = wxSetlocale(LC_ALL , wxEmptyString); +#elif defined(__UNIX__) && !defined(__WXMAC__) + if (language != wxLANGUAGE_DEFAULT) locale = info->CanonicalName; wxMB2WXbuf retloc = wxSetlocaleTryUTF(LC_ALL, locale); -#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" - // - // 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'); -#endif // __AIX__ - + 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, locale.Mid(0,2)); + retloc = wxSetlocaleTryUTF(LC_ALL, langOnly); } + +#if wxUSE_FONTMAP + // some systems (e.g. FreeBSD and HP-UX) don't have xx_YY aliases but + // require the full xx_YY.encoding form, so try using UTF-8 because this is + // the only thing we can do generically + // + // TODO: add encodings applicable to each language to the lang DB and try + // them all in turn here if ( !retloc ) { - // Some C libraries (namely glibc) still use old ISO 639, - // so will translate the abbrev for them - wxString mid = locale.Mid(0,2); - if (mid == wxT("he")) - locale = wxT("iw") + locale.Mid(3); - else if (mid == wxT("id")) - locale = wxT("in") + locale.Mid(3); - else if (mid == wxT("yi")) - locale = wxT("ji") + locale.Mid(3); - else if (mid == wxT("nb")) - locale = wxT("no_NO"); - else if (mid == wxT("nn")) - locale = wxT("no_NY"); - - retloc = wxSetlocaleTryUTF(LC_ALL, locale); + const wxChar **names = + wxFontMapperBase::GetAllEncodingNames(wxFONTENCODING_UTF8); + while ( *names ) + { + retloc = wxSetlocale(LC_ALL, locale + _T('.') + *names++); + if ( retloc ) + break; + } } +#endif // wxUSE_FONTMAP + if ( !retloc ) { - // (This time, we changed locale in previous if-branch, so try again.) - // Some C libraries don't like xx_YY form and require xx only - retloc = wxSetlocaleTryUTF(LC_ALL, locale.Mid(0,2)); + // Some C libraries (namely glibc) still use old ISO 639, + // so will translate the abbrev for them + wxString localeAlt; + if ( langOnly == wxT("he") ) + localeAlt = wxT("iw") + locale.Mid(3); + else if ( langOnly == wxT("id") ) + localeAlt = wxT("in") + locale.Mid(3); + else if ( langOnly == wxT("yi") ) + localeAlt = wxT("ji") + locale.Mid(3); + else if ( langOnly == wxT("nb") ) + localeAlt = wxT("no_NO"); + else if ( langOnly == wxT("nn") ) + localeAlt = wxT("no_NY"); + + if ( !localeAlt.empty() ) + { + retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt); + if ( !retloc ) + retloc = wxSetlocaleTryUTF(LC_ALL, locale.Left(2)); + } } + if ( !retloc ) { wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str()); return false; } + +#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" + // + // 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'); +#endif // __AIX__ + #elif defined(__WIN32__) #if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__)) @@ -1762,9 +1794,8 @@ bool wxLocale::Init(int language, int flags) wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str()); return false; } -#elif defined(__WXPM__) - wxMB2WXbuf retloc = wxSetlocale(LC_ALL , wxEmptyString); #else + wxUnusedVar(flags); return false; #define WX_NO_LOCALE_SUPPORT #endif @@ -3545,4 +3576,3 @@ void wxLocale::InitLanguagesDB() // --- --- --- generated code ends here --- --- --- #endif // wxUSE_INTL -