+ // 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 )
+ {
+ langFull.Truncate(posEndLang);
+ }
+
+ // in addition to the format above, we also can have full language names
+ // in LANG env var - for example, SuSE is known to use LANG="german" - so
+ // check for this
+
+ // do we have just the language (or sublang too)?
+ bool justLang = langFull.Len() == LEN_LANG;
+ if ( justLang ||
+ (langFull.Len() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) )
+ {
+ // 0. Make sure the lang is according to latest ISO 639
+ // (this is neccessary because glibc uses iw and in instead
+ // of he and id respectively).
+
+ // the language itself (second part is the dialect/sublang)
+ wxString langOrig = ExtractLang(langFull);
+
+ wxString lang;
+ if ( langOrig == wxT("iw"))
+ lang = _T("he");
+ else if ( langOrig == wxT("in") )
+ lang = wxT("id");
+ else if ( langOrig == wxT("ji") )
+ lang = wxT("yi");
+ else
+ lang = langOrig;
+
+ // did we change it?
+ if ( lang != langOrig )