aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Crozat2011-10-03 23:53:22 +0100
committerThierry Crozat2011-10-03 23:53:22 +0100
commite3d7606188cfa6896da562bd70541a8aff5561b6 (patch)
tree47e8d40689d72fe4655f7d0c12af7d245b77d762
parent6269dcdd3cf9dfbbee4abd4441c88051edd70ea8 (diff)
downloadscummvm-rg350-e3d7606188cfa6896da562bd70541a8aff5561b6.tar.gz
scummvm-rg350-e3d7606188cfa6896da562bd70541a8aff5561b6.tar.bz2
scummvm-rg350-e3d7606188cfa6896da562bd70541a8aff5561b6.zip
MACOSX: Detect system preferred language when starting bundle
This reimplement getSystemLanguage() for MacOS X because setlocale() only works if the application is started from the terminal. Instead we use CFBundleCopyPreferredLocalizationsFromArray() which requires the translations to be listed in the bundle plist file (this had already been committed). This fixes bug #3394080.
-rw-r--r--backends/platform/sdl/macosx/macosx.cpp47
-rw-r--r--backends/platform/sdl/macosx/macosx.h2
2 files changed, 49 insertions, 0 deletions
diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp
index d9de4e5e33..639bd980f6 100644
--- a/backends/platform/sdl/macosx/macosx.cpp
+++ b/backends/platform/sdl/macosx/macosx.cpp
@@ -118,4 +118,51 @@ bool OSystem_MacOSX::displayLogFile() {
return err != noErr;
}
+Common::String OSystem_MacOSX::getSystemLanguage() const {
+#if defined(USE_DETECTLANG) && defined(USE_TRANSLATION)
+ CFArrayRef availableLocalizations = CFBundleCopyBundleLocalizations(CFBundleGetMainBundle());
+ if (availableLocalizations) {
+ CFArrayRef preferredLocalizations = CFBundleCopyPreferredLocalizationsFromArray(availableLocalizations);
+ CFRelease(availableLocalizations);
+ if (preferredLocalizations) {
+ CFIndex localizationsSize = CFArrayGetCount(preferredLocalizations);
+ // Since we have a list of sorted preferred localization, I would like here to
+ // check that they are supported by the TranslationManager and take the first
+ // one that is supported. The listed localizations are taken from the Bundle
+ // plist file, so they should all be supported, unless the plist file is not
+ // synchronized with the translations.dat file. So this is not really a big
+ // issue. And because getSystemLanguage() is called from the constructor of
+ // TranslationManager (therefore before the instance pointer is set), calling
+ // TransMan here results in an infinite loop and creation of a lot of TransMan
+ // instances.
+ /*
+ for (CFIndex i = 0 ; i < localizationsSize ; ++i) {
+ CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferredLocalizations, i);
+ char buffer[10];
+ CFStringGetCString(language, buffer, 50, kCFStringEncodingASCII);
+ int32 languageId = TransMan.findMatchingLanguage(buffer);
+ if (languageId != -1) {
+ CFRelease(preferredLocalizations);
+ return TransMan.getLangById(languageId);
+ }
+ }
+ */
+ if (localizationsSize > 0) {
+ CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferredLocalizations, 0);
+ char buffer[10];
+ CFStringGetCString(language, buffer, 50, kCFStringEncodingASCII);
+ CFRelease(preferredLocalizations);
+ return buffer;
+ }
+ CFRelease(preferredLocalizations);
+ }
+
+ }
+ // Falback to POSIX implementation
+ return OSystem_POSIX::getSystemLanguage();
+#else // USE_DETECTLANG
+ return OSystem_POSIX::getSystemLanguage();
+#endif // USE_DETECTLANG
+}
+
#endif
diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h
index 86c70297ec..4837e643b3 100644
--- a/backends/platform/sdl/macosx/macosx.h
+++ b/backends/platform/sdl/macosx/macosx.h
@@ -32,6 +32,8 @@ public:
virtual bool hasFeature(Feature f);
virtual bool displayLogFile();
+
+ virtual Common::String getSystemLanguage() const;
virtual void initBackend();
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);