Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 #if defined(OS_CHROMEOS) |
| 83 const char* preferred_languages_pref, | |
| 84 #endif | |
| 85 const char* accept_languages_pref) | |
| 86 : accept_languages_pref_(accept_languages_pref), | |
| 87 #if defined(OS_CHROMEOS) | |
| 88 preferred_languages_pref_(preferred_languages_pref), | |
| 89 #endif | |
| 90 prefs_(user_prefs) { | |
| 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(bool is_accept_language, |
| 291 bool TranslatePrefs::CanTranslateLanguage(Profile* profile, | |
| 292 const std::string& language) { | 289 const std::string& language) { |
| 293 TranslatePrefs translate_prefs(profile->GetPrefs()); | |
| 294 bool blocked = translate_prefs.IsBlockedLanguage(language); | |
| 295 | |
| 296 TranslateAcceptLanguages* accept_languages = | |
|
blundell
2014/02/12 14:01:43
Bikeshedding: It seems to me that an alternative f
droger
2014/02/12 14:08:23
I'm a bit scared because this assumes that the Tra
droger
2014/02/12 14:38:47
With your suggestion, this method can also no long
| |
| 297 TranslateAcceptLanguagesFactory::GetForBrowserContext(profile); | |
| 298 bool is_accept_language = accept_languages->IsAcceptLanguage(language); | |
| 299 bool can_be_accept_language = | 290 bool can_be_accept_language = |
| 300 TranslateAcceptLanguages::CanBeAcceptLanguage(language); | 291 TranslateAcceptLanguages::CanBeAcceptLanguage(language); |
| 301 | 292 |
| 302 // Don't translate any user black-listed languages. Checking | 293 // Don't translate any user black-listed languages. Checking |
| 303 // |is_accept_language| is necessary because if the user eliminates the | 294 // |is_accept_language| is necessary because if the user eliminates the |
| 304 // language from the preference, it is natural to forget whether or not | 295 // language from the preference, it is natural to forget whether or not |
| 305 // the language should be translated. Checking |cannot_be_accept_language| | 296 // the language should be translated. Checking |cannot_be_accept_language| |
| 306 // is also necessary because some minor languages can't be selected in the | 297 // is also necessary because some minor languages can't be selected in the |
| 307 // language preference even though the language is available in Translate | 298 // language preference even though the language is available in Translate |
| 308 // server. | 299 // server. |
| 309 if (blocked && (is_accept_language || !can_be_accept_language)) | 300 if (IsBlockedLanguage(language) && |
| 301 (is_accept_language || !can_be_accept_language)) | |
| 310 return false; | 302 return false; |
| 311 | 303 |
| 312 return true; | 304 return true; |
| 313 } | 305 } |
| 314 | 306 |
| 315 // static | 307 bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language, |
| 316 bool TranslatePrefs::ShouldAutoTranslate(PrefService* user_prefs, | 308 std::string* target_language) { |
| 317 const std::string& original_language, std::string* target_language) { | 309 const base::DictionaryValue* dict = |
| 318 TranslatePrefs prefs(user_prefs); | 310 prefs_->GetDictionary(kPrefTranslateWhitelists); |
| 319 return prefs.IsLanguageWhitelisted(original_language, target_language); | 311 if (dict && dict->GetString(original_language, target_language)) { |
| 312 DCHECK(!target_language->empty()); | |
| 313 return !target_language->empty(); | |
| 314 } | |
| 315 return false; | |
| 320 } | 316 } |
| 321 | 317 |
| 322 // static | 318 // static |
| 323 void TranslatePrefs::RegisterProfilePrefs( | 319 void TranslatePrefs::RegisterProfilePrefs( |
| 324 user_prefs::PrefRegistrySyncable* registry) { | 320 user_prefs::PrefRegistrySyncable* registry) { |
| 325 registry->RegisterListPref(kPrefTranslateLanguageBlacklist, | 321 registry->RegisterListPref(kPrefTranslateLanguageBlacklist, |
| 326 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 322 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 327 registry->RegisterListPref(kPrefTranslateSiteBlacklist, | 323 registry->RegisterListPref(kPrefTranslateSiteBlacklist, |
| 328 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 324 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 329 registry->RegisterDictionaryPref( | 325 registry->RegisterDictionaryPref( |
| 330 kPrefTranslateWhitelists, | 326 kPrefTranslateWhitelists, |
| 331 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 327 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 332 registry->RegisterDictionaryPref( | 328 registry->RegisterDictionaryPref( |
| 333 kPrefTranslateDeniedCount, | 329 kPrefTranslateDeniedCount, |
| 334 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 330 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 335 registry->RegisterDictionaryPref( | 331 registry->RegisterDictionaryPref( |
| 336 kPrefTranslateAcceptedCount, | 332 kPrefTranslateAcceptedCount, |
| 337 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 333 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 338 registry->RegisterListPref(kPrefTranslateBlockedLanguages, | 334 registry->RegisterListPref(kPrefTranslateBlockedLanguages, |
| 339 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 335 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 340 } | 336 } |
| 341 | 337 |
| 342 // static | 338 // static |
| 343 void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs) { | 339 void TranslatePrefs::MigrateUserPrefs(PrefService* user_prefs, |
| 340 const char* accept_languages_pref) { | |
| 344 // Old format of kPrefTranslateWhitelists | 341 // Old format of kPrefTranslateWhitelists |
| 345 // - original language -> list of target langs to auto-translate | 342 // - 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 | 343 // - list of langs is in order of being enabled i.e. last in list is the |
| 347 // most recent language that user enabled via | 344 // most recent language that user enabled via |
| 348 // Always translate |source_lang| to |target_lang|" | 345 // Always translate |source_lang| to |target_lang|" |
| 349 // - this results in a one-to-n relationship between source lang and target | 346 // - this results in a one-to-n relationship between source lang and target |
| 350 // langs. | 347 // langs. |
| 351 // New format: | 348 // New format: |
| 352 // - original language -> one target language to auto-translate | 349 // - original language -> one target language to auto-translate |
| 353 // - each time that the user enables the "Always translate..." option, that | 350 // - 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. | 383 // used after launching the settings UI. |
| 387 // After that, Set 'translate_languages_not_translate' to Accept languages to | 384 // After that, Set 'translate_languages_not_translate' to Accept languages to |
| 388 // enable settings for users. | 385 // enable settings for users. |
| 389 bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); | 386 bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); |
| 390 | 387 |
| 391 if (!merged) { | 388 if (!merged) { |
| 392 std::vector<std::string> blacklisted_languages; | 389 std::vector<std::string> blacklisted_languages; |
| 393 GetBlacklistedLanguages(user_prefs, &blacklisted_languages); | 390 GetBlacklistedLanguages(user_prefs, &blacklisted_languages); |
| 394 | 391 |
| 395 std::string accept_languages_str = | 392 std::string accept_languages_str = |
| 396 user_prefs->GetString(prefs::kAcceptLanguages); | 393 user_prefs->GetString(accept_languages_pref); |
| 397 std::vector<std::string> accept_languages; | 394 std::vector<std::string> accept_languages; |
| 398 base::SplitString(accept_languages_str, ',', &accept_languages); | 395 base::SplitString(accept_languages_str, ',', &accept_languages); |
| 399 | 396 |
| 400 std::vector<std::string> blocked_languages; | 397 std::vector<std::string> blocked_languages; |
| 401 CreateBlockedLanguages(&blocked_languages, | 398 CreateBlockedLanguages( |
| 402 blacklisted_languages, | 399 &blocked_languages, blacklisted_languages, accept_languages); |
| 403 accept_languages); | |
| 404 | 400 |
| 405 // Create the new preference kPrefTranslateBlockedLanguages. | 401 // Create the new preference kPrefTranslateBlockedLanguages. |
| 406 { | 402 { |
| 407 base::ListValue blocked_languages_list; | 403 base::ListValue blocked_languages_list; |
| 408 for (std::vector<std::string>::const_iterator it = | 404 for (std::vector<std::string>::const_iterator it = |
| 409 blocked_languages.begin(); | 405 blocked_languages.begin(); |
| 410 it != blocked_languages.end(); ++it) { | 406 it != blocked_languages.end(); ++it) { |
| 411 blocked_languages_list.Append(new base::StringValue(*it)); | 407 blocked_languages_list.Append(new base::StringValue(*it)); |
| 412 } | 408 } |
| 413 ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); | 409 ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); |
| 414 base::ListValue* list = update.Get(); | 410 base::ListValue* list = update.Get(); |
| 415 DCHECK(list != NULL); | 411 DCHECK(list != NULL); |
| 416 list->Swap(&blocked_languages_list); | 412 list->Swap(&blocked_languages_list); |
| 417 } | 413 } |
| 418 | 414 |
| 419 // Update kAcceptLanguages | 415 // Update kAcceptLanguages |
| 420 for (std::vector<std::string>::const_iterator it = | 416 for (std::vector<std::string>::const_iterator it = |
| 421 blocked_languages.begin(); | 417 blocked_languages.begin(); |
| 422 it != blocked_languages.end(); ++it) { | 418 it != blocked_languages.end(); ++it) { |
| 423 std::string lang = *it; | 419 std::string lang = *it; |
| 424 translate::ToChromeLanguageSynonym(&lang); | 420 translate::ToChromeLanguageSynonym(&lang); |
| 425 bool not_found = | 421 bool not_found = |
| 426 std::find(accept_languages.begin(), accept_languages.end(), lang) == | 422 std::find(accept_languages.begin(), accept_languages.end(), lang) == |
| 427 accept_languages.end(); | 423 accept_languages.end(); |
| 428 if (not_found) | 424 if (not_found) |
| 429 accept_languages.push_back(lang); | 425 accept_languages.push_back(lang); |
| 430 } | 426 } |
| 431 | 427 |
| 432 std::string new_accept_languages_str = JoinString(accept_languages, ","); | 428 std::string new_accept_languages_str = JoinString(accept_languages, ","); |
| 433 user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str); | 429 user_prefs->SetString(accept_languages_pref, new_accept_languages_str); |
| 434 } | 430 } |
| 435 } | 431 } |
| 436 | 432 |
| 437 // static | 433 // static |
| 438 void TranslatePrefs::CreateBlockedLanguages( | 434 void TranslatePrefs::CreateBlockedLanguages( |
| 439 std::vector<std::string>* blocked_languages, | 435 std::vector<std::string>* blocked_languages, |
| 440 const std::vector<std::string>& blacklisted_languages, | 436 const std::vector<std::string>& blacklisted_languages, |
| 441 const std::vector<std::string>& accept_languages) { | 437 const std::vector<std::string>& accept_languages) { |
| 442 DCHECK(blocked_languages); | 438 DCHECK(blocked_languages); |
| 443 DCHECK(blocked_languages->empty()); | 439 DCHECK(blocked_languages->empty()); |
| 444 | 440 |
| 445 std::set<std::string> result; | 441 std::set<std::string> result; |
| 446 | 442 |
| 447 for (std::vector<std::string>::const_iterator it = | 443 for (std::vector<std::string>::const_iterator it = |
| 448 blacklisted_languages.begin(); | 444 blacklisted_languages.begin(); |
| 449 it != blacklisted_languages.end(); ++it) { | 445 it != blacklisted_languages.end(); ++it) { |
| 450 result.insert(*it); | 446 result.insert(*it); |
| 451 } | 447 } |
| 452 | 448 |
| 453 const std::string& app_locale = g_browser_process->GetApplicationLocale(); | 449 const std::string& app_locale = |
| 450 TranslateDownloadManager::GetInstance()->application_locale(); | |
| 454 std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale); | 451 std::string ui_lang = TranslateDownloadManager::GetLanguageCode(app_locale); |
| 455 bool is_ui_english = ui_lang == "en" || | 452 bool is_ui_english = ui_lang == "en" || |
| 456 StartsWithASCII(ui_lang, "en-", false); | 453 StartsWithASCII(ui_lang, "en-", false); |
| 457 | 454 |
| 458 for (std::vector<std::string>::const_iterator it = accept_languages.begin(); | 455 for (std::vector<std::string>::const_iterator it = accept_languages.begin(); |
| 459 it != accept_languages.end(); ++it) { | 456 it != accept_languages.end(); ++it) { |
| 460 std::string converted_lang = ConvertLangCodeForTranslation(*it); | 457 std::string converted_lang = ConvertLangCodeForTranslation(*it); |
| 461 | 458 |
| 462 // Regarding http://crbug.com/36182, even though English exists in Accept | 459 // Regarding http://crbug.com/36182, even though English exists in Accept |
| 463 // language list, English could be translated on non-English locale. | 460 // language list, English could be translated on non-English locale. |
| 464 if (converted_lang == "en" && !is_ui_english) | 461 if (converted_lang == "en" && !is_ui_english) |
| 465 continue; | 462 continue; |
| 466 | 463 |
| 467 result.insert(converted_lang); | 464 result.insert(converted_lang); |
| 468 } | 465 } |
| 469 | 466 |
| 470 blocked_languages->insert(blocked_languages->begin(), | 467 blocked_languages->insert( |
| 471 result.begin(), result.end()); | 468 blocked_languages->begin(), result.begin(), result.end()); |
| 472 } | 469 } |
| 473 | 470 |
| 474 // static | 471 // static |
| 475 std::string TranslatePrefs::ConvertLangCodeForTranslation( | 472 std::string TranslatePrefs::ConvertLangCodeForTranslation( |
| 476 const std::string &lang) { | 473 const std::string& lang) { |
| 477 std::vector<std::string> tokens; | 474 std::vector<std::string> tokens; |
| 478 base::SplitString(lang, '-', &tokens); | 475 base::SplitString(lang, '-', &tokens); |
| 479 if (tokens.size() < 1) | 476 if (tokens.size() < 1) |
| 480 return lang; | 477 return lang; |
| 481 | 478 |
| 482 std::string main_part = tokens[0]; | 479 std::string main_part = tokens[0]; |
| 483 | 480 |
| 484 // Translate doesn't support General Chinese and the sub code is necessary. | 481 // Translate doesn't support General Chinese and the sub code is necessary. |
| 485 if (main_part == "zh") | 482 if (main_part == "zh") |
| 486 return lang; | 483 return lang; |
| 487 | 484 |
| 488 translate::ToTranslateLanguageSynonym(&main_part); | 485 translate::ToTranslateLanguageSynonym(&main_part); |
| 489 return main_part; | 486 return main_part; |
| 490 } | 487 } |
| 491 | 488 |
| 492 bool TranslatePrefs::IsValueInList(const base::ListValue* list, | 489 bool TranslatePrefs::IsValueInList(const base::ListValue* list, |
| 493 const std::string& in_value) const { | 490 const std::string& in_value) const { |
| 494 for (size_t i = 0; i < list->GetSize(); ++i) { | 491 for (size_t i = 0; i < list->GetSize(); ++i) { |
| 495 std::string value; | 492 std::string value; |
| 496 if (list->GetString(i, &value) && value == in_value) | 493 if (list->GetString(i, &value) && value == in_value) |
| 497 return true; | 494 return true; |
| 498 } | 495 } |
| 499 return false; | 496 return false; |
| 500 } | 497 } |
| 501 | 498 |
| 502 bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, | 499 bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, |
| 503 const std::string& value) const { | 500 const std::string& value) const { |
| 504 const base::ListValue* blacklist = prefs_->GetList(pref_id); | 501 const base::ListValue* blacklist = prefs_->GetList(pref_id); |
| 505 return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); | 502 return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); |
| 506 } | 503 } |
| 507 | 504 |
| 508 void TranslatePrefs::BlacklistValue(const char* pref_id, | 505 void TranslatePrefs::BlacklistValue(const char* pref_id, |
| 509 const std::string& value) { | 506 const std::string& value) { |
| 510 { | 507 { |
| 511 ListPrefUpdate update(prefs_, pref_id); | 508 ListPrefUpdate update(prefs_, pref_id); |
| 512 base::ListValue* blacklist = update.Get(); | 509 base::ListValue* blacklist = update.Get(); |
| 513 if (!blacklist) { | 510 if (!blacklist) { |
| 514 NOTREACHED() << "Unregistered translate blacklist pref"; | 511 NOTREACHED() << "Unregistered translate blacklist pref"; |
| 515 return; | 512 return; |
| 516 } | 513 } |
| 517 blacklist->Append(new base::StringValue(value)); | 514 blacklist->Append(new base::StringValue(value)); |
| 518 } | 515 } |
| 519 } | 516 } |
| 520 | 517 |
| 521 void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, | 518 void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, |
| 522 const std::string& value) { | 519 const std::string& value) { |
| 523 ListPrefUpdate update(prefs_, pref_id); | 520 ListPrefUpdate update(prefs_, pref_id); |
| 524 base::ListValue* blacklist = update.Get(); | 521 base::ListValue* blacklist = update.Get(); |
| 525 if (!blacklist) { | 522 if (!blacklist) { |
| 526 NOTREACHED() << "Unregistered translate blacklist pref"; | 523 NOTREACHED() << "Unregistered translate blacklist pref"; |
| 527 return; | 524 return; |
| 528 } | 525 } |
| 529 base::StringValue string_value(value); | 526 base::StringValue string_value(value); |
| 530 blacklist->Remove(string_value, NULL); | 527 blacklist->Remove(string_value, NULL); |
| 531 } | 528 } |
| 532 | 529 |
| 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 { | 530 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { |
| 545 const base::ListValue* blacklist = prefs_->GetList(pref_id); | 531 const base::ListValue* blacklist = prefs_->GetList(pref_id); |
| 546 return (blacklist == NULL || blacklist->empty()); | 532 return (blacklist == NULL || blacklist->empty()); |
| 547 } | 533 } |
| 548 | 534 |
| 549 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { | 535 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { |
| 550 const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); | 536 const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); |
| 551 return (dict == NULL || dict->empty()); | 537 return (dict == NULL || dict->empty()); |
| 552 } | 538 } |
| OLD | NEW |