Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Zolotarev <deathbaba@gmail.com>2011-06-04 01:56:29 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:18:53 +0300
commita64b3355df358d37bd7787358d34e2e1f9e93f20 (patch)
tree4e1df0afe3838e8e10dd0ba5cbff54af4a610030 /platform/preferred_languages.cpp
parent62c19e2429429e96d1f548a8fe2cbe02b0ba2195 (diff)
Get user preferred languages on 1st startup and use them for text dislpaying
@TODO windows implementation
Diffstat (limited to 'platform/preferred_languages.cpp')
-rw-r--r--platform/preferred_languages.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/platform/preferred_languages.cpp b/platform/preferred_languages.cpp
new file mode 100644
index 0000000000..130f3fb055
--- /dev/null
+++ b/platform/preferred_languages.cpp
@@ -0,0 +1,114 @@
+#include "preferred_languages.hpp"
+
+#include "../base/string_utils.hpp"
+#include "../base/logging.hpp"
+
+#include "../std/target_os.hpp"
+#include "../std/set.hpp"
+
+#if defined(OMIM_OS_MAC) || defined(OMIM_OS_IPHONE)
+ #include <CoreFoundation/CFLocale.h>
+ #include <CoreFoundation/CFString.h>
+
+#elif defined(OMIM_OS_WINDOWS)
+ // @TODO
+
+#else
+ #error "Define language preferences for your platform"
+
+#endif
+
+namespace languages
+{
+
+class LangFilter
+{
+ set<string> & m_known;
+public:
+ LangFilter(set<string> & known) : m_known(known) {}
+ bool operator()(string const & t)
+ {
+ return !m_known.insert(t).second;
+ }
+};
+
+class NormalizeFilter
+{
+public:
+ void operator()(string & t)
+ {
+ strings::SimpleTokenizer const iter(t, "-_ ");
+ if (iter)
+ t = *iter;
+ else
+ {
+ LOG(LWARNING, ("Invalid language"));
+ }
+ }
+};
+
+void FilterLanguages(vector<string> & langs)
+{
+ // normalize languages: en-US -> en, ru_RU -> ru etc.
+ for_each(langs.begin(), langs.end(), NormalizeFilter());
+ { // tmp storage
+ set<string> known;
+ // remove duplicate languages
+ langs.erase(remove_if(langs.begin(), langs.end(), LangFilter(known)), langs.end());
+ }
+}
+
+void SystemPreferredLanguages(vector<string> & languages)
+{
+#if defined(OMIM_OS_MAC) || defined(OMIM_OS_IPHONE)
+ // Mac and iOS implementation
+ CFArrayRef langs = CFLocaleCopyPreferredLanguages();
+ char buf[30];
+ for (CFIndex i = 0; i < CFArrayGetCount(langs); ++i)
+ {
+ CFStringRef strRef = (CFStringRef)CFArrayGetValueAtIndex(langs, i);
+ CFStringGetCString(strRef, buf, 30, kCFStringEncodingUTF8);
+ languages.push_back(buf);
+ }
+ CFRelease(langs);
+
+#elif defined(OMIM_OS_WINDOWS)
+ // @TODO Windows implementation
+#else
+ #error "Define language preferences for your platform"
+#endif
+
+ FilterLanguages(languages);
+}
+
+string PreferredLanguages()
+{
+ vector<string> arr;
+
+ SystemPreferredLanguages(arr);
+
+ // generate output string
+ string result;
+ for (size_t i = 0; i < arr.size(); ++i)
+ {
+ result.append(arr[i]);
+ result.push_back('|');
+ }
+ if (result.empty())
+ result = "default";
+ else
+ result.resize(result.size() - 1);
+ return result;
+}
+
+string CurrentLanguage()
+{
+ vector<string> arr;
+ SystemPreferredLanguages(arr);
+ if (arr.empty())
+ return "en";
+ else
+ return arr[0];
+}
+
+}