MLKitTranslator 拓展
支持 50 多种语言互译,翻译过程完全在设备本地完成,文本不上传。
为什么选它:
- 只要一个「翻译」块。语言包没下载会自动先下载再翻译 —— 不用自己串「下载模型 → 等下载完成事件 → 翻译」。
- 源语言等于目标语言时直接原样返回,不会白下几十 MB 的语言包。
- 换语言自动重建翻译器,你不用管生命周期。
- 语言包管理齐全:查询是否已下载、手动预下载、删除、列出已下载的。
重要限制:语言包要联网从 Google 服务器下载(每种语言约 30 MB,下载后永久离线可用)。 国内网络访问 Google 服务器可能失败,此时触发
ModelDownloadFailed。 翻译引擎本体(约 27 MB,4 个 CPU 架构)已打包在.aix里,不需要下载。
- .aix 拓展下载:
cn.fun123.MLKit.Translator.aix
快速上手
一、中译英(最小可用)
设计器里放一个 MLKitTranslator(源语言 默认 zh、目标语言 默认 en)、一个输入框、一个按钮、一个标签。
when 按钮_翻译.Click() {
标签1.Text = "翻译中…"
MLKitTranslator1.Translate(文本输入框_输入.Text)
}
when MLKitTranslator1.GotTranslation(originalText, translatedText) {
标签1.Text = translatedText
}
when MLKitTranslator1.ModelDownloadFailed(errorMessage) {
标签1.Text = errorMessage
}
when MLKitTranslator1.TranslateFailed(operation, errorMessage) {
标签1.Text = errorMessage
}
第一次点会自动下载英文语言包(约 30 MB),之后就纯离线了。
二、切换翻译方向
when 按钮_中译英.Click() {
MLKitTranslator1.SourceLanguage = "zh"
MLKitTranslator1.TargetLanguage = "en"
标签_方向.Text = "中 → 英"
}
when 按钮_英译中.Click() {
MLKitTranslator1.SourceLanguage = "en"
MLKitTranslator1.TargetLanguage = "zh"
标签_方向.Text = "英 → 中"
}
三、启动时提前下好语言包(让第一次翻译不用等)
when Screen1.Initialize() {
MLKitTranslator1.CheckModel("")
}
when MLKitTranslator1.GotModelState(languageTag, isDownloaded) {
if isDownloaded {
标签1.Text = "语言包已就绪"
} else {
标签1.Text = "正在下载语言包,约 30MB,请稍候…"
MLKitTranslator1.DownloadModel()
}
}
when MLKitTranslator1.ModelDownloaded() {
标签1.Text = "语言包下载完成,可以开始翻译了"
}
四、管理占用的空间
每个语言包约 30 MB,做成「管理已下载语言」功能:
when 按钮_模型列表.Click() {
MLKitTranslator1.ListDownloadedModels()
}
when MLKitTranslator1.GotDownloadedModels(count, languageTags) {
标签1.Text = join("已下载 ", count, " 个语言包")
列表显示框1.Elements = languageTags
}
when 按钮_删除英文包.Click() {
MLKitTranslator1.DeleteModel("en")
}
when MLKitTranslator1.GotDeleteResult(languageTag, deleted, errorMessage) {
if deleted {
标签1.Text = join(languageTag, " 语言包已删除")
} else {
标签1.Text = errorMessage
}
}
五、做语言选择下拉框
when Screen1.Initialize() {
列表选择器_目标语言.Elements = MLKitTranslator1.SupportedLanguages()
}
when 列表选择器_目标语言.AfterPicking() {
MLKitTranslator1.TargetLanguage = 列表选择器_目标语言.Selection
}
六、配合语言识别做「自动检测源语言」
装上 MLKitLanguageId 拓展就能做自动识别:
when 按钮_自动识别.Click() {
MLKitLanguageId1.IdentifyLanguage(文本输入框_输入.Text)
}
when MLKitLanguageId1.GotLanguage(languageTag, name) {
MLKitTranslator1.SourceLanguage = languageTag
MLKitTranslator1.Translate(文本输入框_输入.Text)
}
属性
- SourceLanguage
- 源语言标签,默认
zh。常用:zh中文、en英文、ja日文、ko韩文、fr法文、de德文、es西班牙文、ru俄文、th泰文、vi越南文、ar阿拉伯文。 完整列表用SupportedLanguages方法取。填了不支持的语言,调用时会在失败事件里给出提示。 - TargetLanguage
- 目标语言标签,默认
en。取值同上。 - DownloadOnWifiOnly
- 是否只在 WiFi 下下载语言包。默认「假」(任何网络都下)。 设成「真」可以省流量,但用户在移动网络下会一直下载不了 —— 记得在界面上提示他连 WiFi。
- Busy
- 只读。是否正在翻译或下载语言包。
事件
- GotTranslation(originalText,translatedText)
- 翻译完成。源语言与目标语言相同时会原样返回(且不消耗任何下载)。
- TranslateFailed(operation,errorMessage)
- 翻译失败。也包括「文本为空」「语言标签不支持」「上一次还没处理完」这类用法问题。
- ModelDownloaded()
- 语言包下载完成。自动下载和手动
DownloadModel都会触发。 - ModelDownloadFailed(errorMessage)
- 语言包下载失败。最常见的原因是网络无法访问 Google 服务器。 错误文本里已带可操作提示,直接显示给用户即可。
- GotModelState(languageTag,isDownloaded)
CheckModel的结果。- GotDeleteResult(languageTag,deleted,errorMessage)
DeleteModel的结果。- GotDownloadedModels(count,languageTags)
ListDownloadedModels的结果,languageTags是语言标签列表。
方法
- Translate(text)
- 翻译文本。语言包没下载会自动先下载再翻译(下载成功会先触发
ModelDownloaded)。 - DownloadModel()
- 手动下载当前语言对的语言包。一般不用单独调,可用于启动时预下载。
- CheckModel(languageTag)
- 查询某语言的语言包是否已下载。留空则查
目标语言→GotModelState。 - DeleteModel(languageTag)
- 删除某语言的语言包(每个约 30 MB)。留空则删
目标语言→GotDeleteResult。 - ListDownloadedModels()
- 列出已下载到本机的语言包 →
GotDownloadedModels。 - SupportedLanguages()
- 返回全部支持的语言标签列表,可直接喂给列表选择框。
常见问题
第一次翻译一直触发 ModelDownloadFailed。
语言包连不上 Google 服务器 —— 这是网络问题,不是拓展的问题。
引导用户在能访问 Google 服务的网络下完成一次下载,之后永久离线可用。
另外确认 仅WiFi下载 没有被设成「真」而用户正用移动网络。
翻译质量不如在线翻译。
设备端模型为了体积和速度做了大幅压缩,质量确实不如云端大模型。
要更高质量请用在线接口(本仓库的 LLMAI2Ext 大模型拓展也能做翻译)。
本拓展的价值是离线和不上传文本。
中文翻译结果是简体还是繁体?
ML Kit 的 zh 是简体。目前没有单独的繁体翻译模型。
为什么 .aix 有 28 MB?
翻译引擎(4 个 CPU 架构的原生库)打包在里面。语言包是运行时下载的,不算在这 28 MB 里。
扫码添加客服咨询