您可以使用机器学习套件在多种语言之间翻译文本。机器学习套件可以在 50 多种语言之间进行互译。
试试看
- 试用示例应用,查看此 API 的用法示例。
准备工作
- 在您的 Podfile 中添加以下机器学习套件 Pod:
pod 'GoogleMLKit/Translate', '3.2.0'
- 安装或更新项目的 Pod 之后,请使用 Xcode 项目的
.xcworkspace
来打开项目。Xcode 12.4 版或更高版本支持机器学习套件。
翻译文本字符串
如需在两种语言之间翻译字符串,请执行以下操作:
创建一个
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。然后,将语言标记转换为机器学习套件枚举。具体代码取决于您使用的语言:
- Swift:调用
TranslateLanguage.fromLanguageTag()
以获取TranslateLanguage
- Objective-C:调用
MLKTranslateLanguageForLanguageTag()
以获取MLKTranslateLanguage
避免同时在设备上保留过多语言模型。
- Swift:调用
确保已将所需的翻译模型下载到设备上。 确定模型可用之后,再调用
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. }];
语言模型大约为 30MB,因此,如无必要,请勿下载语言模型。除非用户另行指定,否则应仅使用 Wi-Fi 下载语言模型。您应删除不再需要的模型。 请参阅显式管理翻译模型。
确认模型已下载后,将源语言的文本字符串传递给
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(自动引用计数)控制,ARC 是 iOS 开发的推荐惯例。移除所有强引用后,开发者将需要解除译者的分配。
译者在内存中加载时可能会占用 30MB-150MB 的内存。创建并发翻译器实例时,开发者应牢记设备/应用的内存预算,并避免同时在设备上保留过多语言模型。
显式管理翻译模型
在您按上述说明使用翻译 API 时,机器学习套件会根据需要自动将特定语言的翻译模型下载到设备上。您还可以使用机器学习套件的翻译模型管理 API 明确管理您希望在设备上提供的翻译模型。如果您想提前下载模型或从设备中删除不需要的模型,这种做法会非常有用。
如需获取设备上存储的翻译模型,请运行以下命令:
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]; }];