| Index: chrome/browser/profiles/profile_impl.cc
|
| diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
|
| index e0d342941cbdf49c93f320fd970f1d3610e040e9..67191443fc325f1d2e21113d6b31aca32eac2adb 100644
|
| --- a/chrome/browser/profiles/profile_impl.cc
|
| +++ b/chrome/browser/profiles/profile_impl.cc
|
| @@ -1366,28 +1366,75 @@ PromoCounter* ProfileImpl::GetInstantPromoCounter() {
|
| }
|
|
|
| #if defined(OS_CHROMEOS)
|
| -void ProfileImpl::ChangeApplicationLocale(
|
| - const std::string& locale, bool keep_local) {
|
| - if (locale.empty()) {
|
| +void ProfileImpl::ChangeAppLocale(
|
| + const std::string& new_locale, AppLocaleChangedVia via) {
|
| + if (new_locale.empty()) {
|
| NOTREACHED();
|
| return;
|
| }
|
| - if (keep_local) {
|
| - GetPrefs()->SetString(prefs::kApplicationLocaleOverride, locale);
|
| - } else {
|
| - GetPrefs()->SetString(prefs::kApplicationLocale, locale);
|
| - GetPrefs()->ClearPref(prefs::kApplicationLocaleOverride);
|
| + std::string pref_locale = GetPrefs()->GetString(prefs::kApplicationLocale);
|
| + bool do_update_pref = true;
|
| + switch (via) {
|
| + case APP_LOCALE_CHANGED_VIA_SETTINGS:
|
| + case APP_LOCALE_CHANGED_VIA_REVERT: {
|
| + // We keep kApplicationLocaleBackup value as a reference. In case value
|
| + // of kApplicationLocale preference would change due to sync from other
|
| + // device then kApplicationLocaleBackup value will trigger and allow us to
|
| + // show notification about automatic locale change in LocaleChangeGuard.
|
| + GetPrefs()->SetString(prefs::kApplicationLocaleBackup, new_locale);
|
| + GetPrefs()->ClearPref(prefs::kApplicationLocaleAccepted);
|
| + // We maintain kApplicationLocale property in both a global storage
|
| + // and user's profile. Global property determines locale of login screen,
|
| + // while user's profile determines his personal locale preference.
|
| + // In case of APP_LOCALE_CHANGED_VIA_LOGIN we won't touch local state
|
| + // because login screen code is active and takes care of it.
|
| + g_browser_process->local_state()->SetString(
|
| + prefs::kApplicationLocale, new_locale);
|
| + break;
|
| + }
|
| + case APP_LOCALE_CHANGED_VIA_LOGIN: {
|
| + if (!pref_locale.empty()) {
|
| + DCHECK(pref_locale == new_locale);
|
| + std::string accepted_locale =
|
| + GetPrefs()->GetString(prefs::kApplicationLocaleAccepted);
|
| + if (accepted_locale == new_locale) {
|
| + // If locale is accepted then we do not want to show LocaleChange
|
| + // notification. This notification is triggered by different values
|
| + // of kApplicationLocaleBackup and kApplicationLocale preferences,
|
| + // so make them identical.
|
| + GetPrefs()->SetString(prefs::kApplicationLocaleBackup, new_locale);
|
| + } else {
|
| + // Back up locale of login screen.
|
| + GetPrefs()->SetString(prefs::kApplicationLocaleBackup,
|
| + g_browser_process->GetApplicationLocale());
|
| + }
|
| + } else {
|
| + std::string cur_locale = g_browser_process->GetApplicationLocale();
|
| + std::string backup_locale =
|
| + GetPrefs()->GetString(prefs::kApplicationLocaleBackup);
|
| + // Profile synchronization takes time and is not completed at that
|
| + // moment at first login. So we initialize locale preference in steps:
|
| + // (1) first save it to temporary backup;
|
| + // (2) on next login we assume that synchronization is already completed
|
| + // and we may finalize initialization.
|
| + GetPrefs()->SetString(prefs::kApplicationLocaleBackup, cur_locale);
|
| + if (!backup_locale.empty())
|
| + GetPrefs()->SetString(prefs::kApplicationLocale, backup_locale);
|
| + do_update_pref = false;
|
| + }
|
| + break;
|
| + }
|
| + case APP_LOCALE_CHANGED_VIA_UNKNOWN:
|
| + default: {
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| }
|
| - GetPrefs()->SetString(prefs::kApplicationLocaleBackup, locale);
|
| - GetPrefs()->ClearPref(prefs::kApplicationLocaleAccepted);
|
| - // We maintain kApplicationLocale property in both a global storage
|
| - // and user's profile. Global property determines locale of login screen,
|
| - // while user's profile determines his personal locale preference.
|
| - g_browser_process->local_state()->SetString(
|
| - prefs::kApplicationLocale, locale);
|
| -
|
| - GetPrefs()->SavePersistentPrefs();
|
| - g_browser_process->local_state()->SavePersistentPrefs();
|
| + if (do_update_pref)
|
| + GetPrefs()->SetString(prefs::kApplicationLocale, new_locale);
|
| +
|
| + GetPrefs()->ScheduleSavePersistentPrefs();
|
| + g_browser_process->local_state()->ScheduleSavePersistentPrefs();
|
| }
|
|
|
| chromeos::ProxyConfigServiceImpl*
|
|
|