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:
@@ -108,9 +108,13 @@ Changes in behaviour which may result in build errors
|
|||||||
3.1.3: (released 2019-??-??)
|
3.1.3: (released 2019-??-??)
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
All:
|
INCOMPATIBLE CHANGES SINCE 3.1.2:
|
||||||
|
|
||||||
|
- New wxTranslations::GetAcceptableTranslations() method was problematic and
|
||||||
|
was removed, fixing various regressions in wxTranslations::AddCatalog() that
|
||||||
|
were introduced by it. Thanks to Tomasz Słodkowicz and Dummy for reporting
|
||||||
|
this and providing fixes for it.
|
||||||
|
|
||||||
- Fix regression in wxTranslations::AddCatalog() in 3.1.2 (Tomasz Słodkowicz).
|
|
||||||
|
|
||||||
All (GUI):
|
All (GUI):
|
||||||
|
|
||||||
|
@@ -145,12 +145,6 @@ public:
|
|||||||
wxString GetBestTranslation(const wxString& domain,
|
wxString GetBestTranslation(const wxString& domain,
|
||||||
const wxString& msgIdLanguage = "en");
|
const wxString& msgIdLanguage = "en");
|
||||||
|
|
||||||
// find best and all other suitable translation languages for given domain
|
|
||||||
wxArrayString GetAcceptableTranslations(const wxString& domain,
|
|
||||||
wxLanguage msgIdLanguage);
|
|
||||||
wxArrayString GetAcceptableTranslations(const wxString& domain,
|
|
||||||
const wxString& msgIdLanguage = "en");
|
|
||||||
|
|
||||||
// add standard wxWidgets catalog ("wxstd")
|
// add standard wxWidgets catalog ("wxstd")
|
||||||
bool AddStdCatalog();
|
bool AddStdCatalog();
|
||||||
|
|
||||||
|
@@ -136,34 +136,6 @@ public:
|
|||||||
wxString GetBestTranslation(const wxString& domain,
|
wxString GetBestTranslation(const wxString& domain,
|
||||||
const wxString& msgIdLanguage = "en");
|
const wxString& msgIdLanguage = "en");
|
||||||
|
|
||||||
/**
|
|
||||||
Returns the languages of all translations that can be used for the @a
|
|
||||||
domain.
|
|
||||||
|
|
||||||
This is a more general version of GetBestTranslation(), which returns
|
|
||||||
the whole list of preferred UI languages for which a translation for
|
|
||||||
the @a domain was found instead of just the first, i.e. the most
|
|
||||||
preferred, element of this list.
|
|
||||||
|
|
||||||
@param domain
|
|
||||||
The catalog domain to look for.
|
|
||||||
|
|
||||||
@param msgIdLanguage
|
|
||||||
Specifies the language of "msgid" strings in source code (i.e.
|
|
||||||
arguments to GetString(), wxGetTranslation() and the _() macro).
|
|
||||||
|
|
||||||
@return An array of language codes if any suitable matches were found,
|
|
||||||
empty array otherwise.
|
|
||||||
|
|
||||||
@since 3.1.2
|
|
||||||
*/
|
|
||||||
wxArrayString GetAcceptableTranslations(const wxString& domain,
|
|
||||||
wxLanguage msgIdLanguage);
|
|
||||||
|
|
||||||
/// @overload
|
|
||||||
wxArrayString GetAcceptableTranslations(const wxString& domain,
|
|
||||||
const wxString& msgIdLanguage = "en");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add standard wxWidgets catalogs ("wxstd" and possible port-specific
|
Add standard wxWidgets catalogs ("wxstd" and possible port-specific
|
||||||
catalogs).
|
catalogs).
|
||||||
@@ -175,10 +147,9 @@ public:
|
|||||||
bool AddStdCatalog();
|
bool AddStdCatalog();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add a catalog for the preferred UI language. In case of multiple
|
Add a catalog for use with the current locale.
|
||||||
preferences, add catalog for each language, if available.
|
|
||||||
|
|
||||||
By default, the catalog is searched for in standard places (see
|
By default, it is searched for in standard places (see
|
||||||
wxFileTranslationsLoader), but you may also prepend additional
|
wxFileTranslationsLoader), but you may also prepend additional
|
||||||
directories to the search path with
|
directories to the search path with
|
||||||
wxFileTranslationsLoader::AddCatalogLookupPathPrefix().
|
wxFileTranslationsLoader::AddCatalogLookupPathPrefix().
|
||||||
@@ -202,9 +173,8 @@ public:
|
|||||||
code are used instead.
|
code are used instead.
|
||||||
|
|
||||||
@return
|
@return
|
||||||
@true if catalog in the most preferred language was successfully loaded,
|
@true if catalog was successfully loaded, @false otherwise (which might
|
||||||
@false otherwise (which might mean that the catalog is not found or that
|
mean that the catalog is not found or that it isn't in the correct format).
|
||||||
it isn't in the correct format).
|
|
||||||
*/
|
*/
|
||||||
bool AddCatalog(const wxString& domain,
|
bool AddCatalog(const wxString& domain,
|
||||||
wxLanguage msgIdLanguage = wxLANGUAGE_ENGLISH_US);
|
wxLanguage msgIdLanguage = wxLANGUAGE_ENGLISH_US);
|
||||||
@@ -230,9 +200,8 @@ public:
|
|||||||
in case they use 8-bit characters (e.g. German or French strings).
|
in case they use 8-bit characters (e.g. German or French strings).
|
||||||
|
|
||||||
@return
|
@return
|
||||||
@true if catalog in the most preferred language was successfully loaded,
|
@true if catalog was successfully loaded, @false otherwise (which might
|
||||||
@false otherwise (which might mean that the catalog is not found or that
|
mean that the catalog is not found or that it isn't in the correct format).
|
||||||
it isn't in the correct format).
|
|
||||||
*/
|
*/
|
||||||
bool AddCatalog(const wxString& domain,
|
bool AddCatalog(const wxString& domain,
|
||||||
wxLanguage msgIdLanguage,
|
wxLanguage msgIdLanguage,
|
||||||
|
@@ -127,7 +127,7 @@ wxString GetPreferredUILanguageFallback(const wxArrayString& WXUNUSED(available)
|
|||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
|
|
||||||
wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString& allPreferred)
|
wxString GetPreferredUILanguage(const wxArrayString& available)
|
||||||
{
|
{
|
||||||
typedef BOOL (WINAPI *GetUserPreferredUILanguages_t)(DWORD, PULONG, PWSTR, PULONG);
|
typedef BOOL (WINAPI *GetUserPreferredUILanguages_t)(DWORD, PULONG, PWSTR, PULONG);
|
||||||
static GetUserPreferredUILanguages_t s_pfnGetUserPreferredUILanguages = NULL;
|
static GetUserPreferredUILanguages_t s_pfnGetUserPreferredUILanguages = NULL;
|
||||||
@@ -172,20 +172,18 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString& a
|
|||||||
wxString lang(*j);
|
wxString lang(*j);
|
||||||
lang.Replace("-", "_");
|
lang.Replace("-", "_");
|
||||||
if ( available.Index(lang, /*bCase=*/false) != wxNOT_FOUND )
|
if ( available.Index(lang, /*bCase=*/false) != wxNOT_FOUND )
|
||||||
allPreferred.Add(lang);
|
return lang;
|
||||||
size_t pos = lang.find('_');
|
size_t pos = lang.find('_');
|
||||||
if ( pos != wxString::npos )
|
if ( pos != wxString::npos )
|
||||||
{
|
{
|
||||||
lang = lang.substr(0, pos);
|
lang = lang.substr(0, pos);
|
||||||
if ( available.Index(lang, /*bCase=*/false) != wxNOT_FOUND )
|
if ( available.Index(lang, /*bCase=*/false) != wxNOT_FOUND )
|
||||||
allPreferred.Add(lang);
|
return lang;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( !allPreferred.empty() )
|
|
||||||
return allPreferred[0];
|
|
||||||
|
|
||||||
return GetPreferredUILanguageFallback(available);
|
return GetPreferredUILanguageFallback(available);
|
||||||
}
|
}
|
||||||
@@ -209,7 +207,7 @@ void LogTraceArray(const char *prefix, CFArrayRef arr)
|
|||||||
|
|
||||||
#endif // wxUSE_LOG_TRACE
|
#endif // wxUSE_LOG_TRACE
|
||||||
|
|
||||||
wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &allPreferred)
|
wxString GetPreferredUILanguage(const wxArrayString& available)
|
||||||
{
|
{
|
||||||
wxStringToStringHashMap availableNormalized;
|
wxStringToStringHashMap availableNormalized;
|
||||||
wxCFRef<CFMutableArrayRef> availableArr(
|
wxCFRef<CFMutableArrayRef> availableArr(
|
||||||
@@ -233,19 +231,17 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &a
|
|||||||
LogTraceArray(" - system preferred languages", prefArr);
|
LogTraceArray(" - system preferred languages", prefArr);
|
||||||
|
|
||||||
unsigned prefArrLength = CFArrayGetCount(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
|
// Lookup the name in 'available' by index -- we need to get the
|
||||||
// original value corresponding to the normalized one chosen.
|
// 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);
|
wxStringToStringHashMap::const_iterator i = availableNormalized.find(lang);
|
||||||
if ( i == availableNormalized.end() )
|
if ( i == availableNormalized.end() )
|
||||||
allPreferred.push_back(lang);
|
return lang;
|
||||||
else
|
else
|
||||||
allPreferred.push_back(i->second);
|
return i->second;
|
||||||
}
|
}
|
||||||
if ( allPreferred.empty() == false )
|
|
||||||
return allPreferred[0];
|
|
||||||
|
|
||||||
return GetPreferredUILanguageFallback(available);
|
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
|
// The LANGUAGE variable may contain a colon separated list of language
|
||||||
// codes in the order of preference.
|
// codes in the order of preference.
|
||||||
// http://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html
|
// 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;
|
wxString languageFromEnv;
|
||||||
wxArrayString preferred;
|
wxArrayString preferred;
|
||||||
@@ -287,17 +283,15 @@ wxString GetPreferredUILanguage(const wxArrayString& available, wxArrayString &a
|
|||||||
{
|
{
|
||||||
wxString lang(*j);
|
wxString lang(*j);
|
||||||
if ( available.Index(lang) != wxNOT_FOUND )
|
if ( available.Index(lang) != wxNOT_FOUND )
|
||||||
allPreferred.Add(lang);
|
return lang;
|
||||||
size_t pos = lang.find('_');
|
size_t pos = lang.find('_');
|
||||||
if ( pos != wxString::npos )
|
if ( pos != wxString::npos )
|
||||||
{
|
{
|
||||||
lang = lang.substr(0, pos);
|
lang = lang.substr(0, pos);
|
||||||
if ( available.Index(lang) != wxNOT_FOUND )
|
if ( available.Index(lang) != wxNOT_FOUND )
|
||||||
allPreferred.Add(lang);
|
return lang;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( allPreferred.empty() == false )
|
|
||||||
return allPreferred[0];
|
|
||||||
|
|
||||||
return GetPreferredUILanguageFallback(available);
|
return GetPreferredUILanguageFallback(available);
|
||||||
}
|
}
|
||||||
@@ -1555,9 +1549,9 @@ bool wxTranslations::AddCatalog(const wxString& domain,
|
|||||||
wxLanguage msgIdLanguage)
|
wxLanguage msgIdLanguage)
|
||||||
{
|
{
|
||||||
const wxString msgIdLang = wxLocale::GetLanguageCanonicalName(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,
|
wxLogTrace(TRACE_I18N,
|
||||||
wxS("no suitable translation for domain '%s' found"),
|
wxS("no suitable translation for domain '%s' found"),
|
||||||
@@ -1565,30 +1559,11 @@ bool wxTranslations::AddCatalog(const wxString& domain,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool success = false;
|
|
||||||
for ( wxArrayString::const_iterator lang = domain_langs.begin();
|
|
||||||
lang != domain_langs.end();
|
|
||||||
++lang )
|
|
||||||
{
|
|
||||||
wxLogTrace(TRACE_I18N,
|
wxLogTrace(TRACE_I18N,
|
||||||
wxS("adding '%s' translation for domain '%s' (msgid language '%s')"),
|
wxS("adding '%s' translation for domain '%s' (msgid language '%s')"),
|
||||||
*lang, domain, msgIdLang);
|
domain_lang, domain, msgIdLang);
|
||||||
|
|
||||||
// We determine success by the success of loading/failing to load
|
return LoadCatalog(domain, domain_lang, msgIdLang);
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1675,37 +1650,20 @@ wxString wxTranslations::GetBestTranslation(const wxString& domain,
|
|||||||
wxString wxTranslations::GetBestTranslation(const wxString& domain,
|
wxString wxTranslations::GetBestTranslation(const wxString& domain,
|
||||||
const wxString& msgIdLanguage)
|
const wxString& msgIdLanguage)
|
||||||
{
|
{
|
||||||
const wxArrayString allGoodOnes = GetAcceptableTranslations(domain, msgIdLanguage);
|
// explicitly set language should always be respected
|
||||||
wxString best(allGoodOnes.empty() ? wxString() : allGoodOnes[0]);
|
if ( !m_lang.empty() )
|
||||||
wxLogTrace(TRACE_I18N, " => using language '%s'", best);
|
return m_lang;
|
||||||
return best;
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
wxArrayString available(GetAvailableTranslations(domain));
|
||||||
// it's OK to have duplicates, so just add msgid language
|
// it's OK to have duplicates, so just add msgid language
|
||||||
available.push_back(msgIdLanguage);
|
available.push_back(msgIdLanguage);
|
||||||
available.push_back(msgIdLanguage.BeforeFirst('_'));
|
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);
|
LogTraceArray(" - available translations", available);
|
||||||
wxArrayString allPreferred;
|
const wxString lang = GetPreferredUILanguage(available);
|
||||||
GetPreferredUILanguage(available, allPreferred);
|
wxLogTrace(TRACE_I18N, " => using language '%s'", lang);
|
||||||
|
return lang;
|
||||||
// explicitly set language should always be preferred the most
|
|
||||||
if ( !m_lang.empty() )
|
|
||||||
allPreferred.insert(allPreferred.begin(), m_lang);
|
|
||||||
|
|
||||||
return allPreferred;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user