Traduce texto con ML Kit en iOS

Puedes usar ML Kit para traducir texto entre idiomas. El ML Kit puede traducir entre más de 50 idiomas.

Probar

Antes de comenzar

  1. Incluye los siguientes pods del ML Kit en tu Podfile:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. Después de instalar o actualizar los Pods de tu proyecto, abre el proyecto de Xcode con su .xcworkspace. El ML Kit es compatible con Xcode 12.4 o versiones posteriores.

Traduce una string de texto

Sigue estos pasos para traducir una string entre dos idiomas:

  1. Crea un objeto Translator y configúralo con los idiomas de origen y de destino:

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

    Si no sabes el idioma del texto de entrada, puedes usar la API de Identificación de idioma, que te proporciona una etiqueta de idioma. Luego, convierte la etiqueta de idioma en una enumeración del ML Kit. El código depende del lenguaje que uses:

    Evita mantener demasiados modelos de lenguaje en el dispositivo a la vez.

  2. Asegúrate de que el modelo de traducción requerido se haya descargado en el dispositivo. No llames a translate(_:completion:) hasta que sepas que el modelo está disponible.

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

    Los modelos de idioma tienen un tamaño aproximado de 30 MB, por lo que no debes descargarlos innecesariamente y solo puedes hacerlo mediante Wi-Fi, a menos que el usuario haya especificado lo contrario. Deberías borrar los modelos cuando ya no los necesites. Consulta Administra explícitamente los modelos de traducción.

  3. Después de confirmar que el modelo se descargó, pasa una string de texto en el idioma de origen 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.
          }];

    El Kit de AA traduce el texto al idioma de destino que configuraste y pasa el texto traducido al controlador de finalización.

Los ciclos de vida de los traductores se controlan mediante ARC (recuento automático de referencias), que es la convención recomendada para el desarrollo de iOS. Los desarrolladores pueden esperar que se desasigne el Traductor una vez que se hayan quitado todas las referencias importantes.

Los traductores pueden ocupar entre 30 MB y 150 MB cuando se cargan en la memoria. Los desarrolladores deben tener en cuenta el presupuesto de memoria del dispositivo o la app cuando crean instancias simultáneas del traductor y evitar tener demasiados modelos de idiomas en el dispositivo a la vez.

Administra explícitamente los modelos de traducción

Cuando usas la API de Translation como se describió anteriormente, el Kit de AA descarga automáticamente al dispositivo los modelos de traducción específicos de un idioma, según sea necesario. También puedes administrar de forma explícita los modelos de traducción que deseas que estén disponibles en el dispositivo con la API de administración de modelos de traducción del ML Kit. Esto puede ser útil si deseas descargar modelos con anticipación o borrar modelos innecesarios del dispositivo.

Para obtener los modelos de traducción almacenados en el dispositivo, haz lo siguiente:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective‑C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

Para borrar un modelo, haz lo siguiente:

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.

Para descargar un modelo, haz lo siguiente:

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

Si deseas obtener el estado de descarga con NotificationCenter, registra observadores para mlkitModelDownloadDidSucceed y mlkitModelDownloadDidFail. Asegúrate de utilizar una referencia débil para self en el bloque de observador, ya que las descargas pueden demorar un tiempo y el objeto de origen se puede liberar antes de que finalice la descarga. Por ejemplo:

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

Si deseas obtener el estado de descarga con NSNotificationCenter, registra observadores para MLKModelDownloadDidSucceedNotification y MLKModelDownloadDidFailNotification. Asegúrate de utilizar una referencia débil a self en el bloque de observador, ya que las descargas pueden demorar un tiempo y el objeto de origen se puede liberar antes de que finalice la descarga.

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