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

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

Issue 2839093002: Implemented new Translate API for purely Objective-C clients. (Closed)
Patch Set: added TODO Created 3 years, 8 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
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
new file mode 100644
index 0000000000000000000000000000000000000000..0d76c3aded7c3255195968c450b4c6d139d71709
--- /dev/null
+++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
@@ -0,0 +1,137 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/web_view/public/cwv_translation_controller.h"
+
+#include <string>
+
+#include "base/memory/ptr_util.h"
+#include "base/strings/string16.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_controller_internal.h"
+#import "ios/web_view/internal/translate/cwv_translation_language_internal.h"
+#import "ios/web_view/internal/translate/web_view_translate_client.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+NSErrorDomain const kCWVTranslationErrorDomain = @"com.cwv.translation.errors";
+
+@implementation CWVTranslationController {
+ ios_web_view::WebViewTranslateClient* _translateClient;
+ std::unique_ptr<translate::TranslateUIDelegate> _translateUIDelegate;
+}
+
+@synthesize delegate = _delegate;
+@synthesize webState = _webState;
+
+#pragma mark - Internal Methods
+
+- (void)setWebState:(web::WebState*)webState {
+ _webState = webState;
+
+ ios_web_view::WebViewTranslateClient::CreateForWebState(_webState);
+ _translateClient =
+ ios_web_view::WebViewTranslateClient::FromWebState(_webState);
+ _translateClient->set_cwv_translation_controller(self);
+}
+
+- (void)updateTranslateStep:(translate::TranslateStep)step
+ sourceLanguage:(const std::string&)sourceLanguage
+ targetLanguage:(const std::string&)targetLanguage
+ errorType:(translate::TranslateErrors::Type)errorType
+ triggeredFromMenu:(bool)triggeredFromMenu {
+ translate::TranslateManager* manager =
+ _translateClient->GetTranslateManager();
+ _translateUIDelegate = base::MakeUnique<translate::TranslateUIDelegate>(
+ manager->GetWeakPtr(), sourceLanguage, targetLanguage);
+
+ CWVTranslationLanguage* source =
+ [self languageAtIndex:_translateUIDelegate->GetOriginalLanguageIndex()];
+ CWVTranslationLanguage* target =
+ [self languageAtIndex:_translateUIDelegate->GetTargetLanguageIndex()];
+
+ NSError* error;
+ if (errorType != translate::TranslateErrors::NONE) {
+ error = [NSError errorWithDomain:kCWVTranslationErrorDomain
+ code:errorType
+ userInfo:nil];
+ }
+
+ switch (step) {
+ case translate::TRANSLATE_STEP_BEFORE_TRANSLATE: {
+ CWVLanguageDetectionResult* languageDetectionResult =
+ [[CWVLanguageDetectionResult alloc]
+ initWithPageLanguage:source
+ OSLanguage:target
+ supportedLanguages:[self supportedLanguages]];
+ if ([_delegate respondsToSelector:@selector
+ (translationController:didFinishLanguageDetectionWithResult
+ :error:)]) {
+ [_delegate translationController:self
+ didFinishLanguageDetectionWithResult:languageDetectionResult
+ error:error];
+ }
+ break;
+ }
+ case translate::TRANSLATE_STEP_TRANSLATING:
+ if ([_delegate respondsToSelector:@selector
+ (translationController:didStartTranslationFromLanguage
+ :toLanguage:)]) {
+ [_delegate translationController:self
+ didStartTranslationFromLanguage:source
+ toLanguage:target];
+ }
+ break;
+ case translate::TRANSLATE_STEP_AFTER_TRANSLATE:
+ if ([_delegate respondsToSelector:@selector
+ (translationController:didFinishTranslationFromLanguage
+ :toLanguage:error:)]) {
+ [_delegate translationController:self
+ didFinishTranslationFromLanguage:source
+ toLanguage:target
+ error:error];
+ }
+ break;
+ case translate::TRANSLATE_STEP_NEVER_TRANSLATE:
+ break;
+ case translate::TRANSLATE_STEP_TRANSLATE_ERROR:
+ break;
+ }
+}
+
+#pragma mark - Public Methods
+
+- (void)translatePageFromLanguage:(CWVTranslationLanguage*)sourceLanguage
+ toLanguage:(CWVTranslationLanguage*)targetLanguage {
+ _translateUIDelegate->Translate();
+}
+
+- (void)revertTranslation {
+ _translateUIDelegate->RevertTranslation();
+}
+
+#pragma mark - Private Methods
+
+- (NSArray<CWVTranslationLanguage*>*)supportedLanguages {
+ NSMutableArray* supportedLanguages = [NSMutableArray array];
+ for (size_t i = 0; i < _translateUIDelegate->GetNumberOfLanguages(); i++) {
+ CWVTranslationLanguage* language = [self languageAtIndex:i];
+ [supportedLanguages addObject:language];
+ }
+
+ return [supportedLanguages copy];
+}
+
+- (CWVTranslationLanguage*)languageAtIndex:(size_t)index {
+ std::string languageCode = _translateUIDelegate->GetLanguageCodeAt(index);
+ base::string16 localizedName = _translateUIDelegate->GetLanguageNameAt(index);
+ return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
+ localizedName:localizedName];
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698