Traduce texto con el Kit de AA en iOS

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

Probarlo

Antes de comenzar

  1. Incluye los siguientes pods de 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 Kit de AA es compatible con Xcode 12.4 o versiones posteriores.

Traduce una string de texto

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 idiomas, que proporciona una etiqueta de idioma. Luego, convierte la etiqueta del idioma en una enumeración del Kit de AA. El código depende del idioma que uses:

    Evita tener demasiados modelos de idioma 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, así que no los descargues innecesariamente, y solo hazlo a través de Wi-Fi, a menos que el usuario haya especificado lo contrario. Deberías borrar los modelos cuando ya no sean necesarios. Consulta Administra explícitamente los modelos de traducción.

  3. Después de confirmar que el modelo se haya descargado, 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 traductores están controlados por ARC (recuento de referencia automático), que es la convención recomendada para el desarrollo en iOS. Los programadores pueden suponer que se quita la asignación del traductor una vez que se quitan todas las referencias sólidas.

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 creen instancias simultáneas de traductor y evitar mantener demasiados modelos de idioma en el dispositivo a la vez.

Administra explícitamente los modelos de traducción

Cuando usas la API de traducción como se describió anteriormente, el Kit de AA descarga automáticamente modelos de traducción específicos del idioma al dispositivo, 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 Kit de AA. 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, sigue estos pasos:

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

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