Index: chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc |
diff --git a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc |
index fec16e0b2c8758335b75adcad7b839dc020f6a4c..6f42f660a4d0882b6edb8fbf77e9d00bbb2e4415 100644 |
--- a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc |
+++ b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc |
@@ -233,7 +233,56 @@ base::ListValue* CrosLanguageOptionsHandler::GetLanguageListInternal( |
configured_locales.size()); |
size_t configured_locales_count = 0; |
+ |
// Build the list of display names, and build the language map. |
+ |
+ // The list of configured locales might have entries not in |
+ // base_language_codes. If there are unsupported language variants, |
+ // but they resolve to backup locale within base_language_codes, also |
+ // add them to the list. |
+ for (std::map<std::string, int>::const_iterator iter = language_index.begin(); |
+ iter != language_index.end(); |
+ ++iter) { |
+ const std::string& language_id = iter->first; |
+ const int language_idx = iter->second; |
+ |
+ const size_t dash_pos = language_id.find_first_of('-'); |
+ |
+ // Ignore non-specific codes. |
+ if (dash_pos == std::string::npos || dash_pos == 0) |
+ continue; |
+ |
+ if (std::find(base_language_codes.begin(), |
+ base_language_codes.end(), |
+ language_id) != base_language_codes.end()) { |
+ // Language is supported. No need to replace |
+ continue; |
+ } |
+ std::string resolved_locale; |
+ if (!l10n_util::CheckAndResolveLocale(language_id, &resolved_locale)) |
+ continue; |
+ |
+ if (std::find(base_language_codes.begin(), |
+ base_language_codes.end(), |
+ resolved_locale) == base_language_codes.end()) { |
+ // Resolved locale is not supported. |
+ continue; |
+ } |
+ |
+ const base::string16 display_name = |
+ l10n_util::GetDisplayNameForLocale(language_id, app_locale, true); |
+ const base::string16 native_display_name = |
+ l10n_util::GetDisplayNameForLocale( |
+ language_id, language_id, true); |
+ |
+ language_map[display_name] = |
+ std::make_pair(language_id, native_display_name); |
+ |
+ configured_locales_display_names[language_idx] = display_name; |
+ ++configured_locales_count; |
+ } |
+ |
+ // Translate language codes, generated from input methods. |
for (std::set<std::string>::const_iterator iter = language_codes.begin(); |
iter != language_codes.end(); ++iter) { |
// Exclude the language which is not in |base_langauge_codes| even it has |
@@ -255,8 +304,12 @@ base::ListValue* CrosLanguageOptionsHandler::GetLanguageListInternal( |
const std::map<std::string, int>::const_iterator index_pos = |
language_index.find(*iter); |
if (index_pos != language_index.end()) { |
- configured_locales_display_names[index_pos->second] = display_name; |
- ++configured_locales_count; |
+ base::string16& stored_display_name = |
+ configured_locales_display_names[index_pos->second]; |
+ if (stored_display_name.empty()) { |
+ stored_display_name = display_name; |
+ ++configured_locales_count; |
+ } |
} else { |
display_names.push_back(display_name); |
} |