Tradurre un testo con ML Kit su Android

Puoi utilizzare ML Kit per tradurre il testo tra le lingue. ML Kit può tradurre tra più di 50 lingue.

Prova

Prima di iniziare

  1. Nel file build.gradle a livello di progetto, assicurati di includere il repository Maven di Google nelle sezioni buildscript e allprojects.
  2. Aggiungi le dipendenze per le librerie Android ML Kit al file Gradle a livello di app del modulo, che in genere è app/build.gradle:
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.3'
    }

Tradurre una stringa di testo

Per tradurre una stringa tra due lingue:

  1. Crea un Translator oggetto, configurandolo con le lingue di origine e di destinazione:

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

    Se non conosci la lingua del testo di input, puoi utilizzare l'API Language Identification che ti fornisce un tag di lingua. Poi converti il tag in un TranslateLanguage utilizzando TranslateLanguage.fromLanguageTag().

    Evita di conservare troppi modelli linguistici sul dispositivo contemporaneamente.

  2. Assicurati che il modello di traduzione richiesto sia stato scaricato sul dispositivo. Non chiamare translate() finché non sai che il modello è disponibile.

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

    I modelli linguistici hanno una dimensione di circa 30 MB, quindi non scaricarli inutilmente e scaricali solo tramite Wi-Fi, a meno che l'utente non abbia specificato diversamente. Dovresti anche eliminare i modelli non necessari. Consulta Gestire esplicitamente i modelli di traduzione.

  3. Dopo aver verificato che il modello è stato scaricato, passa una stringa di testo in lingua di origine 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.
                // ...
              }
            });

    Il testo tradotto, nella lingua di destinazione configurata, viene passato al listener di successo.

  4. Assicurati che il close() metodo venga chiamato quando l' Translator oggetto non verrà più utilizzato.

    Se utilizzi un traduttore in un frammento o in un'attività AppCompatActivity, un modo semplice per farlo è chiamare LifecycleOwner.getLifecycle() sul frammento o sull'attività AppCompatActivity, quindi chiamare Lifecycle.addObserver. Ad esempio:

    Kotlin

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

    Java

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

    Tieni presente che questo presuppone che il codice si trovi all'interno di una classe che implementa LifecycleOwner (ad es. un frammento o un'attività AppCompatActivity).

Gestire esplicitamente i modelli di traduzione

Quando utilizzi l'API Translation come descritto sopra, ML Kit scarica automaticamente i modelli di traduzione specifici della lingua sul dispositivo, se necessario. Puoi anche gestire esplicitamente i modelli di traduzione che vuoi siano disponibili sul dispositivo utilizzando l'API di gestione dei modelli di traduzione di ML Kit. Questa operazione può essere utile se vuoi scaricare i modelli in anticipo o eliminare i modelli non necessari dal 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<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.
        }
    });