Lingo.dev + .po (Gettext)

Lingo.dev CLI 翻译 GNU gettext 的 .po 文件,同时保留 msgid 引用、元数据和 gettext 特定的格式约定。CLI 完全遵循 GNU gettext 规范,兼容 xgettext、msgfmt 和 Poedit 工具,处理用于消歧的 msgctxt,支持复杂的复数形式规则,并保留所有翻译者和构建信息。

快速设置

为 gettext 可移植对象文件配置:

{
  "locale": {
    "source": "en",
    "targets": ["es", "fr", "de"]
  },
  "buckets": {
    "po": {
      "include": ["locale/[locale]/LC_MESSAGES/messages.po"]
    }
  }
}

提醒[locale] 是一个占位符,在 CLI 运行时会被实际的语言区域替换,因此应在配置中保持原样。

翻译 PO 文件

npx lingo.dev@latest i18n

在更新 msgstr 翻译的同时,保留 msgid 引用、翻译者注释和 gettext 元数据。

Gettext 结构处理

基本消息翻译

#: src/main.c:42
msgid "Welcome to our application"
msgstr "欢迎使用我们的应用程序"

#: src/dialog.c:15
#, c-format
msgid "You have %d new messages"
msgstr "您有 %d 条新消息"

复数形式

#: src/counter.c:28
msgid "One file selected"
msgid_plural "%d files selected"
msgstr[0] "已选择一个文件"
msgstr[1] "已选择 %d 个文件"

上下文处理

#: src/menu.c:12
msgctxt "menu item"
msgid "File"
msgstr "文件"

#: src/toolbar.c:8
msgctxt "document type"
msgid "File"
msgstr "文档"

元数据保留

PO 文件头信息


# MyApp 的翻译文件

# 版权所有 (C) 2024 MyCompany

# 本文件与 MyApp 软件包使用相同的许可证分发。

#
msgid ""

msgstr ""
"Project-Id-Version: MyApp 1.0\n"
"Report-Msgid-Bugs-To: [email protected]\n"
"POT-Creation-Date: 2024-01-15 10:30+0000\n"
"Language: es\n"
"Content-Type: text/plain; charset=UTF-8\n"

所有头部元数据和翻译者注释都会被精确保留。

注释类型

  • 译者注释: # 这里需要上下文
  • 提取的注释: #. 开发者关于用法的说明
  • 参考注释: #: src/file.c:123
  • 标记注释: #, c-format, fuzzy

高级配置

多域

"po": {
  "include": [
    "locale/[locale]/LC_MESSAGES/messages.po",
    "locale/[locale]/LC_MESSAGES/errors.po"
  ]
}

锁定消息 ID

"po": {
  "include": ["locale/[locale]/LC_MESSAGES/messages.po"],
  "lockedKeys": ["version", "copyright"]
}