1
0
Fork 0

Add Windows-specific implementation to determine locale settings.

This commit is contained in:
ThorstenB 2012-05-06 23:15:27 +02:00
parent e794bb8e25
commit 563ed19f97
2 changed files with 55 additions and 4 deletions

View file

@ -18,6 +18,10 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif
#include <simgear/props/props_io.hxx> #include <simgear/props/props_io.hxx>
#include <simgear/structure/exception.hxx> #include <simgear/structure/exception.hxx>
@ -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 // Search property tree for matching locale description
SGPropertyNode* SGPropertyNode*
FGLocale::findLocaleNode(const string& language) FGLocale::findLocaleNode(const string& language)
@ -85,12 +131,12 @@ FGLocale::findLocaleNode(const string& language)
bool bool
FGLocale::selectLanguage(const char *language) 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)) if ((language == NULL)||(language[0]==0))
language = ::getenv("LANG"); language = getUserLanguage();
// Use plain C locale if nothing is available. // 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" ); SG_LOG(SG_GENERAL, SG_INFO, "Unable to detect the language" );
language = "C"; language = "C";
@ -120,7 +166,7 @@ FGLocale::loadResource(SGPropertyNode* localeNode, const char* resource)
const char *path_str = stringNode->getStringValue(resource, NULL); const char *path_str = stringNode->getStringValue(resource, NULL);
if (!path_str) 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; return NULL;
} }

View file

@ -72,6 +72,11 @@ public:
*/ */
static void utf8toLatin1 (std::string& s); static void utf8toLatin1 (std::string& s);
/**
* Obtain user's default language setting.
*/
const char* getUserLanguage();
protected: protected:
/** /**
* Find property node matching given language. * Find property node matching given language.