Index: chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc |
diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc |
index eb0637d6814d79ac3892cb7471ccd5aa2024d973..9c4766f03d2f85333124cb5c8f848ca663994e9c 100644 |
--- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc |
+++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc |
@@ -72,6 +72,32 @@ void AddOptgroupOtherLayouts(base::ListValue* input_methods_list) { |
input_methods_list->Append(optgroup); |
} |
+std::string CalculateSelectedLanguage(const std::string& requested_locale, |
Nikita (slow)
2014/04/07 04:54:27
nit: Add comment.
Alexander Alekseev
2014/04/07 16:56:28
Done.
|
+ const std::string& loaded_locale) { |
+ const size_t dash_pos_requested = requested_locale.find_first_of('-'); |
+ |
+ // Requested language doesn't have specific country. |
Nikita (slow)
2014/04/07 04:54:27
nit: It's better to use "region" instead of "count
Alexander Alekseev
2014/04/07 16:56:28
Done.
|
+ if (dash_pos_requested == std::string::npos || dash_pos_requested == 0) |
+ return loaded_locale; |
+ |
+ const size_t dash_pos_loaded = loaded_locale.find_first_of('-'); |
+ |
+ // loaded_locale doesn't have 'country' name and requested_locale |
+ // is a country-specific language of loaded_locale. |
+ if (dash_pos_loaded == std::string::npos || dash_pos_loaded == 0) { |
+ if (requested_locale.substr(0, dash_pos_requested) == loaded_locale) |
+ return requested_locale; |
+ // languages differ |
Nikita (slow)
2014/04/07 04:54:27
nit: Capitalize comment.
Alexander Alekseev
2014/04/07 16:56:28
Done.
|
+ return loaded_locale; |
+ } |
+ // Both locales are country-specific. Check that languages are the same. |
+ if (requested_locale.substr(0, dash_pos_requested) == |
+ loaded_locale.substr(0, dash_pos_loaded)) |
+ return requested_locale; |
+ |
+ return loaded_locale; |
+} |
+ |
} // namespace |
namespace chromeos { |
@@ -239,13 +265,25 @@ struct NetworkScreenHandlerOnLanguageChangedCallbackData { |
// static |
void NetworkScreenHandler::OnLanguageChangedCallback( |
scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> context, |
- const std::string& /*requested locale*/, |
- const std::string& /*loaded_locale*/, |
- const bool /*success*/) { |
+ const std::string& requested_locale, |
+ const std::string& loaded_locale, |
+ const bool success) { |
if (!context or !context->handler_) |
return; |
NetworkScreenHandler* const self = context->handler_.get(); |
+ |
+ if (success) { |
+ if (requested_locale == loaded_locale) { |
+ self->selected_language_code_ = requested_locale; |
+ } else { |
+ self->selected_language_code_ = |
+ CalculateSelectedLanguage(requested_locale, loaded_locale); |
+ } |
+ } else { |
+ self->selected_language_code_ = loaded_locale; |
+ } |
+ |
self->ReloadLocalizedContent(); |
AccessibilityManager::Get()->OnLocaleChanged(); |
@@ -374,7 +412,6 @@ bool NetworkScreenHandler::IsDerelict() { |
return time_on_oobe_ >= derelict_detection_timeout_; |
} |
-// static |
base::ListValue* NetworkScreenHandler::GetLanguageList() { |
const std::string app_locale = g_browser_process->GetApplicationLocale(); |
input_method::InputMethodManager* manager = |
@@ -416,7 +453,13 @@ base::ListValue* NetworkScreenHandler::GetLanguageList() { |
language_info->SetString("value", value); |
language_info->SetString("title", display_name); |
- language_info->SetBoolean("selected", value == app_locale); |
+ if (selected_language_code_.empty()) { |
+ if (value == app_locale) |
+ language_info->SetBoolean("selected", true); |
+ } else { |
+ if (value == selected_language_code_) |
+ language_info->SetBoolean("selected", true); |
+ } |
} |
return languages_list; |
} |