Home | History | Annotate | Download | only in translate
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
      6 #define CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
      7 #pragma once
      8 
      9 #include <map>
     10 #include <set>
     11 #include <string>
     12 #include <vector>
     13 
     14 #include "base/lazy_instance.h"
     15 #include "base/task.h"
     16 #include "chrome/browser/prefs/pref_change_registrar.h"
     17 #include "chrome/common/net/url_fetcher.h"
     18 #include "chrome/common/translate_errors.h"
     19 #include "content/common/notification_observer.h"
     20 #include "content/common/notification_registrar.h"
     21 
     22 template <typename T> struct DefaultSingletonTraits;
     23 class GURL;
     24 struct PageTranslatedDetails;
     25 class PrefService;
     26 class TabContents;
     27 class TranslateInfoBarDelegate;
     28 
     29 // The TranslateManager class is responsible for showing an info-bar when a page
     30 // in a language different than the user language is loaded.  It triggers the
     31 // page translation the user requests.
     32 // It is a singleton.
     33 
     34 class TranslateManager : public NotificationObserver,
     35                          public URLFetcher::Delegate {
     36  public:
     37   // Returns the singleton instance.
     38   static TranslateManager* GetInstance();
     39 
     40   virtual ~TranslateManager();
     41 
     42   // Translates the page contents from |source_lang| to |target_lang|.
     43   // The actual translation might be performed asynchronously if the translate
     44   // script is not yet available.
     45   void TranslatePage(TabContents* tab_contents,
     46                      const std::string& source_lang,
     47                      const std::string& target_lang);
     48 
     49   // Reverts the contents of the page in |tab_contents| to its original
     50   // language.
     51   void RevertTranslation(TabContents* tab_contents);
     52 
     53   // Reports to the Google translate server that a page language was incorrectly
     54   // detected.  This call is initiated by the user selecting the "report" menu
     55   // under options in the translate infobar.
     56   void ReportLanguageDetectionError(TabContents* tab_contents);
     57 
     58   // Clears the translate script, so it will be fetched next time we translate.
     59   void ClearTranslateScript() { translate_script_.clear(); }
     60 
     61   // NotificationObserver implementation:
     62   virtual void Observe(NotificationType type,
     63                        const NotificationSource& source,
     64                        const NotificationDetails& details);
     65 
     66   // URLFetcher::Delegate implementation:
     67   virtual void OnURLFetchComplete(const URLFetcher* source,
     68                                   const GURL& url,
     69                                   const net::URLRequestStatus& status,
     70                                   int response_code,
     71                                   const ResponseCookies& cookies,
     72                                   const std::string& data);
     73 
     74   // Used by unit-tests to override the default delay after which the translate
     75   // script is fetched again from the translation server.
     76   void set_translate_script_expiration_delay(int delay_ms) {
     77     translate_script_expiration_delay_ = delay_ms;
     78   }
     79 
     80   // Convenience method to know if a tab is showing a translate infobar.
     81   static bool IsShowingTranslateInfobar(TabContents* tab);
     82 
     83   // Returns true if the URL can be translated.
     84   static bool IsTranslatableURL(const GURL& url);
     85 
     86   // Fills |languages| with the list of languages that the translate server can
     87   // translate to and from.
     88   static void GetSupportedLanguages(std::vector<std::string>* languages);
     89 
     90   // Returns the language code that can be used with the Translate method for a
     91   // specified |chrome_locale|.
     92   static std::string GetLanguageCode(const std::string& chrome_locale);
     93 
     94   // Returns true if |language| is supported by the translation server.
     95   static bool IsSupportedLanguage(const std::string& language);
     96 
     97  protected:
     98   TranslateManager();
     99 
    100  private:
    101   friend struct DefaultSingletonTraits<TranslateManager>;
    102 
    103   // Structure that describes a translate request.
    104   // Translation may be deferred while the translate script is being retrieved
    105   // from the translate server.
    106   struct PendingRequest {
    107     int render_process_id;
    108     int render_view_id;
    109     int page_id;
    110     std::string source_lang;
    111     std::string target_lang;
    112   };
    113 
    114   // Starts the translation process on |tab| containing the page in the
    115   // |page_lang| language.
    116   void InitiateTranslation(TabContents* tab, const std::string& page_lang);
    117 
    118   // If the tab identified by |process_id| and |render_id| has been closed, this
    119   // does nothing, otherwise it calls InitiateTranslation.
    120   void InitiateTranslationPosted(int process_id,
    121                                  int render_id,
    122                                  const std::string& page_lang);
    123 
    124   // Sends a translation request to the RenderView of |tab_contents|.
    125   void DoTranslatePage(TabContents* tab_contents,
    126                        const std::string& translate_script,
    127                        const std::string& source_lang,
    128                        const std::string& target_lang);
    129 
    130    // Shows the after translate or error infobar depending on the details.
    131    void PageTranslated(TabContents* tab, PageTranslatedDetails* details);
    132 
    133   // Returns true if the passed language has been configured by the user as an
    134   // accept language.
    135   bool IsAcceptLanguage(TabContents* tab, const std::string& language);
    136 
    137   // Initializes the |accept_languages_| language table based on the associated
    138   // preference in |prefs|.
    139   void InitAcceptLanguages(PrefService* prefs);
    140 
    141   // Fetches the JS translate script (the script that is injected in the page
    142   // to translate it).
    143   void RequestTranslateScript();
    144 
    145   // Shows the specified translate |infobar| in the given |tab|.  If a current
    146   // translate infobar is showing, it just replaces it with the new one.
    147   void ShowInfoBar(TabContents* tab, TranslateInfoBarDelegate* infobar);
    148 
    149   // Returns the language to translate to, which is the language the UI is
    150   // configured in.  Returns an empty string if that language is not supported
    151   // by the translation service.
    152   static std::string GetTargetLanguage();
    153 
    154   // Returns the translate info bar showing in |tab| or NULL if none is showing.
    155   static TranslateInfoBarDelegate* GetTranslateInfoBarDelegate(
    156       TabContents* tab);
    157 
    158   NotificationRegistrar notification_registrar_;
    159   PrefChangeRegistrar pref_change_registrar_;
    160 
    161   // A map that associates a profile with its parsed "accept languages".
    162   typedef std::set<std::string> LanguageSet;
    163   typedef std::map<PrefService*, LanguageSet> PrefServiceLanguagesMap;
    164   PrefServiceLanguagesMap accept_languages_;
    165 
    166   ScopedRunnableMethodFactory<TranslateManager> method_factory_;
    167 
    168   // The JS injected in the page to do the translation.
    169   std::string translate_script_;
    170 
    171   // Delay in milli-seconds after which the translate script is fetched again
    172   // from the translate server.
    173   int translate_script_expiration_delay_;
    174 
    175   // Whether the translate JS is currently being retrieved.
    176   bool translate_script_request_pending_;
    177 
    178   // The list of pending translate requests.  Translate requests are queued when
    179   // the translate script is not ready and has to be fetched from the translate
    180   // server.
    181   std::vector<PendingRequest> pending_requests_;
    182 
    183   // The languages supported by the translation server.
    184   static base::LazyInstance<std::set<std::string> > supported_languages_;
    185 
    186   DISALLOW_COPY_AND_ASSIGN(TranslateManager);
    187 };
    188 
    189 #endif  // CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
    190