summaryrefslogtreecommitdiffstats
path: root/components/translate
diff options
context:
space:
mode:
authordroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-11 20:02:18 +0000
committerdroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-11 20:02:18 +0000
commit29b787f010e8e53cf0f473dbe52c6a17da476391 (patch)
treee49d0c28d22f8c5f46aca68dac142abe2e596599 /components/translate
parent0d97e147adaf3ba0e258921808a016e40a1a0898 (diff)
downloadchromium_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.cc81
-rw-r--r--components/translate/core/browser/translate_accept_languages.h53
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_