Revert all recent changes to wxTranslations
The latest changes to wxTranslations::AddCatalog() behaviour were not backwards-compatible and also had other problem, so revert them for now, even if this means that #18227 has to be reopened. This is a combination of the following commits: ---- Revert "Fix regression in wxTranslations::AddCatalog()" This reverts commit14e905858d
. See #18297. ---- Revert "Fix crash in translations code when no translations are found" This reverts commit80904d1bc7
. See #18299. ---- Revert "Rename new wxTranslations method to GetAcceptableTranslations()" This reverts commit20b02d6169
. ---- Revert "Load catalogs for all preferred languages, if they exist" This reverts commit2d784da2ee
. ---- Revert "Allow getting all usable translations languages" This reverts commit5d08e404c7
. ---- See #18227, #18300. Closes #18302.
This commit is contained in:
@@ -127,7 +127,7 @@ wxString GetPreferredUILanguageFallback(const wxArrayString& WXUNUSED(available)
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
|
||||
wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString& allPreferred)
|
||||
wxString GetPreferredUILanguage(const wxArrayString& available)
|
||||
{
|
||||
typedef BOOL (WINAPI *GetUserPreferredUILanguages_t)(DWORD, PULONG, PWSTR, PULONG);
|
||||
static GetUserPreferredUILanguages_t s_pfnGetUserPreferredUILanguages = NULL;
|
||||
@@ -172,20 +172,18 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString& a
|
||||
wxString lang(*j);
|
||||
lang.Replace("-", "_");
|
||||
if ( available.Index(lang, /*bCase=*/false) != wxNOT_FOUND )
|
||||
allPreferred.Add(lang);
|
||||
return lang;
|
||||
size_t pos = lang.find('_');
|
||||
if ( pos != wxString::npos )
|
||||
{
|
||||
lang = lang.substr(0, pos);
|
||||
if ( available.Index(lang, /*bCase=*/false) != wxNOT_FOUND )
|
||||
allPreferred.Add(lang);
|
||||
return lang;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !allPreferred.empty() )
|
||||
return allPreferred[0];
|
||||
|
||||
return GetPreferredUILanguageFallback(available);
|
||||
}
|
||||
@@ -209,7 +207,7 @@ void LogTraceArray(const char *prefix, CFArrayRef arr)
|
||||
|
||||
#endif // wxUSE_LOG_TRACE
|
||||
|
||||
wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &allPreferred)
|
||||
wxString GetPreferredUILanguage(const wxArrayString& available)
|
||||
{
|
||||
wxStringToStringHashMap availableNormalized;
|
||||
wxCFRef<CFMutableArrayRef> availableArr(
|
||||
@@ -233,19 +231,17 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &a
|
||||
LogTraceArray(" - system preferred languages", prefArr);
|
||||
|
||||
unsigned prefArrLength = CFArrayGetCount(prefArr);
|
||||
for ( size_t x = 0; x < prefArrLength; ++x )
|
||||
if ( prefArrLength > 0 )
|
||||
{
|
||||
// Lookup the name in 'available' by index -- we need to get the
|
||||
// original value corresponding to the normalized one chosen.
|
||||
wxString lang(wxCFStringRef::AsString((CFStringRef)CFArrayGetValueAtIndex(prefArr, x)));
|
||||
wxString lang(wxCFStringRef::AsString((CFStringRef)CFArrayGetValueAtIndex(prefArr, 0)));
|
||||
wxStringToStringHashMap::const_iterator i = availableNormalized.find(lang);
|
||||
if ( i == availableNormalized.end() )
|
||||
allPreferred.push_back(lang);
|
||||
return lang;
|
||||
else
|
||||
allPreferred.push_back(i->second);
|
||||
return i->second;
|
||||
}
|
||||
if ( allPreferred.empty() == false )
|
||||
return allPreferred[0];
|
||||
|
||||
return GetPreferredUILanguageFallback(available);
|
||||
}
|
||||
@@ -259,7 +255,7 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &a
|
||||
// The LANGUAGE variable may contain a colon separated list of language
|
||||
// codes in the order of preference.
|
||||
// http://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html
|
||||
wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &allPreferred)
|
||||
wxString GetPreferredUILanguage(const wxArrayString& available)
|
||||
{
|
||||
wxString languageFromEnv;
|
||||
wxArrayString preferred;
|
||||
@@ -287,17 +283,15 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &a
|
||||
{
|
||||
wxString lang(*j);
|
||||
if ( available.Index(lang) != wxNOT_FOUND )
|
||||
allPreferred.Add(lang);
|
||||
return lang;
|
||||
size_t pos = lang.find('_');
|
||||
if ( pos != wxString::npos )
|
||||
{
|
||||
lang = lang.substr(0, pos);
|
||||
if ( available.Index(lang) != wxNOT_FOUND )
|
||||
allPreferred.Add(lang);
|
||||
return lang;
|
||||
}
|
||||
}
|
||||
if ( allPreferred.empty() == false )
|
||||
return allPreferred[0];
|
||||
|
||||
return GetPreferredUILanguageFallback(available);
|
||||
}
|
||||
@@ -1555,9 +1549,9 @@ bool wxTranslations::AddCatalog(const wxString& domain,
|
||||
wxLanguage msgIdLanguage)
|
||||
{
|
||||
const wxString msgIdLang = wxLocale::GetLanguageCanonicalName(msgIdLanguage);
|
||||
const wxArrayString domain_langs = GetAcceptableTranslations(domain, msgIdLanguage);
|
||||
const wxString domain_lang = GetBestTranslation(domain, msgIdLang);
|
||||
|
||||
if ( domain_langs.empty() )
|
||||
if ( domain_lang.empty() )
|
||||
{
|
||||
wxLogTrace(TRACE_I18N,
|
||||
wxS("no suitable translation for domain '%s' found"),
|
||||
@@ -1565,30 +1559,11 @@ bool wxTranslations::AddCatalog(const wxString& domain,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool success = false;
|
||||
for ( wxArrayString::const_iterator lang = domain_langs.begin();
|
||||
lang != domain_langs.end();
|
||||
++lang )
|
||||
{
|
||||
wxLogTrace(TRACE_I18N,
|
||||
wxS("adding '%s' translation for domain '%s' (msgid language '%s')"),
|
||||
*lang, domain, msgIdLang);
|
||||
wxLogTrace(TRACE_I18N,
|
||||
wxS("adding '%s' translation for domain '%s' (msgid language '%s')"),
|
||||
domain_lang, domain, msgIdLang);
|
||||
|
||||
// We determine success by the success of loading/failing to load
|
||||
// the most preferred (i.e. the first one) language's catalog:
|
||||
if ( lang == domain_langs.begin() )
|
||||
success = LoadCatalog(domain, *lang, msgIdLang);
|
||||
else
|
||||
LoadCatalog(domain, *lang, msgIdLang);
|
||||
|
||||
// No use loading languages that are less preferred than the
|
||||
// msgid language, as by definition it contains all the strings
|
||||
// in the msgid language.
|
||||
if ( msgIdLang == *lang )
|
||||
break;
|
||||
}
|
||||
|
||||
return success;
|
||||
return LoadCatalog(domain, domain_lang, msgIdLang);
|
||||
}
|
||||
|
||||
|
||||
@@ -1675,37 +1650,20 @@ wxString wxTranslations::GetBestTranslation(const wxString& domain,
|
||||
wxString wxTranslations::GetBestTranslation(const wxString& domain,
|
||||
const wxString& msgIdLanguage)
|
||||
{
|
||||
const wxArrayString allGoodOnes = GetAcceptableTranslations(domain, msgIdLanguage);
|
||||
wxString best(allGoodOnes.empty() ? wxString() : allGoodOnes[0]);
|
||||
wxLogTrace(TRACE_I18N, " => using language '%s'", best);
|
||||
return best;
|
||||
}
|
||||
// explicitly set language should always be respected
|
||||
if ( !m_lang.empty() )
|
||||
return m_lang;
|
||||
|
||||
wxArrayString wxTranslations::GetAcceptableTranslations(const wxString& domain,
|
||||
wxLanguage msgIdLanguage)
|
||||
{
|
||||
const wxString lang = wxLocale::GetLanguageCanonicalName(msgIdLanguage);
|
||||
return GetAcceptableTranslations(domain, lang);
|
||||
}
|
||||
|
||||
wxArrayString wxTranslations::GetAcceptableTranslations(const wxString& domain,
|
||||
const wxString& msgIdLanguage)
|
||||
{
|
||||
wxArrayString available(GetAvailableTranslations(domain));
|
||||
// it's OK to have duplicates, so just add msgid language
|
||||
available.push_back(msgIdLanguage);
|
||||
available.push_back(msgIdLanguage.BeforeFirst('_'));
|
||||
|
||||
wxLogTrace(TRACE_I18N, "choosing best languages for domain '%s'", domain);
|
||||
wxLogTrace(TRACE_I18N, "choosing best language for domain '%s'", domain);
|
||||
LogTraceArray(" - available translations", available);
|
||||
wxArrayString allPreferred;
|
||||
GetPreferredUILanguage(available, allPreferred);
|
||||
|
||||
// explicitly set language should always be preferred the most
|
||||
if ( !m_lang.empty() )
|
||||
allPreferred.insert(allPreferred.begin(), m_lang);
|
||||
|
||||
return allPreferred;
|
||||
const wxString lang = GetPreferredUILanguage(available);
|
||||
wxLogTrace(TRACE_I18N, " => using language '%s'", lang);
|
||||
return lang;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user