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

Unified Diff: chrome/browser/translate/translate_manager.cc

Issue 15317007: Translate: split supporting language list handling to TranslateLanguageList (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: for review Created 7 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/translate/translate_manager.cc
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index a5b3dbb99a9bf2635adce83d309bcfc4a2fe3931..285933c696f283f312e56eb060c32f9b927dbed2 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -7,7 +7,6 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
-#include "base/json/json_reader.h"
#include "base/memory/singleton.h"
#include "base/message_loop.h"
#include "base/metrics/histogram.h"
@@ -15,7 +14,6 @@
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/strings/string_split.h"
-#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -23,9 +21,11 @@
#include "chrome/browser/tab_contents/tab_util.h"
#include "chrome/browser/translate/page_translated_details.h"
#include "chrome/browser/translate/translate_infobar_delegate.h"
+#include "chrome/browser/translate/translate_language_list.h"
#include "chrome/browser/translate/translate_manager_metrics.h"
#include "chrome/browser/translate/translate_prefs.h"
#include "chrome/browser/translate/translate_tab_helper.h"
+#include "chrome/browser/translate/translate_url_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
@@ -67,100 +67,17 @@ using content::WebContents;
namespace {
-// The default list of languages the Google translation server supports.
-// We use this list until we receive the list that the server exposes.
-// For information, here is the list of languages that Chrome can be run in
-// but that the translation server does not support:
-// am Amharic
-// bn Bengali
-// gu Gujarati
-// kn Kannada
-// ml Malayalam
-// mr Marathi
-// ta Tamil
-// te Telugu
-const char* const kDefaultSupportedLanguages[] = {
- "af", // Afrikaans
- "sq", // Albanian
- "ar", // Arabic
- "be", // Belarusian
- "bg", // Bulgarian
- "ca", // Catalan
- "zh-CN", // Chinese (Simplified)
- "zh-TW", // Chinese (Traditional)
- "hr", // Croatian
- "cs", // Czech
- "da", // Danish
- "nl", // Dutch
- "en", // English
- "eo", // Esperanto
- "et", // Estonian
- "tl", // Filipino
- "fi", // Finnish
- "fr", // French
- "gl", // Galician
- "de", // German
- "el", // Greek
- "ht", // Haitian Creole
- "iw", // Hebrew
- "hi", // Hindi
- "hu", // Hungarian
- "is", // Icelandic
- "id", // Indonesian
- "ga", // Irish
- "it", // Italian
- "ja", // Japanese
- "ko", // Korean
- "lv", // Latvian
- "lt", // Lithuanian
- "mk", // Macedonian
- "ms", // Malay
- "mt", // Maltese
- "no", // Norwegian
- "fa", // Persian
- "pl", // Polish
- "pt", // Portuguese
- "ro", // Romanian
- "ru", // Russian
- "sr", // Serbian
- "sk", // Slovak
- "sl", // Slovenian
- "es", // Spanish
- "sw", // Swahili
- "sv", // Swedish
- "th", // Thai
- "tr", // Turkish
- "uk", // Ukrainian
- "vi", // Vietnamese
- "cy", // Welsh
- "yi", // Yiddish
-};
-
const char kTranslateScriptURL[] =
"https://translate.google.com/translate_a/element.js";
const char kTranslateScriptHeader[] = "Google-Translate-Element-Mode: library";
const char kReportLanguageDetectionErrorURL[] =
"https://translate.google.com/translate_error?client=cr&action=langidc";
-const char kLanguageListFetchURL[] =
- "https://translate.googleapis.com/translate_a/l?client=chrome&cb=sl";
-
-// Used in kTranslateScriptURL to request supporting languages list including
-// "alpha languages".
-const char kAlphaLanguageQueryName[] = "alpha";
-const char kAlphaLanguageQueryValue[] = "1";
-
-// Used in all translate URLs to specify API Key.
-const char kApiKeyName[] = "key";
// Used in kTranslateScriptURL to specify a callback function name.
const char kCallbackQueryName[] = "cb";
const char kCallbackQueryValue[] =
"cr.googleTranslate.onTranslateElementLoad";
-// Used in kTranslateScriptURL and kLanguageListFetchURL to specify the
-// application locale.
-const char kHostLocaleQueryName[] = "hl";
-
// Used in kReportLanguageDetectionErrorURL to specify the original page
// language.
const char kSourceLanguageQueryName[] = "sl";
@@ -176,31 +93,10 @@ const int kTranslateLoadCheckDelayMs = 150;
// loading before giving up the translation
const int kMaxTranslateLoadCheckAttempts = 20;
-const int kMaxRetryLanguageListFetch = 5;
const int kTranslateScriptExpirationDelayDays = 1;
-GURL AddApiKeyToUrl(const GURL& url) {
- return net::AppendQueryParameter(url, kApiKeyName, google_apis::GetAPIKey());
-}
-
-GURL AddHostLocaleToUrl(const GURL& url) {
- return net::AppendQueryParameter(
- url,
- kHostLocaleQueryName,
- TranslateManager::GetLanguageCode(
- g_browser_process->GetApplicationLocale()));
-}
-
} // namespace
-// This must be kept in sync with the &cb= value in the kLanguageListFetchURL.
-const char TranslateManager::kLanguageListCallbackName[] = "sl(";
-const char TranslateManager::kTargetLanguagesKey[] = "tl";
-
-// static
-base::LazyInstance<std::set<std::string> >
- TranslateManager::supported_languages_ = LAZY_INSTANCE_INITIALIZER;
-
TranslateManager::~TranslateManager() {
weak_method_factory_.InvalidateWeakPtrs();
}
@@ -229,91 +125,6 @@ bool TranslateManager::IsTranslatableURL(const GURL& url) {
!url.SchemeIs(chrome::kFtpScheme);
}
-// static
-void TranslateManager::SetSupportedLanguages(const std::string& language_list) {
- // The format is:
- // sl({"sl": {"XX": "LanguageName", ...}, "tl": {"XX": "LanguageName", ...}})
- // Where "sl(" is set in kLanguageListCallbackName
- // and "tl" is kTargetLanguagesKey
- if (!StartsWithASCII(language_list, kLanguageListCallbackName, false) ||
- !EndsWith(language_list, ")", false)) {
- // We don't have a NOTREACHED here since this can happen in ui_tests, even
- // though the the BrowserMain function won't call us with parameters.ui_task
- // is NULL some tests don't set it, so we must bail here.
- return;
- }
- static const size_t kLanguageListCallbackNameLength =
- strlen(kLanguageListCallbackName);
- std::string languages_json = language_list.substr(
- kLanguageListCallbackNameLength,
- language_list.size() - kLanguageListCallbackNameLength - 1);
- scoped_ptr<Value> json_value(
- base::JSONReader::Read(languages_json, base::JSON_ALLOW_TRAILING_COMMAS));
- if (json_value == NULL || !json_value->IsType(Value::TYPE_DICTIONARY)) {
- NOTREACHED();
- return;
- }
- // The first level dictionary contains two sub-dict, one for source languages
- // and the other for target languages, we want to use the target languages.
- DictionaryValue* language_dict =
- static_cast<DictionaryValue*>(json_value.get());
- DictionaryValue* target_languages = NULL;
- if (!language_dict->GetDictionary(kTargetLanguagesKey, &target_languages) ||
- target_languages == NULL) {
- NOTREACHED();
- return;
- }
- // Now we can clear our current state...
- std::set<std::string>* supported_languages = supported_languages_.Pointer();
- supported_languages->clear();
- // ... and replace it with the values we just fetched from the server.
- for (DictionaryValue::Iterator iter(*target_languages); !iter.IsAtEnd();
- iter.Advance()) {
- supported_languages_.Pointer()->insert(iter.key());
- }
-}
-
-// static
-void TranslateManager::InitSupportedLanguages() {
- // If our list of supported languages have not been set yet, we default
- // to our hard coded list of languages in kDefaultSupportedLanguages.
- if (supported_languages_.Pointer()->empty()) {
- for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i)
- supported_languages_.Pointer()->insert(kDefaultSupportedLanguages[i]);
- }
-}
-
-// static
-void TranslateManager::GetSupportedLanguages(
- std::vector<std::string>* languages) {
- DCHECK(languages && languages->empty());
- InitSupportedLanguages();
- std::set<std::string>* supported_languages = supported_languages_.Pointer();
- std::set<std::string>::const_iterator iter = supported_languages->begin();
- for (; iter != supported_languages->end(); ++iter)
- languages->push_back(*iter);
-}
-
-// static
-std::string TranslateManager::GetLanguageCode(
- const std::string& chrome_locale) {
- // Only remove the country code for country specific languages we don't
- // support specifically yet.
- if (IsSupportedLanguage(chrome_locale))
- return chrome_locale;
-
- size_t hypen_index = chrome_locale.find('-');
- if (hypen_index == std::string::npos)
- return chrome_locale;
- return chrome_locale.substr(0, hypen_index);
-}
-
-// static
-bool TranslateManager::IsSupportedLanguage(const std::string& page_language) {
- InitSupportedLanguages();
- return supported_languages_.Pointer()->count(page_language) != 0;
-}
-
void TranslateManager::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
@@ -423,8 +234,7 @@ void TranslateManager::Observe(int type,
}
void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
- if (translate_script_request_pending_.get() != source &&
- language_list_request_pending_.get() != source) {
+ if (translate_script_request_pending_.get() != source) {
// Looks like crash on Mac is possibly caused with callback entering here
// with unknown fetcher when network is refreshed.
scoped_ptr<const net::URLFetcher> delete_ptr(source);
@@ -432,8 +242,8 @@ void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
}
bool error =
- (source->GetStatus().status() != net::URLRequestStatus::SUCCESS ||
- source->GetResponseCode() != net::HTTP_OK);
+ source->GetStatus().status() != net::URLRequestStatus::SUCCESS ||
+ source->GetResponseCode() != net::HTTP_OK;
if (translate_script_request_pending_.get() == source) {
scoped_ptr<const net::URLFetcher> delete_ptr(
translate_script_request_pending_.release());
@@ -495,16 +305,6 @@ void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
}
}
pending_requests_.clear();
- } else { // if (translate_script_request_pending_.get() == source)
- scoped_ptr<const net::URLFetcher> delete_ptr(
- language_list_request_pending_.release());
- if (!error) {
- std::string data;
- source->GetResponseAsString(&data);
- SetSupportedLanguages(data);
- } else {
- VLOG(9) << "Failed to Fetch languages from: " << kLanguageListFetchURL;
- }
}
}
@@ -553,7 +353,8 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
// Don't translate similar languages (ex: en-US to en).
std::string target_lang = GetTargetLanguage(prefs);
- std::string language_code = GetLanguageCode(page_lang);
+ std::string language_code =
+ TranslateLanguageList::GetLanguageCode(page_lang);
if (language_code == target_lang) {
TranslateManagerMetrics::ReportInitiationStatus(
TranslateManagerMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES);
@@ -569,7 +370,8 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
// Nothing to do if either the language Chrome is in or the language of the
// page is not supported by the translation server.
- if (target_lang.empty() || !IsSupportedLanguage(language_code)) {
+ if (target_lang.empty() ||
+ !TranslateLanguageList::IsSupportedLanguage(language_code)) {
TranslateManagerMetrics::ReportInitiationStatus(
TranslateManagerMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED);
return;
@@ -593,8 +395,8 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
&auto_target_lang)) {
// We need to confirm that the saved target language is still supported.
// Also, GetLanguageCode will take care of removing country code if any.
- auto_target_lang = GetLanguageCode(auto_target_lang);
- if (IsSupportedLanguage(auto_target_lang)) {
+ auto_target_lang = TranslateLanguageList::GetLanguageCode(auto_target_lang);
+ if (TranslateLanguageList::IsSupportedLanguage(auto_target_lang)) {
TranslateManagerMetrics::ReportInitiationStatus(
TranslateManagerMetrics::INITIATION_STATUS_AUTO_BY_CONFIG);
TranslatePage(web_contents, language_code, auto_target_lang);
@@ -654,7 +456,8 @@ void TranslateManager::InitiateTranslationPosted(
return;
}
- InitiateTranslation(web_contents, GetLanguageCode(page_lang));
+ InitiateTranslation(web_contents,
+ TranslateLanguageList::GetLanguageCode(page_lang));
}
void TranslateManager::TranslatePage(WebContents* web_contents,
@@ -731,8 +534,8 @@ void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
kSourceLanguageQueryName,
translate_tab_helper->language_state().original_language());
- report_error_url = AddHostLocaleToUrl(report_error_url);
- report_error_url = AddApiKeyToUrl(report_error_url);
+ report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url);
+ report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url);
chrome::AddSelectedTabWithURL(browser, report_error_url,
content::PAGE_TRANSITION_AUTO_BOOKMARK);
@@ -762,7 +565,7 @@ void TranslateManager::DoTranslatePage(WebContents* web_contents,
void TranslateManager::PageTranslated(WebContents* web_contents,
PageTranslatedDetails* details) {
if ((details->error_type == TranslateErrors::NONE) &&
- !IsSupportedLanguage(details->source_language)) {
+ !TranslateLanguageList::IsSupportedLanguage(details->source_language)) {
// TODO(jcivelli): http://crbug.com/9390 We should change the "after
// translate" infobar to support unknown as the original
// language.
@@ -820,8 +623,8 @@ void TranslateManager::InitAcceptLanguages(PrefService* prefs) {
LanguageSet accept_langs_set;
base::SplitString(accept_langs_str, ',', &accept_langs_list);
std::vector<std::string>::const_iterator iter;
- std::string ui_lang =
- GetLanguageCode(g_browser_process->GetApplicationLocale());
+ std::string ui_lang = TranslateLanguageList::GetLanguageCode(
+ g_browser_process->GetApplicationLocale());
bool is_ui_english = StartsWithASCII(ui_lang, "en-", false);
for (iter = accept_langs_list.begin();
iter != accept_langs_list.end(); ++iter) {
@@ -846,7 +649,7 @@ void TranslateManager::InitAcceptLanguages(PrefService* prefs) {
void TranslateManager::FetchLanguageListFromTranslateServer(
PrefService* prefs) {
- if (language_list_request_pending_.get() != NULL)
+ if (TranslateLanguageList::HasPendingRequest())
return;
// We don't want to do this when translate is disabled.
@@ -857,34 +660,11 @@ void TranslateManager::FetchLanguageListFromTranslateServer(
return;
}
- GURL language_list_fetch_url = GURL(kLanguageListFetchURL);
- language_list_fetch_url = AddHostLocaleToUrl(language_list_fetch_url);
- language_list_fetch_url = AddApiKeyToUrl(language_list_fetch_url);
-
- const CommandLine& command_line = *CommandLine::ForCurrentProcess();
- if (command_line.HasSwitch(switches::kEnableTranslateAlphaLanguages)) {
- language_list_fetch_url = net::AppendQueryParameter(
- language_list_fetch_url,
- kAlphaLanguageQueryName,
- kAlphaLanguageQueryValue);
- }
-
- VLOG(9) << "Fetch supporting language list from: "
- << language_list_fetch_url.spec().c_str();
-
- language_list_request_pending_.reset(net::URLFetcher::Create(
- 1, language_list_fetch_url, net::URLFetcher::GET, this));
- language_list_request_pending_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
- net::LOAD_DO_NOT_SAVE_COOKIES);
- language_list_request_pending_->SetRequestContext(
- g_browser_process->system_request_context());
- language_list_request_pending_->SetMaxRetriesOn5xx(
- kMaxRetryLanguageListFetch);
- language_list_request_pending_->Start();
+ TranslateLanguageList::RequestLanguageList();
}
void TranslateManager::CleanupPendingUlrFetcher() {
Takashi Toyoshima 2013/05/22 16:00:45 This function is called from browser main thread b
- language_list_request_pending_.reset();
+ TranslateLanguageList::ResetPendingRequest();
translate_script_request_pending_.reset();
}
@@ -916,8 +696,10 @@ void TranslateManager::RequestTranslateScript() {
kCallbackQueryName,
kCallbackQueryValue);
- translate_script_url = AddHostLocaleToUrl(translate_script_url);
- translate_script_url = AddApiKeyToUrl(translate_script_url);
+ translate_script_url =
+ TranslateURLUtil::AddHostLocaleToUrl(translate_script_url);
+ translate_script_url =
+ TranslateURLUtil::AddApiKeyToUrl(translate_script_url);
translate_script_request_pending_.reset(net::URLFetcher::Create(
0, translate_script_url, net::URLFetcher::GET, this));
@@ -932,9 +714,9 @@ void TranslateManager::RequestTranslateScript() {
// static
std::string TranslateManager::GetTargetLanguage(PrefService* prefs) {
- std::string ui_lang =
- GetLanguageCode(g_browser_process->GetApplicationLocale());
- if (IsSupportedLanguage(ui_lang))
+ std::string ui_lang = TranslateLanguageList::GetLanguageCode(
+ g_browser_process->GetApplicationLocale());
+ if (TranslateLanguageList::IsSupportedLanguage(ui_lang))
return ui_lang;
// Getting the accepted languages list
@@ -948,8 +730,8 @@ std::string TranslateManager::GetTargetLanguage(PrefService* prefs) {
std::vector<std::string>::iterator iter;
for (iter = accept_langs_list.begin();
iter != accept_langs_list.end(); ++iter) {
- std::string lang_code = GetLanguageCode(*iter);
- if (IsSupportedLanguage(lang_code))
+ std::string lang_code = TranslateLanguageList::GetLanguageCode(*iter);
+ if (TranslateLanguageList::IsSupportedLanguage(lang_code))
return lang_code;
}
return std::string();

Powered by Google App Engine
This is Rietveld 408576698