diff options
author | Thierry Crozat | 2011-10-03 23:53:22 +0100 |
---|---|---|
committer | Thierry Crozat | 2011-10-03 23:53:22 +0100 |
commit | e3d7606188cfa6896da562bd70541a8aff5561b6 (patch) | |
tree | 47e8d40689d72fe4655f7d0c12af7d245b77d762 | |
parent | 6269dcdd3cf9dfbbee4abd4441c88051edd70ea8 (diff) | |
download | scummvm-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.cpp | 47 | ||||
-rw-r--r-- | backends/platform/sdl/macosx/macosx.h | 2 |
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); |