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

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: merge 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
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..f38e1ee039feaaa02209a22f33ead50864e00da1
--- /dev/null
+++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
@@ -0,0 +1,170 @@
+// 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/internal/translate/cwv_translation_controller_internal.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_language_internal.h"
+#import "ios/web_view/internal/translate/web_view_translate_client.h"
+#import "ios/web_view/public/cwv_translation_controller_delegate.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+NSErrorDomain const CWVTranslationErrorDomain =
+ @"org.chromium.chromewebview.TranslationErrorDomain";
+
+const NSInteger CWVTranslationErrorNetwork =
+ translate::TranslateErrors::NETWORK;
+const NSInteger CWVTranslationErrorInitializationError =
+ translate::TranslateErrors::INITIALIZATION_ERROR;
+const NSInteger CWVTranslationErrorUnknownLanguage =
+ translate::TranslateErrors::UNKNOWN_LANGUAGE;
+const NSInteger CWVTranslationErrorUnsupportedLanguage =
+ translate::TranslateErrors::UNSUPPORTED_LANGUAGE;
+const NSInteger CWVTranslationErrorIdenticalLanguages =
+ translate::TranslateErrors::IDENTICAL_LANGUAGES;
+const NSInteger CWVTranslationErrorTranslationError =
+ translate::TranslateErrors::TRANSLATION_ERROR;
+const NSInteger CWVTranslationErrorTranslationTimeout =
+ translate::TranslateErrors::TRANSLATION_TIMEOUT;
+const NSInteger CWVTranslationErrorUnexpectedScriptError =
+ translate::TranslateErrors::UNEXPECTED_SCRIPT_ERROR;
+const NSInteger CWVTranslationErrorBadOrigin =
+ translate::TranslateErrors::BAD_ORIGIN;
+const NSInteger CWVTranslationErrorScriptLoadError =
+ translate::TranslateErrors::SCRIPT_LOAD_ERROR;
+
+@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;
+
+@end
+
+@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_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->translate_manager();
+ _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:CWVTranslationErrorDomain
+ code:errorType
+ userInfo:nil];
+ }
+
+ switch (step) {
+ case translate::TRANSLATE_STEP_BEFORE_TRANSLATE: {
+ CWVLanguageDetectionResult* languageDetectionResult =
+ [[CWVLanguageDetectionResult alloc]
+ initWithPageLanguage:source
+ suggestedTargetLanguage: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 {
+ // TODO(706289): Use the passed parameters.
+ _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 languageName = _translateUIDelegate->GetLanguageNameAt(index);
+ return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
+ languageName:languageName];
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698