Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: chrome/browser/translate/translate_prefs.cc

Issue 23923007: Bug fix: Append a language to the list after blocking it for Translate on Chrome OS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comment Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 std::string main_part = tokens[0]; 59 std::string main_part = tokens[0];
58 60
59 // Translate doesn't support General Chinese and the sub code is necessary. 61 // Translate doesn't support General Chinese and the sub code is necessary.
60 if (main_part == "zh") 62 if (main_part == "zh")
61 return lang; 63 return lang;
62 64
63 TranslateUtil::ToTranslateLanguageSynonym(&main_part); 65 TranslateUtil::ToTranslateLanguageSynonym(&main_part);
64 return main_part; 66 return main_part;
65 } 67 }
66 68
69 // Expands language codes to make these more suitable for Accept-Language.
70 // Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA'].
71 // 'en' won't appear twice as this function eliminates duplicates.
72 void ExpandLanguageCodes(const std::vector<std::string>& languages,
73 std::vector<std::string>* expanded_languages) {
74 DCHECK(expanded_languages->empty());
Takashi Toyoshima 2013/09/10 05:51:54 Oops, sorry for confusing you. I think we should k
hajimehoshi 2013/09/10 06:11:33 Done.
75
76 // used to eliminate duplicates.
77 std::set<std::string> seen;
78
79 for (std::vector<std::string>::const_iterator it = languages.begin();
80 it != languages.end(); ++it) {
81 const std::string& language = *it;
82 if (seen.find(language) == seen.end()) {
83 expanded_languages->push_back(language);
84 seen.insert(language);
85 }
86
87 std::vector<std::string> tokens;
88 base::SplitString(language, '-', &tokens);
89 if (tokens.size() == 0)
90 continue;
91 const std::string& main_part = tokens[0];
92 if (seen.find(main_part) == seen.end()) {
93 expanded_languages->push_back(main_part);
94 seen.insert(main_part);
95 }
96 }
97 }
98
67 } // namespace 99 } // namespace
68 100
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) 101 TranslatePrefs::TranslatePrefs(PrefService* user_prefs)
96 : prefs_(user_prefs) { 102 : prefs_(user_prefs) {
97 } 103 }
98 104
99 bool TranslatePrefs::IsBlockedLanguage( 105 bool TranslatePrefs::IsBlockedLanguage(
100 const std::string& original_language) const { 106 const std::string& original_language) const {
101 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, 107 return IsValueBlacklisted(kPrefTranslateBlockedLanguages,
102 original_language); 108 original_language);
103 } 109 }
104 110
105 void TranslatePrefs::BlockLanguage( 111 void TranslatePrefs::BlockLanguage(
106 const std::string& original_language) { 112 const std::string& original_language) {
107 BlacklistValue(kPrefTranslateBlockedLanguages, original_language); 113 BlacklistValue(kPrefTranslateBlockedLanguages, original_language);
108 AppendLanguageToAcceptLanguages(prefs_, original_language); 114
115 // Add the language to the language list at chrome://settings/languages.
116 std::string language = original_language;
117 TranslateUtil::ToChromeLanguageSynonym(&language);
118
119 std::vector<std::string> languages;
120 GetLanguageList(&languages);
121
122 if (std::find(languages.begin(), languages.end(), language) ==
123 languages.end()) {
124 languages.push_back(language);
125 UpdateLanguageList(languages);
126 }
109 } 127 }
110 128
111 void TranslatePrefs::UnblockLanguage( 129 void TranslatePrefs::UnblockLanguage(
112 const std::string& original_language) { 130 const std::string& original_language) {
113 RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages, 131 RemoveValueFromBlacklist(kPrefTranslateBlockedLanguages,
114 original_language); 132 original_language);
115 } 133 }
116 134
117 void TranslatePrefs::RemoveLanguageFromLegacyBlacklist( 135 void TranslatePrefs::RemoveLanguageFromLegacyBlacklist(
118 const std::string& original_language) { 136 const std::string& original_language) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 dict->GetInteger(language, &count); 249 dict->GetInteger(language, &count);
232 dict->SetInteger(language, count + 1); 250 dict->SetInteger(language, count + 1);
233 } 251 }
234 252
235 void TranslatePrefs::ResetTranslationAcceptedCount( 253 void TranslatePrefs::ResetTranslationAcceptedCount(
236 const std::string& language) { 254 const std::string& language) {
237 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); 255 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount);
238 update.Get()->SetInteger(language, 0); 256 update.Get()->SetInteger(language, 0);
239 } 257 }
240 258
241 // TranslatePrefs: public, static: --------------------------------------------- 259 void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) {
260 DCHECK(languages->empty());
Takashi Toyoshima 2013/09/10 05:51:54 ditto
hajimehoshi 2013/09/10 06:11:33 Done.
261
262 #if defined(OS_CHROMEOS)
263 const char* key = prefs::kLanguagePreferredLanguages;
264 #else
265 const char* key = prefs::kAcceptLanguages;
266 #endif
267
268 std::string languages_str = prefs_->GetString(key);
269 base::SplitString(languages_str, ',', languages);
270 }
271
272 void TranslatePrefs::UpdateLanguageList(
273 const std::vector<std::string>& languages) {
274 #if defined(OS_CHROMEOS)
275 std::string languages_str = JoinString(languages, ',');
276 prefs_->SetString(prefs::kLanguagePreferredLanguages, languages_str);
277 #endif
278
279 // Save the same language list as accept languages preference as well, but we
280 // need to expand the language list, to make it more acceptable. For instance,
281 // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884.
282 std::vector<std::string> accept_languages;
283 ExpandLanguageCodes(languages, &accept_languages);
284 std::string accept_languages_str = JoinString(accept_languages, ',');
285 prefs_->SetString(prefs::kAcceptLanguages, accept_languages_str);
286 }
242 287
243 // static 288 // static
244 bool TranslatePrefs::CanTranslateLanguage(Profile* profile, 289 bool TranslatePrefs::CanTranslateLanguage(Profile* profile,
245 const std::string& language) { 290 const std::string& language) {
246 TranslatePrefs translate_prefs(profile->GetPrefs()); 291 TranslatePrefs translate_prefs(profile->GetPrefs());
247 bool blocked = translate_prefs.IsBlockedLanguage(language); 292 bool blocked = translate_prefs.IsBlockedLanguage(language);
248 293
249 bool is_accept_language = 294 bool is_accept_language =
250 TranslateManager::IsAcceptLanguage(profile, language); 295 TranslateManager::IsAcceptLanguage(profile, language);
251 bool can_be_accept_language = 296 bool can_be_accept_language =
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 accept_languages.end(); 424 accept_languages.end();
380 if (not_found) 425 if (not_found)
381 accept_languages.push_back(lang); 426 accept_languages.push_back(lang);
382 } 427 }
383 428
384 std::string new_accept_languages_str = JoinString(accept_languages, ","); 429 std::string new_accept_languages_str = JoinString(accept_languages, ",");
385 user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str); 430 user_prefs->SetString(prefs::kAcceptLanguages, new_accept_languages_str);
386 } 431 }
387 } 432 }
388 433
389 // TranslatePrefs: private: ----------------------------------------------------
390
391 // static 434 // static
392 void TranslatePrefs::CreateBlockedLanguages( 435 void TranslatePrefs::CreateBlockedLanguages(
393 std::vector<std::string>* blocked_languages, 436 std::vector<std::string>* blocked_languages,
394 const std::vector<std::string>& blacklisted_languages, 437 const std::vector<std::string>& blacklisted_languages,
395 const std::vector<std::string>& accept_languages) { 438 const std::vector<std::string>& accept_languages) {
396 DCHECK(blocked_languages->empty()); 439 DCHECK(blocked_languages->empty());
397 440
398 std::set<std::string> result; 441 std::set<std::string> result;
399 442
400 for (std::vector<std::string>::const_iterator it = 443 for (std::vector<std::string>::const_iterator it =
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 520
478 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { 521 bool TranslatePrefs::IsListEmpty(const char* pref_id) const {
479 const ListValue* blacklist = prefs_->GetList(pref_id); 522 const ListValue* blacklist = prefs_->GetList(pref_id);
480 return (blacklist == NULL || blacklist->empty()); 523 return (blacklist == NULL || blacklist->empty());
481 } 524 }
482 525
483 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { 526 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const {
484 const DictionaryValue* dict = prefs_->GetDictionary(pref_id); 527 const DictionaryValue* dict = prefs_->GetDictionary(pref_id);
485 return (dict == NULL || dict->empty()); 528 return (dict == NULL || dict->empty());
486 } 529 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698