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

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 some error handling. 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..5430823e9ea6d921d904083119ce7e5edf963cd0
--- /dev/null
+++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
@@ -0,0 +1,115 @@
+// 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_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"
+#import "ios/web_view/public/cwv_language_detection_result.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation CWVTranslationController {
+ ios_web_view::WebViewTranslateClient* _translateClient;
+ std::unique_ptr<translate::TranslateUIDelegate> _translateUIDelegate;
+}
+
+@synthesize delegate = _delegate;
+
+- (instancetype)initWithWebViewTranslateClient:
+ (ios_web_view::WebViewTranslateClient*)translateClient {
+ self = [super init];
+ if (self) {
+ _translateClient = translateClient;
+ _translateClient->set_cwv_translation_controller(self);
+ }
+ return 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()];
+ NSMutableArray* supportedLanguages = [NSMutableArray array];
+ for (size_t i = 0; i < _translateUIDelegate->GetNumberOfLanguages(); i++) {
+ CWVTranslationLanguage* language = [self languageAtIndex:i];
+ [supportedLanguages addObject:language];
+ }
+ CWVLanguageDetectionResult* languageDetectionResult =
+ [[CWVLanguageDetectionResult alloc]
+ initWithSourceLanguage:source
+ targetLanguage:target
+ supportedLanguages:[supportedLanguages copy]];
+
+ NSError* error;
+ if (errorType != translate::TranslateErrors::NONE) {
+ error = [NSError errorWithDomain:@"com.cwvwebview.translate.errors"
+ code:errorType
+ userInfo:nil];
+ }
+
+ switch (step) {
+ case translate::TRANSLATE_STEP_BEFORE_TRANSLATE:
+ [_delegate translationController:self
+ didFinishLanguageDetectionWithResult:languageDetectionResult
+ error:error];
+ break;
+ case translate::TRANSLATE_STEP_TRANSLATING:
+ [_delegate translationController:self
+ didStartTranslationFromLanguage:source
+ toLanguage:target];
+ break;
+ case translate::TRANSLATE_STEP_AFTER_TRANSLATE:
+ [_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
+
+- (CWVTranslationLanguage*)languageAtIndex:(size_t)index {
+ std::string languageCode = _translateUIDelegate->GetLanguageCodeAt(index);
+ base::string16 languageName = _translateUIDelegate->GetLanguageNameAt(index);
+ return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
+ languageName:languageName];
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698