| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/translate/translate_prefs.h" | 5 #include "components/translate/core/browser/translate_prefs.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "base/prefs/scoped_user_pref_update.h" | 10 #include "base/prefs/scoped_user_pref_update.h" |
| 11 #include "base/strings/string_split.h" | 11 #include "base/strings/string_split.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "chrome/browser/browser_process.h" | |
| 14 #include "chrome/browser/profiles/profile.h" | |
| 15 #include "chrome/browser/translate/translate_accept_languages_factory.h" | |
| 16 #include "chrome/browser/translate/translate_manager.h" | |
| 17 #include "chrome/common/pref_names.h" | |
| 18 #include "components/translate/core/browser/translate_accept_languages.h" | 13 #include "components/translate/core/browser/translate_accept_languages.h" |
| 19 #include "components/translate/core/browser/translate_download_manager.h" | 14 #include "components/translate/core/browser/translate_download_manager.h" |
| 20 #include "components/translate/core/common/translate_util.h" | 15 #include "components/translate/core/common/translate_util.h" |
| 21 #include "components/user_prefs/pref_registry_syncable.h" | 16 #include "components/user_prefs/pref_registry_syncable.h" |
| 22 | 17 |
| 23 const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = | 18 const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = |
| 24 "translate_language_blacklist"; | 19 "translate_language_blacklist"; |
| 25 const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = | 20 const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = |
| 26 "translate_site_blacklist"; | 21 "translate_site_blacklist"; |
| 27 const char TranslatePrefs::kPrefTranslateWhitelists[] = | 22 const char TranslatePrefs::kPrefTranslateWhitelists[] = |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 const std::string& main_part = tokens[0]; | 71 const std::string& main_part = tokens[0]; |
| 77 if (seen.find(main_part) == seen.end()) { | 72 if (seen.find(main_part) == seen.end()) { |
| 78 expanded_languages->push_back(main_part); | 73 expanded_languages->push_back(main_part); |
| 79 seen.insert(main_part); | 74 seen.insert(main_part); |
| 80 } | 75 } |
| 81 } | 76 } |
| 82 } | 77 } |
| 83 | 78 |
| 84 } // namespace | 79 } // namespace |
| 85 | 80 |
| 86 TranslatePrefs::TranslatePrefs(PrefService* user_prefs) | 81 TranslatePrefs::TranslatePrefs(PrefService* user_prefs, |
| 87 : prefs_(user_prefs) { | 82 const char* accept_languages_pref, |
| 83 const char* preferred_languages_pref) |
| 84 : accept_languages_pref_(accept_languages_pref), |
| 85 prefs_(user_prefs) { |
| 86 #if defined(OS_CHROMEOS) |
| 87 preferred_languages_pref_ = preferred_languages_pref; |
| 88 #else |
| 89 DCHECK(!preferred_languages_pref); |
| 90 #endif |
| 88 } | 91 } |
| 89 | 92 |
| 90 void TranslatePrefs::ResetToDefaults() { | 93 void TranslatePrefs::ResetToDefaults() { |
| 91 ClearBlockedLanguages(); | 94 ClearBlockedLanguages(); |
| 92 ClearBlacklistedSites(); | 95 ClearBlacklistedSites(); |
| 93 ClearWhitelistedLanguagePairs(); | 96 ClearWhitelistedLanguagePairs(); |
| 94 | 97 |
| 95 std::vector<std::string> languages; | 98 std::vector<std::string> languages; |
| 96 GetLanguageList(&languages); | 99 GetLanguageList(&languages); |
| 97 for (std::vector<std::string>::const_iterator it = languages.begin(); | 100 for (std::vector<std::string>::const_iterator it = languages.begin(); |
| 98 it != languages.end(); ++it) { | 101 it != languages.end(); ++it) { |
| 99 const std::string& language = *it; | 102 const std::string& language = *it; |
| 100 ResetTranslationAcceptedCount(language); | 103 ResetTranslationAcceptedCount(language); |
| 101 ResetTranslationDeniedCount(language); | 104 ResetTranslationDeniedCount(language); |
| 102 } | 105 } |
| 103 } | 106 } |
| 104 | 107 |
| 105 bool TranslatePrefs::IsBlockedLanguage( | 108 bool TranslatePrefs::IsBlockedLanguage( |
| 106 const std::string& original_language) const { | 109 const std::string& original_language) const { |
| 107 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, | 110 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, |
| 108 original_language); | 111 original_language); |
| 109 } | 112 } |
| 110 | 113 |
| 111 void TranslatePrefs::BlockLanguage( | 114 void TranslatePrefs::BlockLanguage(const std::string& original_language) { |
| 112 const std::string& original_language) { | |
| 113 BlacklistValue(kPrefTranslateBlockedLanguages, original_language); | 115 BlacklistValue(kPrefTranslateBlockedLanguages, original_language); |
| 114 | 116 |
| 115 // Add the language to the language list at chrome://settings/languages. | 117 // Add the language to the language list at chrome://settings/languages. |
| 116 std::string language = original_language; | 118 std::string language = original_language; |
| 117 translate::ToChromeLanguageSynonym(&language); | 119 translate::ToChromeLanguageSynonym(&language); |
| 118 | 120 |
| 119 std::vector<std::string> languages; | 121 std::vector<std::string> languages; |
| 120 GetLanguageList(&languages); | 122 GetLanguageList(&languages); |
| 121 | 123 |
| 122 if (std::find(languages.begin(), languages.end(), language) == | 124 if (std::find(languages.begin(), languages.end(), language) == |
| 123 languages.end()) { | 125 languages.end()) { |
| 124 languages.push_back(language); | 126 languages.push_back(language); |
| 125 UpdateLanguageList(languages); | 127 UpdateLanguageList(languages); |
| 126 } | 128 } |
| 127 } | 129 } |
| 128 | 130 |
| 129 void TranslatePrefs::UnblockLanguage( | 131 void TranslatePrefs::UnblockLanguage(const std::string& original_language) { |
| 130 const std::string& original_language) { | 132 RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, original_language); |
| 131 RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, | |
| 132 original_language); | |
| 133 } | 133 } |
| 134 | 134 |
| 135 void TranslatePrefs::RemoveLanguageFromLegacyBlacklist( | 135 void TranslatePrefs::RemoveLanguageFromLegacyBlacklist( |
| 136 const std::string& original_language) { | 136 const std::string& original_language) { |
| 137 RemoveValueFromBlacklist(kPrefTranslateLanguageBlacklist, | 137 RemoveValueFromBlacklist(kPrefTranslateLanguageBlacklist, original_language); |
| 138 original_language); | |
| 139 } | 138 } |
| 140 | 139 |
| 141 bool TranslatePrefs::IsSiteBlacklisted(const std::string& site) const { | 140 bool TranslatePrefs::IsSiteBlacklisted(const std::string& site) const { |
| 142 return IsValueBlacklisted(kPrefTranslateSiteBlacklist, site); | 141 return IsValueBlacklisted(kPrefTranslateSiteBlacklist, site); |
| 143 } | 142 } |
| 144 | 143 |
| 145 void TranslatePrefs::BlacklistSite(const std::string& site) { | 144 void TranslatePrefs::BlacklistSite(const std::string& site) { |
| 146 BlacklistValue(kPrefTranslateSiteBlacklist, site); | 145 BlacklistValue(kPrefTranslateSiteBlacklist, site); |
| 147 } | 146 } |
| 148 | 147 |
| 149 void TranslatePrefs::RemoveSiteFromBlacklist(const std::string& site) { | 148 void TranslatePrefs::RemoveSiteFromBlacklist(const std::string& site) { |
| 150 RemoveValueFromBlacklist(kPrefTranslateSiteBlacklist, site); | 149 RemoveValueFromBlacklist(kPrefTranslateSiteBlacklist, site); |
| 151 } | 150 } |
| 152 | 151 |
| 153 bool TranslatePrefs::IsLanguagePairWhitelisted( | 152 bool TranslatePrefs::IsLanguagePairWhitelisted( |
| 154 const std::string& original_language, | 153 const std::string& original_language, |
| 155 const std::string& target_language) { | 154 const std::string& target_language) { |
| 156 const base::DictionaryValue* dict = | 155 const base::DictionaryValue* dict = |
| 157 prefs_->GetDictionary(kPrefTranslateWhitelists); | 156 prefs_->GetDictionary(kPrefTranslateWhitelists); |
| 158 if (dict && !dict->empty()) { | 157 if (dict && !dict->empty()) { |
| 159 std::string auto_target_lang; | 158 std::string auto_target_lang; |
| 160 if (dict->GetString(original_language, &auto_target_lang) && | 159 if (dict->GetString(original_language, &auto_target_lang) && |
| 161 auto_target_lang == target_language) | 160 auto_target_lang == target_language) |
| 162 return true; | 161 return true; |
| 163 } | 162 } |
| 164 return false; | 163 return false; |
| 165 } | 164 } |
| 166 | 165 |
| 167 void TranslatePrefs::WhitelistLanguagePair( | 166 void TranslatePrefs::WhitelistLanguagePair(const std::string& original_language, |
| 168 const std::string& original_language, | 167 const std::string& target_language) { |
| 169 const std::string& target_language) { | |
| 170 DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); | 168 DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); |
| 171 base::DictionaryValue* dict = update.Get(); | 169 base::DictionaryValue* dict = update.Get(); |
| 172 if (!dict) { | 170 if (!dict) { |
| 173 NOTREACHED() << "Unregistered translate whitelist pref"; | 171 NOTREACHED() << "Unregistered translate whitelist pref"; |
| 174 return; | 172 return; |
| 175 } | 173 } |
| 176 dict->SetString(original_language, target_language); | 174 dict->SetString(original_language, target_language); |
| 177 } | 175 } |
| 178 | 176 |
| 179 void TranslatePrefs::RemoveLanguagePairFromWhitelist( | 177 void TranslatePrefs::RemoveLanguagePairFromWhitelist( |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 const std::string& language) { | 253 const std::string& language) { |
| 256 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); | 254 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); |
| 257 update.Get()->SetInteger(language, 0); | 255 update.Get()->SetInteger(language, 0); |
| 258 } | 256 } |
| 259 | 257 |
| 260 void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { | 258 void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { |
| 261 DCHECK(languages); | 259 DCHECK(languages); |
| 262 DCHECK(languages->empty()); | 260 DCHECK(languages->empty()); |
| 263 | 261 |
| 264 #if defined(OS_CHROMEOS) | 262 #if defined(OS_CHROMEOS) |
| 265 const char* key = prefs::kLanguagePreferredLanguages; | 263 const char* key = preferred_languages_pref_.c_str(); |
| 266 #else | 264 #else |
| 267 const char* key = prefs::kAcceptLanguages; | 265 const char* key = accept_languages_pref_.c_str(); |
| 268 #endif | 266 #endif |
| 269 | 267 |
| 270 std::string languages_str = prefs_->GetString(key); | 268 std::string languages_str = prefs_->GetString(key); |
| 271 base::SplitString(languages_str, ',', languages); | 269 base::SplitString(languages_str, ',', languages); |
| 272 } | 270 } |
| 273 | 271 |
| 274 void TranslatePrefs::UpdateLanguageList( | 272 void TranslatePrefs::UpdateLanguageList( |
| 275 const std::vector<std::string>& languages) { | 273 const std::vector<std::string>& languages) { |
| 276 #if defined(OS_CHROMEOS) | 274 #if defined(OS_CHROMEOS) |
| 277 std::string languages_str = JoinString(languages, ','); | 275 std::string languages_str = JoinString(languages, ','); |
| 278 prefs_->SetString(prefs::kLanguagePreferredLanguages, languages_str); | 276 prefs_->SetString(preferred_languages_pref_.c_str(), languages_str); |
| 279 #endif | 277 #endif |
| 280 | 278 |
| 281 // Save the same language list as accept languages preference as well, but we | 279 // Save the same language list as accept languages preference as well, but we |
| 282 // need to expand the language list, to make it more acceptable. For instance, | 280 // need to expand the language list, to make it more acceptable. For instance, |
| 283 // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884. | 281 // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884. |
| 284 std::vector<std::string> accept_languages; | 282 std::vector<std::string> accept_languages; |
| 285 ExpandLanguageCodes(languages, &accept_languages); | 283 ExpandLanguageCodes(languages, &accept_languages); |
| 286 std::string accept_languages_str = JoinString(accept_languages, ','); | 284 std::string accept_languages_str = JoinString(accept_languages, ','); |
| 287 prefs_->SetString(prefs::kAcceptLanguages, accept_languages_str); | 285 prefs_->SetString(accept_languages_pref_.c_str(), accept_languages_str); |
| 288 } | 286 } |
| 289 | 287 |
| 290 // static | 288 bool TranslatePrefs::CanTranslateLanguage( |
| 291 bool TranslatePrefs::CanTranslateLanguage(Profile* profile, | 289 TranslateAcceptLanguages* accept_languages, |
| 292 const std::string& language) { | 290 const std::string& language) { |
| 293 TranslatePrefs translate_prefs(profile->GetPrefs()); | |
| 294 bool blocked = translate_prefs.IsBlockedLanguage(language); | |
| 295 | |
| 296 TranslateAcceptLanguages* accept_languages = | |
| 297 TranslateAcceptLanguagesFactory::GetForBrowserContext(profile); | |
| 298 bool is_accept_language = accept_languages->IsAcceptLanguage(language); | |
| 299 bool can_be_accept_language = | 291 bool can_be_accept_language = |
| 300 TranslateAcceptLanguages::CanBeAcceptLanguage(language); | 292 TranslateAcceptLanguages::CanBeAcceptLanguage(language); |
| 293 bool is_accept_language = accept_languages->IsAcceptLanguage(language); |
| 301 | 294 |
| 302 // Don't translate any user black-listed languages. Checking | 295 // Don't translate any user black-listed languages. Checking |
| 303 // |is_accept_language| is necessary because if the user eliminates the | 296 // |is_accept_language| is necessary because if the user eliminates the |
| 304 // language from the preference, it is natural to forget whether or not | 297 // language from the preference, it is natural to forget whether or not |
| 305 // the language should be translated. Checking |cannot_be_accept_language| | 298 // the language should be translated. Checking |cannot_be_accept_language| |
| 306 // is also necessary because some minor languages can't be selected in the | 299 // is also necessary because some minor languages can't be selected in the |
| 307 // language preference even though the language is available in Translate | 300 // language preference even though the language is available in Translate |
| 308 // server. | 301 // server. |
| 309 if (blocked && (is_accept_language || !can_be_accept_language)) | 302 if (IsBlockedLanguage(language) && |
| 303 (is_accept_language || !can_be_accept_language)) |
| 310 return false; | 304 return false; |
| 311 | 305 |
| 312 return true; | 306 return true; |
| 313 } | 307 } |
| 314 | 308 |
| 315 // static | 309 bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language, |
| 316 bool TranslatePrefs::ShouldAutoTranslate(PrefService* user_prefs, | 310 std::string* target_language) { |
| 317 const std::string& original_language, std::string* target_language) { | 311 const base::DictionaryValue* dict = |
| 318 TranslatePrefs prefs(user_prefs); | 312 prefs_->GetDictionary(kPrefTranslateWhitelists); |
| 319 return prefs.IsLanguageWhitelisted(original_language, target_language); | 313 if (dict && dict->GetString(original_language, target_language)) { |
| 314 DCHECK(!target_language->empty()); |
| 315 return !target_language->empty(); |
| 316 } |
| 317 return false; |
| 320 } | 318 } |
| 321 | 319 |
| 322 // static | 320 // static |
| 323 void TranslatePrefs::RegisterProfilePrefs( | 321 void TranslatePrefs::RegisterProfilePrefs( |
| 324 user_prefs::PrefRegistrySyncable* registry) { | 322 user_prefs::PrefRegistrySyncable* registry) { |
| 325 registry->RegisterListPref(kPrefTranslateLanguageBlacklist, | 323 registry->RegisterListPref(kPrefTranslateLanguageBlacklist, |
| 326 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 324 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 327 registry->RegisterListPref(kPrefTranslateSiteBlacklist, | 325 registry->RegisterListPref(kPrefTranslateSiteBlacklist, |
| 328 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 326 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 329 registry->RegisterDictionaryPref( | 327 registry->RegisterDictionaryPref( |
| 330 kPrefTranslateWhitelists, | 328 kPrefTranslateWhitelists, |
| 331 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 329 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 332 registry->RegisterDictionaryPref( | 330 registry->RegisterDictionaryPref( |
| 333 kPrefTranslateDeniedCount, | 331 kPrefTranslateDeniedCount, |
| 334 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 332 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 335 registry->RegisterDictionaryPref( | 333 registry->RegisterDictionaryPref( |
| 336 kPrefTranslateAcceptedCount, | 334 kPrefTranslateAcceptedCount, |
| 337 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 335 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 338 registry->RegisterListPref(kPrefTranslateBlockedLanguages, | 336 registry->RegisterListPref(kPrefTranslateBlockedLanguages, |
| 339 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 337 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 340 } | 338 } |
| 341 | 339 |
| 342 // static | 340 // static |
| 343 void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs) { | 341 void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs, |
| 342 const char* accept_languages_pref) { |
| 344 // Old format of kPrefTranslateWhitelists | 343 // Old format of kPrefTranslateWhitelists |
| 345 // - original language -> list of target langs to auto-translate | 344 // - original language -> list of target langs to auto-translate |
| 346 // - list of langs is in order of being enabled i.e. last in list is the | 345 // - list of langs is in order of being enabled i.e. last in list is the |
| 347 // most recent language that user enabled via | 346 // most recent language that user enabled via |
| 348 // Always translate |source_lang| to |target_lang|" | 347 // Always translate |source_lang| to |target_lang|" |
| 349 // - this results in a one-to-n relationship between source lang and target | 348 // - this results in a one-to-n relationship between source lang and target |
| 350 // langs. | 349 // langs. |
| 351 // New format: | 350 // New format: |
| 352 // - original language -> one target language to auto-translate | 351 // - original language -> one target language to auto-translate |
| 353 // - each time that the user enables the "Always translate..." option, that | 352 // - each time that the user enables the "Always translate..." option, that |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 // used after launching the settings UI. | 385 // used after launching the settings UI. |
| 387 // After that, Set 'translate_languages_not_translate' to Accept languages to | 386 // After that, Set 'translate_languages_not_translate' to Accept languages to |
| 388 // enable settings for users. | 387 // enable settings for users. |
| 389 bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); | 388 bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); |
| 390 | 389 |
| 391 if (!merged) { | 390 if (!merged) { |
| 392 std::vector<std::string> blacklisted_languages; | 391 std::vector<std::string> blacklisted_languages; |
| 393 GetBlacklistedLanguages(user_prefs, &blacklisted_languages); | 392 GetBlacklistedLanguages(user_prefs, &blacklisted_languages); |
| 394 | 393 |
| 395 std::string accept_languages_str = | 394 std::string accept_languages_str = |
| 396 user_prefs->GetString(prefs::kAcceptLanguages); | 395 user_prefs->GetString(accept_languages_pref); |
| 397 std::vector<std::string> accept_languages; | 396 std::vector<std::string> accept_languages; |
| 398 base::SplitString(accept_languages_str, ',', &accept_languages); | 397 base::SplitString(accept_languages_str, ',', &accept_languages); |
| 399 | 398 |
| 400 std::vector<std::string> blocked_languages; | 399 std::vector<std::string> blocked_languages; |
| 401 CreateBlockedLanguages(&blocked_languages, | 400 CreateBlockedLanguages( |
| 402 blacklisted_languages, | 401 &blocked_languages, blacklisted_languages, accept_languages); |
| 403 accept_languages); | |
| 404 | 402 |
| 405 // Create the new preference kPrefTranslateBlockedLanguages. | 403 // Create the new preference kPrefTranslateBlockedLanguages. |
| 406 { | 404 { |
| 407 base::ListValue blocked_languages_list; | 405 base::ListValue blocked_languages_list; |
| 408 for (std::vector<std::string>::const_iterator it = | 406 for (std::vector<std::string>::const_iterator it = |
| 409 blocked_languages.begin(); | 407 blocked_languages.begin(); |
| 410 it != blocked_languages.end(); ++it) { | 408 it != blocked_languages.end(); ++it) { |
| 411 blocked_languages_list.Append(new base::StringValue(*it)); | 409 blocked_languages_list.Append(new base::StringValue(*it)); |
| 412 } | 410 } |
| 413 ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); | 411 ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); |
| 414 base::ListValue* list = update.Get(); | 412 base::ListValue* list = update.Get(); |
| 415 DCHECK(list != NULL); | 413 DCHECK(list != NULL); |
| 416 list->Swap(&blocked_languages_list); | 414 list->Swap(&blocked_languages_list); |
| 417 } | 415 } |
| 418 | 416 |
| 419 // Update kAcceptLanguages | 417 // Update kAcceptLanguages |
| 420 for (std::vector<std::string>::const_iterator it = | 418 for (std::vector<std::string>::const_iterator it = |
| 421 blocked_languages.begin(); | 419 blocked_languages.begin(); |
| 422 it != blocked_languages.end(); ++it) { | 420 it != blocked_languages.end(); ++it) { |
| 423 std::string lang = *it; | 421 std::string lang = *it; |
| 424 translate::ToChromeLanguageSynonym(&lang); | 422 translate::ToChromeLanguageSynonym(&lang); |
| 425 bool not_found = | 423 bool not_found = |
| 426 std::find(accept_languages.begin(), accept_languages.end(), lang) == | 424 std::find(accept_languages.begin(), accept_languages.end(), lang) == |
| 427 accept_languages.end(); | 425 accept_languages.end(); |
| 428 if (not_found) | 426 if (not_found) |
| 429 accept_languages.push_back(lang); | 427 accept_languages.push_back(lang); |
| 430 } | 428 } |
| 431 | 429 |
| 432 std::string new_accept_languages_str = JoinString(accept_languages, ","); | 430 std::string new_accept_languages_str = JoinString(accept_languages, ","); |
| 433 user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str); | 431 user_prefs->SetString(accept_languages_pref, new_accept_languages_str); |
| 434 } | 432 } |
| 435 } | 433 } |
| 436 | 434 |
| 437 // static | 435 // static |
| 438 void TranslatePrefs::CreateBlockedLanguages( | 436 void TranslatePrefs::CreateBlockedLanguages( |
| 439 std::vector<std::string>* blocked_languages, | 437 std::vector<std::string>* blocked_languages, |
| 440 const std::vector<std::string>& blacklisted_languages, | 438 const std::vector<std::string>& blacklisted_languages, |
| 441 const std::vector<std::string>& accept_languages) { | 439 const std::vector<std::string>& accept_languages) { |
| 442 DCHECK(blocked_languages); | 440 DCHECK(blocked_languages); |
| 443 DCHECK(blocked_languages->empty()); | 441 DCHECK(blocked_languages->empty()); |
| 444 | 442 |
| 445 std::set<std::string> result; | 443 std::set<std::string> result; |
| 446 | 444 |
| 447 for (std::vector<std::string>::const_iterator it = | 445 for (std::vector<std::string>::const_iterator it = |
| 448 blacklisted_languages.begin(); | 446 blacklisted_languages.begin(); |
| 449 it != blacklisted_languages.end(); ++it) { | 447 it != blacklisted_languages.end(); ++it) { |
| 450 result.insert(*it); | 448 result.insert(*it); |
| 451 } | 449 } |
| 452 | 450 |
| 453 const std::string& app_locale = g_browser_process->GetApplicationLocale(); | 451 const std::string& app_locale = |
| 452 TranslateDownloadManager::GetInstance()->application_locale(); |
| 454 std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale); | 453 std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale); |
| 455 bool is_ui_english = ui_lang == "en" || | 454 bool is_ui_english = ui_lang == "en" || |
| 456 StartsWithASCII(ui_lang, "en-", false); | 455 StartsWithASCII(ui_lang, "en-", false); |
| 457 | 456 |
| 458 for (std::vector<std::string>::const_iterator it = accept_languages.begin(); | 457 for (std::vector<std::string>::const_iterator it = accept_languages.begin(); |
| 459 it != accept_languages.end(); ++it) { | 458 it != accept_languages.end(); ++it) { |
| 460 std::string converted_lang = ConvertLangCodeForTranslation(*it); | 459 std::string converted_lang = ConvertLangCodeForTranslation(*it); |
| 461 | 460 |
| 462 // Regarding http://crbug.com/36182, even though English exists in Accept | 461 // Regarding http://crbug.com/36182, even though English exists in Accept |
| 463 // language list, English could be translated on non-English locale. | 462 // language list, English could be translated on non-English locale. |
| 464 if (converted_lang == "en" && !is_ui_english) | 463 if (converted_lang == "en" && !is_ui_english) |
| 465 continue; | 464 continue; |
| 466 | 465 |
| 467 result.insert(converted_lang); | 466 result.insert(converted_lang); |
| 468 } | 467 } |
| 469 | 468 |
| 470 blocked_languages->insert(blocked_languages->begin(), | 469 blocked_languages->insert( |
| 471 result.begin(), result.end()); | 470 blocked_languages->begin(), result.begin(), result.end()); |
| 472 } | 471 } |
| 473 | 472 |
| 474 // static | 473 // static |
| 475 std::string TranslatePrefs::ConvertLangCodeForTranslation( | 474 std::string TranslatePrefs::ConvertLangCodeForTranslation( |
| 476 const std::string &lang) { | 475 const std::string& lang) { |
| 477 std::vector<std::string> tokens; | 476 std::vector<std::string> tokens; |
| 478 base::SplitString(lang, '-', &tokens); | 477 base::SplitString(lang, '-', &tokens); |
| 479 if (tokens.size() < 1) | 478 if (tokens.size() < 1) |
| 480 return lang; | 479 return lang; |
| 481 | 480 |
| 482 std::string main_part = tokens[0]; | 481 std::string main_part = tokens[0]; |
| 483 | 482 |
| 484 // Translate doesn't support General Chinese and the sub code is necessary. | 483 // Translate doesn't support General Chinese and the sub code is necessary. |
| 485 if (main_part == "zh") | 484 if (main_part == "zh") |
| 486 return lang; | 485 return lang; |
| 487 | 486 |
| 488 translate::ToTranslateLanguageSynonym(&main_part); | 487 translate::ToTranslateLanguageSynonym(&main_part); |
| 489 return main_part; | 488 return main_part; |
| 490 } | 489 } |
| 491 | 490 |
| 492 bool TranslatePrefs::IsValueInList(const base::ListValue* list, | 491 bool TranslatePrefs::IsValueInList(const base::ListValue* list, |
| 493 const std::string& in_value) const { | 492 const std::string& in_value) const { |
| 494 for (size_t i = 0; i < list->GetSize(); ++i) { | 493 for (size_t i = 0; i < list->GetSize(); ++i) { |
| 495 std::string value; | 494 std::string value; |
| 496 if (list->GetString(i, &value) && value == in_value) | 495 if (list->GetString(i, &value) && value == in_value) |
| 497 return true; | 496 return true; |
| 498 } | 497 } |
| 499 return false; | 498 return false; |
| 500 } | 499 } |
| 501 | 500 |
| 502 bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, | 501 bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, |
| 503 const std::string& value) const { | 502 const std::string& value) const { |
| 504 const base::ListValue* blacklist = prefs_->GetList(pref_id); | 503 const base::ListValue* blacklist = prefs_->GetList(pref_id); |
| 505 return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); | 504 return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); |
| 506 } | 505 } |
| 507 | 506 |
| 508 void TranslatePrefs::BlacklistValue(const char* pref_id, | 507 void TranslatePrefs::BlacklistValue(const char* pref_id, |
| 509 const std::string& value) { | 508 const std::string& value) { |
| 510 { | 509 { |
| 511 ListPrefUpdate update(prefs_, pref_id); | 510 ListPrefUpdate update(prefs_, pref_id); |
| 512 base::ListValue* blacklist = update.Get(); | 511 base::ListValue* blacklist = update.Get(); |
| 513 if (!blacklist) { | 512 if (!blacklist) { |
| 514 NOTREACHED() << "Unregistered translate blacklist pref"; | 513 NOTREACHED() << "Unregistered translate blacklist pref"; |
| 515 return; | 514 return; |
| 516 } | 515 } |
| 517 blacklist->Append(new base::StringValue(value)); | 516 blacklist->Append(new base::StringValue(value)); |
| 518 } | 517 } |
| 519 } | 518 } |
| 520 | 519 |
| 521 void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, | 520 void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, |
| 522 const std::string& value) { | 521 const std::string& value) { |
| 523 ListPrefUpdate update(prefs_, pref_id); | 522 ListPrefUpdate update(prefs_, pref_id); |
| 524 base::ListValue* blacklist = update.Get(); | 523 base::ListValue* blacklist = update.Get(); |
| 525 if (!blacklist) { | 524 if (!blacklist) { |
| 526 NOTREACHED() << "Unregistered translate blacklist pref"; | 525 NOTREACHED() << "Unregistered translate blacklist pref"; |
| 527 return; | 526 return; |
| 528 } | 527 } |
| 529 base::StringValue string_value(value); | 528 base::StringValue string_value(value); |
| 530 blacklist->Remove(string_value, NULL); | 529 blacklist->Remove(string_value, NULL); |
| 531 } | 530 } |
| 532 | 531 |
| 533 bool TranslatePrefs::IsLanguageWhitelisted( | |
| 534 const std::string& original_language, std::string* target_language) const { | |
| 535 const base::DictionaryValue* dict = | |
| 536 prefs_->GetDictionary(kPrefTranslateWhitelists); | |
| 537 if (dict && dict->GetString(original_language, target_language)) { | |
| 538 DCHECK(!target_language->empty()); | |
| 539 return !target_language->empty(); | |
| 540 } | |
| 541 return false; | |
| 542 } | |
| 543 | |
| 544 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { | 532 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { |
| 545 const base::ListValue* blacklist = prefs_->GetList(pref_id); | 533 const base::ListValue* blacklist = prefs_->GetList(pref_id); |
| 546 return (blacklist == NULL || blacklist->empty()); | 534 return (blacklist == NULL || blacklist->empty()); |
| 547 } | 535 } |
| 548 | 536 |
| 549 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { | 537 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { |
| 550 const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); | 538 const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); |
| 551 return (dict == NULL || dict->empty()); | 539 return (dict == NULL || dict->empty()); |
| 552 } | 540 } |
| OLD | NEW |