From 1f658ff72921207392e512df2fbe8cea66b5ceb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Va=CC=81clav=20Slavi=CC=81k?= Date: Tue, 13 Feb 2024 13:38:37 +0100 Subject: [PATCH] Override GetPreferredUILanguages with WXLANGUAGE Add support for overriding GetPreferredUILanguages() return value by setting the WXLANGUAGE environment variable to a colon-separated list of desired languages (same as GNU's LANGUAGE variable). Primarily used for unit tests, but may be more generally useful. --- docs/doxygen/overviews/envvars.h | 6 ++++++ src/common/uilocale.cpp | 30 +++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/doxygen/overviews/envvars.h b/docs/doxygen/overviews/envvars.h index 7b6386d8e4..21079cc25a 100644 --- a/docs/doxygen/overviews/envvars.h +++ b/docs/doxygen/overviews/envvars.h @@ -51,6 +51,12 @@ wxWidgets programs. default value if it's not a number, so that e.g. setting it to "yes" suppresses all GTK diagnostics while setting it to 16 only suppresses GTK warning messages.} +@itemdef{WXLANGUAGE, + This variable can be set to override OS setting of preferred languages + and make wxUILocale::GetPreferredUILanguages() return the set list + instead. The format is same as GNU's LANGUAGE + variable: a colon-separated list of language codes.} */ @see wxSystemOptions diff --git a/src/common/uilocale.cpp b/src/common/uilocale.cpp index 014d32b678..e52fa2d833 100644 --- a/src/common/uilocale.cpp +++ b/src/common/uilocale.cpp @@ -24,6 +24,9 @@ #include "wx/arrstr.h" #include "wx/intl.h" +#include "wx/log.h" +#include "wx/tokenzr.h" +#include "wx/utils.h" #ifndef __WINDOWS__ #include "wx/language.h" @@ -31,6 +34,8 @@ #include "wx/private/uilocale.h" +#define TRACE_I18N wxS("i18n") + // ---------------------------------------------------------------------------- // helper functions // ---------------------------------------------------------------------------- @@ -678,7 +683,7 @@ int wxUILocale::GetSystemLanguage() { const wxLanguageInfos& languagesDB = wxGetLanguageInfos(); size_t count = languagesDB.size(); - wxVector preferred = wxUILocaleImpl::GetPreferredUILanguages(); + wxVector preferred = wxUILocale::GetPreferredUILanguages(); for (wxVector::const_iterator j = preferred.begin(); j != preferred.end(); @@ -743,6 +748,29 @@ int wxUILocale::GetSystemLocale() /* static */ wxVector wxUILocale::GetPreferredUILanguages() { + // The WXLANGUAGE variable may contain a colon separated list of language + // codes in the order of preference. It is modelled after GNU's LANGUAGE: + // http://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html + wxString languageFromEnv; + if (wxGetEnv("WXLANGUAGE", &languageFromEnv) && !languageFromEnv.empty()) + { + wxVector preferred; + wxStringTokenizer tknzr(languageFromEnv, ":"); + while (tknzr.HasMoreTokens()) + { + const wxString tok = tknzr.GetNextToken(); + if (const wxLanguageInfo* li = wxUILocale::FindLanguageInfo(tok)) + { + preferred.push_back(li->CanonicalName); + } + } + if (!preferred.empty()) + { + wxLogTrace(TRACE_I18N, " - using languages override from WXLANGUAGE: '%s'", languageFromEnv); + return preferred; + } + } + return wxUILocaleImpl::GetPreferredUILanguages(); }