Menerjemahkan teks dengan ML Kit di iOS

Anda dapat menggunakan ML Kit untuk menerjemahkan teks antarbahasa. ML Kit dapat menerjemahkan antara lebih dari 50 bahasa.

Cobalah

  • Silakan coba aplikasi contoh ini untuk melihat contoh penggunaan API ini.

Sebelum memulai

  1. Sertakan pod ML Kit berikut di Podfile Anda:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. Setelah menginstal atau mengupdate Pod project, buka project Xcode menggunakan .xcworkspace-nya. ML Kit didukung di Xcode versi 12.4 atau yang lebih baru.

Menerjemahkan string teks

Untuk menerjemahkan string antara dua bahasa:

  1. Buat objek Translator, lalu konfigurasikan dengan bahasa sumber dan target:

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

    Jika tidak tahu bahasa teks input, Anda dapat menggunakan Language Identification API yang memberi tag bahasa. Kemudian, konversikan tag bahasa ke enum ML Kit. Kode ini bergantung pada bahasa yang Anda gunakan:

    Hindari menyimpan terlalu banyak model bahasa di perangkat sekaligus.

  2. Pastikan model terjemahan yang diperlukan telah didownload ke perangkat. Jangan panggil translate(_:completion:) sebelum Anda mengetahui ketersediaan model tersebut.

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

    Ukuran model bahasa sekitar 30 MB, jadi jangan mendownloadnya jika tidak perlu dan hanya download menggunakan Wi-Fi kecuali jika pengguna telah menentukan sebaliknya. Anda harus menghapus model jika tidak diperlukan lagi. Baca Mengelola model terjemahan secara eksplisit.

  3. Setelah Anda mengonfirmasi bahwa model telah didownload, teruskan string teks dalam bahasa sumber ke 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.
          }];

    ML Kit menerjemahkan teks ke bahasa target yang Anda konfigurasikan dan meneruskan teks yang diterjemahkan ke pengendali penyelesaian.

Siklus proses penerjemah dikontrol oleh ARC (penghitungan referensi otomatis), yang merupakan konvensi yang direkomendasikan untuk pengembangan iOS. Developer dapat memperkirakan bahwa Penerjemah akan dibatalkan alokasinya setelah semua referensi yang kuat dihapus.

Penerjemah dapat menempati 30 MB-150 MB saat dimuat di memori. Developer harus mempertimbangkan anggaran memori perangkat/aplikasi saat membuat instance penerjemah serentak dan menghindari terlalu banyak model bahasa di perangkat sekaligus.

Mengelola model terjemahan secara eksplisit

Saat Anda menggunakan Translation API seperti yang dijelaskan di atas, ML Kit akan otomatis mendownload model terjemahan bahasa tertentu ke perangkat sesuai kebutuhan. Anda juga dapat secara eksplisit mengelola model terjemahan yang ingin tersedia di perangkat menggunakan API pengelolaan model terjemahan dari ML Kit. Hal ini dapat berguna jika Anda ingin mendownload model terlebih dahulu, atau menghapus model yang tidak diperlukan dari perangkat.

Untuk mendapatkan model terjemahan yang disimpan di perangkat:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

Untuk menghapus model:

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.

Untuk mendownload model:

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
    )
)

Jika Anda ingin mendapatkan status download dengan NotificationCenter, daftarkan pengamat untuk mlkitModelDownloadDidSucceed dan mlkitModelDownloadDidFail. Pastikan untuk menggunakan referensi lemah ke self di blok observer karena proses download mungkin memerlukan waktu beberapa saat, dan objek asalnya dapat dibebaskan pada saat download selesai. Contoh:

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

Jika Anda ingin mendapatkan status download dengan NSNotificationCenter, daftarkan pengamat untuk MLKModelDownloadDidSucceedNotification dan MLKModelDownloadDidFailNotification. Pastikan untuk menggunakan referensi lemah ke self di blok observer karena proses download mungkin memerlukan waktu beberapa saat, dan objek awal dapat dibebaskan pada saat download selesai.

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