Zulip 中文翻译指南:术语表、语言风格与实战规范全解析
【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip
导读
本文以 Zulip 官方《Chinese translation style guide(中文翻译指南)》为核心,系统梳理 Zulip 简体中文本地化的术语选词、习惯用语与语气规范,并结合仓库中真实的翻译资源文件(如locale/zh_Hans/translations.json与locale/zh_Hans/LC_MESSAGES/django.po)以及 docs/translating/translating.md、docs/translating/internationalization.md 中描述的翻译工作流,帮助你理解每一个翻译决策背后的理由,从而在 Weblate 上或直接编辑翻译文件时保持术语一致、语气得体、风格统一。
总原则:口语化的英文,正式化的中文
Zulip 的英文原文文风比较口语化(colloquial),而中文翻译团队选择了一种"略微正式但不刻板"的语言风格。同时,Zulip 作为一款现代化的互联网应用,中文翻译大量借鉴了中国用户熟悉的微博、微信、QQ 邮箱等软件的习惯用语,以贴近国内用户的使用直觉。
这条总原则贯穿于下文所有的术语选择与句式处理中:先保证中文读起来自然、正式、符合用户预期,其次再谈忠实直译。这也解释了为什么本文档中大量术语采用意译而非字面直译。
核心术语表(Terms)
以下术语表是整个中文翻译体系的地基,在locale/zh_Hans/translations.json(Web 前端字符串,当前约 2282 条)与locale/zh_Hans/LC_MESSAGES/django.po(服务端字符串,当前约 8000 行)中逐条落实。任何译者在翻译前都应先核对本表,避免同一英文词在不同页面出现不同译法。
Message —— 消息
"Message" 可直译为"消息"或"信息",两者皆可,但翻译团队统一选用**"消息"**。派生译法如下:
| 英文 | 中文 | 理由 |
|---|---|---|
| Stream Message | 频道消息 | 与"频道"术语体系保持一致 |
| Direct Message | 直信 / 私信 | 借鉴微博、微信的用语习惯 |
| Starred Message | 星标消息 | 类比 QQ 邮箱的"星标邮件"功能 |
从翻译资源文件可以印证这些决策的实际落地情况:
"Go to starred messages": "前往星标消息"(locale/zh_Hans/translations.json第 857 行)"Starred messages": "星标消息"(同文件第 1611 行)"Star this message": "添加星标消息标记"(同文件第 1610 行)"You have no starred messages.": "您尚未有星标消息。"(同文件第 2115 行)
需要特别说明的是,Direct Message 在现行版本中多以**"私信"**出现,例如"Direct message": "私信"、"DIRECT MESSAGES": "私信"(同文件第 596、508 行),与微博、微信的"私信"概念一致,符合指南"与国内使用习惯保持一致"的要求。
Stream —— 频道
"Stream" 是 Zulip 最核心的组织概念。翻译团队曾考虑过"群组(Group)""主题(Subject)""版块""栏目(Column)"等候选译法,最终选择**"频道(Channel)"**,其灵感来源于游戏 Ingress 中的聊天 Channel。
选词依据有三层:
- 语义契合:Stream 可以"新建/删除(Create/Delete)",也可以"订阅/退订(Subscribe/Unsubscribe)",这组动词搭配与"频道"完全兼容;
- 结构能力:Stream 内部还可以发起"话题(Topic)"讨论,"频道"天然暗示了这种"频道内分层级"的结构;
- 简洁性:另一个备选"讨论组"(源自 QQ 的临时群组概念)多一个字,"稍微有点啰嗦"。
当前翻译资源中该决策被严格执行,例如"(link to channel)": "(链接到频道)"、"A channel with this name already exists.": "已存在同名的频道。"(locale/zh_Hans/translations.json第 7、63 行)。甚至旧术语 Stream 出现在更早版本字符串中时,也以<z-stream></z-stream>占位符形式保留并在新版本中被"Channel"取代。
Topic —— 话题
"Topic" 对应 Zulip 中频道内部的讨论子主题,统一翻译为**"话题"**。例如"(links to topic)": "(话题链接)"(locale/zh_Hans/translations.json第 10 行),以及"A topic move is already in progress.": "正在对话题进行移动。"(第 70 行)。
Invite-Only / Public Stream —— 私有 / 公开频道
"Invite-Only Stream" 指必须由频道内部用户邀请才能订阅的频道。这类频道私密性极高——用户在没有订阅时根本无法感知到它的存在。直译"仅邀请频道"读起来拗口,因此选择意译为**"私有频道"**,与"公开频道(Public Stream)"形成清晰对立。
Bot —— 机器人
统一翻译为**"机器人"**。翻译资源中可见大量应用,例如"A deactivated bot cannot send messages, access data, or take any other action.": "停用的机器人无法发送消息、访问数据或执行任何其他操作。"(locale/zh_Hans/translations.json第 64 行)。
Integration —— 应用整合
"Integration" 原意为"集成"或"整合",表示将其他应用或服务与 Zulip 实现对接。为了中文表达意思完整,补充翻译为**"应用整合(Application Integration)"**。翻译资源中也可看到与"集成"并存的实例,如"Generate URL for an integration": "生成集成的 URL"——这提示译者:指南给出的是基准,个别字符串会因语境微调,但应保持"整合/集成"同一语义族。
Notification —— 通知
统一翻译为**"通知"**,这是与"消息"并列的高频词,广泛出现在设置项与提示文案中。
Alert Word —— 提示词
"Alert Word" 指用户自定义的、能触发提醒的关键词,翻译为**"提示词"**。在资源文件中对应的现代译法为"提醒词",如"Add a new alert word": "新增提醒词"(locale/zh_Hans/translations.json第 141 行附近)——两者同义,译者可按界面语境选用。
习惯用语(Phrases)
除术语外,Zulip 英文界面中还有一批反复出现的短语。指南为它们规定了统一的、非字面的译法。
Subscribe / Unsubscribe —— 订阅 / 退订
"Subscribe/Unsubscribe" 统一译为**"订阅/退订",完成时态(Subscribed/Unsubscribed)译为"已订阅/已退订"**。英文中有时用 "Join" 表达与 "Subscribe" 相同的含义,同样翻译为"订阅"。资源文件中的实例:
"All users were already subscribed.": "全部用户均已订阅。""Skipped unsubscribed channels": "跳过未订阅频道"
Narrow to ... —— 筛选
"Narrow to ..." 表示"将范围缩小至……",指南选择翻译为**"筛选(Filter)"**,理由有二:
- 汉语中"筛选"表示按指定条件挑选,与"narrow the scope"语义共通;
- "筛选"是大众化的计算机用语,如 Microsoft Excel 的"筛选"功能,易于被普通用户接受。
同时有一个重要的语境例外:在搜索功能语境中,"Narrow to ..." 出于可读性考虑不译为"筛选"而译为"搜索"。例如资源文件中的"Narrow to direct messages that include <z-value></z-value>.": "定位至包含<z-value></z-value>的私信。"以及"Narrow to starred messages.": "筛选星标消息"——可见实际翻译会根据上下文在"筛选""定位至""搜索"之间灵活选择,译者应优先保证中文读起来自然。
Mute / Unmute —— 开启 / 关闭免打扰
"Mute" 常见的直译是"静音"(多见于电视设备语境),但用在 Zulip 中并不合适。指南选择意译为**"开启/关闭免打扰(Turn off/on Notification)"**,与微信的"消息免打扰"用语习惯一致。翻译资源中同样可见"All messages including muted channels": "全部消息包括静音频道"这类按具体场景微调的例子,但"免打扰"是设置项主译法。
Deactivate / Reactivate —— 禁用 / 启用(帐户),关闭 / 激活(社区)
这一对词根据作用对象区分译法,是最能体现"按语境翻译"的案例:
| 作用对象 | 英文 | 中文 |
|---|---|---|
| 用户账户 | Deactivated users | 禁用的用户 |
| 社区(Realm) | Your realm has been deactivated. | 您的社区已关闭 |
资源文件中有多处印证,例如"Deactivated users": "停用成员列表"(locale/zh_Hans/translations.json),以及"<z-user></z-user> 将停用包括用户、频道管理和频道订阅。"这类与停用(Deactivation)语义相关的句子。翻译时需判断当前字符串描述的是"人"还是"组织/社区",再选择"禁用/启用"还是"关闭/激活"。
Invalid —— 不正确
"Invalid" 主要用于异常信息,普通用户很少见到。可选译法有"错误""非法""不合法",为保持习惯一致,指南统一译为**"不正确"**,例如 "Invalid API key" 译为"API 码不正确"。
一个值得注意的仓库实证:在locale/zh_Hans/LC_MESSAGES/django.po中,"Invalid API key" 的实际译文是"错误的 API key"(文件第 4947-4949 行,字符串来源标注为zerver/lib/exceptions.py)。这说明指南给出的是倾向性规范,具体字符串在演进中可能被更新为更直白的说法;译者应把指南当作默认基准,同时尊重现有资源文件中已确立的译法。
I want ... —— 开启
"I want ..." 主要出现在设置页面,直译为"我想……""我要……"过于口语化,不符合中文设置界面的正式表达习惯,因此意译为**"开启(某某功能选项)"**。这条规则提醒译者:设置项文案应当描述"操作结果"而非"用户愿望"。
User / People / Person —— 用户
这三个英文词在 Zulip 中均指使用平台的个人,统一翻译为**"用户"**,不做区分。
语气与人称规范(Others)
You / Your —— 您 / 您的
出于对用户的尊重,第二人称统一使用敬语**"您/您的"**,而非"你/你的"。这一点在翻译资源中贯彻得非常彻底,几乎所有面向用户的文案都使用"您",例如"您尚未有星标消息。"、"您确定直接加入么?"。
We —— 我们(或不翻)
"We" 一般译为第一人称"我们",但中文使用习惯中不太以自我为中心,大量使用"我们"的情况较少,因此很多时候选择不翻译或转换句式。指南给出的范例:
"Still no email? We can resend it" → "仍然没有收到邮件?点击重新发送"
即把"We can resend it"转化为祈使句"点击重新发送",读起来更符合中文习惯。
感叹号与句号 ——(一般省略)
感叹号在 Zulip 英文界面中出现非常多,但英文感叹号的语气比中文略轻。因此:
- 中文翻译建议省略大部分感叹号,除非确定有必要保留;
- 句号(。)在中文排版中影响美观,一般也建议省略,句末留空即可。
这条规则直接影响界面的视觉密度,是中文翻译区别于英文排版的重要特征。
翻译风格指南在整体本地化体系中的位置
docs/translating/chinese.md只是 Zulip 多语言风格指南之一。完整的指南清单(含芬兰语、法语、德语、印地语、日语、波兰语、俄语、西班牙语)见 docs/translating/translating.md。该文档同时建议把风格指南的决策同步录入 Weblate 术语表(glossary),以便翻译界面内联提示。
从 docs/translating/internationalization.md 可以了解这些翻译文件是如何进入系统的:
- 开发者在代码与模板中用
_()、{{ t '...' }}、{{#tr}}...{{/tr}}、{% trans %}...{% endtrans %}等标记待翻译字符串; - 通过
./manage.py makemessages生成各语言的资源文件——Web 端为locale/<语言码>/translations.json,服务端为locale/<语言码>/LC_MESSAGES/django.po; - 资源文件被 Weblate 扫描,译者在线翻译;
- 维护者合并 Weblate 的提交进入代码库。
中文翻译就保存在locale/zh_Hans/目录下(Web 端translations.json、服务端django.po,另有legacy_stream_translations.json存放旧版频道相关的历史字符串)。
如何验证中文翻译效果
根据 docs/translating/translating.md 中的"Testing translations"一节,中文译者可以在本地开发环境验证翻译效果:
- 以语言码作为 URL 前缀访问:例如查看登录页中文版可访问
http://localhost:9991/zh-hans/login/(Zulip 中文语言码为zh-hans),此方法适用于包括登出页在内的所有界面; - 登录后的 Web 应用可在 Zulip UI 中直接切换语言;
- 登出页面(portico)会自动使用操作系统/浏览器配置的语言;
- Zulip 判定用户语言时遵循的优先级是:URL 前缀语言码 →
django_languageCookie → HTTP 请求的Accept-Language头。服务端默认语言码在 zproject/computed_settings.py 中由LANGUAGE_CODE = "en-us"定义,启用国际化由USE_I18N = True控制。
给中文译者的实战建议
综合指南与仓库现状,向参与 Zulip 中文翻译的译者提出以下可操作的检查清单:
- 先查术语表再动笔:遇到 Message / Stream / Topic / Bot / Mute / Deactivate 等高频词,先对照本文术语表,再在
locale/zh_Hans/translations.json与django.po中用grep检索既有译法,保持全文一致; - 区分语境再选词:Deactivate 要看作用对象(用户→禁用、社区→关闭);Narrow to 要看是否处于搜索语境(筛选 / 定位至 / 搜索);
- 不要翻译代码与变量:字符串中的
{variable}、<z-link>、<z-user>、%s等占位符与 HTML 标签必须原样保留(可参见 docs/translating/translating.md 中"Don't translate variables or code"一节),中文译文中的标点与占位符顺序应保证代码可正常插值; - 语气统一用"您",尽量少用"我们",感叹号与句末句号按指南省略;
- 留意服务端与前端两套文件:服务端 API 错误消息(如
django.po中的 "Invalid API key")同样面向用户,属于完整翻译的一部分,不应遗漏; - 关注 Weblate 中的
Django与Frontend组件:这两个组件承载服务器与 Web 应用下一个大版本的字符串,是翻译工作的优先对象。
结语
中文翻译风格指南用一套简洁的术语表和几条语气规则,解决了 Zulip 本地化中最关键的一致性问题:让翻译既保留 Zulip 产品特色,又贴合中文互联网用户的使用习惯。无论是术语(消息/频道/话题/私信/星标消息),还是语气(您、免打扰、省略标点),每一个决策都能在locale/zh_Hans/的真实翻译资源中找到落地的例证。对于新加入的译者,这份指南加上仓库中的翻译资源文件,就是保证翻译质量的最可靠参考。
【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考