| Index: chrome/browser/translate/translate_prefs.cc
|
| diff --git a/chrome/browser/translate/translate_prefs.cc b/chrome/browser/translate/translate_prefs.cc
|
| deleted file mode 100644
|
| index e07d9b14c493ee614d676adc9ba1710b8267635d..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/translate/translate_prefs.cc
|
| +++ /dev/null
|
| @@ -1,552 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/translate/translate_prefs.h"
|
| -
|
| -#include <set>
|
| -
|
| -#include "base/prefs/pref_service.h"
|
| -#include "base/prefs/scoped_user_pref_update.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/translate/translate_accept_languages_factory.h"
|
| -#include "chrome/browser/translate/translate_manager.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "components/translate/core/browser/translate_accept_languages.h"
|
| -#include "components/translate/core/browser/translate_download_manager.h"
|
| -#include "components/translate/core/common/translate_util.h"
|
| -#include "components/user_prefs/pref_registry_syncable.h"
|
| -
|
| -const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] =
|
| - "translate_language_blacklist";
|
| -const char TranslatePrefs::kPrefTranslateSiteBlacklist[] =
|
| - "translate_site_blacklist";
|
| -const char TranslatePrefs::kPrefTranslateWhitelists[] =
|
| - "translate_whitelists";
|
| -const char TranslatePrefs::kPrefTranslateDeniedCount[] =
|
| - "translate_denied_count";
|
| -const char TranslatePrefs::kPrefTranslateAcceptedCount[] =
|
| - "translate_accepted_count";
|
| -const char TranslatePrefs::kPrefTranslateBlockedLanguages[] =
|
| - "translate_blocked_languages";
|
| -
|
| -namespace {
|
| -
|
| -void GetBlacklistedLanguages(const PrefService* prefs,
|
| - std::vector<std::string>* languages) {
|
| - DCHECK(languages);
|
| - DCHECK(languages->empty());
|
| -
|
| - const char* key = TranslatePrefs::kPrefTranslateLanguageBlacklist;
|
| - const base::ListValue* list = prefs->GetList(key);
|
| - for (base::ListValue::const_iterator it = list->begin();
|
| - it != list->end(); ++it) {
|
| - std::string lang;
|
| - (*it)->GetAsString(&lang);
|
| - languages->push_back(lang);
|
| - }
|
| -}
|
| -
|
| -// Expands language codes to make these more suitable for Accept-Language.
|
| -// Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA'].
|
| -// 'en' won't appear twice as this function eliminates duplicates.
|
| -void ExpandLanguageCodes(const std::vector<std::string>& languages,
|
| - std::vector<std::string>* expanded_languages) {
|
| - DCHECK(expanded_languages);
|
| - DCHECK(expanded_languages->empty());
|
| -
|
| - // used to eliminate duplicates.
|
| - std::set<std::string> seen;
|
| -
|
| - for (std::vector<std::string>::const_iterator it = languages.begin();
|
| - it != languages.end(); ++it) {
|
| - const std::string& language = *it;
|
| - if (seen.find(language) == seen.end()) {
|
| - expanded_languages->push_back(language);
|
| - seen.insert(language);
|
| - }
|
| -
|
| - std::vector<std::string> tokens;
|
| - base::SplitString(language, '-', &tokens);
|
| - if (tokens.size() == 0)
|
| - continue;
|
| - const std::string& main_part = tokens[0];
|
| - if (seen.find(main_part) == seen.end()) {
|
| - expanded_languages->push_back(main_part);
|
| - seen.insert(main_part);
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -TranslatePrefs::TranslatePrefs(PrefService* user_prefs)
|
| - : prefs_(user_prefs) {
|
| -}
|
| -
|
| -void TranslatePrefs::ResetToDefaults() {
|
| - ClearBlockedLanguages();
|
| - ClearBlacklistedSites();
|
| - ClearWhitelistedLanguagePairs();
|
| -
|
| - std::vector<std::string> languages;
|
| - GetLanguageList(&languages);
|
| - for (std::vector<std::string>::const_iterator it = languages.begin();
|
| - it != languages.end(); ++it) {
|
| - const std::string& language = *it;
|
| - ResetTranslationAcceptedCount(language);
|
| - ResetTranslationDeniedCount(language);
|
| - }
|
| -}
|
| -
|
| -bool TranslatePrefs::IsBlockedLanguage(
|
| - const std::string& original_language) const {
|
| - return IsValueBlacklisted(kPrefTranslateBlockedLanguages,
|
| - original_language);
|
| -}
|
| -
|
| -void TranslatePrefs::BlockLanguage(
|
| - const std::string& original_language) {
|
| - BlacklistValue(kPrefTranslateBlockedLanguages, original_language);
|
| -
|
| - // Add the language to the language list at chrome://settings/languages.
|
| - std::string language = original_language;
|
| - translate::ToChromeLanguageSynonym(&language);
|
| -
|
| - std::vector<std::string> languages;
|
| - GetLanguageList(&languages);
|
| -
|
| - if (std::find(languages.begin(), languages.end(), language) ==
|
| - languages.end()) {
|
| - languages.push_back(language);
|
| - UpdateLanguageList(languages);
|
| - }
|
| -}
|
| -
|
| -void TranslatePrefs::UnblockLanguage(
|
| - const std::string& original_language) {
|
| - RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages,
|
| - original_language);
|
| -}
|
| -
|
| -void TranslatePrefs::RemoveLanguageFromLegacyBlacklist(
|
| - const std::string& original_language) {
|
| - RemoveValueFromBlacklist(kPrefTranslateLanguageBlacklist,
|
| - original_language);
|
| -}
|
| -
|
| -bool TranslatePrefs::IsSiteBlacklisted(const std::string& site) const {
|
| - return IsValueBlacklisted(kPrefTranslateSiteBlacklist, site);
|
| -}
|
| -
|
| -void TranslatePrefs::BlacklistSite(const std::string& site) {
|
| - BlacklistValue(kPrefTranslateSiteBlacklist, site);
|
| -}
|
| -
|
| -void TranslatePrefs::RemoveSiteFromBlacklist(const std::string& site) {
|
| - RemoveValueFromBlacklist(kPrefTranslateSiteBlacklist, site);
|
| -}
|
| -
|
| -bool TranslatePrefs::IsLanguagePairWhitelisted(
|
| - const std::string& original_language,
|
| - const std::string& target_language) {
|
| - const base::DictionaryValue* dict =
|
| - prefs_->GetDictionary(kPrefTranslateWhitelists);
|
| - if (dict && !dict->empty()) {
|
| - std::string auto_target_lang;
|
| - if (dict->GetString(original_language, &auto_target_lang) &&
|
| - auto_target_lang == target_language)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void TranslatePrefs::WhitelistLanguagePair(
|
| - const std::string& original_language,
|
| - const std::string& target_language) {
|
| - DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists);
|
| - base::DictionaryValue* dict = update.Get();
|
| - if (!dict) {
|
| - NOTREACHED() << "Unregistered translate whitelist pref";
|
| - return;
|
| - }
|
| - dict->SetString(original_language, target_language);
|
| -}
|
| -
|
| -void TranslatePrefs::RemoveLanguagePairFromWhitelist(
|
| - const std::string& original_language,
|
| - const std::string& target_language) {
|
| - DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists);
|
| - base::DictionaryValue* dict = update.Get();
|
| - if (!dict) {
|
| - NOTREACHED() << "Unregistered translate whitelist pref";
|
| - return;
|
| - }
|
| - dict->Remove(original_language, NULL);
|
| -}
|
| -
|
| -bool TranslatePrefs::HasBlockedLanguages() const {
|
| - return !IsListEmpty(kPrefTranslateBlockedLanguages);
|
| -}
|
| -
|
| -void TranslatePrefs::ClearBlockedLanguages() {
|
| - prefs_->ClearPref(kPrefTranslateBlockedLanguages);
|
| -}
|
| -
|
| -bool TranslatePrefs::HasBlacklistedSites() const {
|
| - return !IsListEmpty(kPrefTranslateSiteBlacklist);
|
| -}
|
| -
|
| -void TranslatePrefs::ClearBlacklistedSites() {
|
| - prefs_->ClearPref(kPrefTranslateSiteBlacklist);
|
| -}
|
| -
|
| -bool TranslatePrefs::HasWhitelistedLanguagePairs() const {
|
| - return !IsDictionaryEmpty(kPrefTranslateWhitelists);
|
| -}
|
| -
|
| -void TranslatePrefs::ClearWhitelistedLanguagePairs() {
|
| - prefs_->ClearPref(kPrefTranslateWhitelists);
|
| -}
|
| -
|
| -int TranslatePrefs::GetTranslationDeniedCount(
|
| - const std::string& language) const {
|
| - const base::DictionaryValue* dict =
|
| - prefs_->GetDictionary(kPrefTranslateDeniedCount);
|
| - int count = 0;
|
| - return dict->GetInteger(language, &count) ? count : 0;
|
| -}
|
| -
|
| -void TranslatePrefs::IncrementTranslationDeniedCount(
|
| - const std::string& language) {
|
| - DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount);
|
| - base::DictionaryValue* dict = update.Get();
|
| -
|
| - int count = 0;
|
| - dict->GetInteger(language, &count);
|
| - dict->SetInteger(language, count + 1);
|
| -}
|
| -
|
| -void TranslatePrefs::ResetTranslationDeniedCount(const std::string& language) {
|
| - DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount);
|
| - update.Get()->SetInteger(language, 0);
|
| -}
|
| -
|
| -int TranslatePrefs::GetTranslationAcceptedCount(const std::string& language) {
|
| - const base::DictionaryValue* dict =
|
| - prefs_->GetDictionary(kPrefTranslateAcceptedCount);
|
| - int count = 0;
|
| - return dict->GetInteger(language, &count) ? count : 0;
|
| -}
|
| -
|
| -void TranslatePrefs::IncrementTranslationAcceptedCount(
|
| - const std::string& language) {
|
| - DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount);
|
| - base::DictionaryValue* dict = update.Get();
|
| - int count = 0;
|
| - dict->GetInteger(language, &count);
|
| - dict->SetInteger(language, count + 1);
|
| -}
|
| -
|
| -void TranslatePrefs::ResetTranslationAcceptedCount(
|
| - const std::string& language) {
|
| - DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount);
|
| - update.Get()->SetInteger(language, 0);
|
| -}
|
| -
|
| -void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) {
|
| - DCHECK(languages);
|
| - DCHECK(languages->empty());
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| - const char* key = prefs::kLanguagePreferredLanguages;
|
| -#else
|
| - const char* key = prefs::kAcceptLanguages;
|
| -#endif
|
| -
|
| - std::string languages_str = prefs_->GetString(key);
|
| - base::SplitString(languages_str, ',', languages);
|
| -}
|
| -
|
| -void TranslatePrefs::UpdateLanguageList(
|
| - const std::vector<std::string>& languages) {
|
| -#if defined(OS_CHROMEOS)
|
| - std::string languages_str = JoinString(languages, ',');
|
| - prefs_->SetString(prefs::kLanguagePreferredLanguages, languages_str);
|
| -#endif
|
| -
|
| - // Save the same language list as accept languages preference as well, but we
|
| - // need to expand the language list, to make it more acceptable. For instance,
|
| - // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884.
|
| - std::vector<std::string> accept_languages;
|
| - ExpandLanguageCodes(languages, &accept_languages);
|
| - std::string accept_languages_str = JoinString(accept_languages, ',');
|
| - prefs_->SetString(prefs::kAcceptLanguages, accept_languages_str);
|
| -}
|
| -
|
| -// static
|
| -bool TranslatePrefs::CanTranslateLanguage(Profile* profile,
|
| - const std::string& language) {
|
| - TranslatePrefs translate_prefs(profile->GetPrefs());
|
| - bool blocked = translate_prefs.IsBlockedLanguage(language);
|
| -
|
| - TranslateAcceptLanguages* accept_languages =
|
| - TranslateAcceptLanguagesFactory::GetForBrowserContext(profile);
|
| - bool is_accept_language = accept_languages->IsAcceptLanguage(language);
|
| - bool can_be_accept_language =
|
| - TranslateAcceptLanguages::CanBeAcceptLanguage(language);
|
| -
|
| - // Don't translate any user black-listed languages. Checking
|
| - // |is_accept_language| is necessary because if the user eliminates the
|
| - // language from the preference, it is natural to forget whether or not
|
| - // the language should be translated. Checking |cannot_be_accept_language|
|
| - // is also necessary because some minor languages can't be selected in the
|
| - // language preference even though the language is available in Translate
|
| - // server.
|
| - if (blocked && (is_accept_language || !can_be_accept_language))
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| -bool TranslatePrefs::ShouldAutoTranslate(PrefService* user_prefs,
|
| - const std::string& original_language, std::string* target_language) {
|
| - TranslatePrefs prefs(user_prefs);
|
| - return prefs.IsLanguageWhitelisted(original_language, target_language);
|
| -}
|
| -
|
| -// static
|
| -void TranslatePrefs::RegisterProfilePrefs(
|
| - user_prefs::PrefRegistrySyncable* registry) {
|
| - registry->RegisterListPref(kPrefTranslateLanguageBlacklist,
|
| - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
|
| - registry->RegisterListPref(kPrefTranslateSiteBlacklist,
|
| - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
|
| - registry->RegisterDictionaryPref(
|
| - kPrefTranslateWhitelists,
|
| - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
|
| - registry->RegisterDictionaryPref(
|
| - kPrefTranslateDeniedCount,
|
| - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
|
| - registry->RegisterDictionaryPref(
|
| - kPrefTranslateAcceptedCount,
|
| - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
|
| - registry->RegisterListPref(kPrefTranslateBlockedLanguages,
|
| - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
|
| -}
|
| -
|
| -// static
|
| -void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs) {
|
| - // Old format of kPrefTranslateWhitelists
|
| - // - original language -> list of target langs to auto-translate
|
| - // - list of langs is in order of being enabled i.e. last in list is the
|
| - // most recent language that user enabled via
|
| - // Always translate |source_lang| to |target_lang|"
|
| - // - this results in a one-to-n relationship between source lang and target
|
| - // langs.
|
| - // New format:
|
| - // - original language -> one target language to auto-translate
|
| - // - each time that the user enables the "Always translate..." option, that
|
| - // target lang overwrites the previous one.
|
| - // - this results in a one-to-one relationship between source lang and target
|
| - // lang
|
| - // - we replace old list of target langs with the last target lang in list,
|
| - // assuming the last (i.e. most recent) target lang is what user wants to
|
| - // keep auto-translated.
|
| - DictionaryPrefUpdate update(user_prefs, kPrefTranslateWhitelists);
|
| - base::DictionaryValue* dict = update.Get();
|
| - if (dict && !dict->empty()) {
|
| - base::DictionaryValue::Iterator iter(*dict);
|
| - while (!iter.IsAtEnd()) {
|
| - const base::ListValue* list = NULL;
|
| - if (!iter.value().GetAsList(&list) || !list)
|
| - break; // Dictionary has either been migrated or new format.
|
| - std::string key = iter.key();
|
| - // Advance the iterator before removing the current element.
|
| - iter.Advance();
|
| - std::string target_lang;
|
| - if (list->empty() ||
|
| - !list->GetString(list->GetSize() - 1, &target_lang) ||
|
| - target_lang.empty()) {
|
| - dict->Remove(key, NULL);
|
| - } else {
|
| - dict->SetString(key, target_lang);
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Get the union of the blacklist and the Accept languages, and set this to
|
| - // the new language set 'translate_blocked_languages'. This is used for the
|
| - // settings UI for Translate and configration to determine which langauage
|
| - // should be translated instead of the blacklist. The blacklist is no longer
|
| - // used after launching the settings UI.
|
| - // After that, Set 'translate_languages_not_translate' to Accept languages to
|
| - // enable settings for users.
|
| - bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages);
|
| -
|
| - if (!merged) {
|
| - std::vector<std::string> blacklisted_languages;
|
| - GetBlacklistedLanguages(user_prefs, &blacklisted_languages);
|
| -
|
| - std::string accept_languages_str =
|
| - user_prefs->GetString(prefs::kAcceptLanguages);
|
| - std::vector<std::string> accept_languages;
|
| - base::SplitString(accept_languages_str, ',', &accept_languages);
|
| -
|
| - std::vector<std::string> blocked_languages;
|
| - CreateBlockedLanguages(&blocked_languages,
|
| - blacklisted_languages,
|
| - accept_languages);
|
| -
|
| - // Create the new preference kPrefTranslateBlockedLanguages.
|
| - {
|
| - base::ListValue blocked_languages_list;
|
| - for (std::vector<std::string>::const_iterator it =
|
| - blocked_languages.begin();
|
| - it != blocked_languages.end(); ++it) {
|
| - blocked_languages_list.Append(new base::StringValue(*it));
|
| - }
|
| - ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages);
|
| - base::ListValue* list = update.Get();
|
| - DCHECK(list != NULL);
|
| - list->Swap(&blocked_languages_list);
|
| - }
|
| -
|
| - // Update kAcceptLanguages
|
| - for (std::vector<std::string>::const_iterator it =
|
| - blocked_languages.begin();
|
| - it != blocked_languages.end(); ++it) {
|
| - std::string lang = *it;
|
| - translate::ToChromeLanguageSynonym(&lang);
|
| - bool not_found =
|
| - std::find(accept_languages.begin(), accept_languages.end(), lang) ==
|
| - accept_languages.end();
|
| - if (not_found)
|
| - accept_languages.push_back(lang);
|
| - }
|
| -
|
| - std::string new_accept_languages_str = JoinString(accept_languages, ",");
|
| - user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str);
|
| - }
|
| -}
|
| -
|
| -// static
|
| -void TranslatePrefs::CreateBlockedLanguages(
|
| - std::vector<std::string>* blocked_languages,
|
| - const std::vector<std::string>& blacklisted_languages,
|
| - const std::vector<std::string>& accept_languages) {
|
| - DCHECK(blocked_languages);
|
| - DCHECK(blocked_languages->empty());
|
| -
|
| - std::set<std::string> result;
|
| -
|
| - for (std::vector<std::string>::const_iterator it =
|
| - blacklisted_languages.begin();
|
| - it != blacklisted_languages.end(); ++it) {
|
| - result.insert(*it);
|
| - }
|
| -
|
| - const std::string& app_locale = g_browser_process->GetApplicationLocale();
|
| - std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale);
|
| - bool is_ui_english = ui_lang == "en" ||
|
| - StartsWithASCII(ui_lang, "en-", false);
|
| -
|
| - for (std::vector<std::string>::const_iterator it = accept_languages.begin();
|
| - it != accept_languages.end(); ++it) {
|
| - std::string converted_lang = ConvertLangCodeForTranslation(*it);
|
| -
|
| - // Regarding http://crbug.com/36182, even though English exists in Accept
|
| - // language list, English could be translated on non-English locale.
|
| - if (converted_lang == "en" && !is_ui_english)
|
| - continue;
|
| -
|
| - result.insert(converted_lang);
|
| - }
|
| -
|
| - blocked_languages->insert(blocked_languages->begin(),
|
| - result.begin(), result.end());
|
| -}
|
| -
|
| -// static
|
| -std::string TranslatePrefs::ConvertLangCodeForTranslation(
|
| - const std::string &lang) {
|
| - std::vector<std::string> tokens;
|
| - base::SplitString(lang, '-', &tokens);
|
| - if (tokens.size() < 1)
|
| - return lang;
|
| -
|
| - std::string main_part = tokens[0];
|
| -
|
| - // Translate doesn't support General Chinese and the sub code is necessary.
|
| - if (main_part == "zh")
|
| - return lang;
|
| -
|
| - translate::ToTranslateLanguageSynonym(&main_part);
|
| - return main_part;
|
| -}
|
| -
|
| -bool TranslatePrefs::IsValueInList(const base::ListValue* list,
|
| - const std::string& in_value) const {
|
| - for (size_t i = 0; i < list->GetSize(); ++i) {
|
| - std::string value;
|
| - if (list->GetString(i, &value) && value == in_value)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool TranslatePrefs::IsValueBlacklisted(const char* pref_id,
|
| - const std::string& value) const {
|
| - const base::ListValue* blacklist = prefs_->GetList(pref_id);
|
| - return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value));
|
| -}
|
| -
|
| -void TranslatePrefs::BlacklistValue(const char* pref_id,
|
| - const std::string& value) {
|
| - {
|
| - ListPrefUpdate update(prefs_, pref_id);
|
| - base::ListValue* blacklist = update.Get();
|
| - if (!blacklist) {
|
| - NOTREACHED() << "Unregistered translate blacklist pref";
|
| - return;
|
| - }
|
| - blacklist->Append(new base::StringValue(value));
|
| - }
|
| -}
|
| -
|
| -void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id,
|
| - const std::string& value) {
|
| - ListPrefUpdate update(prefs_, pref_id);
|
| - base::ListValue* blacklist = update.Get();
|
| - if (!blacklist) {
|
| - NOTREACHED() << "Unregistered translate blacklist pref";
|
| - return;
|
| - }
|
| - base::StringValue string_value(value);
|
| - blacklist->Remove(string_value, NULL);
|
| -}
|
| -
|
| -bool TranslatePrefs::IsLanguageWhitelisted(
|
| - const std::string& original_language, std::string* target_language) const {
|
| - const base::DictionaryValue* dict =
|
| - prefs_->GetDictionary(kPrefTranslateWhitelists);
|
| - if (dict && dict->GetString(original_language, target_language)) {
|
| - DCHECK(!target_language->empty());
|
| - return !target_language->empty();
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool TranslatePrefs::IsListEmpty(const char* pref_id) const {
|
| - const base::ListValue* blacklist = prefs_->GetList(pref_id);
|
| - return (blacklist == NULL || blacklist->empty());
|
| -}
|
| -
|
| -bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const {
|
| - const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id);
|
| - return (dict == NULL || dict->empty());
|
| -}
|
|
|