Lingo.dev CLI 可通过已配置的 本地化引擎 翻译仓库中的静态文件——包括 Markdown、MDX、Markdoc、JSON、YAML、字幕等。只需指向你的内容,运行一次,即可在源文件旁生成对应的译文文件。
支持的内容类型#
CLI 会根据文件扩展名自动识别格式,无需配置 bucket 类型。locale 信息直接体现在路径中(content/en/x.md 会变成 content/de/x.md),因此不需要 [locale] 占位符。
| 内容类型 | 格式 | 示例路径 |
|---|---|---|
| 文档 | Markdown | docs/en/getting-started.md |
| 文档 | MDX | docs/en/getting-started.mdx |
| 文档 | Markdoc | docs/en/getting-started.mdoc |
| 结构化数据 | JSON | data/en.json |
| 结构化数据 | YAML | data/en.yaml |
| 博客文章 | Markdown / MDX | blog/en/post-slug.md |
| 本地化 | Gettext PO | locale/en/messages.po |
| 本地化 | XLIFF | locale/en.xliff |
| 字幕 | SRT | subs/en/intro.srt |
支持的文件类型完整列表,请参阅 格式参考。
新 CLI 暂不支持
CSV(csv-per-locale)、VTT 字幕、纯文本 .txt 以及 Java .properties 目前暂不支持新版 CLI。请先继续通过 legacy CLI 处理这些文件,并关注更新日志了解最新进展。
前置条件#
每次运行时,内容都会经过一个本地化引擎——它的配置将决定采用哪个 LLM 模型、术语表、品牌语调和规则。先在 Lingo.dev 控制台中创建一个,再设置 CLI(Node 22+):
npm install -g @lingo.dev/cli
lingo login
lingo init
lingo linklingo init 和 lingo link 会创建 .lingo/config.json,将 CLI 连接到你的组织和引擎。请提交这个文件,让所有环境共享同一份配置。
{
"orgId": "org_abc123",
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocales": ["es", "fr", "de", "ja"],
"files": [{ "pattern": "docs/en/getting-started.md" }]
}在 CI 中,请跳过 lingo login,改为通过环境变量提供 LINGO_API_KEY。你可以在 API keys 中生成它。
文档站点#
大多数文档框架都会按 locale 目录组织译文内容。请在 files 中为每个源文件添加一个模式(或直接使用 glob)。CLI 在翻译 Markdown、MDX 和 Markdoc 时,会保留 frontmatter、代码块和组件语法不变。
{
"orgId": "org_abc123",
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocales": ["es", "fr", "de", "ja"],
"files": [
{ "pattern": "docs/en/getting-started.md" },
{ "pattern": "docs/en/setup.mdx" }
]
}运行首次翻译,回填所有目标 locale:
lingo push --backfill-missing后续运行时,lingo push 只会翻译发生变化的内容。使用 lingo pull 可拉取在其他地方生成的翻译。
根据你的框架目录约定,调整源路径:
| 框架 | 语言区域目录约定 | 参考资料 |
|---|---|---|
| Docusaurus | i18n/[locale]/docusaurus-plugin-content-docs/current/ | Docusaurus i18n 指南 |
| Nextra | 按语言区域拆分的页面或 JSON 字典 | Nextra 文档 |
| Hugo | content/[locale]/ | Hugo 多语言指南 |
| Astro | src/content/[locale]/ 或 JSON 字典 | Astro i18n 指南 |
| VitePress | [locale]/ 目录前缀 | VitePress i18n |
| MkDocs | 配合 i18n 插件使用按语言区域划分的 docs/ | MkDocs i18n 插件 |
MDX 组件
MDX 翻译会保留 JSX 组件语法。像 <Callout>、<Tabs> 和 <CodeBlock> 这样的自定义组件都会原样保留——只有其中的文本内容会被翻译。
结构化数据#
JSON 和 YAML 文件会根据扩展名自动识别并翻译。使用 键控制 可以避免不可翻译的值(如 ID、URL、配置标记)被改动。
{
"orgId": "org_abc123",
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocales": ["es", "fr", "de", "ja"],
"files": [
{ "pattern": "content/en.json" },
{ "pattern": "data/en.yaml" }
]
}通用 YAML 无需 format 字段。只有 yaml-openapi、yaml-root-key 和 android 需要在文件条目中显式指定 "format"。
以 locale 代码为根键的 YAML
以 locale 代码作为根键的 YAML 文件(常见于 Rails 和 Hugo)需要显式指定 "format": "yaml-root-key"——系统会将根键改写为目标 locale。参见 格式参考。
字幕#
SRT 字幕文件会根据扩展名自动翻译。CLI 会保留所有时间数据、字幕序号和格式标签——只有文本内容会被翻译。
{
"orgId": "org_abc123",
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocales": ["es", "fr", "de", "ja"],
"files": [{ "pattern": "subs/en/intro.srt" }]
}VTT 暂不支持
新 CLI 目前还不支持 WebVTT(.vtt)字幕。暂时请继续使用 legacy CLI 处理 VTT 文件,并关注更新日志获取最新进展。
处理大型内容#
静态内容仓库中可能包含成千上万个文件,CLI 也能高效应对:
| 机制 | 作用 |
|---|---|
| 运行状态 | .lingo/lock.json 会跟踪源内容的指纹,因此 lingo push 只会翻译新增或修改过的文件。请将它提交到仓库;每次推送时都会重新生成。 |
| 服务端并行处理 | 引擎会自动并行处理翻译,无需手动调整并发参数。 |
| 定向运行 | 可以用 glob 将一次运行限定在特定文件上:lingo push "docs/en/**"。 |
如果你想在不写入文件的情况下验证翻译是否已是最新状态(非常适合作为 CI 门禁),请运行 lingo check。
