Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Side by Side Diff: app/l10n_util.cc

Issue 193027: Chrome UI language menu fix and add Hawaiian to the A-L list. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "app/l10n_util.h" 5 #include "app/l10n_util.h"
6 6
7 #include "app/app_paths.h" 7 #include "app/app_paths.h"
8 #include "app/app_switches.h" 8 #include "app/app_switches.h"
9 #include "app/gfx/canvas.h" 9 #include "app/gfx/canvas.h"
10 #include "app/resource_bundle.h" 10 #include "app/resource_bundle.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 "fr", // French 80 "fr", // French
81 "fr-CA", // French (Canada) 81 "fr-CA", // French (Canada)
82 "fr-CH", // French (Switzerland) 82 "fr-CH", // French (Switzerland)
83 "fr-FR", // French (France) 83 "fr-FR", // French (France)
84 "fy", // Frisian 84 "fy", // Frisian
85 "ga", // Irish 85 "ga", // Irish
86 "gd", // Scots Gaelic 86 "gd", // Scots Gaelic
87 "gl", // Galician 87 "gl", // Galician
88 "gn", // Guarani 88 "gn", // Guarani
89 "gu", // Gujarati 89 "gu", // Gujarati
90 "ha", // Hausa
91 "haw", // Hawaiian
90 "he", // Hebrew 92 "he", // Hebrew
91 "hi", // Hindi 93 "hi", // Hindi
92 "hr", // Croatian 94 "hr", // Croatian
93 "hu", // Hungarian 95 "hu", // Hungarian
94 "hy", // Armenian 96 "hy", // Armenian
95 "ia", // Interlingua 97 "ia", // Interlingua
96 "id", // Indonesian 98 "id", // Indonesian
97 "is", // Icelandic 99 "is", // Icelandic
98 "it", // Italian 100 "it", // Italian
99 "it-CH", // Italian (Switzerland) 101 "it-CH", // Italian (Switzerland)
(...skipping 18 matching lines...) Expand all
118 "mo", // Moldavian 120 "mo", // Moldavian
119 "mr", // Marathi 121 "mr", // Marathi
120 "ms", // Malay 122 "ms", // Malay
121 "mt", // Maltese 123 "mt", // Maltese
122 "nb", // Norwegian (Bokmal) 124 "nb", // Norwegian (Bokmal)
123 "ne", // Nepali 125 "ne", // Nepali
124 "nl", // Dutch 126 "nl", // Dutch
125 "nn", // Norwegian (Nynorsk) 127 "nn", // Norwegian (Nynorsk)
126 "no", // Norwegian 128 "no", // Norwegian
127 "oc", // Occitan 129 "oc", // Occitan
130 "om", // Oromo
128 "or", // Oriya 131 "or", // Oriya
129 "pa", // Punjabi 132 "pa", // Punjabi
130 "pl", // Polish 133 "pl", // Polish
131 "ps", // Pashto 134 "ps", // Pashto
132 "pt", // Portuguese 135 "pt", // Portuguese
133 "pt-BR", // Portuguese (Brazil) 136 "pt-BR", // Portuguese (Brazil)
134 "pt-PT", // Portuguese (Portugal) 137 "pt-PT", // Portuguese (Portugal)
135 "qu", // Quechua 138 "qu", // Quechua
136 "rm", // Romansh 139 "rm", // Romansh
137 "ro", // Romanian 140 "ro", // Romanian
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 // has to be added manually in GetAvailableLocales(). 252 // has to be added manually in GetAvailableLocales().
250 if (LowerCaseEqualsASCII(locale_name.substr(0, 3), "es_")) 253 if (LowerCaseEqualsASCII(locale_name.substr(0, 3), "es_"))
251 return true; 254 return true;
252 for (size_t i = 0; i < arraysize(kDuplicateNames); ++i) { 255 for (size_t i = 0; i < arraysize(kDuplicateNames); ++i) {
253 if (base::strcasecmp(kDuplicateNames[i], locale_name.c_str()) == 0) 256 if (base::strcasecmp(kDuplicateNames[i], locale_name.c_str()) == 0)
254 return true; 257 return true;
255 } 258 }
256 return false; 259 return false;
257 } 260 }
258 261
262 bool IsLocaleNameTranslated(const char* locale,
263 const std::string& display_locale) {
264 string16 display_name =
265 l10n_util::GetDisplayNameForLocale(locale, display_locale, false);
266 // Because ICU sets the error code to U_USING_DEFAULT_WARNING whether or not
267 // uloc_getDisplayName returns the actual translation or the default
268 // value (locale code), we have to rely on this hack to tell whether
269 // the translation is available or not. If ICU doesn't have a translated
270 // name for this locale, GetDisplayNameForLocale will just return the
271 // locale code.
272 return !IsStringASCII(display_name) || UTF16ToASCII(display_name) != locale;
273 }
274
275 // We added 30+ minimally populated locales with only a few entries
276 // (exemplar character set, script, writing direction and its own
277 // lanaguage name). These locales have to be distinguished from the
278 // fully populated locales to which Chrome is localized.
279 bool IsLocalePartiallyPopulated(const std::string& locale_name) {
280 // For partially populated locales, even the translation for "English"
281 // is not available. A more robust/elegant way to check is to add a special
282 // field (say, 'isPartial' to our version of ICU locale files) and
283 // check its value, but this hack seems to work well.
284 return !IsLocaleNameTranslated("en", locale_name);
285 }
286
259 bool IsLocaleAvailable(const std::string& locale, 287 bool IsLocaleAvailable(const std::string& locale,
260 const FilePath& locale_path) { 288 const FilePath& locale_path) {
261 // If locale has any illegal characters in it, we don't want to try to 289 // If locale has any illegal characters in it, we don't want to try to
262 // load it because it may be pointing outside the locale data file directory. 290 // load it because it may be pointing outside the locale data file directory.
263 if (!file_util::IsFilenameLegal(ASCIIToUTF16(locale))) 291 if (!file_util::IsFilenameLegal(ASCIIToUTF16(locale)))
264 return false; 292 return false;
265 293
266 if (!l10n_util::IsLocaleSupportedByOS(locale)) 294 if (!l10n_util::IsLocaleSupportedByOS(locale))
267 return false; 295 return false;
268 296
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 886
859 const std::vector<std::string>& GetAvailableLocales() { 887 const std::vector<std::string>& GetAvailableLocales() {
860 static std::vector<std::string> locales; 888 static std::vector<std::string> locales;
861 if (locales.empty()) { 889 if (locales.empty()) {
862 int num_locales = uloc_countAvailable(); 890 int num_locales = uloc_countAvailable();
863 for (int i = 0; i < num_locales; ++i) { 891 for (int i = 0; i < num_locales; ++i) {
864 std::string locale_name = uloc_getAvailable(i); 892 std::string locale_name = uloc_getAvailable(i);
865 // Filter out the names that have aliases. 893 // Filter out the names that have aliases.
866 if (IsDuplicateName(locale_name)) 894 if (IsDuplicateName(locale_name))
867 continue; 895 continue;
896 // Filter out locales for which we have only partially populated data
897 // and to which Chrome is not localized.
898 if (IsLocalePartiallyPopulated(locale_name))
899 continue;
868 if (!IsLocaleSupportedByOS(locale_name)) 900 if (!IsLocaleSupportedByOS(locale_name))
869 continue; 901 continue;
870 // Normalize underscores to hyphens because that's what our locale files 902 // Normalize underscores to hyphens because that's what our locale files
871 // use. 903 // use.
872 std::replace(locale_name.begin(), locale_name.end(), '_', '-'); 904 std::replace(locale_name.begin(), locale_name.end(), '_', '-');
873 905
874 // Map the Chinese locale names over to zh-CN and zh-TW. 906 // Map the Chinese locale names over to zh-CN and zh-TW.
875 if (LowerCaseEqualsASCII(locale_name, "zh-hans")) { 907 if (LowerCaseEqualsASCII(locale_name, "zh-hans")) {
876 locale_name = "zh-CN"; 908 locale_name = "zh-CN";
877 } else if (LowerCaseEqualsASCII(locale_name, "zh-hant")) { 909 } else if (LowerCaseEqualsASCII(locale_name, "zh-hant")) {
878 locale_name = "zh-TW"; 910 locale_name = "zh-TW";
879 } 911 }
880 locales.push_back(locale_name); 912 locales.push_back(locale_name);
881 } 913 }
882 914
883 // Manually add 'es-419' to the list. See the comment in IsDuplicateName(). 915 // Manually add 'es-419' to the list. See the comment in IsDuplicateName().
884 locales.push_back("es-419"); 916 locales.push_back("es-419");
885 } 917 }
886 return locales; 918 return locales;
887 } 919 }
888 920
889 void GetAcceptLanguagesForLocale(const std::string& display_locale, 921 void GetAcceptLanguagesForLocale(const std::string& display_locale,
890 std::vector<std::string>* locale_codes) { 922 std::vector<std::string>* locale_codes) {
891 for (size_t i = 0; i < arraysize(kAcceptLanguageList); ++i) { 923 for (size_t i = 0; i < arraysize(kAcceptLanguageList); ++i) {
892 string16 display_name = 924 if (!IsLocaleNameTranslated(kAcceptLanguageList[i], display_locale))
893 l10n_util::GetDisplayNameForLocale(kAcceptLanguageList[i], 925 // TODO(jungshik) : Put them at the of the list with language codes
894 display_locale, false); 926 // enclosed by brackets instead of skipping.
895 // This is a hack. If ICU doesn't have a translated name for 927 continue;
896 // this language, GetDisplayNameForLocale will just return the
897 // language code. In that case, we skip it.
898 // TODO(jungshik) : Put them at the of the list with language codes
899 // enclosed by brackets.
900 if (IsStringASCII(display_name) &&
901 UTF16ToASCII(display_name) == kAcceptLanguageList[i])
902 continue;
903 locale_codes->push_back(kAcceptLanguageList[i]); 928 locale_codes->push_back(kAcceptLanguageList[i]);
904 } 929 }
905 } 930 }
906 931
907 BiDiLineIterator::~BiDiLineIterator() { 932 BiDiLineIterator::~BiDiLineIterator() {
908 if (bidi_) { 933 if (bidi_) {
909 ubidi_close(bidi_); 934 ubidi_close(bidi_);
910 bidi_ = NULL; 935 bidi_ = NULL;
911 } 936 }
912 } 937 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
947 } 972 }
948 973
949 void BiDiLineIterator::GetLogicalRun(int start, 974 void BiDiLineIterator::GetLogicalRun(int start,
950 int* end, 975 int* end,
951 UBiDiLevel* level) { 976 UBiDiLevel* level) {
952 DCHECK(bidi_ != NULL); 977 DCHECK(bidi_ != NULL);
953 ubidi_getLogicalRun(bidi_, start, end, level); 978 ubidi_getLogicalRun(bidi_, start, end, level);
954 } 979 }
955 980
956 } 981 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698