diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-31 22:31:04 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-31 22:31:04 +0000 |
commit | 9ee73628f9d8ec2998b6060805dac0efd825af44 (patch) | |
tree | 39b1016beca729c2295d8cc937bfd654040f83de /chrome/browser/translate | |
parent | 30f9ac3cd37f6a4833be4ce0aefa969dea9a1808 (diff) | |
download | chromium_src-9ee73628f9d8ec2998b6060805dac0efd825af44.zip chromium_src-9ee73628f9d8ec2998b6060805dac0efd825af44.tar.gz chromium_src-9ee73628f9d8ec2998b6060805dac0efd825af44.tar.bz2 |
Hooking the UI part to the translate feature.
Review URL: http://codereview.chromium.org/549217
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37674 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/translate')
-rw-r--r-- | chrome/browser/translate/translate_infobars_delegates.cc | 5 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.cc | 113 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.h | 47 |
3 files changed, 161 insertions, 4 deletions
diff --git a/chrome/browser/translate/translate_infobars_delegates.cc b/chrome/browser/translate/translate_infobars_delegates.cc index ecf0a95..15d165b 100644 --- a/chrome/browser/translate/translate_infobars_delegates.cc +++ b/chrome/browser/translate/translate_infobars_delegates.cc @@ -93,10 +93,7 @@ void TranslateInfoBarDelegate::GetAvailableTargetLanguages( } void TranslateInfoBarDelegate::Translate() { - // TODO(kuan): Call actual Translate method. -/* - Translate(WideToUTF8(original_language()), WideToUTF8(target_language())); -*/ + tab_contents_->TranslatePage(original_language_, target_language_); } bool TranslateInfoBarDelegate::IsLanguageBlacklisted() { diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc new file mode 100644 index 0000000..5a7938a --- /dev/null +++ b/chrome/browser/translate/translate_manager.cc @@ -0,0 +1,113 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/translate/translate_manager.h" + +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/renderer_host/translation_service.h" +#include "chrome/browser/tab_contents/navigation_controller.h" +#include "chrome/browser/tab_contents/navigation_entry.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/translate/translate_infobars_delegates.h" +#include "chrome/browser/translate/translate_prefs.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_service.h" +#include "chrome/common/notification_source.h" +#include "chrome/common/notification_type.h" +#include "chrome/common/pref_service.h" + +TranslateManager::~TranslateManager() { +} + +void TranslateManager::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + switch (type.value) { + case NotificationType::NAV_ENTRY_COMMITTED: { + // We have navigated to a new page. + NavigationController* controller = + Source<NavigationController>(source).ptr(); + NavigationEntry* entry = controller->GetActiveEntry(); + if (!entry->language().empty()) { + // The language for that page is known (it must be a back/forward + // navigation to a page we already visited). + InitiateTranslation(controller->tab_contents(), entry->language()); + } + break; + } + case NotificationType::TAB_LANGUAGE_DETERMINED: { + TabContents* tab = Source<TabContents>(source).ptr(); + std::string language = *(Details<std::string>(details).ptr()); + InitiateTranslation(tab, language); + break; + } + case NotificationType::PAGE_TRANSLATED: { + TabContents* tab = Source<TabContents>(source).ptr(); + std::pair<std::string, std::string>* language_pair = + (Details<std::pair<std::string, std::string> >(details).ptr()); + PrefService* prefs = GetPrefService(tab); + tab->AddInfoBar(new AfterTranslateInfoBarDelegate(tab, prefs, + language_pair->first, + language_pair->second)); + break; + } + default: + NOTREACHED(); + } +} + +TranslateManager::TranslateManager() { + if (!TranslationService::IsTranslationEnabled()) + return; + + notification_registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, + NotificationService::AllSources()); + notification_registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED, + NotificationService::AllSources()); + notification_registrar_.Add(this, NotificationType::PAGE_TRANSLATED, + NotificationService::AllSources()); +} + +void TranslateManager::InitiateTranslation(TabContents* tab, + const std::string& page_lang) { + PrefService* prefs = GetPrefService(tab); + NavigationEntry* entry = tab->controller().GetActiveEntry(); + if (!entry) { + NOTREACHED(); + return; + } + + std::string chrome_lang = g_browser_process->GetApplicationLocale(); + + // We don't want to translate: + // - any Chrome specific page (New Tab Page, Download, History... pages). + // - similar languages (ex: en-US to en). + // - any user black-listed URLs or user selected language combination. + if (entry->url().SchemeIs("chrome") || page_lang == chrome_lang || + !TranslationService::ShouldTranslatePage(page_lang, chrome_lang) || + !TranslatePrefs::CanTranslate(prefs, page_lang, entry->url())) { + return; + } + if (TranslatePrefs::ShouldAutoTranslate(prefs, page_lang, chrome_lang)) { + // The user has previously select "always translate" for this language. + tab->TranslatePage(page_lang, chrome_lang); + return; + } + + // Prompts the user if he/she wants the page translated. + tab->AddInfoBar(new BeforeTranslateInfoBarDelegate(tab, prefs, + entry->url(), + page_lang, chrome_lang)); +} + +PrefService* TranslateManager::GetPrefService(TabContents* tab) { + PrefService* prefs = NULL; + if (tab->profile()) + prefs = tab->profile()->GetPrefs(); + if (prefs) + return prefs; + + return g_browser_process->local_state(); +} diff --git a/chrome/browser/translate/translate_manager.h b/chrome/browser/translate/translate_manager.h new file mode 100644 index 0000000..b51f089 --- /dev/null +++ b/chrome/browser/translate/translate_manager.h @@ -0,0 +1,47 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_ +#define CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_ + +#include <string> + +#include "base/singleton.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_registrar.h" + +class PrefService; +class TabContents; + +// The TranslateManager class is responsible for showing an info-bar when a page +// in a language different than the user language is loaded. It triggers the +// page translation the user requests. +// It is a singleton. + +class TranslateManager : public NotificationObserver { + public: + virtual ~TranslateManager(); + + // NotificationObserver implementation: + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + private: + friend struct DefaultSingletonTraits<TranslateManager>; + + TranslateManager(); + + // Starts the translation process on |tab| containing the page in the + // |page_lang| language. + void InitiateTranslation(TabContents* tab, const std::string& page_lang); + + // Convenience method that retrieves the PrefService. + PrefService* GetPrefService(TabContents* tab); + + NotificationRegistrar notification_registrar_; + + DISALLOW_COPY_AND_ASSIGN(TranslateManager); +}; + +#endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_ |