ترجمه متن با ML Kit در iOS

می‌توانید از ML Kit برای ترجمه متن بین زبان‌ها استفاده کنید. ML Kit در حال حاضر از ترجمه بین 59 زبان پشتیبانی می کند.

قبل از اینکه شروع کنی

  1. اگر قبلاً Firebase را به برنامه خود اضافه نکرده اید، این کار را با دنبال کردن مراحل راهنمای شروع کار انجام دهید.
  2. کتابخانه‌های ML Kit را در فایل پادفایل خود قرار دهید:
    pod 'Firebase/MLNLTranslate', '6.25.0'
    
    پس از نصب یا به‌روزرسانی Pods پروژه، حتماً پروژه Xcode خود را با استفاده از .xcworkspace آن باز کنید.
  3. در برنامه خود، Firebase را وارد کنید:

    سریع

    import Firebase

    هدف-C

    @import Firebase;

یک رشته متن را ترجمه کنید

برای ترجمه یک رشته بین دو زبان:

  1. یک شی Translator ایجاد کنید، آن را با زبان مبدأ و مقصد پیکربندی کنید:

    سریع

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

    هدف-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.
    }
    

    هدف-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.
    }];
    

    مدل های زبان حدود 30 مگابایت هستند، بنابراین آنها را بیهوده دانلود نکنید و فقط با استفاده از وای فای آنها را دانلود کنید، مگر اینکه کاربر چیز دیگری را مشخص کرده باشد. همچنین باید مدل های غیر ضروری را حذف کنید. به مدیریت صریح مدل‌های ترجمه مراجعه کنید.

  3. پس از اینکه تأیید کردید مدل دانلود شده است، یک رشته از متن را به زبان مبدأ برای translate(_:completion:) :

    سریع

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

    هدف-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، مدل‌های ترجمه‌ای را که می‌خواهید در دستگاه موجود باشد، مدیریت کنید. اگر می‌خواهید مدل‌ها را زودتر از موعد دانلود کنید یا مدل‌های غیر ضروری را از دستگاه حذف کنید، می‌تواند مفید باشد.

برای دریافت مدل های ترجمه ذخیره شده در دستگاه:

سریع

let localModels = ModelManager.modelManager().downloadedTranslateModels

هدف-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.
}

هدف-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]
    // ...
}

هدف-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];
 }];