| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "weblayer/browser/i18n_util.h" |
| |
| #include "base/i18n/rtl.h" |
| #include "base/no_destructor.h" |
| #include "build/build_config.h" |
| #include "net/http/http_util.h" |
| |
| #if defined(OS_ANDROID) |
| #include "base/android/locale_utils.h" |
| #include "base/task/post_task.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "weblayer/browser/java/jni/LocaleChangedBroadcastReceiver_jni.h" |
| #endif |
| |
| namespace { |
| |
| base::CallbackList<void()>& GetLocaleChangeCallbacks() { |
| static base::NoDestructor<base::CallbackList<void()>> instance; |
| return *instance; |
| } |
| |
| } // namespace |
| |
| namespace weblayer { |
| namespace i18n { |
| |
| std::string GetApplicationLocale() { |
| // The locale is set in ContentMainDelegateImpl::InitializeResourceBundle(). |
| return base::i18n::GetConfiguredLocale(); |
| } |
| |
| std::string GetAcceptLangs() { |
| #if defined(OS_ANDROID) |
| std::string locale_list = base::android::GetDefaultLocaleListString(); |
| #else |
| std::string locale_list = GetApplicationLocale(); |
| #endif |
| return net::HttpUtil::ExpandLanguageList(locale_list); |
| } |
| |
| std::unique_ptr<LocaleChangeSubscription> RegisterLocaleChangeCallback( |
| base::RepeatingClosure locale_changed) { |
| return GetLocaleChangeCallbacks().Add(locale_changed); |
| } |
| |
| #if defined(OS_ANDROID) |
| static void JNI_LocaleChangedBroadcastReceiver_LocaleChanged(JNIEnv* env) { |
| base::PostTaskAndReply( |
| FROM_HERE, |
| {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE}, |
| base::BindOnce([]() { |
| // Passing an empty |pref_locale| means the Android system locale will |
| // be used (base::android::GetDefaultLocaleString()). |
| ui::ResourceBundle::GetSharedInstance().ReloadLocaleResources( |
| {} /*pref_locale*/); |
| }), |
| base::BindOnce([]() { GetLocaleChangeCallbacks().Notify(); })); |
| // TODO(estade): need to update the ResourceBundle for non-Browser processes |
| // as well. |
| } |
| #endif |
| |
| } // namespace i18n |
| } // namespace weblayer |