Traduce texto con ML Kit en Android

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

Probar

Antes de comenzar

  1. En tu archivo build.gradle de nivel de proyecto, asegúrate de incluir el repositorio Maven de Google en las secciones buildscript y allprojects.
  2. Agrega las dependencias para las bibliotecas de Android del Kit de AA al archivo Gradle a nivel de la app de tu módulo, que suele ser app/build.gradle:
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.2'
    }
    

Traduce una cadena de texto

Para traducir una cadena entre dos idiomas, haz lo siguiente:

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

    Kotlin

    // Create an English-German translator:
    val options = TranslatorOptions.Builder()
        .setSourceLanguage(TranslateLanguage.ENGLISH)
        .setTargetLanguage(TranslateLanguage.GERMAN)
        .build()
    val englishGermanTranslator = Translation.getClient(options)

    Java

    // Create an English-German translator:
    TranslatorOptions options =
        new TranslatorOptions.Builder()
            .setSourceLanguage(TranslateLanguage.ENGLISH)
            .setTargetLanguage(TranslateLanguage.GERMAN)
            .build();
    final Translator englishGermanTranslator =
        Translation.getClient(options);

    Si no sabes el idioma del texto de entrada, puedes usar la API de Language Identification que te proporciona una etiqueta de idioma. Luego, convierte la etiqueta en un TranslateLanguage mediante TranslateLanguage.fromLanguageTag().

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

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

    Kotlin

    var conditions = DownloadConditions.Builder()
        .requireWifi()
        .build()
    englishGermanTranslator.downloadModelIfNeeded(conditions)
        .addOnSuccessListener {
            // Model downloaded successfully. Okay to start translating.
            // (Set a flag, unhide the translation UI, etc.)
        }
        .addOnFailureListener { exception ->
            // Model couldn’t be downloaded or other internal error.
            // ...
        }

    Java

    DownloadConditions conditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
    englishGermanTranslator.downloadModelIfNeeded(conditions)
        .addOnSuccessListener(
            new OnSuccessListener() {
              @Override
              public void onSuccess(Void v) {
                // Model downloaded successfully. Okay to start translating.
                // (Set a flag, unhide the translation UI, etc.)
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Model couldn’t be downloaded or other internal error.
                // ...
              }
            });

    Los modelos de idioma pesan alrededor de 30 MB, por lo que no los descargues innecesariamente. Solo hazlo mediante Wi-Fi, a menos que el usuario haya especificado lo contrario. También debes borrar los modelos innecesarios. 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 a translate():

    Kotlin

    englishGermanTranslator.translate(text)
        .addOnSuccessListener { translatedText ->
            // Translation successful.
        }
        .addOnFailureListener { exception ->
             // Error.
             // ...
        }

    Java

    englishGermanTranslator.translate(text)
        .addOnSuccessListener(
            new OnSuccessListener() {
              @Override
              public void onSuccess(@NonNull String translatedText) {
                // Translation successful.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Error.
                // ...
              }
            });

    El texto traducido, en el idioma de destino que configuraste, se pasa al objeto de escucha que detecta el resultado correcto.

  4. Asegúrate de que se llame al método close() cuando ya no se use el objeto Translator.

    Si usas un traductor en un fragmento o AppCompatActivity, una manera fácil de hacerlo es llamar a LifecycleOwner.getLifecycle() en el Fragment o AppCompatActivity y, luego, llamar a Lifecycle.addObserver. Por ejemplo:

    Kotlin

    val options = ...
    val translator = Translation.getClient(options)
    getLifecycle().addObserver(translator)

    Java

    TranslatorOptions options = ...
    Translator translator = Translation.getClient(options);
    getLifecycle().addObserver(translator);
    ... use translator ...

    Ten en cuenta que se supone que el código está dentro de una clase que implementa LifecycleOwner (p.ej., un Fragment o AppCompatActivity).

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 los modelos de traducción específicos de cada idioma al dispositivo, según sea necesario. También puedes administrar explícitamente 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.

Kotlin

val modelManager = RemoteModelManager.getInstance()

// Get translation models stored on the device.
modelManager.getDownloadedModels(TranslateRemoteModel::class.java)
    .addOnSuccessListener { models ->
        // ...
    }
    .addOnFailureListener {
        // Error.
    }

// Delete the German model if it's on the device.
val germanModel = TranslateRemoteModel.Builder(TranslateLanguage.GERMAN).build()
modelManager.deleteDownloadedModel(germanModel)
    .addOnSuccessListener {
        // Model deleted.
    }
    .addOnFailureListener {
        // Error.
    }

// Download the French model.
val frenchModel = TranslateRemoteModel.Builder(TranslateLanguage.FRENCH).build()
val conditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
modelManager.download(frenchModel, conditions)
    .addOnSuccessListener {
        // Model downloaded.
    }
    .addOnFailureListener {
        // Error.
    }

Java

RemoteModelManager modelManager = RemoteModelManager.getInstance();

// Get translation models stored on the device.
modelManager.getDownloadedModels(TranslateRemoteModel.class)
    .addOnSuccessListener(new OnSuccessListener>() {
        @Override
        public void onSuccess(Set models) {
            // ...
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Error.
        }
    });

// Delete the German model if it's on the device.
TranslateRemoteModel germanModel =
        new TranslateRemoteModel.Builder(TranslateLanguage.GERMAN).build();
modelManager.deleteDownloadedModel(germanModel)
    .addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(Void v) {
            // Model deleted.
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Error.
        }
    });

// Download the French model.
TranslateRemoteModel frenchModel =
        new TranslateRemoteModel.Builder(TranslateLanguage.FRENCH).build();
DownloadConditions conditions = new DownloadConditions.Builder()
    .requireWifi()
    .build();
modelManager.download(frenchModel, conditions)
    .addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(Void v) {
            // Model downloaded.
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Error.
        }
    });