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

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

آن را امتحان کنید

قبل از شروع

  1. پادهای کیت ML زیر را در فایل پادفایل خود قرار دهید:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. پس از نصب یا به روز رسانی Pods پروژه خود، پروژه Xcode خود را با استفاده از .xcworkspace . آن باز کنید. کیت ML در Xcode نسخه 12.4 یا بالاتر پشتیبانی می شود.

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

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

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

    سویفت

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

    هدف-C

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

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

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

  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

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

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

  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 متن را به زبان مقصدی که پیکربندی کرده‌اید ترجمه می‌کند و متن ترجمه‌شده را به کنترل‌کننده تکمیل ارسال می‌کند.

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

مترجم ها می توانند 30 مگابایت تا 150 مگابایت را در هنگام بارگیری در حافظه اشغال کنند. برنامه‌نویسان باید هنگام ایجاد نمونه‌های مترجم همزمان، بودجه حافظه دستگاه/برنامه را در نظر داشته باشند و از نگه‌داشتن مدل‌های زبانی بیش از حد به طور هم‌زمان در دستگاه خودداری کنند.

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

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

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

سویفت

let localModels = ModelManager.modelManager().downloadedTranslateModels

هدف-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

برای حذف یک مدل:

سویفت

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

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

برای دانلود مدل:

سویفت

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

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