Chromium Code Reviews| 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..5795fb6ce101ce2210aa8cbbb2aba76ac724f2e5 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,36 @@ void AddOptgroupOtherLayouts(base::ListValue* input_methods_list) { |
| input_methods_list->Append(optgroup); |
| } |
| +// For "UI Language" drop-down menu at OOBE screen we need to decide which |
| +// entry to mark "selected". If user has just selected "requested_locale", |
| +// but "loaded_locale" was actually loaded, we mark original user choice |
| +// "selected" only if loaded_locale is a backup for "requested_locale". |
| +std::string CalculateSelectedLanguage(const std::string& requested_locale, |
| + const std::string& loaded_locale) { |
| + const size_t dash_pos_requested = requested_locale.find_first_of('-'); |
| + |
| + // Requested language doesn't have specific region. |
| + 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 'region' in name and requested_locale |
| + // is a region-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. |
| + return loaded_locale; |
| + } |
| + // Both locales are region-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 { |
| @@ -118,6 +148,10 @@ void NetworkScreenHandler::Show() { |
| return; |
| } |
| + const StartupCustomizationDocument* startup_manifest = |
| + StartupCustomizationDocument::GetInstance(); |
| + HandleOnLanguageChanged(startup_manifest->initial_locale_default()); |
|
Nikita (slow)
2014/04/07 17:06:58
This won't quit work. This screen may be shown mul
Alexander Alekseev
2014/04/07 19:28:58
Done.
|
| + |
| ShowScreen(OobeUI::kScreenOobeNetwork, NULL); |
| if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableDemoMode)) |
| @@ -239,13 +273,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 +420,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 +461,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; |
| } |