Traduce texto con ML Kit en iOS

Puedes usar ML Kit para traducir texto entre idiomas. Kit de AA 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 a través de su .xcworkspace El Kit de AA es compatible con Xcode 12.4 o versiones posteriores.

Traduce una cadena de texto

Para traducir una cadena entre dos idiomas:

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

    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 opción Idioma Identification API, que te da una etiqueta de idioma. Luego, convierte la etiqueta de idioma en una enumeración de ML Kit. El código depende del lenguaje que utilices:

    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 lenguaje pesan alrededor de 30 MB, así que no los descargues innecesariamente. Solo puedes descargarlos mediante Wi-Fi, a menos que el usuario haya especificado lo contrario. Tú y 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 descargó, pasa una cadena de texto en el idioma de origen en 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 pasa el texto traducido al controlador de finalización.

Los ciclos de vida de los traductores se controlan a través de ARC (recuento automático de referencias). que es la convención recomendada para el desarrollo de iOS. Los desarrolladores pueden esperar la asignación del traductor una vez que se eliminen todas las referencias fuertes.

Los traductores pueden ocupar entre 30 MB y 150 MB cuando se cargan en la memoria. Los desarrolladores deberían ten en cuenta el presupuesto de memoria del dispositivo o la app cuando crees apps instancias del traductor y evita tener demasiados modelos de idioma en el dispositivo de una sola vez.

Administra explícitamente los modelos de traducción

Cuando usas la API de Translation como se describió anteriormente, el Kit de AA descarga modelos de traducción específicos de cada idioma al dispositivo según sea necesario. Tú puede administrar de forma explícita los modelos de traducción que quieres que estén disponibles en la con la API de administración de modelos de traducción del ML Kit. 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 quieres obtener el estado de descarga con NotificationCenter, regístrate observadores de mlkitModelDownloadDidSucceed y mlkitModelDownloadDidFail Asegúrate de usar una referencia débil a self. en el bloque de observador, ya que las descargas pueden tardar un tiempo y la El objeto se puede liberar para cuando 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 quieres obtener el estado de descarga con NSNotificationCenter, regístrate observadores de MLKModelDownloadDidSucceedNotification y MLKModelDownloadDidFailNotification Asegúrate de usar una referencia débil para self en el bloque de observador, ya que las descargas pueden tardar un tiempo, y el el objeto de origen se podrá liberar cuando 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];
 }];