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 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 30 TranslateAcceptLanguages::~TranslateAcceptLanguages() { 31 } 32 33 // static 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 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 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