Вы можете использовать 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
- Objective-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]; }];