MLKitTranslator 拓展:离线翻译

« 返回首页

logo 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 里。

文档反馈