Переведите текст с помощью ML Kit на iOS

Вы можете использовать ML Kit для перевода текста между языками. ML Kit может переводить более чем на 50 языков .

Попробуйте это

Прежде чем вы начнете

  1. Включите в свой подфайл следующие модули ML Kit:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. После установки или обновления модулей вашего проекта откройте проект Xcode, используя его .xcworkspace . ML Kit поддерживается в Xcode версии 12.4 или новее.

Перевести строку текста

Чтобы перевести строку между двумя языками:

  1. Создайте объект 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. Код зависит от того, какой язык вы используете:

    Не храните на устройстве одновременно слишком много языковых моделей.

  2. Убедитесь, что на устройство загружена необходимая модель перевода. Не вызывайте 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, если пользователь не указал иное. Вам следует удалять модели, когда они больше не нужны. См. Явное управление моделями перевода .

  3. После того, как вы подтвердите загрузку модели, передайте строку текста на исходном языке для 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];
 }];