1
0
Fork 0

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".
This commit is contained in:
ThorstenB 2012-04-18 15:43:42 +02:00
parent 516d92c077
commit 201d9d7852

View file

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