Traduire du texte avec ML Kit sur Android

Vous pouvez utiliser ML Kit pour traduire du texte entre différentes langues. ML Kit peut traduire entre plus de 50 langues.

Essayer

Avant de commencer

  1. Dans le fichier build.gradle de niveau projet, veillez à inclure le dépôt Maven de Google à la fois dans les sections buildscript et allprojects.
  2. Ajoutez les dépendances des bibliothèques Android ML Kit au fichier Gradle au niveau de l'application de votre module, qui est généralement app/build.gradle:
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.3'
    }

Traduire une chaîne de texte

Pour traduire une chaîne entre deux langues:

  1. Créez un objet Translator, en le configurant avec les langues source et cible:

    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 vous ne connaissez pas la langue du texte saisi, vous pouvez utiliser l'API Language Identification, qui vous fournit une balise de langue. Convertissez ensuite le tag en TranslateLanguage à l'aide de TranslateLanguage.fromLanguageTag().

    Évitez de conserver trop de modèles de langage sur l'appareil en même temps.

  2. Assurez-vous que le modèle de traduction requis a été téléchargé sur l'appareil. N'appelez pas translate() tant que vous n'êtes pas sûr que le modèle 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.
                // ...
              }
            });

    Les modèles de langage font environ 30 Mo. Ne les téléchargez donc pas inutilement et ne les téléchargez que via le Wi-Fi, sauf si l'utilisateur a spécifié le contraire. Vous devez également supprimer les modèles inutiles. Consultez Gérer explicitement les modèles de traduction.

  3. Une fois que vous avez vérifié que le modèle a été téléchargé, transmettez une chaîne de texte dans la langue source à 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.
                // ...
              }
            });

    Le texte traduit, dans la langue cible que vous avez configurée, est transmis à l'écouteur de succès.

  4. Assurez-vous que la méthode close() est appelée lorsque l'objet Translator n'est plus utilisé.

    Si vous utilisez un traducteur dans un fragment ou une AppCompatActivity, une méthode simple consiste à appeler LifecycleOwner.getLifecycle() sur le fragment ou l'AppCompatActivity, puis à appeler Lifecycle.addObserver. Exemple :

    Kotlin

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

    Java

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

    Notez que cela suppose que le code se trouve dans une classe qui implémente LifecycleOwner (par exemple, un fragment ou une AppCompatActivity).

Gérer explicitement les modèles de traduction

Lorsque vous utilisez l'API de traduction comme décrit ci-dessus, ML Kit télécharge automatiquement des modèles de traduction spécifiques à la langue sur l'appareil, si nécessaire. Vous pouvez également gérer explicitement les modèles de traduction que vous souhaitez mettre à disposition sur l'appareil à l'aide de l'API de gestion des modèles de traduction de ML Kit. Cela peut être utile si vous souhaitez télécharger des modèles à l'avance ou supprimer des modèles inutiles de l'appareil.

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<Set>() {
        @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.
        }
    });