| 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 "chrome/browser/translate/translate_prefs.h" |
| 6 | 6 |
| 7 #include <set> |
| 8 |
| 7 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 8 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
| 9 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 10 #include "chrome/browser/browser_process.h" | 12 #include "chrome/browser/browser_process.h" |
| 11 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 13 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 12 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/browser/translate/translate_accept_languages.h" | 15 #include "chrome/browser/translate/translate_accept_languages.h" |
| 14 #include "chrome/browser/translate/translate_manager.h" | 16 #include "chrome/browser/translate/translate_manager.h" |
| 15 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
| 16 #include "chrome/common/translate/translate_util.h" | 18 #include "chrome/common/translate/translate_util.h" |
| 17 #include "components/user_prefs/pref_registry_syncable.h" | 19 #include "components/user_prefs/pref_registry_syncable.h" |
| 18 | 20 |
| 19 const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = | 21 const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = |
| 20 "translate_language_blacklist"; | 22 "translate_language_blacklist"; |
| 21 const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = | 23 const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = |
| 22 "translate_site_blacklist"; | 24 "translate_site_blacklist"; |
| 23 const char TranslatePrefs::kPrefTranslateWhitelists[] = | 25 const char TranslatePrefs::kPrefTranslateWhitelists[] = |
| 24 "translate_whitelists"; | 26 "translate_whitelists"; |
| 25 const char TranslatePrefs::kPrefTranslateDeniedCount[] = | 27 const char TranslatePrefs::kPrefTranslateDeniedCount[] = |
| 26 "translate_denied_count"; | 28 "translate_denied_count"; |
| 27 const char TranslatePrefs::kPrefTranslateAcceptedCount[] = | 29 const char TranslatePrefs::kPrefTranslateAcceptedCount[] = |
| 28 "translate_accepted_count"; | 30 "translate_accepted_count"; |
| 29 const char TranslatePrefs::kPrefTranslateBlockedLanguages[] = | 31 const char TranslatePrefs::kPrefTranslateBlockedLanguages[] = |
| 30 "translate_blocked_languages"; | 32 "translate_blocked_languages"; |
| 31 | 33 |
| 32 namespace { | 34 namespace { |
| 33 | 35 |
| 34 void GetBlacklistedLanguages(const PrefService* prefs, | 36 void GetBlacklistedLanguages(const PrefService* prefs, |
| 35 std::vector<std::string>* languages) { | 37 std::vector<std::string>* languages) { |
| 38 DCHECK(languages); |
| 36 DCHECK(languages->empty()); | 39 DCHECK(languages->empty()); |
| 37 | 40 |
| 38 const char* key = TranslatePrefs::kPrefTranslateLanguageBlacklist; | 41 const char* key = TranslatePrefs::kPrefTranslateLanguageBlacklist; |
| 39 const ListValue* list = prefs->GetList(key); | 42 const ListValue* list = prefs->GetList(key); |
| 40 for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) { | 43 for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) { |
| 41 std::string lang; | 44 std::string lang; |
| 42 (*it)->GetAsString(&lang); | 45 (*it)->GetAsString(&lang); |
| 43 languages->push_back(lang); | 46 languages->push_back(lang); |
| 44 } | 47 } |
| 45 } | 48 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 57 std::string main_part = tokens[0]; | 60 std::string main_part = tokens[0]; |
| 58 | 61 |
| 59 // Translate doesn't support General Chinese and the sub code is necessary. | 62 // Translate doesn't support General Chinese and the sub code is necessary. |
| 60 if (main_part == "zh") | 63 if (main_part == "zh") |
| 61 return lang; | 64 return lang; |
| 62 | 65 |
| 63 TranslateUtil::ToTranslateLanguageSynonym(&main_part); | 66 TranslateUtil::ToTranslateLanguageSynonym(&main_part); |
| 64 return main_part; | 67 return main_part; |
| 65 } | 68 } |
| 66 | 69 |
| 70 // Expands language codes to make these more suitable for Accept-Language. |
| 71 // Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA']. |
| 72 // 'en' won't appear twice as this function eliminates duplicates. |
| 73 void ExpandLanguageCodes(const std::vector<std::string>& languages, |
| 74 std::vector<std::string>* expanded_languages) { |
| 75 DCHECK(expanded_languages); |
| 76 DCHECK(expanded_languages->empty()); |
| 77 |
| 78 // used to eliminate duplicates. |
| 79 std::set<std::string> seen; |
| 80 |
| 81 for (std::vector<std::string>::const_iterator it = languages.begin(); |
| 82 it != languages.end(); ++it) { |
| 83 const std::string& language = *it; |
| 84 if (seen.find(language) == seen.end()) { |
| 85 expanded_languages->push_back(language); |
| 86 seen.insert(language); |
| 87 } |
| 88 |
| 89 std::vector<std::string> tokens; |
| 90 base::SplitString(language, '-', &tokens); |
| 91 if (tokens.size() == 0) |
| 92 continue; |
| 93 const std::string& main_part = tokens[0]; |
| 94 if (seen.find(main_part) == seen.end()) { |
| 95 expanded_languages->push_back(main_part); |
| 96 seen.insert(main_part); |
| 97 } |
| 98 } |
| 99 } |
| 100 |
| 67 } // namespace | 101 } // namespace |
| 68 | 102 |
| 69 namespace { | |
| 70 | |
| 71 void AppendLanguageToAcceptLanguages(PrefService* prefs, | |
| 72 const std::string& language) { | |
| 73 if (!TranslateAcceptLanguages::CanBeAcceptLanguage(language)) | |
| 74 return; | |
| 75 | |
| 76 std::string accept_language = language; | |
| 77 TranslateUtil::ToChromeLanguageSynonym(&accept_language); | |
| 78 | |
| 79 std::string accept_languages_str = prefs->GetString(prefs::kAcceptLanguages); | |
| 80 std::vector<std::string> accept_languages; | |
| 81 base::SplitString(accept_languages_str, ',', &accept_languages); | |
| 82 if (std::find(accept_languages.begin(), | |
| 83 accept_languages.end(), | |
| 84 accept_language) == accept_languages.end()) { | |
| 85 accept_languages.push_back(accept_language); | |
| 86 } | |
| 87 accept_languages_str = JoinString(accept_languages, ','); | |
| 88 prefs->SetString(prefs::kAcceptLanguages, accept_languages_str); | |
| 89 } | |
| 90 | |
| 91 } // namespace | |
| 92 | |
| 93 // TranslatePrefs: public: ----------------------------------------------------- | |
| 94 | |
| 95 TranslatePrefs::TranslatePrefs(PrefService* user_prefs) | 103 TranslatePrefs::TranslatePrefs(PrefService* user_prefs) |
| 96 : prefs_(user_prefs) { | 104 : prefs_(user_prefs) { |
| 97 } | 105 } |
| 98 | 106 |
| 99 bool TranslatePrefs::IsBlockedLanguage( | 107 bool TranslatePrefs::IsBlockedLanguage( |
| 100 const std::string& original_language) const { | 108 const std::string& original_language) const { |
| 101 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, | 109 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, |
| 102 original_language); | 110 original_language); |
| 103 } | 111 } |
| 104 | 112 |
| 105 void TranslatePrefs::BlockLanguage( | 113 void TranslatePrefs::BlockLanguage( |
| 106 const std::string& original_language) { | 114 const std::string& original_language) { |
| 107 BlacklistValue(kPrefTranslateBlockedLanguages, original_language); | 115 BlacklistValue(kPrefTranslateBlockedLanguages, original_language); |
| 108 AppendLanguageToAcceptLanguages(prefs_, original_language); | 116 |
| 117 // Add the language to the language list at chrome://settings/languages. |
| 118 std::string language = original_language; |
| 119 TranslateUtil::ToChromeLanguageSynonym(&language); |
| 120 |
| 121 std::vector<std::string> languages; |
| 122 GetLanguageList(&languages); |
| 123 |
| 124 if (std::find(languages.begin(), languages.end(), language) == |
| 125 languages.end()) { |
| 126 languages.push_back(language); |
| 127 UpdateLanguageList(languages); |
| 128 } |
| 109 } | 129 } |
| 110 | 130 |
| 111 void TranslatePrefs::UnblockLanguage( | 131 void TranslatePrefs::UnblockLanguage( |
| 112 const std::string& original_language) { | 132 const std::string& original_language) { |
| 113 RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, | 133 RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, |
| 114 original_language); | 134 original_language); |
| 115 } | 135 } |
| 116 | 136 |
| 117 void TranslatePrefs::RemoveLanguageFromLegacyBlacklist( | 137 void TranslatePrefs::RemoveLanguageFromLegacyBlacklist( |
| 118 const std::string& original_language) { | 138 const std::string& original_language) { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 dict->GetInteger(language, &count); | 251 dict->GetInteger(language, &count); |
| 232 dict->SetInteger(language, count + 1); | 252 dict->SetInteger(language, count + 1); |
| 233 } | 253 } |
| 234 | 254 |
| 235 void TranslatePrefs::ResetTranslationAcceptedCount( | 255 void TranslatePrefs::ResetTranslationAcceptedCount( |
| 236 const std::string& language) { | 256 const std::string& language) { |
| 237 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); | 257 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); |
| 238 update.Get()->SetInteger(language, 0); | 258 update.Get()->SetInteger(language, 0); |
| 239 } | 259 } |
| 240 | 260 |
| 241 // TranslatePrefs: public, static: --------------------------------------------- | 261 void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { |
| 262 DCHECK(languages); |
| 263 DCHECK(languages->empty()); |
| 264 |
| 265 #if defined(OS_CHROMEOS) |
| 266 const char* key = prefs::kLanguagePreferredLanguages; |
| 267 #else |
| 268 const char* key = prefs::kAcceptLanguages; |
| 269 #endif |
| 270 |
| 271 std::string languages_str = prefs_->GetString(key); |
| 272 base::SplitString(languages_str, ',', languages); |
| 273 } |
| 274 |
| 275 void TranslatePrefs::UpdateLanguageList( |
| 276 const std::vector<std::string>& languages) { |
| 277 #if defined(OS_CHROMEOS) |
| 278 std::string languages_str = JoinString(languages, ','); |
| 279 prefs_->SetString(prefs::kLanguagePreferredLanguages, languages_str); |
| 280 #endif |
| 281 |
| 282 // Save the same language list as accept languages preference as well, but we |
| 283 // need to expand the language list, to make it more acceptable. For instance, |
| 284 // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884. |
| 285 std::vector<std::string> accept_languages; |
| 286 ExpandLanguageCodes(languages, &accept_languages); |
| 287 std::string accept_languages_str = JoinString(accept_languages, ','); |
| 288 prefs_->SetString(prefs::kAcceptLanguages, accept_languages_str); |
| 289 } |
| 242 | 290 |
| 243 // static | 291 // static |
| 244 bool TranslatePrefs::CanTranslateLanguage(Profile* profile, | 292 bool TranslatePrefs::CanTranslateLanguage(Profile* profile, |
| 245 const std::string& language) { | 293 const std::string& language) { |
| 246 TranslatePrefs translate_prefs(profile->GetPrefs()); | 294 TranslatePrefs translate_prefs(profile->GetPrefs()); |
| 247 bool blocked = translate_prefs.IsBlockedLanguage(language); | 295 bool blocked = translate_prefs.IsBlockedLanguage(language); |
| 248 | 296 |
| 249 bool is_accept_language = | 297 bool is_accept_language = |
| 250 TranslateManager::IsAcceptLanguage(profile, language); | 298 TranslateManager::IsAcceptLanguage(profile, language); |
| 251 bool can_be_accept_language = | 299 bool can_be_accept_language = |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 accept_languages.end(); | 427 accept_languages.end(); |
| 380 if (not_found) | 428 if (not_found) |
| 381 accept_languages.push_back(lang); | 429 accept_languages.push_back(lang); |
| 382 } | 430 } |
| 383 | 431 |
| 384 std::string new_accept_languages_str = JoinString(accept_languages, ","); | 432 std::string new_accept_languages_str = JoinString(accept_languages, ","); |
| 385 user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str); | 433 user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str); |
| 386 } | 434 } |
| 387 } | 435 } |
| 388 | 436 |
| 389 // TranslatePrefs: private: ---------------------------------------------------- | |
| 390 | |
| 391 // static | 437 // static |
| 392 void TranslatePrefs::CreateBlockedLanguages( | 438 void TranslatePrefs::CreateBlockedLanguages( |
| 393 std::vector<std::string>* blocked_languages, | 439 std::vector<std::string>* blocked_languages, |
| 394 const std::vector<std::string>& blacklisted_languages, | 440 const std::vector<std::string>& blacklisted_languages, |
| 395 const std::vector<std::string>& accept_languages) { | 441 const std::vector<std::string>& accept_languages) { |
| 442 DCHECK(blocked_languages); |
| 396 DCHECK(blocked_languages->empty()); | 443 DCHECK(blocked_languages->empty()); |
| 397 | 444 |
| 398 std::set<std::string> result; | 445 std::set<std::string> result; |
| 399 | 446 |
| 400 for (std::vector<std::string>::const_iterator it = | 447 for (std::vector<std::string>::const_iterator it = |
| 401 blacklisted_languages.begin(); | 448 blacklisted_languages.begin(); |
| 402 it != blacklisted_languages.end(); ++it) { | 449 it != blacklisted_languages.end(); ++it) { |
| 403 result.insert(*it); | 450 result.insert(*it); |
| 404 } | 451 } |
| 405 | 452 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 | 524 |
| 478 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { | 525 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { |
| 479 const ListValue* blacklist = prefs_->GetList(pref_id); | 526 const ListValue* blacklist = prefs_->GetList(pref_id); |
| 480 return (blacklist == NULL || blacklist->empty()); | 527 return (blacklist == NULL || blacklist->empty()); |
| 481 } | 528 } |
| 482 | 529 |
| 483 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { | 530 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { |
| 484 const DictionaryValue* dict = prefs_->GetDictionary(pref_id); | 531 const DictionaryValue* dict = prefs_->GetDictionary(pref_id); |
| 485 return (dict == NULL || dict->empty()); | 532 return (dict == NULL || dict->empty()); |
| 486 } | 533 } |
| OLD | NEW |