
Rocket.Chat Auto Translate 深度解析基于多提供方的消息自动翻译模块架构与实践指南【免费下载链接】Rocket.ChatThe Secure CommsOS™ for mission-critical operations项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.ChatRocket.Chat 的 Auto Translate自动翻译让用户无论消息以何种语言书写都能以自己设定的语言阅读会话内容适用于多语言团队的实时协作、跨国客户支持与国际化频道运营等场景。本指南以仓库内 autotranslate 模块说明 为骨架结合其服务端源码与配置实现系统讲解整体设计、Google / DeepL / Microsoft / LibreTranslate 四类翻译提供方的接入机制、管理员配置参数与用户侧启用流程帮助你理解并部署这一能力。一、模块概述与仓库位置原文档明确给出模块的核心定位Rocket.Chat supports auto translate through Google Cloud Translation API. Through this you will be able to read messages in your native languages regardless of language the message was written on.翻译成实际工程语言就是消息保存后由服务端自动将正文翻译成订阅了翻译会话的每个用户所偏好的语言翻译结果随原消息一并存储并按需展示。从当前仓库看该能力已从早期仅面向 Google Cloud Translation API 演进为支持多家翻译服务提供方的可插拔注册表架构全部实现集中在autotranslate/README.md模块说明本指南主体autotranslate/autotranslate.ts注册表 抽象基类autotranslate/index.ts模块统一出口加载权限、四家提供方并导出注册表autotranslate/permissions.ts初始化auto-translate权限autotranslate/functions/getSupportedLanguages.ts、saveSettings.ts、translateMessage.ts服务端设置定义位于 settings/message.tsMeteor 方法与 REST API 分别在 meteor-methods/platform/ 与 api/v1/autotranslate.ts。二、整体设计翻译提供方注册表TranslationProviderRegistry自动翻译的总调度由一个单例式静态注册表完成定义于 autotranslate.ts。它承担三类职责职责关键成员作用提供方注册registerProvider(provider)读取提供方元数据name/displayName/settings并存入Providers哈希表活动提供方切换setCurrentProvider(name)将AutoTranslate_ServiceProvider设置的当前值写入Provider槽位全局开关setEnable(enabled)/enabled控制整个模块启停启用时注册回调、禁用时移除回调registerCallbacks是它与消息系统接驳的关键启用自动翻译时模块向callbacks注册afterSaveMessage钩子优先级MEDIUM名称autotranslate之后每一条被保存的消息都会触发翻译管线禁用时调用callbacks.remove(afterSaveMessage, autotranslate)撤销钩子。对应实现位于 autotranslate.ts。模块在 Meteor 启动阶段通过设置监听完成联动autotranslate.ts监听AutoTranslate_ServiceProvider变更即调用setCurrentProvider监听AutoTranslate_Enabled变更即调用setEnable因此管理员在设置面板切换开关或切换服务商时无需重启配置热生效。三、抽象基类 AutoTranslate翻译管线的公共骨架所有具体提供方都继承抽象基类AutoTranslateautotranslate.ts。该基类实现了与服务商无关的公共逻辑要求子类实现四个抽象方法_getProviderMetadata()返回{ name, displayName, settings }getSupportedLanguages(target)返回可翻译成的语言列表[{ language, name }]_translateMessage(message, targetLanguages)翻译消息正文_translateAttachmentDescriptions(attachment, targetLanguages)翻译附件 description/text3.1 不翻译内容保护tokenize / deTokenize为保证机器翻译不破坏结构基类在发送给第三方 API 之前先做令牌化tokenize翻译完成后再还原deTokenize。令牌化使用统一的占位符i classnotranslate{N}/iN 为自增下标原始内容与占位符一一对应存入message.tokens。依次处理五类内容autotranslate.ts处理项正则 / 策略意义表情符号:[\w\d]:避免把 emoji 名称当普通词翻译Markdown 链接与图片text/alt仅保留链接文字供翻译URL 与括号不被破坏管道链接http://…\|TextRocket.Chat 的斜杠转义链接语法代码块借助Markdown.parseMessageNotEscaped解析后替换非 notranslate 的 token代码不被翻译、多行结构保持提及与 #频道基于message.mentions/message.channels逐个替换用户名与频道名保持原样翻译后仍可正确跳转同时会把 Markdown 解析器包裹的p…/p剥离避免污染翻译结果。翻译返回后由deTokenize将占位符替换回原文。四、四大翻译提供方的实现差异当前仓库内置四个提供方注册入口统一在 index.ts4.1 Google Cloud Translationgoogle-translate默认提供方实现于 googleTranslate.ts调用 Cloud Translation v2 REST翻译端点https://translation.googleapis.com/language/translate/v2语言列表端点https://translation.googleapis.com/language/translate/v2/languages鉴权请求参数keyapiKeyAPI Key 来自设置AutoTranslate_GoogleAPIKey按行翻译q以\n拆分后的行数组提交返回后拼接回原文换行区域回退若目标语言形如xx-YY且不在支持列表中则截断为前两位语言码缓存supportedLanguages[target]按目标语言做内存缓存语言端点返回 400 时会降级为英文名列表4.2 DeepLdeepl-translate实现于 deeplTranslate.ts鉴权头为Authorization: DeepL-Auth-Key key。一个值得注意的细节免费版与专业版 API Key 由后缀自动识别——Key 以:fx结尾时自动切换免费端点专业版https://api.deepl.com/v2/translate免费版https://api-free.deepl.com/v2/translate语言端点同样按:fx区分。翻译结果通过返回的detected_source_language与目标语言比较源语言与目标语言相同时丢弃该行避免无意义覆盖。4.3 Microsoft Translatormicrosoft-translate实现于 msTranslate.ts使用 Azure Translator v3翻译端点https://api.cognitive.microsofttranslator.com/translate?api-version3.0辅助端点detect、languages、breaksentence鉴权请求头Ocp-Apim-Subscription-Key多行混排处理将消息按行拆为[{ Text }]数组一次 POST多个目标语言通过to参数批量指定4.4 LibreTranslatelibre-translate实现于 libreTranslate.ts是唯一支持自建服务的开源方案API 地址完全由AutoTranslate_LibreTranslateAPIURL设置决定默认空未配置时不发起请求请求超时固定 10 秒。请求体默认source: auto仅在配置了 API KeyAutoTranslate_LibreTranslateAPIKey时才附带api_key。语言代码会经Intl.Locale规范化为标准 BCP-47 标签。四家提供方使用的端点、鉴权方式与对应设置汇总如下均为源码内可验证值提供方名称键鉴权关键设置Googlegoogle-translateURL 参数keyAutoTranslate_GoogleAPIKeyDeepLdeepl-translateHeaderDeepL-Auth-KeyAutoTranslate_DeepLAPIKeyMicrosoftmicrosoft-translateHeaderOcp-Apim-Subscription-KeyAutoTranslate_MicrosoftAPIKeyLibreTranslatelibre-translateBodyapi_keyAutoTranslate_LibreTranslateAPIURL、AutoTranslate_LibreTranslateAPIKey五、服务端设置逐项说明与启用前提自动翻译全部服务端设置定义于 settings/message.ts分组为Message下的AutoTranslate小节可通过「管理 → 设置 → 消息 → Auto Translate」配置设置键类型默认值说明AutoTranslate_Enabledbooleanfalse全局总开关AutoTranslate_AutoEnableOnJoinRoombooleanfalse加入房间时是否自动为用户开启自动翻译AutoTranslate_ServiceProviderselectgoogle-translate活动提供方可选google-translate/deepl-translate/microsoft-translate/libre-translateAutoTranslate_GoogleAPIKeystring私有Google 翻译 API Key仅当选 Google 时生效AutoTranslate_DeepLAPIKeystring私有DeepL API Key仅当选 DeepL 时生效AutoTranslate_MicrosoftAPIKeystring私有Azure Translator 订阅 Key仅当选 Microsoft 时生效AutoTranslate_LibreTranslateAPIURLstring私有自建 LibreTranslate 服务地址AutoTranslate_LibreTranslateAPIKeystring私有secretLibreTranslate API Key可选其中每个 API Key 类设置都通过enableQuery做了条件显示/校验仅当AutoTranslate_Enabled true且AutoTranslate_ServiceProvider等于对应值时才有效避免无关凭据被误提交。API Key 均声明为public: false仅管理员可见LibreTranslate Key 额外标记secret: true。启用前提与限制事实层面必须先配置所选服务商的有效 API Key否则getSupportedLanguages返回空列表翻译无法进行模块默认关闭AutoTranslate_Enabled false需管理员开启用户与房间权限受auto-translate权限约束见下文。六、权限模型与面向用户的方法6.1 auto-translate 权限模块启动时permissions.ts检查auto-translate权限是否存在不存在则创建并默认赋予admin角色。服务端所有面向用户的自动翻译操作前都会调用hasPermissionAsync(userId, auto-translate)校验。6.2 保存用户翻译偏好autoTranslate.saveSettings实现位于 functions/saveSettings.ts对应方法autoTranslate.saveSettings。行为要点仅允许修改autoTranslate是否开启布尔以1存储与autoTranslateLanguage目标语言两个字段其他字段抛error-invalid-settings必须存在对应用户订阅否则抛error-invalid-subscriptionE2E 加密房间禁止开启自动翻译在开启autoTranslate时若房间为 E2E 加密房间则抛error-e2e-enabled原文Enabling auto-translation in E2E encrypted rooms is not allowed用户未设置语言且服务端提供defaultLanguage来自默认语言设置时会自动补写该默认语言变更后通过notifyOnSubscriptionChangedById通知订阅变更驱动客户端即时刷新。6.3 获取支持语言autoTranslate.getSupportedLanguagesfunctions/getSupportedLanguages.ts 首先校验AutoTranslate_Enabled设置未开启抛error-autotranslate-disabled再校验权限最终委托TranslationProviderRegistry.getSupportedLanguages(target)。6.4 按需翻译autoTranslate.translateMessagefunctions/translateMessage.ts 支持传入targetLanguage强制指定目标语言翻译指定消息用于翻译此消息类交互否则回退到订阅驱动的批量翻译。七、消息翻译的完整执行链路结合源码一条消息从保存到展示的完整链路如下消息落库触发afterSaveMessage回调autotranslateMEDIUM 优先级autotranslate.ts 的translateMessage判断总开关与活动提供方确定目标语言集合若无显式 target查询所有订阅了该房间且开启翻译的用户的autoTranslateLanguageSubscriptions.getAutoTranslateLanguagesByRoomAndNotUser排除消息作者本人避免给自己发同一语言的副本正文翻译setImmediate异步进行——复制消息、escapeHTML、tokenize保护 URL/代码/提及等、调用_translateMessage得到多语言结果{ lang: text }持久化非空结果调用Messages.addTranslations(message._id, translations, providerName)翻译随原消息 ID 存储附件翻译若消息含附件且有description/text并行调用_translateAttachmentDescriptions并Messages.addAttachmentTranslations引用消息的 前缀会在翻译前剥离避免污染译文实时通知每次写入翻译后调用notifyOnMessageChange通知客户端消息变更订阅该语言的用户即时看到译文而无需刷新。其中目标语言抓取与消息持久化分别依赖rocket.chat/models中Subscriptions、Messages两个模型模型定义见 packages/model-typings说明翻译结果属于消息聚合数据而非独立消息。八、REST API 与默认订阅配置模块同时对外暴露 HTTP 端点见 api/v1/autotranslate.ts供客户端在设置房间翻译偏好、获取语言列表时使用当前仓库以 Meteor 方法为主体REST 端点为配套能力。另外 getSubscriptionAutotranslateDefaultConfig.ts 用于计算新订阅的默认自动翻译配置与设置AutoTranslate_AutoEnableOnJoinRoom配合——该设置开启后用户加入新房间时按默认语言自动启用翻译。九、小结与阅读路径Rocket.Chat 自动翻译由TranslationProviderRegistry AutoTranslate双层结构支撑注册表负责提供方管理与消息回调接线抽象基类沉淀令牌化保护、目标语言收集、结果持久化与实时通知的公共管线四家具体提供方仅需实现语言列表 文本翻译 附件描述翻译三个最小接口即可接入新服务商。继续深入阅读的建议顺序模块整体apps/meteor/server/lib/autotranslate/index.ts注册表与管线核心autotranslate.ts四个提供方实现googleTranslate.ts、deeplTranslate.ts、msTranslate.ts、libreTranslate.ts配置与权限settings/message.ts、permissions.ts用户侧方法meteor-methods/platform/如果你需要在跨语言团队中落地此功能只需完成三步在管理后台开启 Auto Translate 并填入对应服务商 API Key为用户/房间授权auto-translate让用户在房间设置中选择目标语言即可。【免费下载链接】Rocket.ChatThe Secure CommsOS™ for mission-critical operations项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考