תרגום טקסט באמצעות ML Kit ב-Android

אפשר להשתמש בערכת ה-ML Kit כדי לתרגם טקסט בין שפות שונות. אפשר לתרגם ML Kit ביותר מ-50 שפות.

לפני שמתחילים

  1. בקובץ build.gradle ברמת הפרויקט, חשוב להקפיד לכלול את מאגר הנתונים של Google' גם בקטע buildscript וגם בallprojects.
  2. מוסיפים את יחסי התלות של הספריות ל-Android Kit ב-ML Kit, ברמת הקובץ של האפליקציה במודול , שהיא בדרך כלל app/build.gradle:
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.1'
    }
    

תרגום של מחרוזת טקסט

כדי לתרגם מחרוזת בין שתי שפות:

  1. יוצרים אובייקט Translator ומגדירים אותו עם שפת המקור ושפת היעד:

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

    אם אינכם יודעים מהי השפה של טקסט הקלט, תוכלו להשתמש ב-Language IDid מאחר API שמספק לכם תג שפה. לאחר מכן, יש להמיר את התג ל-TranslateLanguage באמצעות TranslateLanguage.fromLanguageTag().

    אין לשמור יותר מדי מודלים של שפה במכשיר בבת אחת.

  2. מוודאים שמודל התרגום הנדרש הורד למכשיר. אין להתקשר אל translate() לפני שהמודל יהיה זמין.

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

    מודלים בשפה הם בסביבות 30MB, לכן אין להוריד אותם שלא לצורך ולהוריד אותם רק באמצעות Wi-Fi אלא אם המשתמש ציין אחרת. צריך גם למחוק מודלים מיותרים. מומלץ לעיין במאמר ניהול מודלים של תרגום באופן מפורש.

  3. אחרי שמאשרים את הורדת המודל, יש להעביר מחרוזת טקסט בשפת המקור אל 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.
                // ...
              }
            });

    הטקסט המתורגם, בשפת היעד שהגדרתם, מועבר למאזינים להצלחה.

  4. יש לוודא שהאפשרות close() תופעל כשהאובייקט Translator לא יהיה בשימוש יותר.

    אם אתם משתמשים ב'כלי תרגום' ב-Fragment או ב-AppCompatActivity, אחת הדרכים הפשוטות לעשות זאת היא לקרוא ל-LifecycleOwner.getLifecycle() ב-Fragment או ב-AppCompatActivity ואז להתקשר אל Lifecycle.addObserver. למשל:

    Kotlin

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

    Java

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

    ההנחה הזו היא שהקוד נמצא בתוך כיתה שמטמיעה מחזור חיים (למשל, Fragment או AppCompatActivity).

ניהול מודלים של תרגום באופן מפורש

כשמשתמשים ב-API של תרגום כפי שמתואר למעלה, ML Kit מורידה באופן אוטומטי דגמים ספציפיים של שפות למכשיר בהתאם לצורך. בנוסף, יש לך אפשרות לנהל באופן מפורש את דגמי התרגומים הרצויים במכשיר באמצעות ממשק ה-API לניהול מודלים של ML Kit. אפשרות זו עשויה להיות שימושית אם ברצונך להוריד מודלים מראש, או למחוק מהמכשיר מודלים מיותרים.

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