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();
}