15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/locale_change_guard.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_delegate.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocaleChangeGuard::Delegate : public NotificationDelegate { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Delegate(chromeos::LocaleChangeGuard* master) : master_(master) {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close(bool by_user) OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Display() OVERRIDE {} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Error() OVERRIDE {} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Click() OVERRIDE {} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string id() const OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual content::RenderViewHost* GetRenderViewHost() const OVERRIDE { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate() {} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::LocaleChangeGuard* master_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Delegate); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocaleChangeGuard::LocaleChangeGuard(Profile* profile) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reverted_(false), 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_started_(false), 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_frame_loaded_(false) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile_); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocaleChangeGuard::~LocaleChangeGuard() {} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::OnLogin() { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_SESSION_STARTED, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllBrowserContextsAndSources()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::RevertLocaleChange() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_ == NULL || 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_locale_.empty() || 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_locale_.empty()) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reverted_) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reverted_ = true; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("LanguageChange_Revert")); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->ChangeAppLocale( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_locale_, Profile::APP_LOCALE_CHANGED_VIA_REVERT); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::AttemptUserExit(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::RevertLocaleChangeCallback(const ListValue* list) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RevertLocaleChange(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::Observe(int type, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_ == NULL) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case chrome::NOTIFICATION_SESSION_STARTED: { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_started_ = true; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Remove(this, chrome::NOTIFICATION_SESSION_STARTED, 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (main_frame_loaded_) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Check(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME: { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_ == 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(source)->GetBrowserContext()) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_frame_loaded_ = true; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to perform locale change check only once, so unsubscribe. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Remove(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (session_started_) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Check(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED: { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DeviceSettingsService::Get()->HasPrivateOwnerKey()) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (local_state) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs == NULL) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string owner_locale = 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetString(prefs::kApplicationLocale); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_locale.empty()) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_state->SetString(prefs::kOwnerLocale, owner_locale); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::Check() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cur_locale = g_browser_process->GetApplicationLocale(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_locale.empty()) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs == NULL) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string to_locale = prefs->GetString(prefs::kApplicationLocale); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (to_locale != cur_locale) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This conditional branch can occur in cases like: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (1) kApplicationLocale preference was modified by synchronization; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (2) kApplicationLocale is managed by policy. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string from_locale = prefs->GetString(prefs::kApplicationLocaleBackup); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (from_locale.empty() || from_locale == to_locale) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // No locale change was detected, just exit. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->GetString(prefs::kApplicationLocaleAccepted) == to_locale) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Already accepted. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Locale change detected, showing notification. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (from_locale_ != from_locale || to_locale_ != to_locale) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Falling back to showing message in current locale. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Showing locale change notification in current (not previous) language"; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChangingLocale(from_locale, to_locale); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_notifier()->NotifyLocaleChanged( 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, cur_locale, from_locale_, to_locale_); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::AcceptLocaleChange() { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_ == NULL || 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_locale_.empty() || 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_locale_.empty()) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether locale has been reverted or changed. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If not: mark current locale as accepted. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reverted_) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs == NULL) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->GetString(prefs::kApplicationLocale) != to_locale_) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("LanguageChange_Accept")); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->SetString(prefs::kApplicationLocaleBackup, to_locale_); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->SetString(prefs::kApplicationLocaleAccepted, to_locale_); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::PrepareChangingLocale( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& from_locale, const std::string& to_locale) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cur_locale = g_browser_process->GetApplicationLocale(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!from_locale.empty()) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_locale_ = from_locale; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!to_locale.empty()) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_locale_ = to_locale; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!from_locale_.empty() && !to_locale_.empty()) { 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 from = l10n_util::GetDisplayNameForLocale( 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_locale_, cur_locale, true); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 to = l10n_util::GetDisplayNameForLocale( 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_locale_, cur_locale, true); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_text_ = l10n_util::GetStringUTF16( 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_SECTION_TITLE_LANGUAGE); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_text_ = l10n_util::GetStringFUTF16( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_LOCALE_CHANGE_MESSAGE, from, to); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) revert_link_text_ = l10n_util::GetStringFUTF16( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_LOCALE_CHANGE_REVERT_MESSAGE, from); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::Delegate::Close(bool by_user) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (by_user) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) master_->AcceptLocaleChange(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string LocaleChangeGuard::Delegate::id() const { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Arbitrary unique Id. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "8c386938-1e3f-11e0-ac7b-18a90520e2e5"; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 247