Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

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

לפני שאתה מתחיל

  1. אם עדיין לא הוספת את Firebase לאפליקציה שלך, עשה זאת על ידי ביצוע השלבים במדריך לתחילת העבודה .
  2. כלול את ספריות ML Kit ב-Podfile שלך:
    pod 'Firebase/MLNLTranslate', '6.25.0'
    
    לאחר שתתקין או תעדכן את ה-Pods של הפרויקט שלך, הקפד לפתוח את פרויקט Xcode שלך ​​באמצעות .xcworkspace שלו.
  3. באפליקציה שלך, ייבא את Firebase:

    מָהִיר

    import Firebase

    Objective-C

    @import Firebase;

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

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

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

    מָהִיר

    // Create an English-German translator:
    let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de)
    let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
    

    Objective-C

    // Create an English-German translator:
    FIRTranslatorOptions *options =
        [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN
                                              targetLanguage:FIRTranslateLanguageDE];
    FIRTranslator *englishGermanTranslator =
        [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
    

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

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

    מָהִיר

    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

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

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

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

    מָהִיר

    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 מתרגם את הטקסט לשפת היעד שהגדרתם ומעביר את הטקסט המתורגם למטפל בהשלמה.

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

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

כדי לקבל את דגמי התרגום המאוחסנים במכשיר:

מָהִיר

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet<FIRTranslateRemoteModel *> *localModels =
    [FIRModelManager modelManager].downloadedTranslateModels;

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

מָהִיר

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

Objective-C

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

להורדת דגם:

מָהִיר

// Download the French model.
let frModel = TranslateRemoteModel.translateRemoteModel(language: .fr)

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

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

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    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 == frModel
        else { return }
    // The model was downloaded and is available on the device
}

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidFail,
    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.
FIRModelDownloadConditions *conditions =
    [[FIRModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                         allowsBackgroundDownloading:YES];
FIRTranslateRemoteModel *frModel =
    [FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageFR];

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

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

__block MyViewController *weakSelf = self;

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

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

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

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