2026/9/8 22:34:00

Ghostty 本地化实战指南:基于 gettext 的翻译流程、术语规范与协作机制

Ghostty 本地化实战指南:基于 gettext 的翻译流程、术语规范与协作机制 Ghostty 本地化实战指南基于 gettext 的翻译流程、术语规范与协作机制【免费下载链接】ghostty Ghostty is a fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration.项目地址: https://gitcode.com/GitHub_Trending/gh/ghostty导读本文是 Ghostty 终端模拟器的官方翻译者指南对应仓库 po/README_TRANSLATORS.md的完整展开。Ghostty 使用 GNUgettext体系承载界面国际化i18n并通过po/目录下的翻译文件.po将英文源串翻译为各语言。读完本文你将掌握完整的本地化工作流安装并验证 gettext 工具链、理解 locale 与翻译文件命名规范、用msginit创建新语种、正确编辑msgid/msgstr/msgctxt条目、在本地实时预览翻译效果以及如何加入语言维护团队并在CODEOWNERS中登记。全文内容均以当前仓库的文档、源码与配置为事实依据。一、开始之前安装并验证 gettext翻译 Ghostty 的界面字符串首先需要系统上装有 GNUgettext工具集提供msginit、msgmerge等命令。在绝大多数 Linux 与 macOS 发行版的软件包管理中它都位于名为gettext的软件包内可直接安装。在 Windows 上Ghostty 翻译者有以下几种安装途径按官方文档推荐排序通过社区维护的 installer 安装包通过软件包管理器Scoopscoop install gettext或 WinGetwinget install gettext二者本质上是对上述安装包的再封装通过类 Unix 环境Cygwin 与 MSYS2 也提供 gettext 软件包。[!WARNING] 与某些教程建议相反官方不建议通过 GnuWin32 安装 gettext该项目自 2010 年起便不再更新很可能无法在现代 Windows 上正常工作。安装完成后用gettext -V验证是否成功。正常输出大致如下$ gettext -V gettext (GNU gettext-runtime) 0.21.1 Copyright (C) 1995-2022 Free Software Foundation, Inc. License GPLv3: GNU GPL version 3 or later https://gnu.org/licenses/gpl.html This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Ulrich Drepper.出现类似上述gettext (GNU gettext-runtime) x.y.z的输出即表示工具链就绪可以开始本地化工作。二、命名规范locale 名与翻译文件名2.1 Locale 名称的构成一个 locale 名通常由两个字母的语言代码组成例如de、es、fr。对于存在地域变体的语言如zh、eslocale 名会追加两个字母的国家/地区代码例如es_AR表示阿根廷西班牙语。完整的 locale 名含文字系统、编码等远比这复杂但 Ghostty 并不会使用全部组成部分关于完整 locale 名的细节可参阅 gettext 官方文档。2.2 翻译文件的命名与职责划分Ghostty 的所有翻译文件都存放在仓库的 po/ 目录下包括主模板文件com.mitchellh.ghostty.pot。请不要编辑.pot模板文件——它由代码与资源Blueprint 界面文件、Zig 源码自动生成应始终与源码保持同步并交由代码贡献者负责重新生成。若发现模板存在问题请联系代码贡献者。翻译文件的命名规则是「locale 名 .po扩展名」例如de.po德语zh_CN.po简体中文zh_TW.po繁体中文打开 zh_CN.po 可以看到真实文件头文件顶部即为元数据区块后文详述下方则是大量#:源注释开头的翻译条目。截至本文所述仓库状态po/目录下已包含zh_CN、de、ja、ko_KR、ru、es_AR、pt_BR、zh_TW等 30 余个语种的翻译文件。2.3 后端如何认识这些 locale翻译者新增语种后必须让 Ghostty 的构建系统与运行时 API 认识该 locale。这份「已知 locale 白名单」记录在 src/os/i18n_locales.zig。该文件注释明确说明它被构建流程与运行时 libghostty API 共同依赖必须与po/目录中的翻译保持同步并且列表顺序有讲究——当系统只提供了不完整的 locale 信息例如只有zh而没有地区码时代码会做线性匹配并命中第一个匹配项因此常见语种排在前面可以减少线性搜索的迭代次数同等常见时按字母序排列。当前列表中zh_CN排在最前紧跟de、fr、ja等末尾是sr与srlatin。如果你不确定新语种该插在哪个位置官方建议放在列表末尾。三、编辑翻译文件条目结构、注释与元数据3.1 一个典型条目的解剖翻译文件中每条记录的结构如下节选自真实条目风格#. Translators: the category in the right-click context menu that contains split items for all directions #: src/apprt/gtk/ui/1.0/menu-surface-context-menu.blp:38 # 译注其他终端程序对 Split 皆有不同翻译此处采取最直观的翻译方式 msgctxt Context menu msgid Split msgstr 分屏各部分含义msgid英文原文串不可改动msgstr你的译文是翻译工作的核心输出msgctxt仅在多个英文串完全相同时出现用于按上下文区分同一原文——例如把 Split 在「右键上下文菜单」与「其他场景」中翻译成不同措辞源注释#: src/apprt/gtk/ui/1.0/menu-surface-context-menu.blp:38指明该字符串来自哪个源码或资源文件通常无需翻译者理会但它能帮你定位字符串在界面中的实际位置。3.2 注释的三种形式以#开头的行都是注释但用途有别前缀来源含义#.开发者开发者留给翻译者的上下文提示需要重点关注例如按钮用途、字符串出现的场景#:系统源注释记录字符串出处源码或 Blueprint 文件及行号一般无需考虑#你自己给同语种的其他翻译者看的备注仅对该 locale 生效不影响其他语言3.3 元数据区块.po文件的第一条记录msgid 是特殊条目用于存放文件自身的元数据。以 zh_CN.po 为例msgid msgstr Project-Id-Version: com.mitchellh.ghostty\n Report-Msgid-Bugs-To: mmitchellh.com\n POT-Creation-Date: 2026-08-10 10:06-0500\n PO-Revision-Date: 2026-02-12 01:560800\n Last-Translator: Leah hipluie.me\n Language-Team: Chinese (simplified) i18n-zhgooglegroups.com\n Language: zh_CN\n MIME-Version: 1.0\n Content-Type: text/plain; charsetUTF-8\n Content-Transfer-Encoding: 8bit\n Plural-Forms: nplurals1; plural0;\n翻译者完成编辑后至少应更新PO-Revision-Date修订日期与Last-Translator最后译者姓名与邮箱其余元数据字段通常无需改动。3.4 源码侧的取词机制背景知识了解翻译文件如何被消费有助于翻译者把握「哪些串会进模板」。在 Ghostty 的 Zig 实现 src/os/i18n.zig 中_直接按 Ghostty 的应用域bundle id调用dgettext查词并返回译文N_只把字符串标记为「待翻译」而不立即翻译返回原文供先存储、展示时再翻译的场景使用两者在编译期comptime被调用时都会原样返回msgid。GTK 运行时的可翻译字符串主要来自src/apprt/gtk/ui下的 Blueprint 界面文件以及 Zig 源码中i18n._(...)形式的调用统一抽取进po/com.mitchellh.ghostty.pot模板构建时各.po会被编译为.mo二进制并安装到share/locale/LOCALE/LC_MESSAGES/下供libintl读取。关于取词侧的完整机制可阅读配套的 po/README_CONTRIBUTORS.md。四、从零创建新语种翻译文件如果目标语种的.po文件尚不存在请使用msginit创建。假设你的 locale 名为X执行$ msginit -i po/com.mitchellh.ghostty.pot -l X -o po/X.pomsginit可能会询问邮箱等信息如实填写即可。它会基于com.mitchellh.ghostty.pot模板生成初始的po/X.po随后你就可以在其中逐条填写翻译。创建完成后还有两项收尾工作不可遗漏登记 locale 到构建系统打开 src/os/i18n_locales.zig在locales数组中加入你的 locale 名例如const locales [_][]const u8{ zh_CN, // - Add your locale name here (probably) }顺序非常重要理由见上文 2.3 节不确定时放在列表末尾。该文件中还有一处细节值得注意像srlatin这类带修饰符的 locale 也被合法支持且需与翻译文件名完全一致。登记到CODEOWNERS在提交 PR 前按第五章「本地化团队」一节的方法把你的.po文件映射到对应维护团队。完成上述步骤后运行zig build run即可在本地看到新语言的界面详见第五章。五、在本地查看你的翻译[!NOTE] 本地化系统目前尚未在 macOS 上实现因此在 macOS 上暂时无法预览翻译效果。此限制在 po/README_CONTRIBUTORS.md 的 macOS 小节中亦有明确说明。预览翻译非常简单核心命令是$ zig build runGhostty 默认跟随你的系统语言。若要强制使用某语种可追加参数--languageXX为你的 locale 名也可以改用环境变量LANGUAGE指定 locale 名。[!TIP] 通过LANGUAGE环境变量可以按优先级列出多个候选语言用冒号分隔如en:fr表示优先英文、缺失时回退法文这是 gettext 语义的一部分Ghostty 在 macOS 上解析系统首选语言列表时同样采用该机制见 src/os/locale.zig 中对preferredLanguages的处理。5.1 桌面环境的显示差异在 KDE Plasma 等默认启用服务端装饰server-side decorations即标题栏由窗口管理器绘制的桌面环境中标题栏等大量 UI 字符串会因此被隐藏不利于核对译文。此时可强制 Ghostty 使用客户端装饰$ zig build run -- --window-decorationclient5.2 留意重复出现的字符串Ghostty 中许多字符串会出现在多个位置。最典型的例子是右键菜单与标题栏汉堡菜单共享了相当一部分字符串例如上文的 Split/分屏 同时出现在右键「分屏」菜单与头部栏菜单中。因此修改某条翻译后应同时检查它在不同入口的呈现是否都符合预期。5.3 与语言配置项的关系如果你是终端用户而非翻译者只想切换界面语言Ghostty 还提供language配置项见 src/config/Config.zig可在配置文件中写language de其语义为强制 Ghostty 图形界面使用德语而非系统默认语言。需要注意该配置项的两点约束GTKLinux专用从 1.3.0 起可用无法在运行时热重载修改后必须完整重启 Ghostty 才能生效它只影响已翻译的 GUI 字符串不影响在 Ghostty 内运行的程序那些程序仍使用系统语言也不影响未接入翻译的非 GUI 元素。若是在开发过程中做翻译预览直接使用上文的--languageX命令行参数会更方便无需修改配置文件。六、本地化团队与 CODEOWNERS6.1 团队模型每个 locale 都有一个由该语言**维护者maintainers**组成的本地化团队负责维护对应语言翻译的持续更新。任何人都可以为任意语言贡献字符串也可以自愿加入该语言的团队。维护者与普通母语者的区别仅在于三点职责声明承诺持续更新该语言翻译当出现未翻译字符串时会通过 GitHub 的提及被偶尔通知通过 GitHub 的评审请求review requests获知其维护翻译的变更。也就是说成为维护者并无硬性门槛未来也可以随时退出。6.2 每个团队至少两名维护者Ghostty 要求每个本地化团队至少有两名维护者以便互相评审译文。同理为一个新语言提交的 PR 只有在至少两人自愿加入的情况下才会被合并——作为 PR 创建者你很可能打算持续参与维护如果你没有此打算请务必在一开始就明确说明。官方并不要求两位维护者必须互相认识。如果语言使用人数较少你甚至可以考虑邀请一位同讲该语言的朋友共同维护。6.3 在 CODEOWNERS 中登记翻译文件本地化团队在 Ghostty 的 GitHub 组织中表现为对应团队。GitHub 通过CODEOWNERS文件将文件映射到团队用于识别相关维护者。在引入一门新语言时必须把它的.po文件加进CODEOWNERS。打开仓库根目录的 CODEOWNERS 文件定位到底部的# Localization区块在其中加入一行尽量保持按字母序排列# Localization /po/README_TRANSLATORS.md ghostty-org/localization /po/com.mitchellh.ghostty.pot ghostty-org/localization /po/zh_CN.po ghostty-org/zh_CN /po/X.po ghostty-org/yy_ZZ其中X.po是你创建的翻译文件名。与翻译文件名不同本地化团队名总是同时包含语言码与国家/地区码上例中yy是语言码ZZ是国家/地区码。你可以对照真实文件确认——例如 CODEOWNERS 中po/zh_CN.po对应ghostty-org/zh_CNpo/zh_TW.po对应ghostty-org/zh_TWpo/pt_BR.po对应ghostty-org/pt_BR而sr与srlatin两个文件都归ghostty-org/sr_RS团队塞尔维亚语的拉丁与西里尔两种书写形式管辖。此外po/README_TRANSLATORS.md、po/com.mitchellh.ghostty.pot与src/os/i18n_locales.zig本身也受本地化管理团队关注改动它们会触发相应的评审。七、翻译风格指南不同语言各有其最佳实践但以下原则为所有翻译提供基调基准使用教导式但专业的语气。在区分正式/非正式语气的语言中采用互联网上教学资料惯用的正式程度。应把用户视为程序与译者的平辈而不是高高在上的顾客。用词简单易懂避免术语堆砌。对于在英语语境中常见、但在你的语言中不常见的概念应加以解释。不要过度直译外来概念。要确保译文对不了解英文原文背景的读者也能成立。本地化localize是概念在不同语言间的迁移而非逐词对译。保持风格与语气的一致性。参考前人译文并加以模仿不要在没有充分理由的情况下覆盖他人的心血。让 Ghostty 融入周边应用。术语尽量沿用既有软件生态中的通行译法即使并不完美并遵循各平台的人机界面书写规范Linux 上参照 GNOME Human Interface GuidelinesmacOS 上参照 Apple Human Interface Guidelines。八、常见问题清单翻译中最常犯的错误集中在以下几处提交前请逐项自查8.1 Unicode 省略号英文源串使用的是省略号字符…单个 Unicode 字符而不是三个英文句点...。若你的语言使用省略号译文也必须使用…。可以直接从英文源串中复制该字符。8.2 标题式大写Title caseTitle case标题式大写是英文书写的特性标题中绝大多数单词首字母大写如 This Clause Is Written In Title Case。它是命名由来——常见于标题中但英语几乎是唯一使用 title case 的语言。如果你的语言不使用 title case请不要为了照抄英文源而使用它请遵循自己语言的书写惯例。8.3 移除X-Generator字段许多.po编辑器会在元数据区自动添加X-Generator字段记录所用的编辑器名称与版本。这些字段应当删除原因有二其一不同编辑器之间会互相覆盖产生噪音其二部分工具如 Poedit会在版本变化时自动更新该行从而给 diff 引入无意义的变更。用纯文本编辑器删掉该行即可。8.4 更新元数据修订日期文件顶部元数据中的PO-Revision-Date修订日期字段极易被忽略请务必在完成翻译修改后更新它。根据文件上次由谁翻译Last-Translator最后译者字段可能也需要一并更新——确保其中是你的姓名与邮箱。最后如果文件顶部版权注释中还没有你的姓名与邮箱也请考虑补上。九、提交前的检查清单汇总整篇指南一个完整的翻译贡献流程可以概括为安装并验证 gettextgettext -V若语种不存在用msginit -i po/com.mitchellh.ghostty.pot -l X -o po/X.po创建新文件逐条翻译msgid→msgstr关注#.开发者注释并善用msgctxt区分同形串在 src/os/i18n_locales.zig 的locales数组中登记新 locale不确定就放末尾运行zig build run -- --languageX必要时加--window-decorationclient本地核对译文在 CODEOWNERS 的# Localization区块登记.po文件归属团队并确保新语言已有至少两名自愿维护者清理X-Generator字段、使用 Unicode 省略号、遵循语言自身大小写惯例更新PO-Revision-Date与Last-Translator后提交 PR。遵循上述流程即可让你的母语以专业、一致、可维护的方式进入 Ghostty——无论是新增一门语言还是修补已有翻译都欢迎参与到这个不断壮大的社区本地化工作中来。【免费下载链接】ghostty Ghostty is a fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration.项目地址: https://gitcode.com/GitHub_Trending/gh/ghostty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考