Chromium Code Reviews| Index: chrome/browser/translate/translate_prefs.cc |
| diff --git a/chrome/browser/translate/translate_prefs.cc b/chrome/browser/translate/translate_prefs.cc |
| index a6b51d930d01e30040955c2c152cc81f094a62f4..4cef11feef8e3aa62bdf75a9dc207322d9a54167 100644 |
| --- a/chrome/browser/translate/translate_prefs.cc |
| +++ b/chrome/browser/translate/translate_prefs.cc |
| @@ -4,6 +4,8 @@ |
| #include "chrome/browser/translate/translate_prefs.h" |
| +#include <set> |
| + |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/string_split.h" |
| #include "base/strings/string_util.h" |
| @@ -64,28 +66,34 @@ std::string ConvertLangCodeForTranslation(const std::string &lang) { |
| return main_part; |
| } |
| -} // namespace |
| - |
| -namespace { |
| +// Expands language codes to make these more suitable for Accept-Language. |
| +// Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA']. |
| +// 'en' won't appear twice as this function eliminates duplicates. |
| +void ExpandLanguageCodes(const std::vector<std::string>& languages, |
| + std::vector<std::string>* expanded_languages) { |
| + DCHECK(expanded_languages); |
|
Takashi Toyoshima
2013/09/09 12:26:11
DCHECK(expanded_langauges->empty()) ?
hajimehoshi
2013/09/10 03:21:45
Done.
|
| -void AppendLanguageToAcceptLanguages(PrefService* prefs, |
| - const std::string& language) { |
| - if (!TranslateAcceptLanguages::CanBeAcceptLanguage(language)) |
| - return; |
| + // used to eliminate duplicates. |
| + std::set<std::string> seen; |
| - std::string accept_language = language; |
| - TranslateUtil::ToChromeLanguageSynonym(&accept_language); |
| + for (std::vector<std::string>::const_iterator it = languages.begin(); |
| + it != languages.end(); ++it) { |
| + const std::string& language = *it; |
| + if (seen.find(language) == seen.end()) { |
| + expanded_languages->push_back(language); |
| + seen.insert(language); |
| + } |
| - std::string accept_languages_str = prefs->GetString(prefs::kAcceptLanguages); |
| - std::vector<std::string> accept_languages; |
| - base::SplitString(accept_languages_str, ',', &accept_languages); |
| - if (std::find(accept_languages.begin(), |
| - accept_languages.end(), |
| - accept_language) == accept_languages.end()) { |
| - accept_languages.push_back(accept_language); |
| + std::vector<std::string> tokens; |
| + base::SplitString(language, '-', &tokens); |
| + if (tokens.size() == 0) |
| + continue; |
| + const std::string& main_part = tokens[0]; |
| + if (seen.find(main_part) == seen.end()) { |
| + expanded_languages->push_back(main_part); |
| + seen.insert(main_part); |
| + } |
| } |
| - accept_languages_str = JoinString(accept_languages, ','); |
| - prefs->SetString(prefs::kAcceptLanguages, accept_languages_str); |
| } |
| } // namespace |
| @@ -105,7 +113,19 @@ bool TranslatePrefs::IsBlockedLanguage( |
| void TranslatePrefs::BlockLanguage( |
| const std::string& original_language) { |
| BlacklistValue(kPrefTranslateBlockedLanguages, original_language); |
| - AppendLanguageToAcceptLanguages(prefs_, original_language); |
| + |
| + // Add the language to the language list at chrome://settings/languages. |
| + std::string language = original_language; |
| + TranslateUtil::ToChromeLanguageSynonym(&language); |
| + |
| + std::vector<std::string> languages; |
| + GetLanguageList(&languages); |
| + |
| + if (std::find(languages.begin(), languages.end(), language) == |
| + languages.end()) { |
| + languages.push_back(language); |
| + UpdateLanguageList(languages); |
| + } |
| } |
| void TranslatePrefs::UnblockLanguage( |
| @@ -238,6 +258,35 @@ void TranslatePrefs::ResetTranslationAcceptedCount( |
| update.Get()->SetInteger(language, 0); |
| } |
| +void TranslatePrefs::GetLanguageList(std::vector<std::string>* languages) { |
| + DCHECK(languages); |
|
Takashi Toyoshima
2013/09/09 12:26:11
DCHECK(languages->empty()) ?
hajimehoshi
2013/09/10 03:21:45
Done.
|
| + |
| +#if defined(OS_CHROMEOS) |
| + const char* key = prefs::kLanguagePreferredLanguages; |
| +#else |
| + const char* key = prefs::kAcceptLanguages; |
| +#endif |
| + |
| + std::string languages_str = prefs_->GetString(key); |
| + base::SplitString(languages_str, ',', languages); |
| +} |
| + |
| +void TranslatePrefs::UpdateLanguageList( |
| + const std::vector<std::string>& languages) { |
| +#if defined(OS_CHROMEOS) |
| + std::string languages_str = JoinString(languages, ','); |
| + prefs_->SetString(prefs::kLanguagePreferredLanguages, languages_str); |
| +#endif |
| + |
| + // Save the same language list as accept languages preference as well, but we |
| + // need to expand the language list, to make it more acceptable. For instance, |
| + // some web sites don't understand 'en-US' but 'en'. See crosbug.com/9884. |
| + std::vector<std::string> accept_languages; |
| + 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
|
| + std::string accept_languages_str = JoinString(accept_languages, ','); |
| + prefs_->SetString(prefs::kAcceptLanguages, accept_languages_str); |
| +} |
| + |
| // TranslatePrefs: public, static: --------------------------------------------- |
| // static |