# Signal翻译版(独立桌面端 MVP) 这是 **在 Signal 聊天界面内部翻译** 的独立 macOS 应用:消息气泡显示译文,聊天输入框旁提供草稿翻译。不是此前的剪贴板伴侣。 基于 [Signal Desktop](https://github.com/signalapp/Signal-Desktop) 开源代码。上游版本 `8.30.0-alpha.1`,基准提交 `6aea489bd04f31f6070538ffdbcea9fcf492479d`。本项目是独立修改版本,**非 Signal 官方产品**。 ## 安装 要求 Apple Silicon Mac、macOS 15+。本次构建为 arm64;Intel 尚未构建验证。 1. 解压 `release/Signal-Translator-macOS-arm64.zip`。 2. 将 `Signal翻译版.app` 拖入“应用程序”文件夹,双击启动。 3. 首屏可展开“试用设备端翻译(无需关联)”,先测试中英示例;首次使用按系统提示下载语言包。 4. 在手机 Signal → 设置 → 已关联设备 → 关联新设备,扫描本应用二维码。 这是本机临时签名的开发测试版,未做 Apple Developer ID 签名或公证。跨机器下载可能被 Gatekeeper 拦截;可从源码构建,面向其他用户正式发行前应补全签名、公证和验收。 独立数据目录为 `~/Library/Application Support/CreatorSignalTranslator`(开发环境可能附带配置的 profile 后缀)。不会读取或迁移官方 Signal 的本地数据库,需要手机重新关联。关联和历史记录转移能力沿用上游流程。不要手动复制官方 Signal 数据目录到此应用。 ## 聊天内部翻译 - **接收消息:** 点击文字气泡下方“翻译”,译文直接显示在原消息下,可展开/收起。原文一直保留。 - **自动翻译:** 在输入框上方勾选“自动翻译可见消息”。只对当前页面可见的接收消息发起翻译,默认关闭,重启后关闭。 - **中英方向:** 中文自动译成英文;其他被识别的语言尝试译成简体中文。系统不支持的语言会给出错误。很短或混合语言文字可能识别不准。 - **发送前翻译:** 在 Signal 输入框正常输入文字,选择“草稿 → 英文/中文/自动中英”,点击“翻译草稿”。预览后点击“使用译文”,译文才会填回输入框;最后由你使用原有发送按钮或快捷键发送。 - **避免覆盖草稿:** 翻译期间若修改了输入内容,“使用译文”会要求重新翻译;切换会话或发送后,旧预览会清除。 翻译草稿会转换为纯文本,清除原有富文本格式。带 @提及的草稿暂不翻译。含隐藏文字(spoiler)的消息暂不提供翻译入口,避免提前显示隐藏内容。一次性内容、图片、语音、长文本附件下载和群组专属翻译配置不在本次新增范围。 ## 本地翻译与数据处理 使用 Apple Translation。原文通过父子进程的匿名管道交给本机 Swift 模块,没有新增云翻译请求、API 密钥或监听端口。语言包首次下载需联网;安装完成后的翻译由系统在设备端执行。Apple 可能收集 API 使用/性能和语言指标,不包含原文及译文,参见 [Apple TranslationSession 文档](https://developer.apple.com/documentation/translation/translationsession)。 新增译文只在当前界面状态和正在运行的请求中暂存,不写入 Signal 消息数据库,也不写入新增日志或磁盘翻译历史。消息删除/编辑或组件卸载后不保留原组件译文。应用依然具有上游 Signal 自身的数据库、日志、草稿保存和网络通信;草稿使用译文后会按上游草稿机制保存。 加密、设备关联、消息发送接收和密钥处理仍走上游代码;新增翻译在客户端正常解密并展示文本之后进行。本次不是对整个上游客户端的安全审计。 单次最多 10,000 个 UTF-16 代码单元;请求最多并行提交两项,系统模块顺序翻译。等待过久或取消下载时可重试。首个语言包下载超过十分钟时请求会超时,完成下载后再试。 ## 从源码构建 安装 Xcode,完成首次运行设置;安装 Node `24.19.0`、npm 和 pnpm `11.24.0`。项目保留原始依赖锁文件,没有改变 Signal 的协议依赖。 在项目目录执行: ```sh bash scripts/build-translator-macos.sh ``` 脚本将安装依赖、构建原生翻译模块、生成 Signal 资源、运行类型检查和新增队列测试、打包 arm64 `.app`,进行本机临时签名,最后生成 ZIP。需要联网下载 npm/Electron 构建依赖。本机编译不需要 Apple 开发者账号;公开分发所需的 Developer ID 和公证凭证不包含在源码中。 单独测试: ```sh pnpm run check:types node --import=tsx --test translation-tests/client_test.mjs ``` 新功能主要位于 `ts/translation/`,本地翻译模块位于 `native/LocalTranslation/`。消息和草稿入口分别接入 `Message.dom.tsx`、`CompositionArea.dom.tsx` 和 `CompositionInput.dom.tsx`。 ## 已知边界与维护 - 这是基于上游 alpha 代码的初版,不应直接视为经过完整验收的正式发行版本。 - 当前一个本地资料目录/一个关联身份;尚未实现创世 WhatsApp 翻译器的多开、账号后台、收费系统、云翻译引擎或多账号角标汇总。 - 未注册为官方 `sgnl` / `signalcaptcha` 链接的默认打开程序,避免替换官方应用。若 Signal 要求验证码或外部深链,这部分回调需要后续单独适配。 - 官方更新通道已关闭,避免官方包覆盖独立翻译版;上游的版本过期检测保留。需要持续合并 Signal 更新并重新发行,不能永久停留在这个构建。 - 关联真实账号、实际收发消息和多种消息类型需要用户在自己的 Signal 账号中验收;开发过程中不代发真实消息。 - 关闭窗口、退出应用和卸载沿用普通 macOS 应用习惯;删除 `.app` 不会自动删除独立资料目录。 ## 源码与许可 继承上游 GNU AGPLv3,完整许可见 `LICENSE`;新增代码也使用 `AGPL-3.0-only`。分发时请一并提供对应完整源码和构建说明,保留上游版权及第三方许可。应用使用上游 Signal 官方图标,名称为「Signal翻译版」。本项目非 Signal 官方产品,未获 Signal 官方背书;Signal 名称、图标及商标归其权利人所有。