| Index: ios/web_view/internal/translate/cwv_translation_controller.mm
|
| diff --git a/ios/web_view/internal/translate/cwv_translation_controller.mm b/ios/web_view/internal/translate/cwv_translation_controller.mm
|
| index f38e1ee039feaaa02209a22f33ead50864e00da1..b82ee17c20ed8b5f1ee56f756064627bf652fc54 100644
|
| --- a/ios/web_view/internal/translate/cwv_translation_controller.mm
|
| +++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
|
| @@ -8,12 +8,15 @@
|
|
|
| #include "base/memory/ptr_util.h"
|
| #include "base/strings/string16.h"
|
| +#include "base/strings/sys_string_conversions.h"
|
| +#include "components/translate/core/browser/translate_download_manager.h"
|
| #include "components/translate/core/browser/translate_manager.h"
|
| -#include "components/translate/core/browser/translate_ui_delegate.h"
|
| #import "ios/web_view/internal/translate/cwv_language_detection_result_internal.h"
|
| #import "ios/web_view/internal/translate/cwv_translation_language_internal.h"
|
| #import "ios/web_view/internal/translate/web_view_translate_client.h"
|
| #import "ios/web_view/public/cwv_translation_controller_delegate.h"
|
| +#import "ios/web_view/public/cwv_translation_policy.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
|
|
| #if !defined(__has_feature) || !__has_feature(objc_arc)
|
| #error "This file requires ARC support."
|
| @@ -45,21 +48,22 @@ const NSInteger CWVTranslationErrorScriptLoadError =
|
|
|
| @interface CWVTranslationController ()
|
|
|
| -// Convenience method to generate all supported languages from
|
| -// |translateUIDelegate|.
|
| -- (NSArray<CWVTranslationLanguage*>*)supportedLanguages;
|
| +// A map of CWTranslationLanguages keyed by its language code. Lazily loaded.
|
| +@property(nonatomic, readonly)
|
| + NSDictionary<NSString*, CWVTranslationLanguage*>* supportedLanguagesByCode;
|
|
|
| -// Convenience method to get a language at |index| from |translateUIDelegate|.
|
| -- (CWVTranslationLanguage*)languageAtIndex:(size_t)index;
|
| +// Convenience method to get the language with |languageCode|.
|
| +- (CWVTranslationLanguage*)languageWithCode:(const std::string&)languageCode;
|
|
|
| @end
|
|
|
| @implementation CWVTranslationController {
|
| ios_web_view::WebViewTranslateClient* _translateClient;
|
| - std::unique_ptr<translate::TranslateUIDelegate> _translateUIDelegate;
|
| + std::unique_ptr<translate::TranslatePrefs> _translatePrefs;
|
| }
|
|
|
| @synthesize delegate = _delegate;
|
| +@synthesize supportedLanguagesByCode = _supportedLanguagesByCode;
|
| @synthesize webState = _webState;
|
|
|
| #pragma mark - Internal Methods
|
| @@ -71,6 +75,9 @@ const NSInteger CWVTranslationErrorScriptLoadError =
|
| _translateClient =
|
| ios_web_view::WebViewTranslateClient::FromWebState(_webState);
|
| _translateClient->set_translation_controller(self);
|
| + _translatePrefs = _translateClient->translate_manager()
|
| + ->translate_client()
|
| + ->GetTranslatePrefs();
|
| }
|
|
|
| - (void)updateTranslateStep:(translate::TranslateStep)step
|
| @@ -78,14 +85,8 @@ const NSInteger CWVTranslationErrorScriptLoadError =
|
| targetLanguage:(const std::string&)targetLanguage
|
| errorType:(translate::TranslateErrors::Type)errorType
|
| triggeredFromMenu:(bool)triggeredFromMenu {
|
| - translate::TranslateManager* manager = _translateClient->translate_manager();
|
| - _translateUIDelegate = base::MakeUnique<translate::TranslateUIDelegate>(
|
| - manager->GetWeakPtr(), sourceLanguage, targetLanguage);
|
| -
|
| - CWVTranslationLanguage* source =
|
| - [self languageAtIndex:_translateUIDelegate->GetOriginalLanguageIndex()];
|
| - CWVTranslationLanguage* target =
|
| - [self languageAtIndex:_translateUIDelegate->GetTargetLanguageIndex()];
|
| + CWVTranslationLanguage* source = [self languageWithCode:sourceLanguage];
|
| + CWVTranslationLanguage* target = [self languageWithCode:targetLanguage];
|
|
|
| NSError* error;
|
| if (errorType != translate::TranslateErrors::NONE) {
|
| @@ -96,11 +97,17 @@ const NSInteger CWVTranslationErrorScriptLoadError =
|
|
|
| switch (step) {
|
| case translate::TRANSLATE_STEP_BEFORE_TRANSLATE: {
|
| + NSArray* supportedLanguages = [self.supportedLanguagesByCode.allValues
|
| + sortedArrayUsingComparator:^NSComparisonResult(
|
| + CWVTranslationLanguage* languageA,
|
| + CWVTranslationLanguage* languageB) {
|
| + return [languageA.languageName compare:languageB.languageName];
|
| + }];
|
| CWVLanguageDetectionResult* languageDetectionResult =
|
| [[CWVLanguageDetectionResult alloc]
|
| initWithPageLanguage:source
|
| suggestedTargetLanguage:target
|
| - supportedLanguages:[self supportedLanguages]];
|
| + supportedLanguages:supportedLanguages];
|
| if ([_delegate respondsToSelector:@selector
|
| (translationController:didFinishLanguageDetectionWithResult
|
| :error:)]) {
|
| @@ -140,31 +147,120 @@ const NSInteger CWVTranslationErrorScriptLoadError =
|
|
|
| - (void)translatePageFromLanguage:(CWVTranslationLanguage*)sourceLanguage
|
| toLanguage:(CWVTranslationLanguage*)targetLanguage {
|
| - // TODO(706289): Use the passed parameters.
|
| - _translateUIDelegate->Translate();
|
| + std::string sourceLanguageCode =
|
| + base::SysNSStringToUTF8(sourceLanguage.languageCode);
|
| + std::string targetLanguageCode =
|
| + base::SysNSStringToUTF8(targetLanguage.languageCode);
|
| + _translateClient->translate_manager()->TranslatePage(
|
| + sourceLanguageCode, targetLanguageCode, false);
|
| }
|
|
|
| - (void)revertTranslation {
|
| - _translateUIDelegate->RevertTranslation();
|
| + _translateClient->translate_manager()->RevertTranslation();
|
| }
|
|
|
| -#pragma mark - Private Methods
|
| +- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy
|
| + forPageLanguage:(CWVTranslationLanguage*)pageLanguage {
|
| + std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode);
|
| + switch (policy.type) {
|
| + case CWVTranslationPolicyAsk: {
|
| + _translatePrefs->UnblockLanguage(languageCode);
|
| + _translatePrefs->RemoveLanguagePairFromWhitelist(languageCode,
|
| + std::string());
|
| + break;
|
| + }
|
| + case CWVTranslationPolicyNever: {
|
| + _translatePrefs->BlockLanguage(languageCode);
|
| + break;
|
| + }
|
| + case CWVTranslationPolicyAuto: {
|
| + _translatePrefs->UnblockLanguage(languageCode);
|
| + _translatePrefs->WhitelistLanguagePair(
|
| + languageCode, base::SysNSStringToUTF8(policy.language.languageCode));
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +- (CWVTranslationPolicy*)translationPolicyForPageLanguage:
|
| + (CWVTranslationLanguage*)pageLanguage {
|
| + std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode);
|
| + bool isLanguageBlocked = _translatePrefs->IsBlockedLanguage(languageCode);
|
| + if (isLanguageBlocked) {
|
| + return [CWVTranslationPolicy translationPolicyNever];
|
| + }
|
| +
|
| + std::string autoTargetLanguageCode;
|
| + if (!_translatePrefs->ShouldAutoTranslate(languageCode,
|
| + &autoTargetLanguageCode)) {
|
| + return [CWVTranslationPolicy translationPolicyAsk];
|
| + }
|
| +
|
| + CWVTranslationLanguage* targetLanguage =
|
| + [self languageWithCode:autoTargetLanguageCode];
|
| + return [CWVTranslationPolicy
|
| + translationPolicyAutoTranslateToLanguage:targetLanguage];
|
| +}
|
|
|
| -- (NSArray<CWVTranslationLanguage*>*)supportedLanguages {
|
| - NSMutableArray* supportedLanguages = [NSMutableArray array];
|
| - for (size_t i = 0; i < _translateUIDelegate->GetNumberOfLanguages(); i++) {
|
| - CWVTranslationLanguage* language = [self languageAtIndex:i];
|
| - [supportedLanguages addObject:language];
|
| +- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy
|
| + forPageHost:(NSString*)pageHost {
|
| + DCHECK(pageHost.length);
|
| + switch (policy.type) {
|
| + case CWVTranslationPolicyAsk: {
|
| + _translatePrefs->RemoveSiteFromBlacklist(
|
| + base::SysNSStringToUTF8(pageHost));
|
| + break;
|
| + }
|
| + case CWVTranslationPolicyNever: {
|
| + _translatePrefs->BlacklistSite(base::SysNSStringToUTF8(pageHost));
|
| + break;
|
| + }
|
| + case CWVTranslationPolicyAuto: {
|
| + // TODO(crbug.com/706289): Support auto translation policies for websites.
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +- (CWVTranslationPolicy*)translationPolicyForPageHost:(NSString*)pageHost {
|
| + // TODO(crbug.com/706289): Return translationPolicyAuto when implemented.
|
| + bool isSiteBlackListed =
|
| + _translatePrefs->IsSiteBlacklisted(base::SysNSStringToUTF8(pageHost));
|
| + if (isSiteBlackListed) {
|
| + return [CWVTranslationPolicy translationPolicyNever];
|
| }
|
| + return [CWVTranslationPolicy translationPolicyAsk];
|
| +}
|
| +
|
| +#pragma mark - Private Methods
|
|
|
| - return [supportedLanguages copy];
|
| +- (NSDictionary<NSString*, CWVTranslationLanguage*>*)supportedLanguagesByCode {
|
| + if (!_supportedLanguagesByCode) {
|
| + NSMutableDictionary<NSString*, CWVTranslationLanguage*>*
|
| + supportedLanguagesByCode = [NSMutableDictionary dictionary];
|
| + std::vector<std::string> languageCodes;
|
| + translate::TranslateDownloadManager::GetSupportedLanguages(&languageCodes);
|
| + std::string locale = translate::TranslateDownloadManager::GetInstance()
|
| + ->application_locale();
|
| + for (const std::string& languageCode : languageCodes) {
|
| + base::string16 languageName =
|
| + l10n_util::GetDisplayNameForLocale(languageCode, locale, true);
|
| + CWVTranslationLanguage* language =
|
| + [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
|
| + languageName:languageName];
|
| +
|
| + supportedLanguagesByCode[language.languageCode] = language;
|
| + }
|
| +
|
| + _supportedLanguagesByCode = [supportedLanguagesByCode copy];
|
| + }
|
| + return _supportedLanguagesByCode;
|
| }
|
|
|
| -- (CWVTranslationLanguage*)languageAtIndex:(size_t)index {
|
| - std::string languageCode = _translateUIDelegate->GetLanguageCodeAt(index);
|
| - base::string16 languageName = _translateUIDelegate->GetLanguageNameAt(index);
|
| - return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
|
| - languageName:languageName];
|
| +- (CWVTranslationLanguage*)languageWithCode:(const std::string&)languageCode {
|
| + NSString* languageCodeString = base::SysUTF8ToNSString(languageCode);
|
| + return self.supportedLanguagesByCode[languageCodeString];
|
| }
|
|
|
| @end
|
|
|