Tradurre un testo con ML Kit su iOS

Puoi utilizzare ML Kit per tradurre il testo da una lingua all'altra. Kit ML può tradurre tra più di 50 lingue.

Prova

  • Prova l'app di esempio per per vedere un esempio di utilizzo di questa API.

Prima di iniziare

  1. Includi i seguenti pod ML Kit nel podfile:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. Dopo aver installato o aggiornato i pod del progetto, apri il progetto Xcode utilizzando la relativa .xcworkspace. ML Kit è supportato in Xcode versione 12.4 o successiva.

Traduci una stringa di testo

Per tradurre una stringa tra due lingue:

  1. Crea un oggetto Translator, configurandolo con l'origine e la destinazione lingue:

    Swift

        // Create an English-German translator:
        let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german)
        let englishGermanTranslator = Translator.translator(options: options)

    Objective-C

        // Create an English-German translator:
        MLKTranslatorOptions *options =
            [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish
                                                  targetLanguage:MLKTranslateLanguageGerman];
        MLKTranslator *englishGermanTranslator =
            [MLKTranslator translatorwithOptions:options];

    Se non conosci la lingua del testo di input, puoi utilizzare lo strumento Lingua API di identificazione, fornisce un tag lingua. Quindi converti il tag della lingua in un'enumerazione del kit ML. Il codice dipende dal linguaggio utilizzato:

    Evita di conservare sul dispositivo troppi modelli linguistici contemporaneamente.

  2. Assicurati che il modello di traduzione richiesto sia stato scaricato sul dispositivo. Non chiamare translate(_:completion:) finché non hai la certezza che il modello è disponibile.

    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

    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.
    }];

    I modelli linguistici hanno una dimensione di circa 30 MB, quindi cerca di non scaricarli inutilmente e scaricarle solo tramite Wi-Fi, a meno che l'utente non abbia specificato diversamente. Tu ed eliminare i modelli quando non sono più necessari. Consulta Gestire in modo esplicito i modelli di traduzione.

  3. Dopo aver confermato che il modello è stato scaricato, passa una stringa di testo lingua di origine in 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.
          }];

    ML Kit traduce il testo nella lingua di destinazione che hai configurato passa il testo tradotto al gestore del completamento.

I cicli di vita del traduttore sono controllati dall'ARC (conteggio automatico dei riferimenti), che è la convenzione consigliata per lo sviluppo in iOS. Gli sviluppatori possono aspettarsi il traduttore da gestire una volta rimossi tutti i riferimenti forti.

I traduttori possono occupare 30-150 MB se caricati in memoria. Gli sviluppatori dovrebbero tieni a mente il budget della memoria del dispositivo o dell'app quando crei contenuti traduttore ed evitare di conservare sul dispositivo troppi modelli linguistici contemporaneamente.

Gestisci in modo esplicito i modelli di traduzione

Quando utilizzi l'API di traduzione come descritto in precedenza, ML Kit esegue automaticamente scarica modelli di traduzione specifici della lingua sul dispositivo, se necessario. Tu gestire in modo esplicito i modelli di traduzione che vuoi rendere disponibili tramite l'API di gestione del modello di traduzione di ML Kit. Può essere È utile se vuoi scaricare i modelli in anticipo o eliminare quelli non necessari dal dispositivo.

Per scaricare i modelli di traduzione memorizzati sul dispositivo:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

Per eliminare un modello:

Swift

// 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.
}

Objective-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.

Per scaricare un modello:

Swift

// 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
    )
)

Se vuoi ottenere lo stato del download con NotificationCenter, registrati osservatori per mlkitModelDownloadDidSucceed e mlkitModelDownloadDidFail. Assicurati di utilizzare un riferimento inefficace a self nel blocco di osservazione, dato che i download possono richiedere del tempo e i contenuti può essere liberato al termine del download. Ad esempio:

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]
    // ...
}

Objective-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];

Se vuoi ottenere lo stato del download con NSNotificationCenter, registrati osservatori per MLKModelDownloadDidSucceedNotification e MLKModelDownloadDidFailNotification. Assicurati di utilizzare un riferimento inefficace self nel blocco osservatore, poiché i download possono richiedere del tempo e può essere liberato al termine del download.

__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];
 }];