diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 8f1141c26..6c255bdc1 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -149,6 +149,24 @@ string fgBasePackageVersion() { return version; } +// +// Select the proper language based on the given locale/language name. +// +static SGPropertyNode* findLocale(SGPropertyNode *intl, const char* language) +{ + vector<SGPropertyNode_ptr> localeList = intl->getChildren("locale"); + for (unsigned int i = 0; i < localeList.size(); i++) { + + vector<SGPropertyNode_ptr> lang = localeList[i]->getChildren("lang"); + for (unsigned int j = 0; j < lang.size(); j++) { + + if (!strcmp(lang[j]->getStringValue(), language)) { + return localeList[i]; + } + } + } + return NULL; +} // Initialize the localization SGPropertyNode *fgInitLocale(const char *language) { @@ -161,20 +179,20 @@ SGPropertyNode *fgInitLocale(const char *language) { if (!intl) return NULL; - // - // Select the proper language from the list - // - vector<SGPropertyNode_ptr> locale = intl->getChildren("locale"); - for (unsigned int i = 0; i < locale.size(); i++) { + c_node = findLocale(intl, language); + if (!c_node) + { + /* be tolerant about locale names, i.e. instead of "de_DE.utf8" also + * consider "de_DE" ... */ + string l = language; + size_t pos = l.find("."); + if ((pos != string::npos)&&(pos>0)) + c_node = findLocale(intl, l.substr(0, pos).c_str()); - vector<SGPropertyNode_ptr> lang = locale[i]->getChildren("lang"); - for (unsigned int j = 0; j < lang.size(); j++) { - - if (!strcmp(lang[j]->getStringValue(), language)) { - c_node = locale[i]; - break; - } - } + /* finally consider country alone, i.e. "de" */ + pos = l.find("_"); + if ((!c_node)&&(pos != string::npos)&&(pos>0)) + c_node = findLocale(intl, l.substr(0, pos).c_str()); }