diff options
author | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-11 20:02:18 +0000 |
---|---|---|
committer | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-11 20:02:18 +0000 |
commit | 29b787f010e8e53cf0f473dbe52c6a17da476391 (patch) | |
tree | e49d0c28d22f8c5f46aca68dac142abe2e596599 /components/translate | |
parent | 0d97e147adaf3ba0e258921808a016e40a1a0898 (diff) | |
download | chromium_src-29b787f010e8e53cf0f473dbe52c6a17da476391.zip chromium_src-29b787f010e8e53cf0f473dbe52c6a17da476391.tar.gz chromium_src-29b787f010e8e53cf0f473dbe52c6a17da476391.tar.bz2 |
Refactor TranslateAcceptLanguages as a BrowserContextKeyedService
This CL refactors TranslateAcceptLanguages as a BrowserContextKeyedService,
and moves it into the Translate component.
The choice of BrowserContextKeyedService seems obvious since there is one
accept languages list per profile.
The existing code is simplified, since the handling of profiles and notifications
is deferred to the BrowserContextKeyedService code and can be removed.
Note that there is now one TranslateAcceptLanguages instance per profile (it
was a singleton owned by TranslateManager previously).
BUG=335076
Review URL: https://codereview.chromium.org/149753006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@250480 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/translate')
-rw-r--r-- | components/translate/core/browser/translate_accept_languages.cc | 81 | ||||
-rw-r--r-- | components/translate/core/browser/translate_accept_languages.h | 53 |
2 files changed, 134 insertions, 0 deletions
diff --git a/components/translate/core/browser/translate_accept_languages.cc b/components/translate/core/browser/translate_accept_languages.cc new file mode 100644 index 0000000..773530c --- /dev/null +++ b/components/translate/core/browser/translate_accept_languages.cc @@ -0,0 +1,81 @@ +// Copyright 2014 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 "components/translate/core/browser/translate_accept_languages.h" + +#include "base/bind.h" +#include "base/prefs/pref_service.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "components/translate/core/browser/translate_download_manager.h" +#include "components/translate/core/common/translate_util.h" +#include "ui/base/l10n/l10n_util.h" + +TranslateAcceptLanguages::TranslateAcceptLanguages( + PrefService* prefs, + const char* accept_languages_pref) + : accept_languages_pref_(accept_languages_pref) { + InitAcceptLanguages(prefs); + + // Also start listening for changes in the accept languages. + pref_change_registrar_.Init(prefs); + pref_change_registrar_.Add( + accept_languages_pref, + base::Bind(&TranslateAcceptLanguages::InitAcceptLanguages, + base::Unretained(this), + prefs)); +} + +TranslateAcceptLanguages::~TranslateAcceptLanguages() { +} + +// static +bool TranslateAcceptLanguages::CanBeAcceptLanguage( + const std::string& language) { + std::string accept_language = language; + translate::ToChromeLanguageSynonym(&accept_language); + + const std::string locale = + TranslateDownloadManager::GetInstance()->application_locale(); + std::vector<std::string> accept_language_codes; + l10n_util::GetAcceptLanguagesForLocale(locale, &accept_language_codes); + + if (std::find(accept_language_codes.begin(), + accept_language_codes.end(), + accept_language) != accept_language_codes.end()) { + return true; + } + + return false; +} + +bool TranslateAcceptLanguages::IsAcceptLanguage(const std::string& language) { + std::string accept_language = language; + translate::ToChromeLanguageSynonym(&accept_language); + return accept_languages_.find(accept_language) != accept_languages_.end(); +} + +void TranslateAcceptLanguages::InitAcceptLanguages(PrefService* prefs) { + DCHECK(prefs); + // Build the languages. + accept_languages_.clear(); + std::string accept_langs_str = prefs->GetString( + accept_languages_pref_.c_str()); + std::vector<std::string> accept_langs_list; + base::SplitString(accept_langs_str, ',', &accept_langs_list); + std::vector<std::string>::const_iterator iter; + + for (iter = accept_langs_list.begin(); + iter != accept_langs_list.end(); ++iter) { + // Get rid of the locale extension if any (ex: en-US -> en), but for Chinese + // for which the CLD reports zh-CN and zh-TW. + std::string accept_lang(*iter); + size_t index = iter->find("-"); + if (index != std::string::npos && *iter != "zh-CN" && *iter != "zh-TW") + accept_lang = iter->substr(0, index); + + accept_languages_.insert(accept_lang); + } +} + diff --git a/components/translate/core/browser/translate_accept_languages.h b/components/translate/core/browser/translate_accept_languages.h new file mode 100644 index 0000000..1c2a328 --- /dev/null +++ b/components/translate/core/browser/translate_accept_languages.h @@ -0,0 +1,53 @@ +// Copyright 2014 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. + +#ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_ACCEPT_LANGUAGES_H_ +#define CHROME_BROWSER_TRANSLATE_TRANSLATE_ACCEPT_LANGUAGES_H_ + +#include <set> +#include <string> + +#include "base/basictypes.h" +#include "base/prefs/pref_change_registrar.h" + +class PrefService; + +// TranslateAcceptLanguages tracks the value of the "Accept-Language" HTTP +// header. +class TranslateAcceptLanguages { + public: + + // |accept_languages_pref| is the path to the preference storing the accept + // languages. + TranslateAcceptLanguages(PrefService* prefs, + const char* accept_languages_pref); + virtual ~TranslateAcceptLanguages(); + + // Returns true if |language| is available as Accept-Languages. |language| + // will be converted if it has the synonym of accept language. + static bool CanBeAcceptLanguage(const std::string& language); + + // Returns true if the passed language has been configured by the user as an + // accept language. |language| will be converted if it has the synonym of + // accept languages. + bool IsAcceptLanguage(const std::string& language); + + private: + // Initializes the |accept_languages_| language table based on the associated + // preference in |prefs|. + void InitAcceptLanguages(PrefService* prefs); + + // Set of accept languages. + std::set<std::string> accept_languages_; + + // Listens to accept languages changes. + PrefChangeRegistrar pref_change_registrar_; + + // Path of accept languages preference. + const std::string accept_languages_pref_; + + DISALLOW_COPY_AND_ASSIGN(TranslateAcceptLanguages); +}; + +#endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_ACCEPT_LANGUAGES_H_ |