15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_prefs.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <set> 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_split.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_accept_languages.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_download_manager.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/translate_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_language_blacklist"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_site_blacklist"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateWhitelists[] = 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_whitelists"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateDeniedCount[] = 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_denied_count"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateAcceptedCount[] = 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_accepted_count"; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char TranslatePrefs::kPrefTranslateBlockedLanguages[] = 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "translate_blocked_languages"; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GetBlacklistedLanguages(const PrefService* prefs, 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string>* languages) { 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(languages); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(languages->empty()); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* key = TranslatePrefs::kPrefTranslateLanguageBlacklist; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* list = prefs->GetList(key); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::ListValue::const_iterator it = list->begin(); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != list->end(); ++it) { 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string lang; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (*it)->GetAsString(&lang); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch languages->push_back(lang); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Expands language codes to make these more suitable for Accept-Language. 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA']. 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 'en' won't appear twice as this function eliminates duplicates. 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ExpandLanguageCodes(const std::vector<std::string>& languages, 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string>* expanded_languages) { 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(expanded_languages); 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(expanded_languages->empty()); 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // used to eliminate duplicates. 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::set<std::string> seen; 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (std::vector<std::string>::const_iterator it = languages.begin(); 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) it != languages.end(); ++it) { 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& language = *it; 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (seen.find(language) == seen.end()) { 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expanded_languages->push_back(language); 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) seen.insert(language); 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> tokens; 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::SplitString(language, '-', &tokens); 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (tokens.size() == 0) 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) continue; 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& main_part = tokens[0]; 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (seen.find(main_part) == seen.end()) { 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expanded_languages->push_back(main_part); 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) seen.insert(main_part); 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TranslatePrefs::TranslatePrefs(PrefService* user_prefs, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* accept_languages_pref, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* preferred_languages_pref) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : accept_languages_pref_(accept_languages_pref), 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_(user_prefs) { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_languages_pref_ = preferred_languages_pref; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!preferred_languages_pref); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TranslatePrefs::ResetToDefaults() { 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClearBlockedLanguages(); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClearBlacklistedSites(); 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClearWhitelistedLanguagePairs(); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<std::string> languages; 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetLanguageList(&languages); 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (std::vector<std::string>::const_iterator it = languages.begin(); 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) it != languages.end(); ++it) { 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& language = *it; 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResetTranslationAcceptedCount(language); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResetTranslationDeniedCount(language); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TranslatePrefs::IsBlockedLanguage( 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& original_language) const { 110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return IsValueBlacklisted(kPrefTranslateBlockedLanguages, 111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) original_language); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::BlockLanguage(const std::string& original_language) { 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BlacklistValue(kPrefTranslateBlockedLanguages, original_language); 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Add the language to the language list at chrome://settings/languages. 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string language = original_language; 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) translate::ToChromeLanguageSynonym(&language); 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> languages; 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetLanguageList(&languages); 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (std::find(languages.begin(), languages.end(), language) == 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) languages.end()) { 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) languages.push_back(language); 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateLanguageList(languages); 128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::UnblockLanguage(const std::string& original_language) { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, original_language); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TranslatePrefs::RemoveLanguageFromLegacyBlacklist( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_language) { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RemoveValueFromBlacklist(kPrefTranslateLanguageBlacklist, original_language); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::IsSiteBlacklisted(const std::string& site) const { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsValueBlacklisted(kPrefTranslateSiteBlacklist, site); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::BlacklistSite(const std::string& site) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlacklistValue(kPrefTranslateSiteBlacklist, site); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::RemoveSiteFromBlacklist(const std::string& site) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveValueFromBlacklist(kPrefTranslateSiteBlacklist, site); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TranslatePrefs::IsLanguagePairWhitelisted( 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_language, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& target_language) { 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateWhitelists); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict && !dict->empty()) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string auto_target_lang; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict->GetString(original_language, &auto_target_lang) && 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auto_target_lang == target_language) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::WhitelistLanguagePair(const std::string& original_language, 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& target_language) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate whitelist pref"; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(original_language, target_language); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::RemoveLanguagePairFromWhitelist( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_language, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& target_language) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate whitelist pref"; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->Remove(original_language, NULL); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool TranslatePrefs::HasBlockedLanguages() const { 190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return !IsListEmpty(kPrefTranslateBlockedLanguages); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TranslatePrefs::ClearBlockedLanguages() { 194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) prefs_->ClearPref(kPrefTranslateBlockedLanguages); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TranslatePrefs::HasBlacklistedSites() const { 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !IsListEmpty(kPrefTranslateSiteBlacklist); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TranslatePrefs::ClearBlacklistedSites() { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_->ClearPref(kPrefTranslateSiteBlacklist); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::HasWhitelistedLanguagePairs() const { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !IsDictionaryEmpty(kPrefTranslateWhitelists); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TranslatePrefs::ClearWhitelistedLanguagePairs() { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_->ClearPref(kPrefTranslateWhitelists); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TranslatePrefs::GetTranslationDeniedCount( 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& language) const { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateDeniedCount); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict->GetInteger(language, &count) ? count : 0; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::IncrementTranslationDeniedCount( 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& language) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->GetInteger(language, &count); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetInteger(language, count + 1); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::ResetTranslationDeniedCount(const std::string& language) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update.Get()->SetInteger(language, 0); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TranslatePrefs::GetTranslationAcceptedCount(const std::string& language) { 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateAcceptedCount); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict->GetInteger(language, &count) ? count : 0; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::IncrementTranslationAcceptedCount( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& language) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->GetInteger(language, &count); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetInteger(language, count + 1); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::ResetTranslationAcceptedCount( 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& language) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update.Get()->SetInteger(language, 0); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { 259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(languages); 260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(languages->empty()); 261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS) 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* key = preferred_languages_pref_.c_str(); 264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* key = accept_languages_pref_.c_str(); 266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 268d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string languages_str = prefs_->GetString(key); 269d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::SplitString(languages_str, ',', languages); 270d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TranslatePrefs::UpdateLanguageList( 273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<std::string>& languages) { 274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS) 275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string languages_str = JoinString(languages, ','); 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->SetString(preferred_languages_pref_.c_str(), languages_str); 277d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Save the same language list as accept languages preference as well, but we 280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // need to expand the language list, to make it more acceptable. For instance, 281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884. 282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> accept_languages; 283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ExpandLanguageCodes(languages, &accept_languages); 284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string accept_languages_str = JoinString(accept_languages, ','); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->SetString(accept_languages_pref_.c_str(), accept_languages_str); 286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslatePrefs::CanTranslateLanguage( 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TranslateAcceptLanguages* accept_languages, 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& language) { 291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool can_be_accept_language = 292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) TranslateAcceptLanguages::CanBeAcceptLanguage(language); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_accept_language = accept_languages->IsAcceptLanguage(language); 294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Don't translate any user black-listed languages. Checking 296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // |is_accept_language| is necessary because if the user eliminates the 297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // language from the preference, it is natural to forget whether or not 298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // the language should be translated. Checking |cannot_be_accept_language| 299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // is also necessary because some minor languages can't be selected in the 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // language preference even though the language is available in Translate 301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // server. 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsBlockedLanguage(language) && 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (is_accept_language || !can_be_accept_language)) 304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language, 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string* target_language) { 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateWhitelists); 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (dict && dict->GetString(original_language, target_language)) { 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!target_language->empty()); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !target_language->empty(); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TranslatePrefs::RegisterProfilePrefs( 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(kPrefTranslateLanguageBlacklist, 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(kPrefTranslateSiteBlacklist, 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPrefTranslateWhitelists, 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPrefTranslateDeniedCount, 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPrefTranslateAcceptedCount, 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch registry->RegisterListPref(kPrefTranslateBlockedLanguages, 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs, 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* accept_languages_pref) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old format of kPrefTranslateWhitelists 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - original language -> list of target langs to auto-translate 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - list of langs is in order of being enabled i.e. last in list is the 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // most recent language that user enabled via 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always translate |source_lang| to |target_lang|" 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - this results in a one-to-n relationship between source lang and target 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // langs. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New format: 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - original language -> one target language to auto-translate 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - each time that the user enables the "Always translate..." option, that 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target lang overwrites the previous one. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - this results in a one-to-one relationship between source lang and target 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lang 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - we replace old list of target langs with the last target lang in list, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // assuming the last (i.e. most recent) target lang is what user wants to 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep auto-translated. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(user_prefs, kPrefTranslateWhitelists); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (dict && !dict->empty()) { 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue::Iterator iter(*dict); 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while (!iter.IsAtEnd()) { 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* list = NULL; 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!iter.value().GetAsList(&list) || !list) 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; // Dictionary has either been migrated or new format. 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string key = iter.key(); 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Advance the iterator before removing the current element. 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.Advance(); 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string target_lang; 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (list->empty() || 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !list->GetString(list->GetSize() - 1, &target_lang) || 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch target_lang.empty()) { 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dict->Remove(key, NULL); 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dict->SetString(key, target_lang); 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Get the union of the blacklist and the Accept languages, and set this to 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the new language set 'translate_blocked_languages'. This is used for the 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // settings UI for Translate and configration to determine which langauage 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // should be translated instead of the blacklist. The blacklist is no longer 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // used after launching the settings UI. 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // After that, Set 'translate_languages_not_translate' to Accept languages to 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // enable settings for users. 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!merged) { 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> blacklisted_languages; 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetBlacklistedLanguages(user_prefs, &blacklisted_languages); 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string accept_languages_str = 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_prefs->GetString(accept_languages_pref); 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> accept_languages; 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(accept_languages_str, ',', &accept_languages); 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> blocked_languages; 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateBlockedLanguages( 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &blocked_languages, blacklisted_languages, accept_languages); 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the new preference kPrefTranslateBlockedLanguages. 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue blocked_languages_list; 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blocked_languages.begin(); 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != blocked_languages.end(); ++it) { 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocked_languages_list.Append(new base::StringValue(*it)); 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* list = update.Get(); 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(list != NULL); 414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) list->Swap(&blocked_languages_list); 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update kAcceptLanguages 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blocked_languages.begin(); 420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != blocked_languages.end(); ++it) { 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string lang = *it; 4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) translate::ToChromeLanguageSynonym(&lang); 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool not_found = 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::find(accept_languages.begin(), accept_languages.end(), lang) == 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch accept_languages.end(); 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (not_found) 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch accept_languages.push_back(lang); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string new_accept_languages_str = JoinString(accept_languages, ","); 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_prefs->SetString(accept_languages_pref, new_accept_languages_str); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TranslatePrefs::CreateBlockedLanguages( 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string>* blocked_languages, 438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<std::string>& blacklisted_languages, 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<std::string>& accept_languages) { 440d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(blocked_languages); 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(blocked_languages->empty()); 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string> result; 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blacklisted_languages.begin(); 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != blacklisted_languages.end(); ++it) { 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result.insert(*it); 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& app_locale = 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TranslateDownloadManager::GetInstance()->application_locale(); 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale); 4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_ui_english = ui_lang == "en" || 4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartsWithASCII(ui_lang, "en-", false); 4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = accept_languages.begin(); 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != accept_languages.end(); ++it) { 45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string converted_lang = ConvertLangCodeForTranslation(*it); 4603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Regarding http://crbug.com/36182, even though English exists in Accept 4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // language list, English could be translated on non-English locale. 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (converted_lang == "en" && !is_ui_english) 4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) continue; 4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.insert(converted_lang); 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocked_languages->insert( 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocked_languages->begin(), result.begin(), result.end()); 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string TranslatePrefs::ConvertLangCodeForTranslation( 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& lang) { 476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<std::string> tokens; 477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SplitString(lang, '-', &tokens); 478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (tokens.size() < 1) 479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return lang; 480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string main_part = tokens[0]; 482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Translate doesn't support General Chinese and the sub code is necessary. 484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (main_part == "zh") 485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return lang; 486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) translate::ToTranslateLanguageSynonym(&main_part); 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return main_part; 489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslatePrefs::IsValueInList(const base::ListValue* list, 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& in_value) const { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < list->GetSize(); ++i) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list->GetString(i, &value) && value == in_value) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value) const { 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* blacklist = prefs_->GetList(pref_id); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::BlacklistValue(const char* pref_id, 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value) { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListPrefUpdate update(prefs_, pref_id); 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* blacklist = update.Get(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!blacklist) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate blacklist pref"; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklist->Append(new base::StringValue(value)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value) { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListPrefUpdate update(prefs_, pref_id); 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* blacklist = update.Get(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!blacklist) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate blacklist pref"; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringValue string_value(value); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blacklist->Remove(string_value, NULL); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::IsListEmpty(const char* pref_id) const { 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* blacklist = prefs_->GetList(pref_id); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (blacklist == NULL || blacklist->empty()); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (dict == NULL || dict->empty()); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 541