跳转到内容

实战范例:翻译 i18n 文件

这份范例演示如何翻译网页和移动应用的本地化文件。yaku 会提取字符串值、翻译后写回——key 和结构完全不经过 LLM。

输入(locales/en.json):

{
"greeting": "Hello!",
"farewell": "Goodbye!",
"login": "Log in",
"signup": "Sign up",
"settings": "Settings"
}
Terminal window
yaku --to zh-CN -f locales/en.json -o locales/zh-CN.json
yaku --to ja -f locales/en.json -o locales/ja.json

输出(locales/zh-CN.json):

{
"greeting": "你好!",
"farewell": "再见!",
"login": "登录",
"signup": "注册",
"settings": "设置"
}

yaku 可以处理深层嵌套 JSON:

{
"nav": {
"home": "Home",
"about": "About Us"
},
"errors": {
"404": "Page not found",
"500": "Internal server error"
}
}
Terminal window
yaku --to zh-CN -f en.json -o zh-CN.json

所有 key、嵌套结构、数字和布尔值都会保留,只有字符串值会被翻译。

输入(config/locales/en.yaml):

en:
activerecord:
errors:
messages:
blank: "can't be blank"
invalid: "is invalid"
taken: "has already been taken"
views:
pagination:
next: "Next"
previous: "Previous"
first: "First"
last: "Last"
Terminal window
yaku --to zh-CN -f config/locales/en.yaml -o config/locales/zh-CN.yaml

输出(config/locales/zh-CN.yaml):

en:
activerecord:
errors:
messages:
blank: "不能为空"
invalid: "无效"
taken: "已被使用"
views:
pagination:
next: "下一页"
previous: "上一页"
first: "第一页"
last: "最后一页"

将一个源文件翻译成多种语言:

#!/bin/bash
SOURCE="locales/en.json"
LANGUAGES=("zh-CN" "ja" "ko" "fr" "de" "es")
for lang in "${LANGUAGES[@]}"; do
yaku --to "$lang" -f "$SOURCE" -o "locales/${lang}.json"
echo "已生成 locales/${lang}.json"
done

UI 用词通常需要精确且一致的翻译。创建一份术语表:

.yaku-glossary.yaml
zh-CN:
Sign up: 注册
Log in: 登录
Log out: 退出登录
Settings: 设置
Dashboard: 仪表盘
Profile: 个人资料
ja:
Sign up: サインアップ
Log in: ログイン
Log out: ログアウト
Settings: 設定
Dashboard: ダッシュボード
Terminal window
yaku --to zh-CN -f locales/en.json -o locales/zh-CN.json
# 术语表会自动从 .yaku-glossary.yaml 加载
  • 从源语言翻译。 一律从 en.json(或你的源语言)翻译,而不是从另一个翻译过的文件。
  • 使用术语表确保 UI 一致性。 按钮、标签和导航项目应该在所有地方使用相同的翻译。
  • 检查复数形式。 不同语言处理复数的方式不同。翻译后请确认你的 i18n 框架正确处理了复数形式。
  • 注意插值变量。 如果 i18n 文件中包含 {{name}}%{count} 等变量,请确认它们在输出中被保留。