summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/cros/language_library.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/cros/language_library.cc')
-rw-r--r--chrome/browser/chromeos/cros/language_library.cc50
1 files changed, 33 insertions, 17 deletions
diff --git a/chrome/browser/chromeos/cros/language_library.cc b/chrome/browser/chromeos/cros/language_library.cc
index 712c1a8..10b8c23 100644
--- a/chrome/browser/chromeos/cros/language_library.cc
+++ b/chrome/browser/chromeos/cros/language_library.cc
@@ -42,8 +42,8 @@ bool FindAndUpdateProperty(const chromeos::ImeProperty& new_prop,
// There are some differences between ISO 639-2 (T) and ISO 639-2 B, and
// some language codes are not recognized by ICU (i.e. ICU cannot convert
-// these codes to display names). Hence we convert these codes to ones
-// that ICU recognize.
+// these codes to two-letter language codes and display names). Hence we
+// convert these codes to ones that ICU recognize.
//
// See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes for details.
const char* kIso639VariantMapping[][2] = {
@@ -63,26 +63,42 @@ namespace chromeos {
std::string LanguageLibrary::NormalizeLanguageCode(
const std::string& language_code) {
- // Convert some language codes. See comments at kIso639VariantMapping.
- if (language_code.size() == 3) {
- for (size_t i = 0; i < arraysize(kIso639VariantMapping); ++i) {
- if (language_code == kIso639VariantMapping[i][0]) {
- return kIso639VariantMapping[i][1];
- }
+ // Some ibus engines return locale codes like "zh_CN" as language codes.
+ // Normalize these to like "zh-CN".
+ if (language_code.size() >= 5 && language_code[2] == '_') {
+ std::string copied_language_code = language_code;
+ copied_language_code[2] = '-';
+ // Downcase the language code part.
+ for (size_t i = 0; i < 2; ++i) {
+ copied_language_code[i] = ToLowerASCII(copied_language_code[i]);
}
+ // Upcase the country code part.
+ for (size_t i = 3; i < copied_language_code.size(); ++i) {
+ copied_language_code[i] = ToUpperASCII(copied_language_code[i]);
+ }
+ return copied_language_code;
}
- // We only handle two-letter codes from here.
- // Some ibus engines return locale codes like "zh_CN" as language codes,
- // and we don't want to rewrite this to "zho".
- if (language_code.size() != 2) {
+ // We only handle three-letter codes from here.
+ if (language_code.size() != 3) {
return language_code;
}
- const char* three_letter_code = uloc_getISO3Language(
- language_code.c_str());
- if (three_letter_code && strlen(three_letter_code) > 0) {
- return three_letter_code;
+
+ // Convert special language codes. See comments at kIso639VariantMapping.
+ std::string copied_language_code = language_code;
+ for (size_t i = 0; i < arraysize(kIso639VariantMapping); ++i) {
+ if (language_code == kIso639VariantMapping[i][0]) {
+ copied_language_code = kIso639VariantMapping[i][1];
+ }
+ }
+ // Convert the three-letter code to two letter-code.
+ UErrorCode error = U_ZERO_ERROR;
+ char two_letter_code[ULOC_LANG_CAPACITY];
+ uloc_getLanguage(copied_language_code.c_str(),
+ two_letter_code, sizeof(two_letter_code), &error);
+ if (U_FAILURE(error)) {
+ return language_code;
}
- return language_code;
+ return two_letter_code;
}
bool LanguageLibrary::IsKeyboardLayout(