十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Zulip 法语翻译风格指南:社区协作、语言规范与 i18n 落地实践

Zulip 法语翻译风格指南:社区协作、语言规范与 i18n 落地实践 Zulip 法语翻译风格指南社区协作、语言规范与 i18n 落地实践【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip法语是 Zulip 官方支持的主要界面语言之一其翻译质量由一套社区维护的风格指南即本仓库中的docs/translating/french.md来保障。本文以该风格指南为核心系统讲解 Zulip 法语翻译的社区协作渠道、五条核心翻译规则、术语管理方式并结合仓库中的翻译资源文件locale/fr/与国际化文档docs/translating/展开源码级佐证帮助法语译者与参与 Zulip 本地化的开发者快速上手并产出风格统一、可直接合并的高质量翻译。风格指南在 Zulip 本地化体系中的位置Zulip 为多个语言维护了独立的翻译风格指南法语是其中之一。在 翻译总指南 中Zulip 官方明确说明风格指南给出如何把 Zulip 翻译成特定语言例如 channel 一词该译成什么的建议及其理由以便后续译者理解并延续这些决策。与法语并列的语言还包括中文、芬兰语、德语、印地语、日语、波兰语、俄语与西班牙语。这些风格指南并不是孤立的文档它们与 Zulip 的两层国际化体系紧密配合服务端字符串存放于locale/语言代码/LC_MESSAGES/django.po如法语的 locale/fr/LC_MESSAGES/django.po当前仓库中约 8700 行覆盖 API 错误消息、登录等 portico 页面Web 应用字符串存放于locale/语言代码/translations.json如法语的 locale/fr/translations.json覆盖前端 Handlebars 模板与 JavaScript 中的界面文案。法语风格指南正是这两类字符串翻译时的硬性准则具体细节参见 国际化开发文档。社区协作两个专用频道法语翻译不是一个人在战斗。Zulip 官方为法语译者准备了两个协作场所见 french.md#translation频道下的 French translations 话题这是主翻译频道中的一个子话题用于汇总法语翻译相关的讨论独立的#translation/fr频道法语译者专用的讨论频道用于交流具体的翻译问题。风格指南建议所有法语译者加入并打个招呼遇到棘手的翻译时不要犹豫去问社区或补充到本指南中。这种先交流、后定稿的协作模式与翻译总指南中加入#translation频道并向社区问好、该频道也是提问和汇报进度的正确场所的流程完全一致。五条核心翻译规则french.md中列出了法语翻译必须遵守的规则它们决定了法语界面的一致性与专业性。以下逐条展开并结合仓库翻译文件验证其实际落地情况。1. 使用敬称vous而非tuZulip 的法语界面统一使用正式敬称vous而非亲近的tu。这一点在翻译资源中有大量体现例如 locale/fr/translations.json 中原文(to you)译为(à vous)原文pYou are searching for messages...译为pVous recherchez des messages envoyés par plusieurs personnes...动词recherchez即vous形式。采用vous意味着动词变位、代词、所有格形容词都要使用正式形式。比如 your organization 应处理为votre organisation而非ta organisation。这条规则是法语商务与政务软件界面的通用惯例保证任何年龄与关系的用户都感到被尊重。2. 冒号与分号前使用不换行空格non-breaking space法语排版规则要求在冒号:和分号;之前放置一个不换行空格espace insécable这与英语冒号前无空格截然不同。在翻译资源中可以看到该规则的执行痕迹例如 locale/fr/translations.json 中bNombre total de messages/b : {total_messages}—— 冒号前使用不换行空格\u00a0在 JSON 中呈现为不可见字符。在 Weblate 或直接编辑资源文件时需要使用 UTF-8 不换行空格U00A0HTML 中的nbsp;并注意保持文件编码为 UTF-8。如果译文在:前是普通空格法语用户会视为排版错误。3. 冒号、分号、句号、逗号后保留空格与英语一致法语要求在这四种标点之后留一个空格。这条规则与第 2 条共同构成了法语标点排版的完整规范标点前仅冒号/分号与标点后都要有空格。4. 遵循英文的大小写风格法语翻译不应引入法语习惯的大写规则如某些法语风格喜欢在标题中大写每个词而应遵循 Zulip 英文原文的大小写。Zulip 全局采用句子式大写sentence case策略即翻译总指南所强调的每个句子或短语的首字母大写专有名词大写URL、HTTP 等通用词保持标准写法例如正确Channel settings错误Channel Settings这一策略由测试套件强制保证./tools/check-capitalization脚本会检查所有标记为可翻译的字符串排除清单定义在 tools/lib/capitalization.py其中的IGNORED_PHRASES列表。法语译者同样可以借助该脚本验证自己的译文是否破坏了大写规范。5. 动词优先使用不定式在按钮、菜单等界面文案中Zulip 法语风格要求使用动词的不定式形式而非命令式impératif。风格指南给出的经典示例Save应译为Sauver而不是Sauvez命令式。从仓库翻译资源看这条规则同样已实际执行。在 locale/fr/translations.json 中Save: Enregistrer—— 不定式而不是EnregistrezSave changes: Enregistrer les modificationsSave draft and start a new message: Enregistrer le brouillon et commencer un nouveau messageSend: EnvoyerInvite users: Inviter des utilisateurs。可以看到界面动作类文案普遍使用-er结尾的不定式这正是界面指令对用户而言是中性陈述而非命令这一设计理念在法语中的体现。翻译新字符串时遇到英文祈使句如 Save、Send、Invite一律先考虑不定式。术语管理Weblate 词汇表风格指南指出推荐翻译请参考 Weblate 词汇表Zulip 项目法语词汇表若某些重要词汇在词汇表中缺失请在#translation/fr频道中提出。词汇表机制的意义在于处理 Zulip 的领域术语例如 channel频道、topic话题、stream旧称等贯穿整个应用的词汇必须全站一致。正如翻译总指南所说使用并更新词汇表会通过内联的术语翻译参考例如 channel提供一致的建议Weblete 会在翻译界面中直接显示这些术语建议。french.md还鼓励译者在遇到词汇表未覆盖的重要词汇时主动反馈把决策沉淀回词汇表与风格指南。从风格指南到落地法语翻译的完整工作流理解了规则之后法语译者还需要了解 Zulip 翻译的端到端流程以便正确提交与验证译文。资源文件与生成方式根据国际化开发文档Zulip 的翻译流程是开发者在源码中标记可翻译字符串Jinja2/Python 用_()、{% trans %}前端用$t()、Handlebars 的{{t}}运行./manage.py makemessages生成各语言的资源文件——Web 应用字符串写入translations.json服务端字符串写入django.po资源文件提交后由 Weblate 自动扫描译者在 Weblate 界面翻译法语译者应随时打开本风格指南Weblate 将翻译打包成 Git 提交由维护者合并。makemessages是幂等的只删除不再使用的单数键只有当对应单数键不存在时才删除复数键不会覆盖已含译文的单数键值。法语复数规则的特殊性法语属于单复数两态 特殊情况的语言。仓库中法语django.po的头部声明了复数形式Plural-Forms: nplurals3; plural(n 0 || n 1) ? 0 : n ! 0 n % 1000000 0 ? 1 : 2;\n从源码结构看法语被声明为三态复数nplurals30或1视为第一类1000000的整数倍如 100 万、200 万为第二类其余为第三类。翻译含数字的字符串如{N, plural, one {...} other {...}}时需要在 ICU MessageFormat 语法中正确写出法语对应的复数分支。前端资源文件中已有实际范例例如 locale/fr/translations.json 中的strong{username}/strong has {number_of_invites_by_user, plural, one {# unexpired invitation} other {# unexpired invitations}}.译为strong{username}/strong a {number_of_invites_by_user, plural, one {# invitation non expirée} other {# invitations non expirées}}.翻译中的通用注意事项无论使用哪个语言翻译总指南中的以下要点对法语译者同样适用不要翻译变量与代码以%开头、位于 HTML 标签...内或花括号{variable}内的内容原样保留注意大小写与标点Weblate 会对部分标点不匹配给出警告细节决定成败优先翻译Frontend与Flutter组件但Django组件中的 API 错误消息会直接展示给用户完整的法语翻译应覆盖它们机器翻译只能作为辅助Zulip 期望人工质量的翻译使用 Weblate 的自动建议Automatic suggestions生成译文后必须逐条人工复核。如何验证法语翻译翻译完成后建议在本地开发环境中验证效果。根据翻译总指南将 Weblate 远程仓库加入本地 Git 仓库并挑选合并git remote add weblate https://hosted.weblate.org/git/zulip/django/ git cherry-pick weblate/main ^upstream/main在开发环境中默认http://localhost:9991以三种方式查看法语界面URL 前缀法在任意页面 URL 前加语言代码如http://localhost:9991/fr/login/即可查看法语登录页登录态界面在 Zulip Web 应用内通过更改语言设置切换为法语请求头法浏览器/系统的Accept-Language配置会自动作用于未登录的 portico 页面也可以使用 HTTP 客户端显式传入请求头调试例如import requests headers {Accept-Language: fr} response requests.get(http://localhost:9991/login/, headersheaders) print(response.content)Zulip 的语言选择优先级为URL 前缀语言代码 →django_languageCookie →Accept-Language请求头验证时需注意当前生效的是哪一层。结语把经验沉淀回指南法语风格指南最动人的一句是有些翻译可能很棘手所以请不要犹豫向社区求助或为这份指南贡献内容。 它把风格指南定位为活文档新译者遇到词汇表未覆盖的术语、发现新的规则案例时应一边翻译一边记录把经验沉淀回french.md与 Weblate 词汇表从而让后续每一位法语译者都站在前人的决策之上。这正是 Zulip 十多种语言翻译能够长期保持高质量、全站风格统一的根本原因。对于想要加入的译者从#translation/fr频道的一声问候开始对照本指南的五条规则与词汇表翻译第一条字符串就是最好的起点。【免费下载链接】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),仅供参考
返回列表