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

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: 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
67 } // namespace 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);
Takashi Toyoshima 2013/09/09 12:26:11 DCHECK(expanded_langauges->empty()) ?
hajimehoshi 2013/09/10 03:21:45 Done.
68 75
69 namespace { 76 // used to eliminate duplicates.
77 std::set<std::string> seen;
70 78
71 void AppendLanguageToAcceptLanguages(PrefService* prefs, 79 for (std::vector<std::string>::const_iterator it = languages.begin();
72 const std::string& language) { 80 it != languages.end(); ++it) {
73 if (!TranslateAcceptLanguages::CanBeAcceptLanguage(language)) 81 const std::string& language = *it;
74 return; 82 if (seen.find(language) == seen.end()) {
83 expanded_languages->push_back(language);
84 seen.insert(language);
85 }
75 86
76 std::string accept_language = language; 87 std::vector<std::string> tokens;
77 TranslateUtil::ToChromeLanguageSynonym(&accept_language); 88 base::SplitString(language, '-', &tokens);
78 89 if (tokens.size() == 0)
79 std::string accept_languages_str = prefs->GetString(prefs::kAcceptLanguages); 90 continue;
80 std::vector<std::string> accept_languages; 91 const std::string& main_part = tokens[0];
81 base::SplitString(accept_languages_str, ',', &accept_languages); 92 if (seen.find(main_part) == seen.end()) {
82 if (std::find(accept_languages.begin(), 93 expanded_languages->push_back(main_part);
83 accept_languages.end(), 94 seen.insert(main_part);
84 accept_language) == accept_languages.end()) { 95 }
85 accept_languages.push_back(accept_language);
86 } 96 }
87 accept_languages_str = JoinString(accept_languages, ',');
88 prefs->SetString(prefs::kAcceptLanguages, accept_languages_str);
89 } 97 }
90 98
91 } // namespace 99 } // namespace
92 100
93 // TranslatePrefs: public: ----------------------------------------------------- 101 // TranslatePrefs: public: -----------------------------------------------------
Takashi Toyoshima 2013/09/09 12:26:11 BTW, this separator is out of chromium coding styl
hajimehoshi 2013/09/10 03:21:45 Done.
94 102
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
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
261 void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) {
262 DCHECK(languages);
Takashi Toyoshima 2013/09/09 12:26:11 DCHECK(languages->empty()) ?
hajimehoshi 2013/09/10 03:21:45 Done.
263
264 #if defined(OS_CHROMEOS)
265 const char* key = prefs::kLanguagePreferredLanguages;
266 #else
267 const char* key = prefs::kAcceptLanguages;
268 #endif
269
270 std::string languages_str = prefs_->GetString(key);
271 base::SplitString(languages_str, ',', languages);
272 }
273
274 void TranslatePrefs::UpdateLanguageList(
275 const std::vector<std::string>& languages) {
276 #if defined(OS_CHROMEOS)
277 std::string languages_str = JoinString(languages, ',');
278 prefs_->SetString(prefs::kLanguagePreferredLanguages, languages_str);
279 #endif
280
281 // 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,
283 // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884.
284 std::vector<std::string> accept_languages;
285 ExpandLanguageCodes(languages, &accept_languages);
Takashi Toyoshima 2013/09/09 12:26:11 I don't think this works as you expect. In the ca
hajimehoshi 2013/09/10 03:21:45 Sorry but I couldn't understand. Please discuss la
286 std::string accept_languages_str = JoinString(accept_languages, ',');
287 prefs_->SetString(prefs::kAcceptLanguages, accept_languages_str);
288 }
289
241 // TranslatePrefs: public, static: --------------------------------------------- 290 // TranslatePrefs: public, static: ---------------------------------------------
242 291
243 // static 292 // static
244 bool TranslatePrefs::CanTranslateLanguage(Profile* profile, 293 bool TranslatePrefs::CanTranslateLanguage(Profile* profile,
245 const std::string& language) { 294 const std::string& language) {
246 TranslatePrefs translate_prefs(profile->GetPrefs()); 295 TranslatePrefs translate_prefs(profile->GetPrefs());
247 bool blocked = translate_prefs.IsBlockedLanguage(language); 296 bool blocked = translate_prefs.IsBlockedLanguage(language);
248 297
249 bool is_accept_language = 298 bool is_accept_language =
250 TranslateManager::IsAcceptLanguage(profile, language); 299 TranslateManager::IsAcceptLanguage(profile, language);
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 526
478 bool TranslatePrefs::IsListEmpty(const char* pref_id) const { 527 bool TranslatePrefs::IsListEmpty(const char* pref_id) const {
479 const ListValue* blacklist = prefs_->GetList(pref_id); 528 const ListValue* blacklist = prefs_->GetList(pref_id);
480 return (blacklist == NULL || blacklist->empty()); 529 return (blacklist == NULL || blacklist->empty());
481 } 530 }
482 531
483 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { 532 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const {
484 const DictionaryValue* dict = prefs_->GetDictionary(pref_id); 533 const DictionaryValue* dict = prefs_->GetDictionary(pref_id);
485 return (dict == NULL || dict->empty()); 534 return (dict == NULL || dict->empty());
486 } 535 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698