diff options
author | Johannes Schickel | 2010-11-25 18:40:56 +0000 |
---|---|---|
committer | Johannes Schickel | 2010-11-25 18:40:56 +0000 |
commit | 189c9bf216e8c802cff7087ccb6c11805ecbc0ca (patch) | |
tree | c7ae01eb2b0d3a9281f12e4108e0e3be21d2c1ab | |
parent | 601494cad4968ac2246a0c0820bfd9f01ec249ad (diff) | |
download | scummvm-rg350-189c9bf216e8c802cff7087ccb6c11805ecbc0ca.tar.gz scummvm-rg350-189c9bf216e8c802cff7087ccb6c11805ecbc0ca.tar.bz2 scummvm-rg350-189c9bf216e8c802cff7087ccb6c11805ecbc0ca.zip |
OSYSTEM: Add API to query the system locale.
I also adapted the SDL backend to implement the API.
svn-id: r54479
-rw-r--r-- | backends/platform/sdl/sdl.cpp | 67 | ||||
-rw-r--r-- | backends/platform/sdl/sdl.h | 2 | ||||
-rw-r--r-- | common/system.cpp | 4 | ||||
-rw-r--r-- | common/system.h | 20 | ||||
-rw-r--r-- | common/util.cpp | 68 | ||||
-rw-r--r-- | common/util.h | 3 |
6 files changed, 141 insertions, 23 deletions
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 8a139e5c1b..ea7d4b0523 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -53,6 +53,12 @@ #include <time.h> // for getTimeAndDate() +#ifdef USE_DETECTLANG +#ifndef WIN32 +#include <locale.h> +#endif // !WIN32 +#endif + //#define SAMPLES_PER_SEC 11025 #define SAMPLES_PER_SEC 22050 //#define SAMPLES_PER_SEC 44100 @@ -586,6 +592,67 @@ void OSystem_SDL::logMessage(LogMessageType::Type type, const char *message) { #endif } +Common::Language OSystem_SDL::getSystemLanguage() const { +#ifdef USE_DETECTLANG +#ifdef WIN32 + // We can not use "setlocale" (at least not for MSVC builds), since it + // will return locales like: "English_USA.1252", thus we need a special + // way to determine the locale string for Win32. + char langName[9]; + char ctryName[9]; + + const LCID languageIdentifier = GetThreadLocale(); + + // GetLocalInfo is only supported starting from Windows 2000, according to this: + // http://msdn.microsoft.com/en-us/library/dd318101%28VS.85%29.aspx + // On the other hand the locale constants used, seem to exist on Windows 98 too, + // check this for that: http://msdn.microsoft.com/en-us/library/dd464799%28v=VS.85%29.aspx + // + // I am not exactly sure what is the truth now, it might be very well that this breaks + // support for systems older than Windows 2000.... + // + // TODO: Check whether this (or ScummVM at all ;-) works on a system with Windows 98 for + // example and if it does not and we still want Windows 9x support, we should definitly + // think of another solution. + if (GetLocaleInfo(languageIdentifier, LOCALE_SISO639LANGNAME, langName, sizeof(langName)) != 0 && + GetLocaleInfo(languageIdentifier, LOCALE_SISO3166CTRYNAME, ctryName, sizeof(ctryName)) != 0) { + Common::String localeName = langName; + localeName += "_"; + localeName += ctryName; + + return Common::parseLanguageFromLocale(localeName.c_str()); + } else { + return Common::UNK_LANG; + } +#else // WIN32 + // Activating current locale settings + const char *locale = "de_DE.utf8";//setlocale(LC_ALL, ""); + + // Detect the language from the locale + if (!locale) { + return Common::UNK_LANG; + } else { + int length = 0; + + // Strip out additional information, like + // ".UTF-8" or the like. We do this, since + // our translation languages are usually + // specified without any charset information. + for (int i = 0; locale[i]; ++i, ++length) { + // TODO: Check whether "@" should really be checked + // here. + if (locale[i] == '.' || locale[i] == ' ' || locale[i] == '@') + break; + } + + return Common::parseLanguageFromLocale(Common::String(locale, length).c_str()); + } +#endif // WIN32 +#else // USE_DETECTLANG + return Common::UNK_LANG; +#endif // USE_DETECTLANG +} + void OSystem_SDL::setupIcon() { int x, y, w, h, ncols, nbytes, i; unsigned int rgba[256]; diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 328bb03426..9af8885283 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -194,6 +194,8 @@ public: // Logging virtual void logMessage(LogMessageType::Type type, const char *message); + virtual Common::Language getSystemLanguage() const; + void deinit(); virtual void getTimeAndDate(TimeDate &t) const; diff --git a/common/system.cpp b/common/system.cpp index e14e5ea7d3..1da5367f22 100644 --- a/common/system.cpp +++ b/common/system.cpp @@ -90,3 +90,7 @@ void OSystem::logMessage(LogMessageType::Type type, const char *message) { fflush(output); } +Common::Language OSystem::getSystemLanguage() const { + return Common::UNK_LANG; +} + diff --git a/common/system.h b/common/system.h index 83d11998a4..4870efc854 100644 --- a/common/system.h +++ b/common/system.h @@ -30,6 +30,7 @@ #include "common/noncopyable.h" #include "common/rect.h" #include "common/list.h" // For OSystem::getSupportedFormats() +#include "common/util.h" // For Common::Language #include "graphics/pixelformat.h" @@ -1050,6 +1051,25 @@ public: */ virtual void logMessage(LogMessageType::Type type, const char *message); + /** + * Returns the locale of the system. + * + * This returns the currently set up locale of the system, on which + * ScummVM is run. + * + * In case the locale can not be prepresented by Common::Language the + * backend should return Common::UNK_LANG. + * + * @see Common::Language + * @see Common::UNK_LANG + * + * The default implementation returns Common::UNK_LANG. + * + * + * @return locale of the system + */ + virtual Common::Language getSystemLanguage() const; + //@} }; diff --git a/common/util.cpp b/common/util.cpp index 533795ca9e..d9e51c6be2 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -107,29 +107,29 @@ bool parseBool(const Common::String &val, bool &valAsBool) { const LanguageDescription g_languages[] = { - { "zh-cn", "Chinese (China)", ZH_CNA }, - { "zh", "Chinese (Taiwan)", ZH_TWN }, - { "cz", "Czech", CZ_CZE }, - { "nl", "Dutch", NL_NLD }, - { "en", "English", EN_ANY }, // Generic English (when only one game version exist) - { "gb", "English (GB)", EN_GRB }, - { "us", "English (US)", EN_USA }, - { "fr", "French", FR_FRA }, - { "de", "German", DE_DEU }, - { "gr", "Greek", GR_GRE }, - { "he", "Hebrew", HE_ISR }, - { "hb", "Hebrew", HE_ISR }, // Deprecated - { "hu", "Hungarian", HU_HUN }, - { "it", "Italian", IT_ITA }, - { "jp", "Japanese", JA_JPN }, - { "kr", "Korean", KO_KOR }, - { "nb", "Norwegian Bokm\xE5l", NB_NOR }, - { "pl", "Polish", PL_POL }, - { "br", "Portuguese", PT_BRA }, - { "ru", "Russian", RU_RUS }, - { "es", "Spanish", ES_ESP }, - { "se", "Swedish", SE_SWE }, - { 0, 0, UNK_LANG } + { "zh-cn", "zh_CN", "Chinese (China)", ZH_CNA }, + { "zh", "zh_TW", "Chinese (Taiwan)", ZH_TWN }, + { "cz", "cs_CZ", "Czech", CZ_CZE }, + { "nl", "nl_NL", "Dutch", NL_NLD }, + { "en", "en", "English", EN_ANY }, // Generic English (when only one game version exist) + { "gb", "en_GB", "English (GB)", EN_GRB }, + { "us", "en_US", "English (US)", EN_USA }, + { "fr", "fr_FR", "French", FR_FRA }, + { "de", "de_DE", "German", DE_DEU }, + { "gr", "el_GR", "Greek", GR_GRE }, + { "he", "he_IL", "Hebrew", HE_ISR }, + { "hb", "he_IL", "Hebrew", HE_ISR }, // Deprecated + { "hu", "hu_HU", "Hungarian", HU_HUN }, + { "it", "it_IT", "Italian", IT_ITA }, + { "jp", "ja_JP", "Japanese", JA_JPN }, + { "kr", "ko_KR", "Korean", KO_KOR }, + { "nb", "nb_NO", "Norwegian Bokm\xE5l", NB_NOR }, // TODO Someone should verify the unix locale + { "pl", "pl_PL", "Polish", PL_POL }, + { "br", "pt_BR", "Portuguese", PT_BRA }, + { "ru", "ru_RU", "Russian", RU_RUS }, + { "es", "es_ES", "Spanish", ES_ESP }, + { "se", "sv_SE", "Swedish", SE_SWE }, + { 0, 0, 0, UNK_LANG } }; Language parseLanguage(const String &str) { @@ -145,6 +145,19 @@ Language parseLanguage(const String &str) { return UNK_LANG; } +Language parseLanguageFromLocale(const char *locale) { + if (!locale || !*locale) + return UNK_LANG; + + const LanguageDescription *l = g_languages; + for (; l->code; ++l) { + if (!strcmp(l->unixLocale, locale)) + return l->id; + } + + return UNK_LANG; +} + const char *getLanguageCode(Language id) { const LanguageDescription *l = g_languages; for (; l->code; ++l) { @@ -154,6 +167,15 @@ const char *getLanguageCode(Language id) { return 0; } +const char *getLanguageLocale(Language id) { + const LanguageDescription *l = g_languages; + for (; l->code; ++l) { + if (l->id == id) + return l->unixLocale; + } + return 0; +} + const char *getLanguageDescription(Language id) { const LanguageDescription *l = g_languages; for (; l->code; ++l) { diff --git a/common/util.h b/common/util.h index 699653918a..fae4975a9b 100644 --- a/common/util.h +++ b/common/util.h @@ -133,6 +133,7 @@ enum Language { struct LanguageDescription { const char *code; + const char *unixLocale; const char *description; Common::Language id; }; @@ -142,7 +143,9 @@ extern const LanguageDescription g_languages[]; /** Convert a string containing a language name into a Language enum value. */ extern Language parseLanguage(const String &str); +extern Language parseLanguageFromLocale(const char *locale); extern const char *getLanguageCode(Language id); +extern const char *getLanguageLocale(Language id); extern const char *getLanguageDescription(Language id); /** |