翻译 EmDash

本页内容

EmDash 的管理界面使用 Lingui 进行消息提取,使用 Lunaria 跟踪翻译进度,支持翻译。所有翻译存储在 PO (gettext) 文件中——每个语言环境一个。

翻译状态

查看翻译仪表板了解所有语言环境的当前进度。

谁可以翻译

每个翻译都必须由母语使用者或流利使用者监督。AI 生成的翻译可以接受,但仅限于流利使用者在提交前审查每个字符串并在运行中的管理面板中预览的情况下。未经监督的机器输出不被接受。请参阅下方的 AI 辅助翻译和测试你的翻译。

留下未翻译的字符串比翻译错误更好。错误的翻译会误导用户;英语回退只会给他们带来不便。

文件结构

翻译目录位于 packages/admin/src/locales/:

packages/admin/src/locales/
├── en/
│   └── messages.po    # 英语(源语言)
├── de/
│   └── messages.po    # 德语
└── ...

每个 .po 文件包含 msgid/msgstr 对。msgid 是英语源文本;msgstr 是你的翻译。空的 msgstr 意味着”尚未翻译”——Lingui 将在运行时回退到英语。

翻译字符串

  1. **查看翻译仪表板**了解哪些需要工作。检查未关闭的 PR 以避免重复工作。

  2. Fork 仓库并创建分支:

    git checkout -b i18n/zh-cn
  3. 打开你的语言环境的 PO 文件(例如,packages/admin/src/locales/zh-cn/messages.po)。

  4. 填写翻译。 每个条目如下所示:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr ""

    填写 msgstr:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr "使用 Passkey 登录"
  5. 测试你的翻译(见下文)。

  6. 提交 PR 目标为 main。标题格式:i18n(zh-cn): add/update Chinese (Simplified) translations。

需要翻译的内容

  • 每个条目的 msgstr 值。

不需要翻译的内容

  • msgid 值——这些是查找键。
  • 插值占位符如 {error}、{email}、{label}——保持原样不变。
  • XML 样式标签如 <0>、</0>——这些包裹交互元素(链接、按钮)。保留标签并翻译它们之间的文本。
  • 以 #: 开头的注释——这些是 Lingui 添加的源代码引用。

插值和标签

一些字符串包含占位符和标签:

msgid "Authentication error: {error}"
msgstr "认证错误:{error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "还没有账户?<0>注册</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "如果 <0>{email}</0> 对应的账户存在,我们已发送登录链接。"

占位符({error}、{email})在运行时被动态值替换。标签(<0>...</0>)包裹 React 组件。两者都必须在你的翻译中与源文本完全一致地出现——相同的名称、相同的嵌套结构。

测试你的翻译

  1. 编译并运行示例:

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. 在管理设置页面切换语言环境,验证你的翻译在上下文中显示正确。

伪语言环境

EmDash 附带了一个伪语言环境,它将所有包裹的字符串转换为带重音的仿制字符——"Dashboard" 变成 "Ðàšĥƀöàřð",以此类推。在伪语言环境激活时以正常英语显示的任何字符串要么缺少 t\…“ 包裹,要么来自目录之外。

要启用它,在示例目录的 .env 文件中添加以下内容:

EMDASH_PSEUDO_LOCALE=1

然后重启开发服务器。伪语言环境在登录页面和设置的语言选择器中显示为 Pseudo。切换到它可以一目了然地发现未包裹的字符串。

添加新语言

如果你的语言还没有 PO 文件:

  1. 在 packages/admin/src/locales/locales.ts 中添加语言环境:

    export const LOCALES: LocaleDefinition[] = [
      { code: "en", label: "English", enabled: true },
      { code: "de", label: "Deutsch", enabled: true },
      // ...
      { code: "vi", label: "Tiếng Việt", enabled: false },  // 添加你的
    ];

    这是唯一的事实来源——lingui.config.ts、lunaria.config.ts 和管理运行时都从这个文件派生其语言环境列表。在翻译进行中时设置 enabled: false。维护者会在语言环境有足够的覆盖率用于管理界面时启用它。

  2. 运行提取以生成空的 PO 文件:

    pnpm run locale:extract

    这会创建 packages/admin/src/locales/{你的语言环境}/messages.po,其中所有字符串已准备好翻译。

  3. 按照上述步骤翻译和测试。

翻译标准

准确性

翻译应在母语者水平上忠实地表达英语源文本。不要添加、删除或重新解释含义。如果源字符串有歧义,检查 #: 注释了解源文件位置——阅读组件代码以理解上下文。

一致性

在你的语言环境内使用一致的术语。如果你在一个地方将”collection”翻译为”集合”,不要在另一个地方改为”收藏”。如果你的语言已有翻译,在开始之前阅读现有的 PO 文件以匹配已建立的术语。

语气

管理界面使用直接、专业的语气。在你的语言中匹配这种语气——避免过于正式或过于随意的措辞。

AI 辅助翻译

你可以使用 AI 工具生成翻译,包括完整的首次翻译,但流利使用者必须监督结果:

  • 流利使用者必须审查每个字符串。AI 工具会犯只有流利使用者才能发现的微妙错误——错误的语域、不自然的措辞、不正确的技术术语。
  • 流利使用者必须在运行中的管理界面中预览翻译。AI 工具不了解布局限制或 UI 上下文。
  • 在 PR 描述中说明 AI 的使用。
  • 包含未经监督的机器翻译的 PR 将被关闭。

部分翻译

欢迎部分翻译。你不需要在一个 PR 中翻译每个字符串——任何进展都有帮助。未翻译的字符串将在运行时回退到英语。