Tradurre un testo con ML Kit su iOS

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

Prova

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 il relativo .xcworkspace. ML Kit è supportato in Xcode versione 12.4 o successiva.

Tradurre una stringa di testo

Per tradurre una stringa tra due lingue:

  1. Crea un oggetto Translator configurandolo con le lingue di origine e di destinazione:

    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 l'API Language Identification, che fornisce un tag lingua. Poi converti il tag della lingua in un'enumerazione ML Kit. Il codice dipende dal linguaggio utilizzato:

    Evita di tenere troppi modelli linguistici contemporaneamente sul dispositivo.

  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 dimensioni di circa 30 MB, quindi non scaricarli inutilmente, ma scaricali solo tramite Wi-Fi, a meno che l'utente non abbia specificato diversamente. Dovresti eliminare i modelli quando non sono più necessari. Consulta Gestire in modo esplicito i modelli di traduzione.

  3. Dopo aver confermato il download del modello, trasmetti una stringa di testo nella lingua di origine a 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 configurata e lo trasmette al gestore del completamento.

I cicli di vita del traduttore sono controllati tramite la tecnologia ARC (Conteggio automatico dei riferimenti), che è la convenzione consigliata per lo sviluppo per iOS. Gli sviluppatori possono aspettarsi che venga localizzato il traduttore dopo la rimozione di tutti i riferimenti efficaci.

I traduttori possono occupare da 30 MB a 150 MB se caricati in memoria. Gli sviluppatori dovrebbero tenere a mente il budget per la memoria del dispositivo/dell'app quando creano istanze del traduttore simultanee ed evitare di tenere troppi modelli linguistici contemporaneamente sul dispositivo.

Gestisci in modo esplicito i modelli di traduzione

Quando utilizzi l'API di traduzione come descritto sopra, ML Kit scarica automaticamente sul dispositivo i modelli di traduzione specifici per la lingua, come richiesto. Puoi anche gestire esplicitamente i modelli di traduzione che vuoi rendere disponibili sul dispositivo utilizzando l'API di gestione dei modelli di traduzione di ML Kit. Questo può essere utile se vuoi scaricare i modelli in anticipo o eliminare quelli non necessari dal dispositivo.

Per memorizzare i modelli di traduzione 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, registra gli osservatori per mlkitModelDownloadDidSucceed e mlkitModelDownloadDidFail. Assicurati di utilizzare un riferimento debole a self nel blocco dell'osservatore, poiché i download possono richiedere del tempo e l'oggetto di origine 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, registra gli osservatori per MLKModelDownloadDidSucceedNotification e MLKModelDownloadDidFailNotification. Assicurati di utilizzare un riferimento debole a self nel blocco osservatore, poiché i download possono richiedere tempo e l'oggetto di origine 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];
 }];