From 563ed19f977c0f96c88bdc26bc3977eefa62884d Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Sun, 6 May 2012 23:15:27 +0200 Subject: [PATCH] Add Windows-specific implementation to determine locale settings. --- src/Main/locale.cxx | 54 +++++++++++++++++++++++++++++++++++++++++---- src/Main/locale.hxx | 5 +++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/Main/locale.cxx b/src/Main/locale.cxx index 27aff0c8d..f3c8e9ba3 100644 --- a/src/Main/locale.cxx +++ b/src/Main/locale.cxx @@ -18,6 +18,10 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +#ifdef HAVE_WINDOWS_H +#include +#endif + #include #include @@ -37,6 +41,48 @@ FGLocale::~FGLocale() { } +#ifdef HAVE_WINDOWS_H +/** + * Determine locale/language settings on Windows. + * + * Copyright (C) 1997, 2002, 2003 Martin von Loewis + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies. + * + * This software comes with no warranty. Use at your own risk. + */ +const char* +FGLocale::getUserLanguage() +{ + static char locale[100] = {0}; + + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_SISO639LANGNAME, + locale, sizeof(locale))) + { + size_t i = strlen(locale); + locale[i++] = '_'; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_SISO3166CTRYNAME, + locale+i, (int)(sizeof(locale)-i))) + return locale; + } + + return NULL; +} +#else +/** + * Determine locale/language settings on Linux (and Mac?). + */ +const char* +FGLocale::getUserLanguage() +{ + return ::getenv("LANG"); +} +#endif + // Search property tree for matching locale description SGPropertyNode* FGLocale::findLocaleNode(const string& language) @@ -85,12 +131,12 @@ FGLocale::findLocaleNode(const string& language) bool FGLocale::selectLanguage(const char *language) { - // Use environment setting when no language is given. + // Use system setting when no language is given. if ((language == NULL)||(language[0]==0)) - language = ::getenv("LANG"); + language = getUserLanguage(); // Use plain C locale if nothing is available. - if (language == NULL) + if ((language == NULL)||(language[0]==0)) { SG_LOG(SG_GENERAL, SG_INFO, "Unable to detect the language" ); language = "C"; @@ -120,7 +166,7 @@ FGLocale::loadResource(SGPropertyNode* localeNode, const char* resource) const char *path_str = stringNode->getStringValue(resource, NULL); if (!path_str) { - SG_LOG(SG_GENERAL, SG_ALERT, "No path in " << stringNode->getPath() << "/" << resource << "."); + SG_LOG(SG_GENERAL, SG_WARN, "No path in " << stringNode->getPath() << "/" << resource << "."); return NULL; } diff --git a/src/Main/locale.hxx b/src/Main/locale.hxx index e9d2a5ae0..8ccd2d218 100644 --- a/src/Main/locale.hxx +++ b/src/Main/locale.hxx @@ -72,6 +72,11 @@ public: */ static void utf8toLatin1 (std::string& s); + /** + * Obtain user's default language setting. + */ + const char* getUserLanguage(); + protected: /** * Find property node matching given language.