aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2010-11-25 18:40:56 +0000
committerJohannes Schickel2010-11-25 18:40:56 +0000
commit189c9bf216e8c802cff7087ccb6c11805ecbc0ca (patch)
treec7ae01eb2b0d3a9281f12e4108e0e3be21d2c1ab
parent601494cad4968ac2246a0c0820bfd9f01ec249ad (diff)
downloadscummvm-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.cpp67
-rw-r--r--backends/platform/sdl/sdl.h2
-rw-r--r--common/system.cpp4
-rw-r--r--common/system.h20
-rw-r--r--common/util.cpp68
-rw-r--r--common/util.h3
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);
/**