1
# Backport of http://code.google.com/p/chromium/issues/detail?id=83397
4
base/i18n/rtl.cc | 10 +++++++++-
5
ui/base/l10n/l10n_util.cc | 20 ++++++++++++++------
6
ui/base/l10n/l10n_util_unittest.cc | 17 +++++++++++++++++
7
3 files changed, 40 insertions(+), 7 deletions(-)
9
Index: src/base/i18n/rtl.cc
10
===================================================================
11
--- src.orig/base/i18n/rtl.cc
12
+++ src/base/i18n/rtl.cc
14
#include "unicode/uscript.h"
16
#if defined(TOOLKIT_USES_GTK)
22
-// Extract language and country, ignore keywords, concatenate using dash.
23
+// Extract language, country and variant, but ignore keywords. For example,
24
+// en-US, ca@valencia, ca-ES@valencia.
25
std::string GetLocaleString(const icu::Locale& locale) {
26
const char* language = locale.getLanguage();
27
const char* country = locale.getCountry();
28
+ const char* variant = locale.getVariant();
31
(language != NULL && *language != '\0') ? language : "und";
33
if (country != NULL && *country != '\0') {
38
+ if (variant != NULL && *variant != '\0') {
39
+ std::string variant_str(variant);
40
+ StringToLowerASCII(&variant_str);
41
+ result += '@' + variant_str;
52
Index: src/ui/base/l10n/l10n_util.cc
53
===================================================================
54
--- src.orig/ui/base/l10n/l10n_util.cc
55
+++ src/ui/base/l10n/l10n_util.cc
58
bool CheckAndResolveLocale(const std::string& locale,
59
const FilePath& locale_path,
60
std::string* resolved_locale) {
61
if (IsLocaleAvailable(locale, locale_path)) {
62
*resolved_locale = locale;
66
+ // If there's a variant, skip over it so we can try without the region
67
+ // code. For example, ca_ES@valencia should cause us to try ca@valencia
69
+ std::string::size_type variant_pos = locale.find('@');
70
+ if (variant_pos != std::string::npos)
73
// If the locale matches language but not country, use that instead.
74
// TODO(jungshik) : Nothing is done about languages that Chrome
75
// does not support but available on Windows. We fall
76
// back to en-US in GetApplicationLocale so that it's a not critical,
77
// but we can do better.
78
std::string::size_type hyphen_pos = locale.find('-');
79
if (hyphen_pos != std::string::npos && hyphen_pos > 0) {
80
std::string lang(locale, 0, hyphen_pos);
81
std::string region(locale, hyphen_pos + 1);
82
std::string tmp_locale(lang);
83
// Map es-RR other than es-ES to es-419 (Chrome's Latin American
85
if (LowerCaseEqualsASCII(lang, "es") && !LowerCaseEqualsASCII(region, "es"))
86
tmp_locale.append("-419");
87
else if (LowerCaseEqualsASCII(lang, "zh")) {
88
// Map zh-HK and zh-MO to zh-TW. Otherwise, zh-FOO is mapped to zh-CN.
89
- if (LowerCaseEqualsASCII(region, "hk") ||
90
- LowerCaseEqualsASCII(region, "mo")) { // Macao
91
- tmp_locale.append("-TW");
93
- tmp_locale.append("-CN");
95
+ if (LowerCaseEqualsASCII(region, "hk") ||
96
+ LowerCaseEqualsASCII(region, "mo")) { // Macao
97
+ tmp_locale.append("-TW");
99
+ tmp_locale.append("-CN");
102
if (IsLocaleAvailable(tmp_locale, locale_path)) {
103
resolved_locale->swap(tmp_locale);
108
// Google updater uses no, iw and en for our nb, he, and en-US.
109
Index: src/ui/base/l10n/l10n_util_unittest.cc
110
===================================================================
111
--- src.orig/ui/base/l10n/l10n_util_unittest.cc
112
+++ src/ui/base/l10n/l10n_util_unittest.cc
113
@@ -135,16 +135,18 @@
127
static const char kLocaleFileExtension[] = ".dll";
128
#elif defined(OS_POSIX)
129
static const char kLocaleFileExtension[] = ".pak";
131
for (size_t i = 0; i < arraysize(filenames); ++i) {
132
@@ -188,16 +190,31 @@
133
EXPECT_EQ("fr", l10n_util::GetApplicationLocale(""));
134
env->UnSetVar("LANGUAGE");
135
EXPECT_EQ("es", l10n_util::GetApplicationLocale(""));
136
env->UnSetVar("LC_ALL");
137
EXPECT_EQ("he", l10n_util::GetApplicationLocale(""));
138
env->UnSetVar("LC_MESSAGES");
139
EXPECT_EQ("nb", l10n_util::GetApplicationLocale(""));
140
env->UnSetVar("LANG");
142
+ SetDefaultLocaleForTest("ca", env.get());
143
+ EXPECT_EQ("ca", l10n_util::GetApplicationLocale(""));
145
+ SetDefaultLocaleForTest("ca-ES", env.get());
146
+ EXPECT_EQ("ca", l10n_util::GetApplicationLocale(""));
148
+ SetDefaultLocaleForTest("ca@valencia", env.get());
149
+ EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(""));
151
+ SetDefaultLocaleForTest("ca_ES@valencia", env.get());
152
+ EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(""));
154
+ SetDefaultLocaleForTest("ca_ES.UTF8@valencia", env.get());
155
+ EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(""));
156
#endif // defined(OS_POSIX) && !defined(OS_CHROMEOS)
158
SetDefaultLocaleForTest("en-US", env.get());
159
EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(""));
161
SetDefaultLocaleForTest("xx", env.get());
162
EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(""));