Переводите текст с помощью 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];
 }];