Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

Вы можете использовать ML Kit для перевода текста с одного языка на другой. ML Kit в настоящее время поддерживает перевод между 59 языками .

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

  1. Если вы еще не добавили Firebase в ваше приложение, сделать это, следуя инструкциям , приведенным в руководстве Приступая к работе .
  2. Включите библиотеки ML Kit в вашей Podfile:
    pod 'Firebase/MLNLTranslate', '6.25.0'
    
    После установки или обновления Бобы вашего проекта, не забудьте открыть свой проект Xcode , используя его .xcworkspace .
  3. В своем приложении импортируйте Firebase:

    Быстрый

    import Firebase

    Цель-C

    @import Firebase;

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

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

  1. Создание Translator объекта, настраивая его с языками источника и цели:

    Быстрый

    // Create an English-German translator:
    let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de)
    let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
    

    Цель-C

    // Create an English-German translator:
    FIRTranslatorOptions *options =
        [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN
                                              targetLanguage:FIRTranslateLanguageDE];
    FIRTranslator *englishGermanTranslator =
        [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
    

    Если вы не знаете языка ввода текста, вы можете использовать идентификационный API языка первым. (Но убедитесь, что вы не держите на устройстве слишком много языковых моделей одновременно.)

  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

    FIRModelDownloadConditions *conditions =
        [[FIRModelDownloadConditions 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 переводит текст на настроенный вами целевой язык и передает переведенный текст обработчику завершения.

Явное управление моделями перевода

Когда вы используете API перевода, как описано выше, ML Kit автоматически загружает модели перевода для конкретного языка на устройство по мере необходимости. Вы также можете явно управлять моделями перевода, которые должны быть доступны на устройстве, с помощью API управления моделями перевода ML Kit. Это может быть полезно, если вы хотите заранее загрузить модели или удалить ненужные модели с устройства.

Чтобы сохранить модели перевода на устройстве:

Быстрый

let localModels = ModelManager.modelManager().downloadedTranslateModels

Цель-C

NSSet<FIRTranslateRemoteModel *> *localModels =
    [FIRModelManager modelManager].downloadedTranslateModels;

Чтобы удалить модель:

Быстрый

// Delete the German model if it's on the device.
let deModel = TranslateRemoteModel.translateRemoteModel(language: .de)
ModelManager.modelManager().deleteDownloadedModel(deModel) { error in
    guard error == nil else { return }
    // Model deleted.
}

Цель-C

// Delete the German model if it's on the device.
FIRTranslateRemoteModel *deModel =
    [FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageDE];
[[FIRModelManager modelManager] deleteDownloadedModel:deModel
                                           completion:^(NSError * _Nullable error) {
                                               if (error != nil) {
                                                   return;
                                               }
                                               // Model deleted.
                                           }];

Чтобы скачать модель:

Быстрый

// Download the French model.
let frModel = TranslateRemoteModel.translateRemoteModel(language: .fr)

// Keep a reference to the download progress so you can check that the model
// is available before you use it.
progress = ModelManager.modelManager().download(
    frModel,
    conditions: ModelDownloadConditions(
        allowsCellularAccess: false,
        allowsBackgroundDownloading: true
    )
)

Если вы хотите , чтобы получить статус загрузки с NotificationCenter , регистрировать наблюдателей на firebaseMLModelDownloadDidSucceed и firebaseMLModelDownloadDidFail . Обязательно используйте слабую ссылку на self в блоке наблюдателя, так как загрузка может занять некоторое время, и объект происходящего может быть освобожден от времени загрузку заканчиваются. Например:

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    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 == frModel
        else { return }
    // The model was downloaded and is available on the device
}

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidFail,
    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.
FIRModelDownloadConditions *conditions =
    [[FIRModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                         allowsBackgroundDownloading:YES];
FIRTranslateRemoteModel *frModel =
    [FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageFR];

// Keep a reference to the download progress so you can check that the model
// is available before you use it.
self.downloadProgress = [[FIRModelManager modelManager] downloadModel:frModel
                                                           conditions:conditions];

Если вы хотите , чтобы получить статус загрузки с NSNotificationCenter , регистрировать наблюдателей на FIRModelDownloadDidSucceedNotification и FIRModelDownloadDidFailNotification . Обязательно используйте слабую ссылку на self в блоке наблюдателя, так как загрузка может занять некоторое время, и объект происходящего может быть освобожден от времени загрузку заканчиваются.

__block MyViewController *weakSelf = self;

[NSNotificationCenter.defaultCenter
 addObserverForName:FIRModelDownloadDidSucceedNotification
 object:nil
 queue:nil
 usingBlock:^(NSNotification * _Nonnull note) {
     if (weakSelf == nil | note.userInfo == nil) {
         return;
     }

     FIRTranslateRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
     if ([model isKindOfClass:[FIRTranslateRemoteModel class]]
         && model == frModel) {
         // The model was downloaded and is available on the device
     }
 }];

[NSNotificationCenter.defaultCenter
 addObserverForName:FIRModelDownloadDidFailNotification
 object:nil
 queue:nil
 usingBlock:^(NSNotification * _Nonnull note) {
     if (weakSelf == nil | note.userInfo == nil) {
         return;
     }

     NSError *error = note.userInfo[FIRModelDownloadUserInfoKeyError];
 }];