ترجمة النص باستخدام حزمة تعلّم الآلة على نظام التشغيل iOS

يمكنك استخدام أدوات تعلّم الآلة لترجمة النصوص بين اللغات. يمكن الترجمة إلى أكثر من 50 لغة من خلال "حزمة تعلّم الآلة".

تجربة السمات والبيانات

  • جرِّب نموذج التطبيق للاطّلاع على مثال حول استخدام واجهة برمجة التطبيقات هذه.

قبل البدء

  1. أدرِج مجموعات تعلّم الآلة التالية في Podfile:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. بعد تثبيت أو تحديث مجموعات Pods لمشروعك، افتح مشروع Xcode باستخدام .xcworkspace. تتوفّر هذه الأداة في الإصدار 12.4 من Xcode أو إصدار أحدث.

ترجمة سلسلة من النص

لترجمة سلسلة بين لغتَين:

  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 Identification API لمنحك علامة لغة. بعد ذلك، عليك تحويل علامة اللغة إلى تعداد ML Kit. يعتمد الرمز على اللغة التي تستخدمها:

    تجنَّب الاحتفاظ بعدد كبير جدًا من النماذج اللغوية على الجهاز في وقت واحد.

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

    يبلغ حجم النماذج اللغوية حوالي 30 ميغابايت، لذا لا تنزّلها بدون داعٍ، واحرص على تنزيلها باستخدام شبكة 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.
          }];

    تحوِّل أدوات تعلّم الآلة النص إلى اللغة الهدف التي تم ضبطها وتمرِّر النص المُترجَم إلى معالِج الإكمال.

يتم التحكم في دورات حياة المترجم من خلال تقنية ARC (الاحتساب التلقائي للمراجع)، وهو الاصطلاح الموصى به لتطوير نظام التشغيل iOS. من المتوقّع أن يتم نقل "المترجم" بعد إزالة جميع المراجع القوية.

يمكن أن تشغل أجهزة الترجمة مساحة من 30 إلى 150 ميغابايت عند تحميلها في الذاكرة. وعلى مطوّري البرامج مراعاة ميزانية الذاكرة للجهاز/التطبيق عند إنشاء مثيلات للترجمة المتزامنة وتجنُّب الاحتفاظ بعدد كبير جدًا من النماذج اللغوية على الجهاز في الوقت نفسه.

إدارة نماذج الترجمة بوضوح

عند استخدام واجهة برمجة تطبيقات الترجمة كما هو موضّح أعلاه، تعمل أدوات تعلّم الآلة تلقائيًا على تنزيل نماذج الترجمة الخاصة باللغات على الجهاز حسب الحاجة. يمكنك أيضًا إدارة نماذج الترجمة التي تريد توفيرها على الجهاز بشكل واضح، وذلك باستخدام واجهة برمجة التطبيقات لإدارة نماذج الترجمة في أدوات تعلّم الآلة. وقد يكون هذا الإجراء مفيدًا إذا كنت تريد تنزيل النماذج مسبقًا أو حذف النماذج غير الضرورية من الجهاز.

للحصول على نماذج الترجمة المخزَّنة على الجهاز:

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