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" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |