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

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

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

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

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

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

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

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

    מומלץ לא לשמור יותר מדי מודלים של שפה במכשיר בו-זמנית.

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

    KotlinJava
    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.
            // ...
        }
    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():

    KotlinJava
    englishGermanTranslator.translate(text)
        .addOnSuccessListener { translatedText ->
            // Translation successful.
        }
        .addOnFailureListener { exception ->
             // Error.
             // ...
        }
    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.

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

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

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

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

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

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