From 201d9d78529ea096af3d2e407555229aeece9ffe Mon Sep 17 00:00:00 2001 From: ThorstenB <brehmt@gmail.com> Date: Wed, 18 Apr 2012 15:43:42 +0200 Subject: [PATCH] Be more tolerant about locale name when detecting the default language, i.e. consider the German resource provided for "de_DE" or "de" when locale name is "de_DE.utf8". --- src/Main/fg_init.cxx | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) 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()); }