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

می‌توانید از ML Kit برای ترجمه نوشتار بین زبان‌ها استفاده کنید. ML Kit می‌تواند بین بیش‌از ۵۰ زبان ترجمه کند.

امتحان کنید

  • با برنامه نمونه بازی کنید تا نمونه‌ای از استفاده از این API را ببینید.

قبل‌از شروع

  1. غلاف‌های ML Kit زیر را در Podfile خود بگنجانید:
    pod 'GoogleMLKit/Translate', '8.0.0'
    
  2. پس‌از نصب یا به‌روزرسانی Pods پروژه، پروژه Xcode را بااستفاده از .xcworkspace آن باز کنید. «کیت یادگیری ماشین» در Xcode نسخه ۱۲.۴ یا بالاتر پشتیبانی می‌شود.

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

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

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

    Swift

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

    آبجکتیو-سی

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

    اگر زبان نوشتار ورودی را نمی‌دانید، می‌توانید از Language Identification API استفاده کنید که برچسب زبان را به شما می‌دهد. سپس برچسب زبان را به یک ML Kit enum تبدیل کنید. کد به زبانی که استفاده می‌کنید بستگی دارد:

    از نگهداری هم‌زمان تعداد زیادی مدل زبانی در دستگاه خودداری کنید.

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

    آبجکتیو-سی

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

    مدل‌های زبانی حدود ۳۰ مگابایت هستند، بنابراین آن‌ها را بی‌دلیل بارگیری نکنید و فقط بااستفاده از Wi-Fi آن‌ها را بارگیری کنید، مگراینکه کاربر چیز دیگری مشخص کرده باشد. وقتی دیگر به مدل‌ها نیاز ندارید، باید آن‌ها را حذف کنید. مدیریت صریح مدل‌های ترجمه را ببینید.

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

    Swift

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

    آبجکتیو-سی

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

    ML Kit نوشتار را به زبان مقصدی که پیکربندی کرده‌اید ترجمه می‌کند و نوشتار ترجمه‌شده را به گرداننده تکمیل ارسال می‌کند.

چرخه‌های عمر مترجم توسط ARC (شمارش مرجع خودکار) کنترل می‌شود، که قرارداد توصیه‌شده برای توسعه iOS است. توسعه‌دهندگان می‌توانند انتظار داشته باشند که وقتی همه ارجاع‌های قوی برداشته شد، «ترجمه‌کننده» تخصیص‌زدایی شود.

وقتی مترجم‌ها در حافظه بار می‌شوند، می‌توانند ۳۰ تا ۱۵۰ مگابایت فضا اشغال کنند. توسعه‌دهندگان باید هنگام ایجاد نمونه‌های هم‌زمان مترجم، بودجه حافظه دستگاه/برنامه را درنظر داشته باشند و از نگهداری هم‌زمان تعداد زیادی مدل زبانی در دستگاه خودداری کنند.

مدل‌های ترجمه را به‌طور صریح مدیریت کنید

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

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

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

آبجکتیو-سی

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

آبجکتیو-سی

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

آبجکتیو-سی

// 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];
 }];