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 commit 14e905858d.

See #18297.

----

Revert "Fix crash in translations code when no translations are found"

This reverts commit 80904d1bc7.

See #18299.

----

Revert "Rename new wxTranslations method to GetAcceptableTranslations()"

This reverts commit 20b02d6169.

----

Revert "Load catalogs for all preferred languages, if they exist"

This reverts commit 2d784da2ee.

----

Revert "Allow getting all usable translations languages"

This reverts commit 5d08e404c7.

----

See #18227, #18300.

Closes #18302.
This commit is contained in:
Vadim Zeitlin
2018-12-23 17:24:13 +01:00
parent 2c737bfbc0
commit 270ad54abe
4 changed files with 36 additions and 111 deletions

View File

@@ -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;
}