diff options
author | Alex Zolotarev <deathbaba@gmail.com> | 2011-05-11 23:35:48 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:17:14 +0300 |
commit | 932eb8340b49303f1f96ddbced549c0b8f0a1651 (patch) | |
tree | f3a7d628922ed349ee43a7f84051c7f9381681f0 /coding/multilang_utf8_string.cpp | |
parent | 85d29433d58af14bc4ad3fbbf0fc995da460e3a9 (diff) |
Added language preferences support for displayed text
Diffstat (limited to 'coding/multilang_utf8_string.cpp')
-rw-r--r-- | coding/multilang_utf8_string.cpp | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/coding/multilang_utf8_string.cpp b/coding/multilang_utf8_string.cpp index 297d2c22d8..0a7a1d844e 100644 --- a/coding/multilang_utf8_string.cpp +++ b/coding/multilang_utf8_string.cpp @@ -1,10 +1,16 @@ #include "multilang_utf8_string.hpp" +char StringUtf8Multilang::m_priorities[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63 +}; - -char StringUtf8Multilang::GetLangIndex(string const & lang) const +char StringUtf8Multilang::GetLangIndex(string const & lang) { - char const * arr[] = { "def", + static char const * arr[] = { "default", "en", "ja", "fr", "ko_rm", "ar", "de", "ru", "sv", "zh", "fi", "ko", "ka", "he", "be", "nl", "ga", "ja_rm", "el", "it", "es", "th", "zh_pinyin", "ca", "cy", "hu", "hsb", "sr", "fa", "eu", "pl", @@ -75,3 +81,45 @@ bool StringUtf8Multilang::GetString(char lang, string & utf8s) const return false; } + +void StringUtf8Multilang::SetPreferableLanguages(vector<string> const & langCodes) +{ + CHECK_EQUAL(langCodes.size(), 64, ()); + for (size_t i = 0; i < langCodes.size(); ++i) + { + char index = GetLangIndex(langCodes[i]); + if (index >= 0) + m_priorities[static_cast<size_t>(index)] = i; + else + { + ASSERT(false, ("Invalid language code")); + } + CHECK_GREATER_OR_EQUAL(m_priorities[i], 0, ("Unsupported language", langCodes[i])); + } +} + +void StringUtf8Multilang::GetPreferableString(string & utf8s) const +{ + size_t i = 0; + size_t const sz = m_s.size(); + + int currPriority = 256; + while (i < sz) + { + size_t const next = GetNextIndex(i); + + int p = m_priorities[m_s[i] & 0x3F]; + if (p < currPriority) + { + ++i; + + currPriority = p; + utf8s.assign(m_s.c_str() + i, next - i); + + if (p == 0) + return; + } + + i = next; + } +} |