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

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

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

  1. יש לכלול ב-Podfile את מוטות ה-ML Kit הבאים:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. לאחר ההתקנה או עדכון של ה-Pod של הפרויקט, פותחים את פרויקט Xcode באמצעות .xcworkspace. ערכת ה-ML Kit נתמכת בגרסה Xcode 12.4 ומעלה.

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

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

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

    Swift

        // Create an English-German translator:
        let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german)
        let englishGermanTranslator = Translator.translator(options: options)

    Objective-C

        // Create an English-German translator:
        MLKTranslatorOptions *options =
            [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish
                                                  targetLanguage:MLKTranslateLanguageGerman];
        MLKTranslator *englishGermanTranslator =
            [MLKTranslator translatorwithOptions:options];

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

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

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

    Swift

    let conditions = ModelDownloadConditions(
        allowsCellularAccess: false,
        allowsBackgroundDownloading: true
    )
    englishGermanTranslator.downloadModelIfNeeded(with: conditions) { error in
        guard error == nil else { return }
    
        // Model downloaded successfully. Okay to start translating.
    }

    Objective-C

    MLKModelDownloadConditions *conditions =
        [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                             allowsBackgroundDownloading:YES];
    [englishGermanTranslator downloadModelIfNeededWithConditions:conditions
                                                      completion:^(NSError *_Nullable error) {
      if (error != nil) {
        return;
      }
      // Model downloaded successfully. Okay to start translating.
    }];

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

  3. אחרי שמאשרים את הורדת המודל, יש להעביר מחרוזת טקסט בשפת המקור אל translate(_:completion:):

    Swift

          englishGermanTranslator.translate(text) { translatedText, error in
              guard error == nil, let translatedText = translatedText else { return }
    
              // Translation succeeded.
          }

    Objective-C

          [englishGermanTranslator translateText:text
                                      completion:^(NSString *_Nullable translatedText,
                                                   NSError *_Nullable error) {
            if (error != nil || translatedText == nil) {
              return;
            }
    
            // Translation succeeded.
          }];

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

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

מתרגם יכול לתפוס 30MB-150MB כשהוא נטען בזיכרון. מפתחים צריכים לזכור את תקציב הזיכרון של המכשיר או האפליקציה כשיוצרים מופעים בו-זמנית ולא לשמור יותר מדי דגמי שפות במכשיר בו-זמנית.

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

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

כדי לשמור את דגמי התרגום במכשיר:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

כדי למחוק מודל:

Swift

// Delete the German model if it's on the device.
let germanModel = TranslateRemoteModel.translateRemoteModel(language: .german)
ModelManager.modelManager().deleteDownloadedModel(germanModel) { error in
    guard error == nil else { return }
    // Model deleted.
}

Objective-C

// Delete the German model if it's on the device.
MLKTranslateRemoteModel *germanModel =
    [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageGerman];
[[MLKModelManager modelManager] deleteDownloadedModel:germanModel
                                           completion:^(NSError * _Nullable error) {
                                               if (error != nil) {
                                                   return;
                                               }
                                               // Model deleted.

כדי להוריד מודל:

Swift

// Download the French model.
let frenchModel = TranslateRemoteModel.translateRemoteModel(language: .french)

// Keep a reference to the download progress so you can check that the model
// is available before you use it.
progress = ModelManager.modelManager().download(
    frenchModel,
    conditions: ModelDownloadConditions(
        allowsCellularAccess: false,
        allowsBackgroundDownloading: true
    )
)

אם רוצים לקבל את סטטוס ההורדה ב-NotificationCenter, צריך לרשום צופים עבור mlkitModelDownloadDidSucceed ו-mlkitModelDownloadDidFail. הקפידו להשתמש בקובץ עזר חלש ביחס ל-self במאגר הצופים, כי ההורדה עשויה להימשך זמן מה. תוכלו להוריד את האובייקט המקורי עד שההורדה תסתיים. למשל:

NotificationCenter.default.addObserver(
    forName: .mlkitModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let strongSelf = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? TranslateRemoteModel,
        model == frenchModel
        else { return }
    // The model was downloaded and is available on the device
}

NotificationCenter.default.addObserver(
    forName: .mlkitModelDownloadDidFail,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let strongSelf = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? TranslateRemoteModel
        else { return }
    let error = userInfo[ModelDownloadUserInfoKey.error.rawValue]
    // ...
}

Objective-C

// Download the French model.
MLKModelDownloadConditions *conditions =
    [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                         allowsBackgroundDownloading:YES];
MLKTranslateRemoteModel *frenchModel =
    [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageFrench];

// Keep a reference to the download progress so you can check that the model
// is available before you use it.
self.downloadProgress = [[MLKModelManager modelManager] downloadModel:frenchModel
conditions:conditions];

אם רוצים לקבל את סטטוס ההורדה ב-NSNotificationCenter, צריך לרשום צופים עבור MLKModelDownloadDidSucceedNotification ו-MLKModelDownloadDidFailNotification. חשוב להשתמש בקובץ עזר חלש ביחס ל-self בקטעי הצפייה, כי ההורדה עשויה להימשך זמן מה, וייתכן שהאובייקט המקורי יתפנה עד שההורדה תסתיים.

__block MyViewController *weakSelf = self;

[NSNotificationCenter.defaultCenter
 addObserverForName:MLKModelDownloadDidSucceedNotification
 object:nil
 queue:nil
 usingBlock:^(NSNotification * _Nonnull note) {
     if (weakSelf == nil | note.userInfo == nil) {
         return;
     }

     MLKTranslateRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel];
     if ([model isKindOfClass:[MLKTranslateRemoteModel class]]
         && model == frenchModel) {
         // The model was downloaded and is available on the device
     }
 }];

[NSNotificationCenter.defaultCenter
 addObserverForName:MLKModelDownloadDidFailNotification
 object:nil
 queue:nil
 usingBlock:^(NSNotification * _Nonnull note) {
     if (weakSelf == nil | note.userInfo == nil) {
         return;
     }

     NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError];
 }];