- wxString lang;
- if (!wxGetEnv(wxT("LC_ALL"), &lang) &&
- !wxGetEnv(wxT("LC_MESSAGES"), &lang) &&
- !wxGetEnv(wxT("LANG"), &lang))
- return wxLANGUAGE_UNKNOWN;
-
- bool is_abbrev = lang.Len() == 2 ||
- (lang.Len() == 5 && lang[2] == wxT('_'));
-
- // 0. Make sure the abbrev is according to latest ISO 639
- // (this is neccessary because glibc uses iw and in instead
- // of he and id respectively).
- if (is_abbrev)
+ // first get the string identifying the language from the environment
+ wxString langFull;
+ if (!wxGetEnv(wxT("LC_ALL"), &langFull) &&
+ !wxGetEnv(wxT("LC_MESSAGES"), &langFull) &&
+ !wxGetEnv(wxT("LANG"), &langFull))
+ {
+ // no language specified, threat it as English
+ return wxLANGUAGE_ENGLISH;
+ }
+
+ if ( langFull == _T("C") || langFull == _T("POSIX") )
+ {
+ // default C locale
+ return wxLANGUAGE_ENGLISH;
+ }
+
+ // the language string has the following form
+ //
+ // lang[_LANG][.encoding][@modifier]
+ //
+ // (see environ(5) in the Open Unix specification)
+ //
+ // where lang is the primary language, LANG is a sublang/territory,
+ // encoding is the charset to use and modifier "allows the user to select
+ // a specific instance of localization data within a single category"
+ //
+ // for example, the following strings are valid:
+ // fr
+ // fr_FR
+ // de_DE.iso88591
+ // de_DE@euro
+ // de_DE.iso88591@euro
+
+ // for now we don't use the encoding, although we probably should (doing
+ // translations of the msg catalogs on the fly as required) (TODO)
+ //
+ // we don't use the modifiers neither but we probably should translate
+ // "euro" into iso885915
+ size_t posEndLang = langFull.find_first_of(_T("@."));
+ if ( posEndLang != wxString::npos )