OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 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_infobar_delegate2.h" |
| 6 |
| 7 #include "app/l10n_util.h" |
| 8 #include "app/resource_bundle.h" |
| 9 #include "chrome/browser/browser_process.h" |
| 10 #include "chrome/browser/profile.h" |
| 11 #include "chrome/browser/tab_contents/tab_contents.h" |
| 12 #include "chrome/browser/translate/translate_infobar_view.h" |
| 13 #include "chrome/browser/translate/translate_manager2.h" |
| 14 #include "grit/generated_resources.h" |
| 15 #include "grit/theme_resources.h" |
| 16 |
| 17 // static |
| 18 TranslateInfoBarDelegate2* TranslateInfoBarDelegate2::CreateInstance( |
| 19 Type type, |
| 20 TranslateErrors::Type error, |
| 21 TabContents* tab_contents, |
| 22 const std::string& original_language, |
| 23 const std::string& target_language) { |
| 24 if (!TranslateManager2::IsSupportedLanguage(original_language) || |
| 25 !TranslateManager2::IsSupportedLanguage(target_language)) { |
| 26 return NULL; |
| 27 } |
| 28 return new TranslateInfoBarDelegate2(type, error, tab_contents, |
| 29 original_language, target_language); |
| 30 } |
| 31 |
| 32 TranslateInfoBarDelegate2::TranslateInfoBarDelegate2( |
| 33 Type type, |
| 34 TranslateErrors::Type error, |
| 35 TabContents* tab_contents, |
| 36 const std::string& original_language, |
| 37 const std::string& target_language) |
| 38 : InfoBarDelegate(tab_contents), |
| 39 type_(type), |
| 40 background_animation_(NONE), |
| 41 tab_contents_(tab_contents), |
| 42 original_language_index_(-1), |
| 43 target_language_index_(-1), |
| 44 error_(error), |
| 45 infobar_view_(NULL), |
| 46 prefs_(tab_contents_->profile()->GetPrefs()) { |
| 47 DCHECK((type_ != TRANSLATION_ERROR && error == TranslateErrors::NONE) || |
| 48 (type_ == TRANSLATION_ERROR && error != TranslateErrors::NONE)); |
| 49 |
| 50 std::vector<std::string> language_codes; |
| 51 TranslateManager2::GetSupportedLanguages(&language_codes); |
| 52 |
| 53 languages_.reserve(language_codes.size()); |
| 54 for (std::vector<std::string>::const_iterator iter = language_codes.begin(); |
| 55 iter != language_codes.end(); ++iter) { |
| 56 std::string language_code = *iter; |
| 57 |
| 58 if (language_code == original_language) |
| 59 original_language_index_ = iter - language_codes.begin(); |
| 60 else if (language_code == target_language) |
| 61 target_language_index_ = iter - language_codes.begin(); |
| 62 |
| 63 string16 language_name = GetLanguageDisplayableName(language_code); |
| 64 // Insert the language in languages_ in alphabetical order. |
| 65 std::vector<LanguageNamePair>::iterator iter2; |
| 66 for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) { |
| 67 if (language_name.compare(iter2->second) < 0) |
| 68 break; |
| 69 } |
| 70 languages_.insert(iter2, LanguageNamePair(language_code, language_name)); |
| 71 } |
| 72 DCHECK(original_language_index_ != -1); |
| 73 DCHECK(target_language_index_ != -1); |
| 74 } |
| 75 |
| 76 int TranslateInfoBarDelegate2::GetLanguageCount() const { |
| 77 return static_cast<int>(languages_.size()); |
| 78 } |
| 79 |
| 80 const std::string& TranslateInfoBarDelegate2::GetLanguageCodeAt( |
| 81 int index) const { |
| 82 DCHECK(index >=0 && index < GetLanguageCount()); |
| 83 return languages_[index].first; |
| 84 } |
| 85 |
| 86 const string16& TranslateInfoBarDelegate2::GetLanguageDisplayableNameAt( |
| 87 int index) const { |
| 88 DCHECK(index >=0 && index < GetLanguageCount()); |
| 89 return languages_[index].second; |
| 90 } |
| 91 |
| 92 const std::string& TranslateInfoBarDelegate2::GetOriginalLanguageCode() const { |
| 93 return GetLanguageCodeAt(original_language_index()); |
| 94 } |
| 95 |
| 96 const std::string& TranslateInfoBarDelegate2::GetTargetLanguageCode() const { |
| 97 return GetLanguageCodeAt(target_language_index()); |
| 98 } |
| 99 |
| 100 void TranslateInfoBarDelegate2::SetOriginalLanguage(int language_index) { |
| 101 DCHECK(language_index < static_cast<int>(languages_.size())); |
| 102 original_language_index_ = language_index; |
| 103 if (infobar_view_) |
| 104 infobar_view_->OriginalLanguageChanged(); |
| 105 if (type_ == AFTER_TRANSLATE) |
| 106 Translate(); |
| 107 } |
| 108 |
| 109 void TranslateInfoBarDelegate2::SetTargetLanguage(int language_index) { |
| 110 DCHECK(language_index < static_cast<int>(languages_.size())); |
| 111 target_language_index_ = language_index; |
| 112 if (infobar_view_) |
| 113 infobar_view_->TargetLanguageChanged(); |
| 114 if (type_ == AFTER_TRANSLATE) |
| 115 Translate(); |
| 116 } |
| 117 |
| 118 bool TranslateInfoBarDelegate2::IsError() { |
| 119 return type_ == TRANSLATION_ERROR; |
| 120 } |
| 121 |
| 122 void TranslateInfoBarDelegate2::Translate() { |
| 123 Singleton<TranslateManager2>::get()->TranslatePage( |
| 124 tab_contents_, |
| 125 GetLanguageCodeAt(original_language_index()), |
| 126 GetLanguageCodeAt(target_language_index())); |
| 127 } |
| 128 |
| 129 void TranslateInfoBarDelegate2::RevertTranslation() { |
| 130 Singleton<TranslateManager2>::get()->RevertTranslation(tab_contents_); |
| 131 tab_contents_->RemoveInfoBar(this); |
| 132 } |
| 133 |
| 134 void TranslateInfoBarDelegate2::TranslationDeclined() { |
| 135 // Remember that the user declined the translation so as to prevent showing a |
| 136 // translate infobar for that page again. (TranslateManager initiates |
| 137 // translations when getting a LANGUAGE_DETERMINED from the page, which |
| 138 // happens when a load stops. That could happen multiple times, including |
| 139 // after the user already declined the translation.) |
| 140 tab_contents_->language_state().set_translation_declined(true); |
| 141 } |
| 142 |
| 143 void TranslateInfoBarDelegate2::InfoBarDismissed() { |
| 144 if (type_ != BEFORE_TRANSLATE) |
| 145 return; |
| 146 |
| 147 // The user closed the infobar without clicking the translate button. |
| 148 TranslationDeclined(); |
| 149 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslateCloseInfobar", 1); |
| 150 } |
| 151 |
| 152 SkBitmap* TranslateInfoBarDelegate2::GetIcon() const { |
| 153 return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
| 154 IDR_INFOBAR_TRANSLATE); |
| 155 } |
| 156 |
| 157 InfoBarDelegate::Type TranslateInfoBarDelegate2::GetInfoBarType() { |
| 158 return InfoBarDelegate::PAGE_ACTION_TYPE; |
| 159 } |
| 160 |
| 161 bool TranslateInfoBarDelegate2::IsLanguageBlacklisted() { |
| 162 const std::string& original_lang = |
| 163 GetLanguageCodeAt(original_language_index()); |
| 164 return prefs_.IsLanguageBlacklisted(original_lang); |
| 165 } |
| 166 |
| 167 void TranslateInfoBarDelegate2::ToggleLanguageBlacklist() { |
| 168 const std::string& original_lang = |
| 169 GetLanguageCodeAt(original_language_index()); |
| 170 if (prefs_.IsLanguageBlacklisted(original_lang)) |
| 171 prefs_.RemoveLanguageFromBlacklist(original_lang); |
| 172 else |
| 173 prefs_.BlacklistLanguage(original_lang); |
| 174 } |
| 175 |
| 176 bool TranslateInfoBarDelegate2::IsSiteBlacklisted() { |
| 177 std::string host = GetPageHost(); |
| 178 return !host.empty() && prefs_.IsSiteBlacklisted(host); |
| 179 } |
| 180 |
| 181 void TranslateInfoBarDelegate2::ToggleSiteBlacklist() { |
| 182 std::string host = GetPageHost(); |
| 183 if (host.empty()) |
| 184 return; |
| 185 |
| 186 if (prefs_.IsSiteBlacklisted(host)) |
| 187 prefs_.RemoveSiteFromBlacklist(host); |
| 188 else |
| 189 prefs_.BlacklistSite(host); |
| 190 } |
| 191 |
| 192 bool TranslateInfoBarDelegate2::ShouldAlwaysTranslate() { |
| 193 return prefs_.IsLanguagePairWhitelisted(GetOriginalLanguageCode(), |
| 194 GetTargetLanguageCode()); |
| 195 } |
| 196 |
| 197 void TranslateInfoBarDelegate2::ToggleAlwaysTranslate() { |
| 198 std::string original_lang = GetOriginalLanguageCode(); |
| 199 std::string target_lang = GetTargetLanguageCode(); |
| 200 if (prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)) |
| 201 prefs_.RemoveLanguagePairFromWhitelist(original_lang, target_lang); |
| 202 else |
| 203 prefs_.WhitelistLanguagePair(original_lang, target_lang); |
| 204 } |
| 205 |
| 206 string16 TranslateInfoBarDelegate2::GetMessageInfoBarText() { |
| 207 switch (type_) { |
| 208 case TRANSLATING: |
| 209 return l10n_util::GetStringFUTF16( |
| 210 IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, |
| 211 GetLanguageDisplayableNameAt(target_language_index_)); |
| 212 case TRANSLATION_ERROR: |
| 213 switch (error_) { |
| 214 case TranslateErrors::NETWORK: |
| 215 return l10n_util::GetStringUTF16( |
| 216 IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT); |
| 217 case TranslateErrors::INITIALIZATION_ERROR: |
| 218 case TranslateErrors::TRANSLATION_ERROR: |
| 219 return l10n_util::GetStringUTF16( |
| 220 IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE); |
| 221 default: |
| 222 NOTREACHED(); |
| 223 return string16(); |
| 224 } |
| 225 default: |
| 226 NOTREACHED(); |
| 227 return string16(); |
| 228 } |
| 229 } |
| 230 |
| 231 string16 TranslateInfoBarDelegate2::GetMessageInfoBarButtonText() { |
| 232 switch (type_) { |
| 233 case TRANSLATING: |
| 234 return string16(); |
| 235 case TRANSLATION_ERROR: |
| 236 return l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_RETRY); |
| 237 default: |
| 238 NOTREACHED(); |
| 239 return string16(); |
| 240 } |
| 241 } |
| 242 |
| 243 void TranslateInfoBarDelegate2::MessageInfoBarButtonPressed() { |
| 244 DCHECK(type_ == TRANSLATION_ERROR); |
| 245 Singleton<TranslateManager2>::get()->TranslatePage( |
| 246 tab_contents_, |
| 247 GetLanguageCodeAt(original_language_index()), |
| 248 GetLanguageCodeAt(target_language_index())); |
| 249 } |
| 250 |
| 251 void TranslateInfoBarDelegate2::UpdateBackgroundAnimation( |
| 252 TranslateInfoBarDelegate2* previous_infobar) { |
| 253 if (!previous_infobar || previous_infobar->IsError() == IsError()) { |
| 254 background_animation_ = NONE; |
| 255 return; |
| 256 } |
| 257 background_animation_ = IsError() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL; |
| 258 } |
| 259 |
| 260 std::string TranslateInfoBarDelegate2::GetPageHost() { |
| 261 NavigationEntry* entry = tab_contents_->controller().GetActiveEntry(); |
| 262 return entry ? entry->url().HostNoBrackets() : std::string(); |
| 263 } |
| 264 |
| 265 // static |
| 266 string16 TranslateInfoBarDelegate2::GetLanguageDisplayableName( |
| 267 const std::string& language_code) { |
| 268 return l10n_util::GetDisplayNameForLocale( |
| 269 language_code, g_browser_process->GetApplicationLocale(), true); |
| 270 } |
| 271 |
| 272 // static |
| 273 void TranslateInfoBarDelegate2::GetAfterTranslateStrings( |
| 274 std::vector<string16>* strings, bool* swap_languages) { |
| 275 DCHECK(strings); |
| 276 DCHECK(swap_languages); |
| 277 |
| 278 std::vector<size_t> offsets; |
| 279 string16 text = |
| 280 l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_AFTER_MESSAGE, |
| 281 string16(), string16(), &offsets); |
| 282 DCHECK(offsets.size() == 2U); |
| 283 |
| 284 if (offsets[0] > offsets[1]) { |
| 285 // Target language comes before source. |
| 286 int tmp = offsets[0]; |
| 287 offsets[0] = offsets[0]; |
| 288 offsets[1] = tmp; |
| 289 *swap_languages = true; |
| 290 } else { |
| 291 *swap_languages = false; |
| 292 } |
| 293 |
| 294 strings->push_back(text.substr(0, offsets[0])); |
| 295 strings->push_back(text.substr(offsets[0], offsets[1])); |
| 296 strings->push_back(text.substr(offsets[1])); |
| 297 } |
| 298 |
| 299 #if !defined(OS_WIN) && !defined(OS_CHROMEOS) |
| 300 // Necessary so we link OK on Mac and Linux while the new translate infobars |
| 301 // are being ported to these platforms. |
| 302 InfoBar* TranslateInfoBarDelegate2::CreateInfoBar() { |
| 303 return NULL; |
| 304 } |
| 305 #endif |
OLD | NEW |