Вы можете использовать ML Kit для перевода текста между языками. ML Kit может выполнять перевод между более чем 50 языками .
Попробуйте
- Поэкспериментируйте с образцом приложения, чтобы увидеть пример использования этого API.
Прежде чем вы начнете
- Включите в свой подфайл следующие модули ML Kit:
pod 'GoogleMLKit/Translate', '3.2.0'
. - После установки или обновления модулей вашего проекта откройте проект Xcode, используя его
.xcworkspace
. ML Kit поддерживается в Xcode версии 12.4 или выше.
Перевести строку текста
Чтобы перевести строку между двумя языками:
Создайте объект
Translator
, настроив его на исходный и целевой языки:Быстрый
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german) let englishGermanTranslator = Translator.translator(options: options)
Цель-C
// Create an English-German translator: MLKTranslatorOptions *options = [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish targetLanguage:MLKTranslateLanguageGerman]; MLKTranslator *englishGermanTranslator = [MLKTranslator translatorwithOptions:options];
Если вы не знаете язык вводимого текста, вы можете использовать API идентификации языка, который дает вам тег языка. Затем преобразуйте языковой тег в перечисление ML Kit. Код зависит от того, какой язык вы используете:
- Swift: вызовите
TranslateLanguage.fromLanguageTag()
, чтобы получитьTranslateLanguage
- Задача-C:
MLKTranslateLanguageForLanguageTag()
, чтобы получитьMLKTranslateLanguage
Старайтесь не хранить слишком много языковых моделей на устройстве одновременно.
- Swift: вызовите
Убедитесь, что необходимая модель перевода загружена на устройство. Не вызывайте
translate(_:completion:)
, пока не узнаете, что модель доступна.Быстрый
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. }
Цель-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:)
:Быстрый
englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }
Цель-C
[englishGermanTranslator translateText:text completion:^(NSString *_Nullable translatedText, NSError *_Nullable error) { if (error != nil || translatedText == nil) { return; } // Translation succeeded. }];
ML Kit переводит текст на настроенный вами целевой язык и передает переведенный текст обработчику завершения.
Жизненные циклы транслятора контролируются ARC (автоматический подсчет ссылок), что является рекомендуемым соглашением для разработки iOS. Разработчики могут ожидать, что транслятор будет освобожден после удаления всех надежных ссылок.
Трансляторы могут занимать 30МБ-150МБ при загрузке в память. Разработчики должны помнить о бюджете памяти устройства/приложения при создании параллельных экземпляров транслятора и избегать одновременного хранения слишком большого количества языковых моделей на устройстве.
Явное управление моделями перевода
Когда вы используете API перевода, как описано выше, ML Kit автоматически загружает модели перевода для конкретного языка на устройство по мере необходимости. Вы также можете явно управлять моделями перевода, которые должны быть доступны на устройстве, с помощью API управления моделями перевода ML Kit. Это может быть полезно, если вы хотите заранее загрузить модели или удалить ненужные модели с устройства.
Чтобы получить модели перевода, хранящиеся на устройстве:
Быстрый
let localModels = ModelManager.modelManager().downloadedTranslateModels
Цель-C
NSSet*localModels = [MLKModelManager modelManager].downloadedTranslateModels;
Чтобы удалить модель:
Быстрый
// 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. }
Цель-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.
Чтобы скачать модель:
Быстрый
// 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] // ... }
Цель-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]; }];