Text mit ML Kit unter iOS übersetzen

Mit ML Kit können Sie Text zwischen Sprachen übersetzen. ML Kit kann zwischen mehr als 50 Sprachen übersetzen.

Ausprobieren

  • Probieren Sie die Beispiel-App aus, um ein Beispiel für die Verwendung dieser API zu sehen.

Hinweis

  1. Nehmen Sie die folgenden ML Kit-Pods in Ihre Podfile-Datei auf:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie Ihr Xcode-Projekt mit der zugehörigen .xcworkspace. ML Kit wird in Xcode ab Version 12.4 unterstützt.

Textfolge übersetzen

So übersetzen Sie einen String zwischen zwei Sprachen:

  1. Erstellen Sie ein Translator-Objekt und konfigurieren Sie es mit den Quell- und Zielsprachen:

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

    Wenn Sie die Sprache des Eingabetexts nicht kennen, können Sie die Language Identification API verwenden, die ein Sprach-Tag zur Verfügung stellt. Konvertieren Sie dann das Sprach-Tag in eine ML Kit-Enum. Der Code hängt von der verwendeten Sprache ab:

    Vermeiden Sie es, zu viele Sprachmodelle gleichzeitig auf dem Gerät zu speichern.

  2. Prüfen Sie, ob das erforderliche Übersetzungsmodell auf das Gerät heruntergeladen wurde. Rufen Sie translate(_:completion:) erst dann auf, wenn Sie wissen, dass das Modell verfügbar ist.

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

    Sprachmodelle sind etwa 30 MB groß. Laden Sie sie also nicht unnötig herunter, sondern laden Sie sie nur über WLAN herunter, sofern der Nutzer nichts anderes angegeben hat. Sie sollten Modelle löschen, wenn sie nicht mehr benötigt werden. Weitere Informationen finden Sie unter Übersetzungsmodelle explizit verwalten.

  3. Nachdem Sie bestätigt haben, dass das Modell heruntergeladen wurde, übergeben Sie einen Textstring in der Ausgangssprache an 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 übersetzt den Text in die von Ihnen konfigurierte Zielsprache und übergibt den übersetzten Text an den Abschluss-Handler.

Die Lebenszyklen von Übersetzern werden durch ARC (automatische Referenzzählung) gesteuert. Dies ist die empfohlene Konvention für die iOS-Entwicklung. Entwickler können davon ausgehen, dass die Zuordnung des Übersetzers aufgehoben wird, sobald alle aussagekräftigen Referenzen entfernt wurden.

Übersetzer können 30 MB bis 150 MB belegen, wenn sie in den Speicher geladen werden. Entwickler sollten beim Erstellen gleichzeitiger Übersetzungsinstanzen das Arbeitsspeicherbudget des Geräts bzw. der App im Hinterkopf behalten und vermeiden, zu viele Sprachmodelle gleichzeitig auf dem Gerät zu speichern.

Übersetzungsmodelle explizit verwalten

Wenn Sie die Translation API wie oben beschrieben verwenden, lädt ML Kit automatisch sprachspezifische Übersetzungsmodelle nach Bedarf auf das Gerät herunter. Sie können die Übersetzungsmodelle, die auf dem Gerät verfügbar sein sollen, auch explizit verwalten, indem Sie die Translation Model Management API von ML Kit verwenden. Das kann nützlich sein, wenn du Modelle vorab herunterladen oder nicht benötigte Modelle vom Gerät löschen möchtest.

So rufen Sie die auf dem Gerät gespeicherten Übersetzungsmodelle ab:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

So löschen Sie ein Modell:

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.

So laden Sie ein Modell herunter:

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

Wenn Sie den Downloadstatus mit NotificationCenter abrufen möchten, registrieren Sie Beobachter für mlkitModelDownloadDidSucceed und mlkitModelDownloadDidFail. Verwenden Sie im Beobachterblock unbedingt einen schwachen Verweis auf self, da Downloads einige Zeit dauern können und das ursprüngliche Objekt bis zum Abschluss des Downloads freigegeben werden kann. Beispiel:

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

Wenn Sie den Downloadstatus mit NSNotificationCenter abrufen möchten, registrieren Sie Beobachter für MLKModelDownloadDidSucceedNotification und MLKModelDownloadDidFailNotification. Im Beobachterblock muss ein schwacher Verweis auf self verwendet werden, da Downloads einige Zeit dauern können und das ursprüngliche Objekt nach Abschluss des Downloads freigegeben werden kann.

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