| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/translate/translate_manager.h" | 5 #include "chrome/browser/translate/translate_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" |
| 10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
| 11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 12 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
| 13 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
| 14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 16 #include "chrome/browser/browser_process.h" | 16 #include "chrome/browser/browser_process.h" |
| 17 #include "chrome/browser/chrome_notification_types.h" | 17 #include "chrome/browser/chrome_notification_types.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/tab_contents/language_state.h" | |
| 20 #include "chrome/browser/tab_contents/tab_util.h" | 19 #include "chrome/browser/tab_contents/tab_util.h" |
| 21 #include "chrome/browser/translate/translate_accept_languages.h" | 20 #include "chrome/browser/translate/translate_accept_languages.h" |
| 22 #include "chrome/browser/translate/translate_infobar_delegate.h" | 21 #include "chrome/browser/translate/translate_infobar_delegate.h" |
| 23 #include "chrome/browser/translate/translate_language_list.h" | 22 #include "chrome/browser/translate/translate_language_list.h" |
| 24 #include "chrome/browser/translate/translate_prefs.h" | 23 #include "chrome/browser/translate/translate_prefs.h" |
| 25 #include "chrome/browser/translate/translate_script.h" | 24 #include "chrome/browser/translate/translate_script.h" |
| 26 #include "chrome/browser/translate/translate_tab_helper.h" | 25 #include "chrome/browser/translate/translate_tab_helper.h" |
| 27 #include "chrome/browser/translate/translate_url_util.h" | 26 #include "chrome/browser/translate/translate_url_util.h" |
| 28 #include "chrome/browser/ui/browser.h" | 27 #include "chrome/browser/ui/browser.h" |
| 29 #include "chrome/browser/ui/browser_finder.h" | 28 #include "chrome/browser/ui/browser_finder.h" |
| 30 #include "chrome/browser/ui/browser_tabstrip.h" | 29 #include "chrome/browser/ui/browser_tabstrip.h" |
| 31 #include "chrome/browser/ui/browser_window.h" | 30 #include "chrome/browser/ui/browser_window.h" |
| 32 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 31 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 33 #include "chrome/browser/ui/translate/translate_bubble_factory.h" | 32 #include "chrome/browser/ui/translate/translate_bubble_factory.h" |
| 34 #include "chrome/common/chrome_switches.h" | 33 #include "chrome/common/chrome_switches.h" |
| 35 #include "chrome/common/pref_names.h" | 34 #include "chrome/common/pref_names.h" |
| 36 #include "chrome/common/render_messages.h" | 35 #include "chrome/common/render_messages.h" |
| 37 #include "chrome/common/url_constants.h" | 36 #include "chrome/common/url_constants.h" |
| 37 #include "components/translate/core/browser/language_state.h" |
| 38 #include "components/translate/core/browser/page_translated_details.h" | 38 #include "components/translate/core/browser/page_translated_details.h" |
| 39 #include "components/translate/core/browser/translate_browser_metrics.h" | 39 #include "components/translate/core/browser/translate_browser_metrics.h" |
| 40 #include "components/translate/core/browser/translate_error_details.h" | 40 #include "components/translate/core/browser/translate_error_details.h" |
| 41 #include "components/translate/core/browser/translate_event_details.h" | 41 #include "components/translate/core/browser/translate_event_details.h" |
| 42 #include "components/translate/core/common/language_detection_details.h" | 42 #include "components/translate/core/common/language_detection_details.h" |
| 43 #include "components/translate/core/common/translate_constants.h" | 43 #include "components/translate/core/common/translate_constants.h" |
| 44 #include "content/public/browser/navigation_controller.h" | 44 #include "content/public/browser/navigation_controller.h" |
| 45 #include "content/public/browser/navigation_details.h" | 45 #include "content/public/browser/navigation_details.h" |
| 46 #include "content/public/browser/navigation_entry.h" | 46 #include "content/public/browser/navigation_entry.h" |
| 47 #include "content/public/browser/notification_details.h" | 47 #include "content/public/browser/notification_details.h" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 return; | 195 return; |
| 196 | 196 |
| 197 // If the navigation happened while offline don't show the translate | 197 // If the navigation happened while offline don't show the translate |
| 198 // bar since there will be nothing to translate. | 198 // bar since there will be nothing to translate. |
| 199 if (load_details->http_status_code == 0 || | 199 if (load_details->http_status_code == 0 || |
| 200 load_details->http_status_code == net::HTTP_INTERNAL_SERVER_ERROR) { | 200 load_details->http_status_code == net::HTTP_INTERNAL_SERVER_ERROR) { |
| 201 return; | 201 return; |
| 202 } | 202 } |
| 203 | 203 |
| 204 if (!load_details->is_main_frame && | 204 if (!load_details->is_main_frame && |
| 205 translate_tab_helper->language_state().translation_declined()) { | 205 translate_tab_helper->GetLanguageState().translation_declined()) { |
| 206 // Some sites (such as Google map) may trigger sub-frame navigations | 206 // Some sites (such as Google map) may trigger sub-frame navigations |
| 207 // when the user interacts with the page. We don't want to show a new | 207 // when the user interacts with the page. We don't want to show a new |
| 208 // infobar if the user already dismissed one in that case. | 208 // infobar if the user already dismissed one in that case. |
| 209 return; | 209 return; |
| 210 } | 210 } |
| 211 if (entry->GetTransitionType() != content::PAGE_TRANSITION_RELOAD && | 211 if (entry->GetTransitionType() != content::PAGE_TRANSITION_RELOAD && |
| 212 load_details->type != content::NAVIGATION_TYPE_SAME_PAGE) { | 212 load_details->type != content::NAVIGATION_TYPE_SAME_PAGE) { |
| 213 return; | 213 return; |
| 214 } | 214 } |
| 215 | 215 |
| 216 // When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent, | 216 // When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent, |
| 217 // so the translation needs to be explicitly initiated, but only when the | 217 // so the translation needs to be explicitly initiated, but only when the |
| 218 // page needs translation. | 218 // page needs translation. |
| 219 if (!translate_tab_helper->language_state().page_needs_translation()) | 219 if (!translate_tab_helper->GetLanguageState().page_needs_translation()) |
| 220 return; | 220 return; |
| 221 // Note that we delay it as the TranslateManager gets this notification | 221 // Note that we delay it as the TranslateManager gets this notification |
| 222 // before the WebContents and the WebContents processing might remove the | 222 // before the WebContents and the WebContents processing might remove the |
| 223 // current infobars. Since InitTranslation might add an infobar, it must | 223 // current infobars. Since InitTranslation might add an infobar, it must |
| 224 // be done after that. | 224 // be done after that. |
| 225 base::MessageLoop::current()->PostTask(FROM_HERE, | 225 base::MessageLoop::current()->PostTask(FROM_HERE, |
| 226 base::Bind( | 226 base::Bind( |
| 227 &TranslateManager::InitiateTranslationPosted, | 227 &TranslateManager::InitiateTranslationPosted, |
| 228 weak_method_factory_.GetWeakPtr(), | 228 weak_method_factory_.GetWeakPtr(), |
| 229 controller->GetWebContents()->GetRenderProcessHost()->GetID(), | 229 controller->GetWebContents()->GetRenderProcessHost()->GetID(), |
| 230 controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(), | 230 controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(), |
| 231 translate_tab_helper->language_state().original_language(), 0)); | 231 translate_tab_helper->GetLanguageState().original_language(), 0)); |
| 232 break; | 232 break; |
| 233 } | 233 } |
| 234 case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: { | 234 case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: { |
| 235 const LanguageDetectionDetails* lang_det_details = | 235 const LanguageDetectionDetails* lang_det_details = |
| 236 content::Details<const LanguageDetectionDetails>(details).ptr(); | 236 content::Details<const LanguageDetectionDetails>(details).ptr(); |
| 237 | 237 |
| 238 WebContents* tab = content::Source<WebContents>(source).ptr(); | 238 WebContents* tab = content::Source<WebContents>(source).ptr(); |
| 239 if (!tab->GetBrowserContext()->IsOffTheRecord()) | 239 if (!tab->GetBrowserContext()->IsOffTheRecord()) |
| 240 NotifyLanguageDetection(*lang_det_details); | 240 NotifyLanguageDetection(*lang_det_details); |
| 241 | 241 |
| 242 // We may get this notifications multiple times. Make sure to translate | 242 // We may get this notifications multiple times. Make sure to translate |
| 243 // only once. | 243 // only once. |
| 244 TranslateTabHelper* translate_tab_helper = | 244 TranslateTabHelper* translate_tab_helper = |
| 245 TranslateTabHelper::FromWebContents(tab); | 245 TranslateTabHelper::FromWebContents(tab); |
| 246 if (!translate_tab_helper) | 246 if (!translate_tab_helper) |
| 247 return; | 247 return; |
| 248 | 248 |
| 249 LanguageState& language_state = translate_tab_helper->language_state(); | 249 LanguageState& language_state = translate_tab_helper->GetLanguageState(); |
| 250 if (language_state.page_needs_translation() && | 250 if (language_state.page_needs_translation() && |
| 251 !language_state.translation_pending() && | 251 !language_state.translation_pending() && |
| 252 !language_state.translation_declined() && | 252 !language_state.translation_declined() && |
| 253 !language_state.IsPageTranslated()) { | 253 !language_state.IsPageTranslated()) { |
| 254 std::string language = lang_det_details->adopted_language; | 254 std::string language = lang_det_details->adopted_language; |
| 255 InitiateTranslation(tab, language); | 255 InitiateTranslation(tab, language); |
| 256 } | 256 } |
| 257 break; | 257 break; |
| 258 } | 258 } |
| 259 case chrome::NOTIFICATION_PAGE_TRANSLATED: { | 259 case chrome::NOTIFICATION_PAGE_TRANSLATED: { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { | 397 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { |
| 398 std::string auto_target_lang = GetAutoTargetLanguage(language_code, prefs); | 398 std::string auto_target_lang = GetAutoTargetLanguage(language_code, prefs); |
| 399 if (!auto_target_lang.empty()) { | 399 if (!auto_target_lang.empty()) { |
| 400 TranslateBrowserMetrics::ReportInitiationStatus( | 400 TranslateBrowserMetrics::ReportInitiationStatus( |
| 401 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); | 401 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); |
| 402 TranslatePage(web_contents, language_code, auto_target_lang); | 402 TranslatePage(web_contents, language_code, auto_target_lang); |
| 403 return; | 403 return; |
| 404 } | 404 } |
| 405 } | 405 } |
| 406 | 406 |
| 407 LanguageState& language_state = translate_tab_helper->language_state(); | 407 LanguageState& language_state = translate_tab_helper->GetLanguageState(); |
| 408 std::string auto_translate_to = language_state.AutoTranslateTo(); | 408 std::string auto_translate_to = language_state.AutoTranslateTo(); |
| 409 if (!auto_translate_to.empty()) { | 409 if (!auto_translate_to.empty()) { |
| 410 // This page was navigated through a click from a translated page. | 410 // This page was navigated through a click from a translated page. |
| 411 TranslateBrowserMetrics::ReportInitiationStatus( | 411 TranslateBrowserMetrics::ReportInitiationStatus( |
| 412 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); | 412 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); |
| 413 TranslatePage(web_contents, language_code, auto_translate_to); | 413 TranslatePage(web_contents, language_code, auto_translate_to); |
| 414 return; | 414 return; |
| 415 } | 415 } |
| 416 | 416 |
| 417 TranslateBrowserMetrics::ReportInitiationStatus( | 417 TranslateBrowserMetrics::ReportInitiationStatus( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 438 const std::string& page_lang, | 438 const std::string& page_lang, |
| 439 int attempt) { | 439 int attempt) { |
| 440 // The tab might have been closed. | 440 // The tab might have been closed. |
| 441 WebContents* web_contents = | 441 WebContents* web_contents = |
| 442 tab_util::GetWebContentsByID(process_id, render_id); | 442 tab_util::GetWebContentsByID(process_id, render_id); |
| 443 if (!web_contents) | 443 if (!web_contents) |
| 444 return; | 444 return; |
| 445 | 445 |
| 446 TranslateTabHelper* translate_tab_helper = | 446 TranslateTabHelper* translate_tab_helper = |
| 447 TranslateTabHelper::FromWebContents(web_contents); | 447 TranslateTabHelper::FromWebContents(web_contents); |
| 448 if (translate_tab_helper->language_state().translation_pending()) | 448 if (translate_tab_helper->GetLanguageState().translation_pending()) |
| 449 return; | 449 return; |
| 450 | 450 |
| 451 // During a reload we need web content to be available before the | 451 // During a reload we need web content to be available before the |
| 452 // translate script is executed. Otherwise we will run the translate script on | 452 // translate script is executed. Otherwise we will run the translate script on |
| 453 // an empty DOM which will fail. Therefore we wait a bit to see if the page | 453 // an empty DOM which will fail. Therefore we wait a bit to see if the page |
| 454 // has finished. | 454 // has finished. |
| 455 if ((web_contents->IsLoading()) && attempt < kMaxTranslateLoadCheckAttempts) { | 455 if ((web_contents->IsLoading()) && attempt < kMaxTranslateLoadCheckAttempts) { |
| 456 int backoff = attempt * max_reload_check_attempts_; | 456 int backoff = attempt * max_reload_check_attempts_; |
| 457 base::MessageLoop::current()->PostDelayedTask( | 457 base::MessageLoop::current()->PostDelayedTask( |
| 458 FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted, | 458 FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted, |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | 525 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
| 526 if (!entry) { | 526 if (!entry) { |
| 527 NOTREACHED(); | 527 NOTREACHED(); |
| 528 return; | 528 return; |
| 529 } | 529 } |
| 530 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( | 530 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( |
| 531 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); | 531 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); |
| 532 | 532 |
| 533 TranslateTabHelper* translate_tab_helper = | 533 TranslateTabHelper* translate_tab_helper = |
| 534 TranslateTabHelper::FromWebContents(web_contents); | 534 TranslateTabHelper::FromWebContents(web_contents); |
| 535 translate_tab_helper->language_state().SetCurrentLanguage( | 535 translate_tab_helper->GetLanguageState().SetCurrentLanguage( |
| 536 translate_tab_helper->language_state().original_language()); | 536 translate_tab_helper->GetLanguageState().original_language()); |
| 537 } | 537 } |
| 538 | 538 |
| 539 void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) { | 539 void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) { |
| 540 TranslateBrowserMetrics::ReportLanguageDetectionError(); | 540 TranslateBrowserMetrics::ReportLanguageDetectionError(); |
| 541 // We'll open the URL in a new tab so that the user can tell us more. | 541 // We'll open the URL in a new tab so that the user can tell us more. |
| 542 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); | 542 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); |
| 543 if (!browser) { | 543 if (!browser) { |
| 544 NOTREACHED(); | 544 NOTREACHED(); |
| 545 return; | 545 return; |
| 546 } | 546 } |
| 547 | 547 |
| 548 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); | 548 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); |
| 549 | 549 |
| 550 GURL page_url = web_contents->GetController().GetActiveEntry()->GetURL(); | 550 GURL page_url = web_contents->GetController().GetActiveEntry()->GetURL(); |
| 551 report_error_url = net::AppendQueryParameter( | 551 report_error_url = net::AppendQueryParameter( |
| 552 report_error_url, | 552 report_error_url, |
| 553 kUrlQueryName, | 553 kUrlQueryName, |
| 554 page_url.spec()); | 554 page_url.spec()); |
| 555 | 555 |
| 556 TranslateTabHelper* translate_tab_helper = | 556 TranslateTabHelper* translate_tab_helper = |
| 557 TranslateTabHelper::FromWebContents(web_contents); | 557 TranslateTabHelper::FromWebContents(web_contents); |
| 558 report_error_url = net::AppendQueryParameter( | 558 report_error_url = net::AppendQueryParameter( |
| 559 report_error_url, | 559 report_error_url, |
| 560 kSourceLanguageQueryName, | 560 kSourceLanguageQueryName, |
| 561 translate_tab_helper->language_state().original_language()); | 561 translate_tab_helper->GetLanguageState().original_language()); |
| 562 | 562 |
| 563 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); | 563 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); |
| 564 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); | 564 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); |
| 565 | 565 |
| 566 chrome::AddSelectedTabWithURL(browser, report_error_url, | 566 chrome::AddSelectedTabWithURL(browser, report_error_url, |
| 567 content::PAGE_TRANSITION_AUTO_BOOKMARK); | 567 content::PAGE_TRANSITION_AUTO_BOOKMARK); |
| 568 } | 568 } |
| 569 | 569 |
| 570 void TranslateManager::ClearTranslateScript() { | 570 void TranslateManager::ClearTranslateScript() { |
| 571 if (script_.get() == NULL) { | 571 if (script_.get() == NULL) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 583 if (!entry) { | 583 if (!entry) { |
| 584 NOTREACHED(); | 584 NOTREACHED(); |
| 585 return; | 585 return; |
| 586 } | 586 } |
| 587 | 587 |
| 588 TranslateTabHelper* translate_tab_helper = | 588 TranslateTabHelper* translate_tab_helper = |
| 589 TranslateTabHelper::FromWebContents(web_contents); | 589 TranslateTabHelper::FromWebContents(web_contents); |
| 590 if (!translate_tab_helper) | 590 if (!translate_tab_helper) |
| 591 return; | 591 return; |
| 592 | 592 |
| 593 translate_tab_helper->language_state().set_translation_pending(true); | 593 translate_tab_helper->GetLanguageState().set_translation_pending(true); |
| 594 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( | 594 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( |
| 595 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), | 595 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), |
| 596 translate_script, source_lang, target_lang)); | 596 translate_script, source_lang, target_lang)); |
| 597 } | 597 } |
| 598 | 598 |
| 599 void TranslateManager::PageTranslated(WebContents* web_contents, | 599 void TranslateManager::PageTranslated(WebContents* web_contents, |
| 600 PageTranslatedDetails* details) { | 600 PageTranslatedDetails* details) { |
| 601 if ((details->error_type == TranslateErrors::NONE) && | 601 if ((details->error_type == TranslateErrors::NONE) && |
| 602 details->source_language != translate::kUnknownLanguageCode && | 602 details->source_language != translate::kUnknownLanguageCode && |
| 603 !IsSupportedLanguage(details->source_language)) { | 603 !IsSupportedLanguage(details->source_language)) { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 chrome::FindLastActiveWithHostDesktopType(browser->host_desktop_type())) { | 728 chrome::FindLastActiveWithHostDesktopType(browser->host_desktop_type())) { |
| 729 return; | 729 return; |
| 730 } | 730 } |
| 731 | 731 |
| 732 // During auto-translating, the bubble should not be shown. | 732 // During auto-translating, the bubble should not be shown. |
| 733 if (view_state == TranslateBubbleModel::VIEW_STATE_TRANSLATING || | 733 if (view_state == TranslateBubbleModel::VIEW_STATE_TRANSLATING || |
| 734 view_state == TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE) { | 734 view_state == TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE) { |
| 735 TranslateTabHelper* translate_tab_helper = | 735 TranslateTabHelper* translate_tab_helper = |
| 736 TranslateTabHelper::FromWebContents(web_contents); | 736 TranslateTabHelper::FromWebContents(web_contents); |
| 737 if (!translate_tab_helper || | 737 if (!translate_tab_helper || |
| 738 translate_tab_helper->language_state().InTranslateNavigation()) { | 738 translate_tab_helper->GetLanguageState().InTranslateNavigation()) { |
| 739 return; | 739 return; |
| 740 } | 740 } |
| 741 } | 741 } |
| 742 | 742 |
| 743 TranslateBubbleFactory::Show(browser->window(), web_contents, view_state, | 743 TranslateBubbleFactory::Show(browser->window(), web_contents, view_state, |
| 744 error_type); | 744 error_type); |
| 745 #else | 745 #else |
| 746 NOTREACHED(); | 746 NOTREACHED(); |
| 747 #endif | 747 #endif |
| 748 } | 748 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 // so we are more aggressive about showing the shortcut to never translate. | 810 // so we are more aggressive about showing the shortcut to never translate. |
| 811 #if defined(OS_ANDROID) | 811 #if defined(OS_ANDROID) |
| 812 config.never_translate_min_count = 1; | 812 config.never_translate_min_count = 1; |
| 813 #else | 813 #else |
| 814 config.never_translate_min_count = 3; | 814 config.never_translate_min_count = 3; |
| 815 #endif // defined(OS_ANDROID) | 815 #endif // defined(OS_ANDROID) |
| 816 | 816 |
| 817 config.always_translate_min_count = 3; | 817 config.always_translate_min_count = 3; |
| 818 return config; | 818 return config; |
| 819 } | 819 } |
| OLD | NEW |