É possível usar o kit de aprendizado de máquina para traduzir texto entre idiomas. Atualmente, o Kit de ML oferece suporte para a tradução entre 59 idiomas.
Antes de começar
- Se você ainda não adicionou o Firebase ao seu app, siga as etapas no guia de iniciação.
- Inclua as bibliotecas do kit de ML no seu Podfile:
  pod 'Firebase/MLNLTranslate', '6.25.0' .xcworkspace.
- Importe o Firebase para seu app:
  Swiftimport Firebase Objective-C@import Firebase; 
Traduzir uma string de texto
Para traduzir uma string entre dois idiomas, siga estas etapas:
- Crie um objeto - Translator, configurando-o com os idiomas de origem e de destino:- Swift- // Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de) let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)- Objective-C- // Create an English-German translator: FIRTranslatorOptions *options = [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN targetLanguage:FIRTranslateLanguageDE]; FIRTranslator *englishGermanTranslator = [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];- Se você não souber o idioma do texto de entrada, use a API de identificação de idioma primeiro. Porém, certifique-se de não manter muitos modelos de idioma no dispositivo ao mesmo tempo. 
- Verifique se o modelo de tradução necessário foi salvo no dispositivo. Não chame - translate(_:completion:)até verificar se o modelo está disponível.- Swift- 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. }- Objective-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. }];- Os modelos de idiomas têm cerca de 30 MB, portanto, faça o download deles apenas quando necessário e usando Wi-Fi, a menos que o usuário tenha especificado o contrário. Além disso, exclua modelos desnecessários. Consulte Gerenciar explicitamente modelos de tradução. 
- Depois de confirmar o download do modelo, transmita uma string de texto no idioma de origem para - translate(_:completion:):- Swift- englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }- Objective-C- [englishGermanTranslator translateText:text completion:^(NSString *_Nullable translatedText, NSError *_Nullable error) { if (error != nil || translatedText == nil) { return; } // Translation succeeded. }];- O Kit de ML traduz o texto para o idioma de destino configurado e transmite o texto traduzido para o gerenciador de conclusão. 
Gerenciar explicitamente modelos de tradução
Quando a API de tradução é usada conforme descrito acima, o Kit de ML faz o download automático de modelos de tradução específicos do idioma para o dispositivo, conforme necessário. Também é possível gerenciar explicitamente os modelos de tradução que você quer disponibilizar no dispositivo usando a API de gerenciamento de modelos de tradução do Kit de ML. Isso pode ser útil se você quiser fazer o download de modelos antecipadamente ou excluir modelos desnecessários do dispositivo.
Para receber os modelos de tradução armazenados no dispositivo:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-C
NSSet<FIRTranslateRemoteModel *> *localModels =
    [FIRModelManager modelManager].downloadedTranslateModels;
Para excluir um modelo:
Swift
// 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.
}
Objective-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.
                                           }];
Para fazer o download de um modelo:
Swift
// 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
    )
)
Se você quiser saber o status do download com NotificationCenter, registre observadores para firebaseMLModelDownloadDidSucceed e firebaseMLModelDownloadDidFail. Certifique-se de usar uma referência fraca para self no bloco de observadores, já que os downloads podem levar algum tempo, e o objeto de origem pode ser liberado quando o download for concluído. Exemplo:
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]
    // ...
}
Objective-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];
Se você quiser saber o status do download com NSNotificationCenter, registre observadores para FIRModelDownloadDidSucceedNotification e FIRModelDownloadDidFailNotification. Certifique-se de usar uma referência fraca para self no bloco de observadores, já que os downloads podem demorar algum tempo e o objeto de origem poderá ser liberado quando o download for concluído.
__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];
 }];