• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/translate/core/browser/translate_accept_languages.h"
6 
7 #include "base/bind.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/strings/string_split.h"
10 #include "base/strings/string_util.h"
11 #include "components/translate/core/browser/translate_download_manager.h"
12 #include "components/translate/core/common/translate_util.h"
13 #include "ui/base/l10n/l10n_util.h"
14 
TranslateAcceptLanguages(PrefService * prefs,const char * accept_languages_pref)15 TranslateAcceptLanguages::TranslateAcceptLanguages(
16     PrefService* prefs,
17     const char* accept_languages_pref)
18     : accept_languages_pref_(accept_languages_pref) {
19   InitAcceptLanguages(prefs);
20 
21   // Also start listening for changes in the accept languages.
22   pref_change_registrar_.Init(prefs);
23   pref_change_registrar_.Add(
24       accept_languages_pref,
25       base::Bind(&TranslateAcceptLanguages::InitAcceptLanguages,
26                  base::Unretained(this),
27                  prefs));
28 }
29 
~TranslateAcceptLanguages()30 TranslateAcceptLanguages::~TranslateAcceptLanguages() {
31 }
32 
33 // static
CanBeAcceptLanguage(const std::string & language)34 bool TranslateAcceptLanguages::CanBeAcceptLanguage(
35     const std::string& language) {
36   std::string accept_language = language;
37   translate::ToChromeLanguageSynonym(&accept_language);
38 
39   const std::string locale =
40       TranslateDownloadManager::GetInstance()->application_locale();
41   std::vector<std::string> accept_language_codes;
42   l10n_util::GetAcceptLanguagesForLocale(locale, &accept_language_codes);
43 
44   if (std::find(accept_language_codes.begin(),
45                 accept_language_codes.end(),
46                 accept_language) != accept_language_codes.end()) {
47     return true;
48   }
49 
50   return false;
51 }
52 
IsAcceptLanguage(const std::string & language)53 bool TranslateAcceptLanguages::IsAcceptLanguage(const std::string& language) {
54   std::string accept_language = language;
55   translate::ToChromeLanguageSynonym(&accept_language);
56   return accept_languages_.find(accept_language) != accept_languages_.end();
57 }
58 
InitAcceptLanguages(PrefService * prefs)59 void TranslateAcceptLanguages::InitAcceptLanguages(PrefService* prefs) {
60   DCHECK(prefs);
61   // Build the languages.
62   accept_languages_.clear();
63   std::string accept_langs_str = prefs->GetString(
64       accept_languages_pref_.c_str());
65   std::vector<std::string> accept_langs_list;
66   base::SplitString(accept_langs_str, ',', &accept_langs_list);
67   std::vector<std::string>::const_iterator iter;
68 
69   for (iter = accept_langs_list.begin();
70        iter != accept_langs_list.end(); ++iter) {
71     // Get rid of the locale extension if any (ex: en-US -> en), but for Chinese
72     // for which the CLD reports zh-CN and zh-TW.
73     std::string accept_lang(*iter);
74     size_t index = iter->find("-");
75     if (index != std::string::npos && *iter != "zh-CN" && *iter != "zh-TW")
76       accept_lang = iter->substr(0, index);
77 
78     accept_languages_.insert(accept_lang);
79   }
80 }
81 
82