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 |