blob: 7ab1c5f821f11e04e7f23424bce7200f89039f25 [file] [log] [blame]
// 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