С помощью ML Kit можно переводить текст с одного языка на другой. ML Kit может переводить текст более чем на 50 языков.
Попробовать
- Попробуйте поработать с примером приложения, чтобы понять, как использовать этот API.
Подготовка
- Добавьте в Podfile следующие поды ML Kit:
pod 'GoogleMLKit/Translate', '8.0.0'
- После установки или обновления Pods откройте проект Xcode, используя файл
.xcworkspace. ML Kit поддерживается в Xcode версии 12.4 и более поздних.
Как перевести строку текста
Чтобы перевести строку с одного языка на другой:
Создайте объект
Translator, указав исходный и целевой языки:Swift
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german) let englishGermanTranslator = Translator.translator(options: options)
Objective-C
// Create an English-German translator: MLKTranslatorOptions *options = [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish targetLanguage:MLKTranslateLanguageGerman]; MLKTranslator *englishGermanTranslator = [MLKTranslator translatorwithOptions:options];
Если вы не знаете язык входного текста, используйте Language Identification API, который возвращает тег языка. Затем преобразуйте тег языка в перечисление ML Kit. Код зависит от используемого языка:
- Swift: вызовите
TranslateLanguage.fromLanguageTag(), чтобы получитьTranslateLanguage. - Objective-C: вызовите
MLKTranslateLanguageForLanguageTag(), чтобы получитьMLKTranslateLanguage.
Не храните на устройстве слишком много языковых моделей одновременно.
- Swift: вызовите
Убедитесь, что на устройство скачана нужная модель перевода. Не вызывайте функцию
translate(_:completion:), пока не убедитесь, что модель доступна.Swift
let conditions = ModelDownloadConditions( allowsCellularAccess: false, allowsBackgroundDownloading: true ) englishGermanTranslator.downloadModelIfNeeded(with: conditions) { error in guard error == nil else { return } // Model downloaded successfully. Okay to start translating. }
Objective-C
MLKModelDownloadConditions *conditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO allowsBackgroundDownloading:YES]; [englishGermanTranslator downloadModelIfNeededWithConditions:conditions completion:^(NSError *_Nullable error) { if (error != nil) { return; } // Model downloaded successfully. Okay to start translating. }];
Языковые модели занимают около 30 МБ, поэтому не скачивайте их без необходимости и используйте для этого Wi-Fi, если пользователь не указал иное. Если модель больше не нужна, ее следует удалить. Подробнее о том, как управлять моделями перевода…
После того как вы убедитесь, что модель скачана, передайте строку текста на исходном языке в
translate(_:completion:):Swift
englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }
Objective-C
[englishGermanTranslator translateText:text completion:^(NSString *_Nullable translatedText, NSError *_Nullable error) { if (error != nil || translatedText == nil) { return; } // Translation succeeded. }];
ML Kit переводит текст на язык перевода и передает переведенный текст обработчику завершения.
Жизненные циклы переводчиков контролируются ARC (автоматическим подсчетом ссылок), который рекомендуется использовать при разработке для iOS. Разработчики могут рассчитывать на то, что объект Translator будет удален из памяти, как только будут удалены все сильные ссылки на него.
При загрузке в память переводчики могут занимать от 30 до 150 МБ. Разработчикам следует учитывать объем памяти устройства/приложения при создании параллельных экземпляров переводчика и избегать одновременного хранения слишком большого количества языковых моделей на устройстве.
Явное управление моделями перевода
Когда вы используете API перевода, как описано выше, ML Kit автоматически скачивает на устройство нужные языковые модели. Вы также можете явно управлять моделями перевода, доступными на устройстве, с помощью API управления моделями перевода ML Kit. Это может быть полезно, если вы хотите скачать модели заранее или удалить ненужные модели с устройства.
Чтобы получить модели перевода, хранящиеся на устройстве:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-C
NSSet*localModels = [MLKModelManager modelManager].downloadedTranslateModels;
Чтобы удалить модель, сделайте следующее:
Swift
// Delete the German model if it's on the device. let germanModel = TranslateRemoteModel.translateRemoteModel(language: .german) ModelManager.modelManager().deleteDownloadedModel(germanModel) { error in guard error == nil else { return } // Model deleted. }
Objective-C
// Delete the German model if it's on the device. MLKTranslateRemoteModel *germanModel = [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageGerman]; [[MLKModelManager modelManager] deleteDownloadedModel:germanModel completion:^(NSError * _Nullable error) { if (error != nil) { return; } // Model deleted.
Чтобы скачать модель, сделайте следующее:
Swift
// Download the French model. let frenchModel = TranslateRemoteModel.translateRemoteModel(language: .french) // Keep a reference to the download progress so you can check that the model // is available before you use it. progress = ModelManager.modelManager().download( frenchModel, conditions: ModelDownloadConditions( allowsCellularAccess: false, allowsBackgroundDownloading: true ) )
Если вы хотите получать статус скачивания с помощью NotificationCenter, зарегистрируйте наблюдателей для mlkitModelDownloadDidSucceed и mlkitModelDownloadDidFail. Обязательно используйте слабую ссылку на self в блоке наблюдателя, поскольку скачивание может занять некоторое время, а исходный объект может быть освобожден к моменту завершения скачивания. Пример:
NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidSucceed, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? TranslateRemoteModel, model == frenchModel else { return } // The model was downloaded and is available on the device } NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidFail, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? TranslateRemoteModel else { return } let error = userInfo[ModelDownloadUserInfoKey.error.rawValue] // ... }
Objective-C
// Download the French model. MLKModelDownloadConditions *conditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO allowsBackgroundDownloading:YES]; MLKTranslateRemoteModel *frenchModel = [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageFrench]; // Keep a reference to the download progress so you can check that the model // is available before you use it. self.downloadProgress = [[MLKModelManager modelManager] downloadModel:frenchModel conditions:conditions];
Чтобы получать статус скачивания с помощью NSNotificationCenter, зарегистрируйте наблюдателей для MLKModelDownloadDidSucceedNotification и MLKModelDownloadDidFailNotification. Обязательно используйте слабую ссылку на self в блоке наблюдателя, поскольку скачивание может занять некоторое время, и исходный объект может быть освобожден к моменту завершения скачивания.
__block MyViewController *weakSelf = self; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidSucceedNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } MLKTranslateRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel]; if ([model isKindOfClass:[MLKTranslateRemoteModel class]] && model == frenchModel) { // The model was downloaded and is available on the device } }]; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidFailNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError]; }];