Traduce texto con ML Kit en Android

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. En tu archivo build.gradle de nivel de proyecto, asegúrate de incluir lo siguiente: Puedes acceder al repositorio Maven de Google en tu buildscript y allprojects.
  2. Agrega las dependencias para las bibliotecas de Android del ML Kit al archivo archivo de Gradle a nivel de la app, que suele ser app/build.gradle:
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.3'
    }
    

Traduce una cadena de texto

Para traducir una cadena entre dos idiomas:

  1. Crea un Translator y configúralo con los idiomas fuente y objetivo:

    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 opción Idioma Identification API, que te da una etiqueta de idioma. Luego, convierte la etiqueta en TranslateLanguage. con TranslateLanguage.fromLanguageTag().

    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() 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 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ú también debería 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 para 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 receptor de éxito.

  4. Asegúrate de que el elemento close() se llama a este método cuando Translator ya no se usará ese objeto.

    Si usas un traductor en un fragmento o AppCompatActivity, es muy fácil es llamar a LifecycleOwner.getLifecycle(). en Fragment o AppCompatActivity y, luego, llama 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 esto 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 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.

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