| OLD | NEW | 
| (Empty) |  | 
 |    1 // Copyright 2013 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 #include "chrome/browser/translate/translate_ui_delegate.h" | 
 |    6  | 
 |    7 #include "base/i18n/string_compare.h" | 
 |    8 #include "base/metrics/histogram.h" | 
 |    9 #include "chrome/browser/browser_process.h" | 
 |   10 #include "chrome/browser/profiles/profile.h" | 
 |   11 #include "chrome/browser/translate/translate_manager.h" | 
 |   12 #include "chrome/browser/translate/translate_prefs.h" | 
 |   13 #include "chrome/browser/translate/translate_tab_helper.h" | 
 |   14 #include "components/translate/common/translate_constants.h" | 
 |   15 #include "content/public/browser/browser_context.h" | 
 |   16 #include "content/public/browser/navigation_entry.h" | 
 |   17 #include "content/public/browser/web_contents.h" | 
 |   18 #include "third_party/icu/source/i18n/unicode/coll.h" | 
 |   19 #include "ui/base/l10n/l10n_util.h" | 
 |   20  | 
 |   21 namespace { | 
 |   22  | 
 |   23 const char kDeclineTranslate[] = "Translate.DeclineTranslate"; | 
 |   24 const char kRevertTranslation[] = "Translate.RevertTranslation"; | 
 |   25 const char kPerformTranslate[] = "Translate.Translate"; | 
 |   26 const char kNeverTranslateLang[] = "Translate.NeverTranslateLang"; | 
 |   27 const char kNeverTranslateSite[] = "Translate.NeverTranslateSite"; | 
 |   28 const char kAlwaysTranslateLang[] = "Translate.AlwaysTranslateLang"; | 
 |   29  | 
 |   30 } | 
 |   31  | 
 |   32 TranslateUIDelegate::TranslateUIDelegate(content::WebContents* web_contents, | 
 |   33                                          const std::string& original_language, | 
 |   34                                          const std::string& target_language) | 
 |   35     : web_contents_(web_contents), | 
 |   36       original_language_index_(NO_INDEX), | 
 |   37       initial_original_language_index_(NO_INDEX), | 
 |   38       target_language_index_(NO_INDEX) { | 
 |   39   std::vector<std::string> language_codes; | 
 |   40   TranslateManager::GetSupportedLanguages(&language_codes); | 
 |   41  | 
 |   42   // Preparing for the alphabetical order in the locale. | 
 |   43   UErrorCode error = U_ZERO_ERROR; | 
 |   44   std::string locale = g_browser_process->GetApplicationLocale(); | 
 |   45   icu::Locale loc(locale.c_str()); | 
 |   46   scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(loc, error)); | 
 |   47   collator->setStrength(icu::Collator::PRIMARY); | 
 |   48  | 
 |   49   languages_.reserve(language_codes.size()); | 
 |   50   for (std::vector<std::string>::const_iterator iter = language_codes.begin(); | 
 |   51        iter != language_codes.end(); ++iter) { | 
 |   52     std::string language_code = *iter; | 
 |   53  | 
 |   54     string16 language_name = l10n_util::GetDisplayNameForLocale( | 
 |   55         language_code, g_browser_process->GetApplicationLocale(), true); | 
 |   56     // Insert the language in languages_ in alphabetical order. | 
 |   57     std::vector<LanguageNamePair>::iterator iter2; | 
 |   58     for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) { | 
 |   59       if (base::i18n::CompareString16WithCollator(collator.get(), | 
 |   60           language_name, iter2->second) == UCOL_LESS) { | 
 |   61         break; | 
 |   62       } | 
 |   63     } | 
 |   64     languages_.insert(iter2, LanguageNamePair(language_code, language_name)); | 
 |   65   } | 
 |   66   for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin(); | 
 |   67        iter != languages_.end(); ++iter) { | 
 |   68     std::string language_code = iter->first; | 
 |   69     if (language_code == original_language) { | 
 |   70       original_language_index_ = iter - languages_.begin(); | 
 |   71       initial_original_language_index_ = original_language_index_; | 
 |   72     } | 
 |   73     if (language_code == target_language) | 
 |   74       target_language_index_ = iter - languages_.begin(); | 
 |   75   } | 
 |   76  | 
 |   77   Profile* profile = | 
 |   78       Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 
 |   79   prefs_.reset(new TranslatePrefs(profile->GetPrefs())); | 
 |   80 } | 
 |   81  | 
 |   82 TranslateUIDelegate::~TranslateUIDelegate() { | 
 |   83 } | 
 |   84  | 
 |   85 size_t TranslateUIDelegate::GetNumberOfLanguages() const { | 
 |   86   return languages_.size(); | 
 |   87 } | 
 |   88  | 
 |   89 size_t TranslateUIDelegate::GetOriginalLanguageIndex() const { | 
 |   90   return original_language_index_; | 
 |   91 } | 
 |   92  | 
 |   93 void TranslateUIDelegate::SetOriginalLanguageIndex(size_t language_index) { | 
 |   94   DCHECK_LT(language_index, GetNumberOfLanguages()); | 
 |   95   original_language_index_ = language_index; | 
 |   96 } | 
 |   97  | 
 |   98 size_t TranslateUIDelegate::GetTargetLanguageIndex() const { | 
 |   99   return target_language_index_; | 
 |  100 } | 
 |  101  | 
 |  102 void TranslateUIDelegate::SetTargetLanguageIndex(size_t language_index) { | 
 |  103   DCHECK_LT(language_index, GetNumberOfLanguages()); | 
 |  104   target_language_index_ = language_index; | 
 |  105 } | 
 |  106  | 
 |  107  | 
 |  108 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { | 
 |  109   DCHECK_LT(index, GetNumberOfLanguages()); | 
 |  110   return languages_[index].first; | 
 |  111 } | 
 |  112  | 
 |  113 string16 TranslateUIDelegate::GetLanguageNameAt(size_t index) const { | 
 |  114   if (index == static_cast<size_t>(NO_INDEX)) | 
 |  115     return string16(); | 
 |  116   DCHECK_LT(index, GetNumberOfLanguages()); | 
 |  117   return languages_[index].second; | 
 |  118 } | 
 |  119  | 
 |  120 std::string TranslateUIDelegate::GetOriginalLanguageCode() const { | 
 |  121   return (GetOriginalLanguageIndex() == static_cast<size_t>(NO_INDEX)) ? | 
 |  122       translate::kUnknownLanguageCode : | 
 |  123       GetLanguageCodeAt(GetOriginalLanguageIndex()); | 
 |  124 } | 
 |  125  | 
 |  126 std::string TranslateUIDelegate::GetTargetLanguageCode() const { | 
 |  127   return GetLanguageCodeAt(GetTargetLanguageIndex()); | 
 |  128 } | 
 |  129  | 
 |  130 void TranslateUIDelegate::Translate() { | 
 |  131   if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 
 |  132     prefs_->ResetTranslationDeniedCount(GetOriginalLanguageCode()); | 
 |  133     prefs_->IncrementTranslationAcceptedCount(GetOriginalLanguageCode()); | 
 |  134   } | 
 |  135   TranslateManager::GetInstance()->TranslatePage(web_contents(), | 
 |  136                                                  GetOriginalLanguageCode(), | 
 |  137                                                  GetTargetLanguageCode()); | 
 |  138  | 
 |  139   UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); | 
 |  140 } | 
 |  141  | 
 |  142 void TranslateUIDelegate::RevertTranslation() { | 
 |  143   TranslateManager::GetInstance()->RevertTranslation(web_contents()); | 
 |  144  | 
 |  145   UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); | 
 |  146 } | 
 |  147  | 
 |  148 void TranslateUIDelegate::TranslationDeclined() { | 
 |  149   if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 
 |  150     prefs_->ResetTranslationAcceptedCount(GetOriginalLanguageCode()); | 
 |  151     prefs_->IncrementTranslationDeniedCount(GetOriginalLanguageCode()); | 
 |  152   } | 
 |  153  | 
 |  154   // Remember that the user declined the translation so as to prevent showing a | 
 |  155   // translate infobar for that page again.  (TranslateManager initiates | 
 |  156   // translations when getting a LANGUAGE_DETERMINED from the page, which | 
 |  157   // happens when a load stops. That could happen multiple times, including | 
 |  158   // after the user already declined the translation.) | 
 |  159   TranslateTabHelper::FromWebContents(web_contents())-> | 
 |  160       language_state().set_translation_declined(true); | 
 |  161  | 
 |  162   UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); | 
 |  163 } | 
 |  164  | 
 |  165 bool TranslateUIDelegate::IsLanguageBlocked() { | 
 |  166   return prefs_->IsBlockedLanguage(GetOriginalLanguageCode()); | 
 |  167 } | 
 |  168  | 
 |  169 void TranslateUIDelegate::SetLanguageBlocked(bool value) { | 
 |  170   if (value) | 
 |  171     prefs_->BlockLanguage(GetOriginalLanguageCode()); | 
 |  172   else | 
 |  173     prefs_->UnblockLanguage(GetOriginalLanguageCode()); | 
 |  174  | 
 |  175   UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true); | 
 |  176 } | 
 |  177  | 
 |  178 bool TranslateUIDelegate::IsSiteBlacklisted() { | 
 |  179   std::string host = GetPageHost(); | 
 |  180   return !host.empty() && prefs_->IsSiteBlacklisted(host); | 
 |  181 } | 
 |  182  | 
 |  183 void TranslateUIDelegate::SetSiteBlacklist(bool value) { | 
 |  184   std::string host = GetPageHost(); | 
 |  185   if (host.empty()) | 
 |  186     return; | 
 |  187  | 
 |  188   if (value) | 
 |  189     prefs_->BlacklistSite(host); | 
 |  190   else | 
 |  191     prefs_->RemoveSiteFromBlacklist(host); | 
 |  192  | 
 |  193   UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true); | 
 |  194 } | 
 |  195  | 
 |  196 bool TranslateUIDelegate::ShouldAlwaysTranslate() { | 
 |  197   return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), | 
 |  198                                            GetTargetLanguageCode()); | 
 |  199 } | 
 |  200  | 
 |  201 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { | 
 |  202   const std::string& original_lang = GetOriginalLanguageCode(); | 
 |  203   const std::string& target_lang = GetTargetLanguageCode(); | 
 |  204   if (value) | 
 |  205     prefs_->WhitelistLanguagePair(original_lang, target_lang); | 
 |  206   else | 
 |  207     prefs_->RemoveLanguagePairFromWhitelist(original_lang, target_lang); | 
 |  208  | 
 |  209   UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, true); | 
 |  210 } | 
 |  211  | 
 |  212 std::string TranslateUIDelegate::GetPageHost() { | 
 |  213   content::NavigationEntry* entry = | 
 |  214       web_contents()->GetController().GetActiveEntry(); | 
 |  215   return entry ? entry->GetURL().HostNoBrackets() : std::string(); | 
 |  216 } | 
| OLD | NEW |