Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Unified Diff: ios/web_view/internal/translate/cwv_translation_controller.mm

Issue 2872083003: Added translation policy API. (Closed)
Patch Set: sync Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ios/web_view/BUILD.gn ('k') | ios/web_view/internal/translate/cwv_translation_language.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ios/web_view/BUILD.gn ('k') | ios/web_view/internal/translate/cwv_translation_language.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698