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) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace translate { 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_language_blacklist"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_site_blacklist"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateWhitelists[] = 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_whitelists"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateDeniedCount[] = 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_denied_count"; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TranslatePrefs::kPrefTranslateAcceptedCount[] = 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "translate_accepted_count"; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char TranslatePrefs::kPrefTranslateBlockedLanguages[] = 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "translate_blocked_languages"; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char TranslatePrefs::kPrefTranslateLastDeniedTime[] = 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "translate_last_denied_time"; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char TranslatePrefs::kPrefTranslateTooOftenDenied[] = 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "translate_too_often_denied"; 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GetBlacklistedLanguages(const PrefService* prefs, 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string>* languages) { 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(languages); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(languages->empty()); 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* key = TranslatePrefs::kPrefTranslateLanguageBlacklist; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* list = prefs->GetList(key); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::ListValue::const_iterator it = list->begin(); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != list->end(); ++it) { 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string lang; 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (*it)->GetAsString(&lang); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch languages->push_back(lang); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Expands language codes to make these more suitable for Accept-Language. 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA']. 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 'en' won't appear twice as this function eliminates duplicates. 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ExpandLanguageCodes(const std::vector<std::string>& languages, 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string>* expanded_languages) { 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(expanded_languages); 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(expanded_languages->empty()); 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // used to eliminate duplicates. 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::set<std::string> seen; 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (std::vector<std::string>::const_iterator it = languages.begin(); 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) it != languages.end(); ++it) { 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& language = *it; 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (seen.find(language) == seen.end()) { 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expanded_languages->push_back(language); 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) seen.insert(language); 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> tokens; 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::SplitString(language, '-', &tokens); 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (tokens.size() == 0) 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) continue; 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& main_part = tokens[0]; 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (seen.find(main_part) == seen.end()) { 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) expanded_languages->push_back(main_part); 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) seen.insert(main_part); 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TranslatePrefs::TranslatePrefs(PrefService* user_prefs, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* accept_languages_pref, 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* preferred_languages_pref) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : accept_languages_pref_(accept_languages_pref), 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_(user_prefs) { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_languages_pref_ = preferred_languages_pref; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!preferred_languages_pref); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TranslatePrefs::ResetToDefaults() { 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClearBlockedLanguages(); 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClearBlacklistedSites(); 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClearWhitelistedLanguagePairs(); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<std::string> languages; 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetLanguageList(&languages); 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (std::vector<std::string>::const_iterator it = languages.begin(); 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) it != languages.end(); ++it) { 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& language = *it; 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResetTranslationAcceptedCount(language); 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResetTranslationDeniedCount(language); 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prefs_->ClearPref(kPrefTranslateLastDeniedTime); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prefs_->ClearPref(kPrefTranslateTooOftenDenied); 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool TranslatePrefs::IsBlockedLanguage( 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& original_language) const { 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return IsValueBlacklisted(kPrefTranslateBlockedLanguages, 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) original_language); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::BlockLanguage(const std::string& original_language) { 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BlacklistValue(kPrefTranslateBlockedLanguages, original_language); 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Add the language to the language list at chrome://settings/languages. 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string language = original_language; 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) translate::ToChromeLanguageSynonym(&language); 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> languages; 131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetLanguageList(&languages); 132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (std::find(languages.begin(), languages.end(), language) == 134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) languages.end()) { 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) languages.push_back(language); 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateLanguageList(languages); 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::UnblockLanguage(const std::string& original_language) { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, original_language); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TranslatePrefs::RemoveLanguageFromLegacyBlacklist( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_language) { 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RemoveValueFromBlacklist(kPrefTranslateLanguageBlacklist, original_language); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::IsSiteBlacklisted(const std::string& site) const { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsValueBlacklisted(kPrefTranslateSiteBlacklist, site); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::BlacklistSite(const std::string& site) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlacklistValue(kPrefTranslateSiteBlacklist, site); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::RemoveSiteFromBlacklist(const std::string& site) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveValueFromBlacklist(kPrefTranslateSiteBlacklist, site); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TranslatePrefs::IsLanguagePairWhitelisted( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_language, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& target_language) { 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateWhitelists); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict && !dict->empty()) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string auto_target_lang; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict->GetString(original_language, &auto_target_lang) && 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auto_target_lang == target_language) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::WhitelistLanguagePair(const std::string& original_language, 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& target_language) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate whitelist pref"; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(original_language, target_language); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::RemoveLanguagePairFromWhitelist( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_language, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& target_language) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate whitelist pref"; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->Remove(original_language, NULL); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool TranslatePrefs::HasBlockedLanguages() const { 199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return !IsListEmpty(kPrefTranslateBlockedLanguages); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TranslatePrefs::ClearBlockedLanguages() { 203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) prefs_->ClearPref(kPrefTranslateBlockedLanguages); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TranslatePrefs::HasBlacklistedSites() const { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !IsListEmpty(kPrefTranslateSiteBlacklist); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TranslatePrefs::ClearBlacklistedSites() { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_->ClearPref(kPrefTranslateSiteBlacklist); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::HasWhitelistedLanguagePairs() const { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !IsDictionaryEmpty(kPrefTranslateWhitelists); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TranslatePrefs::ClearWhitelistedLanguagePairs() { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_->ClearPref(kPrefTranslateWhitelists); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TranslatePrefs::GetTranslationDeniedCount( 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& language) const { 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateDeniedCount); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict->GetInteger(language, &count) ? count : 0; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::IncrementTranslationDeniedCount( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& language) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->GetInteger(language, &count); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetInteger(language, count + 1); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::ResetTranslationDeniedCount(const std::string& language) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update.Get()->SetInteger(language, 0); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TranslatePrefs::GetTranslationAcceptedCount(const std::string& language) { 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateAcceptedCount); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict->GetInteger(language, &count) ? count : 0; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::IncrementTranslationAcceptedCount( 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& language) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->GetInteger(language, &count); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetInteger(language, count + 1); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::ResetTranslationAcceptedCount( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& language) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update.Get()->SetInteger(language, 0); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TranslatePrefs::UpdateLastDeniedTime() { 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (IsTooOftenDenied()) 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double time = prefs_->GetDouble(kPrefTranslateLastDeniedTime); 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time last_closed_time = base::Time::FromJsTime(time); 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time now = base::Time::Now(); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prefs_->SetDouble(kPrefTranslateLastDeniedTime, now.ToJsTime()); 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (now - last_closed_time <= base::TimeDelta::FromDays(1)) 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prefs_->SetBoolean(kPrefTranslateTooOftenDenied, true); 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool TranslatePrefs::IsTooOftenDenied() const { 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return prefs_->GetBoolean(kPrefTranslateTooOftenDenied); 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TranslatePrefs::ResetDenialState() { 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prefs_->SetDouble(kPrefTranslateLastDeniedTime, 0); 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prefs_->SetBoolean(kPrefTranslateTooOftenDenied, false); 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { 289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(languages); 290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(languages->empty()); 291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS) 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* key = preferred_languages_pref_.c_str(); 294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* key = accept_languages_pref_.c_str(); 296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string languages_str = prefs_->GetString(key); 299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::SplitString(languages_str, ',', languages); 300d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TranslatePrefs::UpdateLanguageList( 303d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<std::string>& languages) { 304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS) 305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string languages_str = JoinString(languages, ','); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->SetString(preferred_languages_pref_.c_str(), languages_str); 307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Save the same language list as accept languages preference as well, but we 310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // need to expand the language list, to make it more acceptable. For instance, 311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884. 312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> accept_languages; 313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ExpandLanguageCodes(languages, &accept_languages); 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string accept_languages_str = JoinString(accept_languages, ','); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->SetString(accept_languages_pref_.c_str(), accept_languages_str); 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslatePrefs::CanTranslateLanguage( 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TranslateAcceptLanguages* accept_languages, 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& language) { 321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool can_be_accept_language = 322424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) TranslateAcceptLanguages::CanBeAcceptLanguage(language); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_accept_language = accept_languages->IsAcceptLanguage(language); 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Don't translate any user black-listed languages. Checking 326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // |is_accept_language| is necessary because if the user eliminates the 327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // language from the preference, it is natural to forget whether or not 328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // the language should be translated. Checking |cannot_be_accept_language| 329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // is also necessary because some minor languages can't be selected in the 330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // language preference even though the language is available in Translate 331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // server. 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsBlockedLanguage(language) && 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (is_accept_language || !can_be_accept_language)) 334424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language, 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string* target_language) { 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->GetDictionary(kPrefTranslateWhitelists); 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (dict && dict->GetString(original_language, target_language)) { 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!target_language->empty()); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !target_language->empty(); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TranslatePrefs::RegisterProfilePrefs( 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(kPrefTranslateLanguageBlacklist, 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(kPrefTranslateSiteBlacklist, 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPrefTranslateWhitelists, 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPrefTranslateDeniedCount, 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPrefTranslateAcceptedCount, 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch registry->RegisterListPref(kPrefTranslateBlockedLanguages, 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry->RegisterDoublePref( 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kPrefTranslateLastDeniedTime, 0, 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry->RegisterBooleanPref( 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kPrefTranslateTooOftenDenied, false, 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs, 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* accept_languages_pref) { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old format of kPrefTranslateWhitelists 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - original language -> list of target langs to auto-translate 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - list of langs is in order of being enabled i.e. last in list is the 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // most recent language that user enabled via 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always translate |source_lang| to |target_lang|" 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - this results in a one-to-n relationship between source lang and target 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // langs. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New format: 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - original language -> one target language to auto-translate 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - each time that the user enables the "Always translate..." option, that 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target lang overwrites the previous one. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - this results in a one-to-one relationship between source lang and target 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lang 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - we replace old list of target langs with the last target lang in list, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // assuming the last (i.e. most recent) target lang is what user wants to 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep auto-translated. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(user_prefs, kPrefTranslateWhitelists); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (dict && !dict->empty()) { 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue::Iterator iter(*dict); 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while (!iter.IsAtEnd()) { 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* list = NULL; 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!iter.value().GetAsList(&list) || !list) 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; // Dictionary has either been migrated or new format. 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string key = iter.key(); 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Advance the iterator before removing the current element. 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.Advance(); 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string target_lang; 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (list->empty() || 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !list->GetString(list->GetSize() - 1, &target_lang) || 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch target_lang.empty()) { 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dict->Remove(key, NULL); 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dict->SetString(key, target_lang); 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Get the union of the blacklist and the Accept languages, and set this to 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the new language set 'translate_blocked_languages'. This is used for the 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // settings UI for Translate and configration to determine which langauage 420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // should be translated instead of the blacklist. The blacklist is no longer 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // used after launching the settings UI. 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // After that, Set 'translate_languages_not_translate' to Accept languages to 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // enable settings for users. 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!merged) { 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> blacklisted_languages; 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetBlacklistedLanguages(user_prefs, &blacklisted_languages); 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string accept_languages_str = 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_prefs->GetString(accept_languages_pref); 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> accept_languages; 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(accept_languages_str, ',', &accept_languages); 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> blocked_languages; 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateBlockedLanguages( 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &blocked_languages, blacklisted_languages, accept_languages); 438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the new preference kPrefTranslateBlockedLanguages. 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue blocked_languages_list; 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blocked_languages.begin(); 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != blocked_languages.end(); ++it) { 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocked_languages_list.Append(new base::StringValue(*it)); 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* list = update.Get(); 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(list != NULL); 450d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) list->Swap(&blocked_languages_list); 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update kAcceptLanguages 454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = 455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blocked_languages.begin(); 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != blocked_languages.end(); ++it) { 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string lang = *it; 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) translate::ToChromeLanguageSynonym(&lang); 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool not_found = 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::find(accept_languages.begin(), accept_languages.end(), lang) == 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch accept_languages.end(); 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (not_found) 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch accept_languages.push_back(lang); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string new_accept_languages_str = JoinString(accept_languages, ","); 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_prefs->SetString(accept_languages_pref, new_accept_languages_str); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TranslatePrefs::CreateBlockedLanguages( 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string>* blocked_languages, 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<std::string>& blacklisted_languages, 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<std::string>& accept_languages) { 476d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(blocked_languages); 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(blocked_languages->empty()); 478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string> result; 480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blacklisted_languages.begin(); 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != blacklisted_languages.end(); ++it) { 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result.insert(*it); 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& app_locale = 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TranslateDownloadManager::GetInstance()->application_locale(); 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale); 4903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_ui_english = ui_lang == "en" || 4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartsWithASCII(ui_lang, "en-", false); 4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = accept_languages.begin(); 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != accept_languages.end(); ++it) { 49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string converted_lang = ConvertLangCodeForTranslation(*it); 4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Regarding http://crbug.com/36182, even though English exists in Accept 4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // language list, English could be translated on non-English locale. 49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (converted_lang == "en" && !is_ui_english) 5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) continue; 5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.insert(converted_lang); 503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocked_languages->insert( 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocked_languages->begin(), result.begin(), result.end()); 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string TranslatePrefs::ConvertLangCodeForTranslation( 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& lang) { 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<std::string> tokens; 513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SplitString(lang, '-', &tokens); 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (tokens.size() < 1) 515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return lang; 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string main_part = tokens[0]; 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Translate doesn't support General Chinese and the sub code is necessary. 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (main_part == "zh") 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return lang; 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) translate::ToTranslateLanguageSynonym(&main_part); 524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return main_part; 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslatePrefs::IsValueInList(const base::ListValue* list, 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& in_value) const { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < list->GetSize(); ++i) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list->GetString(i, &value) && value == in_value) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value) const { 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* blacklist = prefs_->GetList(pref_id); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::BlacklistValue(const char* pref_id, 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListPrefUpdate update(prefs_, pref_id); 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* blacklist = update.Get(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!blacklist) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate blacklist pref"; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklist->Append(new base::StringValue(value)); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListPrefUpdate update(prefs_, pref_id); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* blacklist = update.Get(); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!blacklist) { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unregistered translate blacklist pref"; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringValue string_value(value); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blacklist->Remove(string_value, NULL); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::IsListEmpty(const char* pref_id) const { 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* blacklist = prefs_->GetList(pref_id); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (blacklist == NULL || blacklist->empty()); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (dict == NULL || dict->empty()); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace translate 579