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..de63cbb75dd489b42972fdfaabae17907481a149 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,18 +48,15 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
@interface CWVTranslationController () |
-// Convenience method to generate all supported languages from |
-// |translateUIDelegate|. |
-- (NSArray<CWVTranslationLanguage*>*)supportedLanguages; |
- |
-// 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:(NSString*)languageCode; |
Hiroshi Ichikawa
2017/05/25 06:44:22
Optional: Maybe this method should take const std:
jzw1
2017/05/25 06:55:37
Done.
|
@end |
@implementation CWVTranslationController { |
ios_web_view::WebViewTranslateClient* _translateClient; |
- std::unique_ptr<translate::TranslateUIDelegate> _translateUIDelegate; |
+ std::unique_ptr<translate::TranslatePrefs> _translatePrefs; |
+ NSArray<CWVTranslationLanguage*>* _supportedLanguages; |
} |
@synthesize delegate = _delegate; |
@@ -71,6 +71,33 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
_translateClient = |
ios_web_view::WebViewTranslateClient::FromWebState(_webState); |
_translateClient->set_translation_controller(self); |
+ _translatePrefs = _translateClient->translate_manager() |
+ ->translate_client() |
+ ->GetTranslatePrefs(); |
+ |
+ NSMutableArray<CWVTranslationLanguage*>* supportedLanguages = |
+ [NSMutableArray array]; |
+ std::vector<std::string> language_codes; |
+ translate::TranslateDownloadManager::GetSupportedLanguages(&language_codes); |
+ std::string locale = |
+ translate::TranslateDownloadManager::GetInstance()->application_locale(); |
+ for (std::vector<std::string>::const_iterator iter = language_codes.begin(); |
Hiroshi Ichikawa
2017/05/25 06:44:22
for (const std::string languageCode : language_cod
jzw1
2017/05/25 06:55:37
Done.
Hiroshi Ichikawa
2017/05/25 07:42:30
Oops sorry it's better to add "&":
for (const std
|
+ iter != language_codes.end(); ++iter) { |
+ std::string languageCode = *iter; |
Hiroshi Ichikawa
2017/05/25 06:44:22
Be consistent with the variable name style between
jzw1
2017/05/25 06:55:36
Done.
|
+ base::string16 languageName = |
+ l10n_util::GetDisplayNameForLocale(languageCode, locale, true); |
+ CWVTranslationLanguage* language = |
+ [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode |
+ languageName:languageName]; |
+ [supportedLanguages addObject:language]; |
+ } |
+ |
+ [supportedLanguages sortUsingComparator:^NSComparisonResult( |
+ CWVTranslationLanguage* languageA, |
+ CWVTranslationLanguage* languageB) { |
+ return [languageA.languageName compare:languageB.languageName]; |
+ }]; |
+ _supportedLanguages = [supportedLanguages copy]; |
Hiroshi Ichikawa
2017/05/25 06:44:22
Why do you copy here?
jzw1
2017/05/25 06:55:37
the local var is a NSMutableArray so I usually cop
Hiroshi Ichikawa
2017/05/25 07:42:30
Oh I see, good to know. I didn't know -[NSMutableA
|
} |
- (void)updateTranslateStep:(translate::TranslateStep)step |
@@ -78,14 +105,10 @@ 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()]; |
+ [self languageWithCode:base::SysUTF8ToNSString(sourceLanguage)]; |
CWVTranslationLanguage* target = |
- [self languageAtIndex:_translateUIDelegate->GetTargetLanguageIndex()]; |
+ [self languageWithCode:base::SysUTF8ToNSString(targetLanguage)]; |
NSError* error; |
if (errorType != translate::TranslateErrors::NONE) { |
@@ -100,7 +123,7 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
[[CWVLanguageDetectionResult alloc] |
initWithPageLanguage:source |
suggestedTargetLanguage:target |
- supportedLanguages:[self supportedLanguages]]; |
+ supportedLanguages:_supportedLanguages]; |
if ([_delegate respondsToSelector:@selector |
(translationController:didFinishLanguageDetectionWithResult |
:error:)]) { |
@@ -140,31 +163,103 @@ 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; |
+ } |
+ } |
+} |
-- (NSArray<CWVTranslationLanguage*>*)supportedLanguages { |
- NSMutableArray* supportedLanguages = [NSMutableArray array]; |
- for (size_t i = 0; i < _translateUIDelegate->GetNumberOfLanguages(); i++) { |
- CWVTranslationLanguage* language = [self languageAtIndex:i]; |
- [supportedLanguages addObject:language]; |
+- (CWVTranslationPolicy*)translationPolicyForPageLanguage: |
+ (CWVTranslationLanguage*)pageLanguage { |
+ std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode); |
+ bool isLanguageBlocked = _translatePrefs->IsBlockedLanguage(languageCode); |
+ if (isLanguageBlocked) { |
+ return [CWVTranslationPolicy translationPolicyNever]; |
} |
- return [supportedLanguages copy]; |
+ std::string autoTargetLanguageCode; |
+ if (!_translatePrefs->ShouldAutoTranslate(languageCode, |
+ &autoTargetLanguageCode)) { |
+ autoTargetLanguageCode = std::string(); |
Hiroshi Ichikawa
2017/05/25 06:44:22
How about returning [CWVTranslationPolicy translat
jzw1
2017/05/25 06:55:37
Done.
|
+ } |
+ if (autoTargetLanguageCode.empty()) { |
+ return [CWVTranslationPolicy translationPolicyAsk]; |
+ } |
+ |
+ CWVTranslationLanguage* targetLanguage = |
+ [self languageWithCode:base::SysUTF8ToNSString(autoTargetLanguageCode)]; |
+ return [CWVTranslationPolicy |
+ translationPolicyAutoTranslateToLanguage:targetLanguage]; |
} |
-- (CWVTranslationLanguage*)languageAtIndex:(size_t)index { |
- std::string languageCode = _translateUIDelegate->GetLanguageCodeAt(index); |
- base::string16 languageName = _translateUIDelegate->GetLanguageNameAt(index); |
- return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode |
- languageName:languageName]; |
+- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy |
+ forPageHost:(NSString*)pageHost { |
+ DCHECK(pageHost.length > 0); |
+ 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 { |
+ bool isSiteBlackListed = |
+ _translatePrefs->IsSiteBlacklisted(base::SysNSStringToUTF8(pageHost)); |
+ if (isSiteBlackListed) { |
+ return [CWVTranslationPolicy translationPolicyNever]; |
+ } |
+ return [CWVTranslationPolicy translationPolicyAsk]; |
+} |
+ |
+#pragma mark - Private Methods |
+ |
+- (CWVTranslationLanguage*)languageWithCode:(NSString*)languageCode { |
+ for (CWVTranslationLanguage* language in _supportedLanguages) { |
+ if ([language.languageCode isEqualToString:languageCode]) { |
+ return language; |
+ } |
+ } |
+ return nil; |
} |
@end |