您可以使用 ML Kit 在語言之間翻譯文本。 ML Kit 目前支持59 種語言之間的翻譯。
在你開始之前
- 如果您尚未將 Firebase 添加到您的應用,請按照入門指南中的步驟進行操作。
- 在您的 Podfile 中包含 ML Kit 庫:
pod 'Firebase/MLNLTranslate', '6.25.0'
安裝或更新項目的 Pod 後,請務必使用其.xcworkspace
打開您的 Xcode 項目。 - 在您的應用中,導入 Firebase:
迅速
import Firebase
Objective-C
@import Firebase;
翻譯一串文本
要在兩種語言之間翻譯字符串:
創建一個
Translator
對象,使用源語言和目標語言對其進行配置:迅速
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de) let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
Objective-C
// Create an English-German translator: FIRTranslatorOptions *options = [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN targetLanguage:FIRTranslateLanguageDE]; FIRTranslator *englishGermanTranslator = [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
如果不知道輸入文本的語言,可以先使用語言識別API 。 (但請確保不要一次在設備上保留太多語言模型。)
確保所需的翻譯模型已下載到設備。在您知道模型可用之前,不要調用
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. }
Objective-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. }];
語言模型大約 30MB,所以不要不必要地下載它們,只使用 WiFi 下載它們,除非用戶另有說明。您還應該刪除不需要的模型。請參閱顯式管理翻譯模型。
確認模型已下載後,將源語言中的文本字符串傳遞給
translate(_:completion:)
:迅速
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 將文本翻譯成您配置的目標語言,並將翻譯後的文本傳遞給完成處理程序。
顯式管理翻譯模型
當您使用上述翻譯 API 時,ML Kit 會根據需要自動將特定語言的翻譯模型下載到設備。您還可以使用 ML Kit 的翻譯模型管理 API 明確管理您希望在設備上可用的翻譯模型。如果您想提前下載模型或從設備中刪除不需要的模型,這會很有用。
要獲取存儲在設備上的翻譯模型:
迅速
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-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.
}
Objective-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]
// ...
}
Objective-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];
}];