关于 verbaly
Verbaly 是面向应用开发团队的 i18n 编译器和运行时,支持在代码中编写文本并获得类型化翻译与 CI 检查。它提取消息并生成键,还提供 MCP 服务供 Agent 起草翻译,草稿须由人批准。
主要功能
- 01提取消息并生成稳定键
- 02根据消息文本推断类型化参数
- 03在 CI 中检查缺失或损坏的翻译
- 04导出目录以供翻译工作流使用
- 05在本地面板中审阅草稿
适用场景
- 01开发应用文本时添加翻译
- 02发布前发现缺少参数或复数形式
- 03使用 Agent 准备翻译草稿
- 04在 Studio 中审阅并批准草稿
MCP 相关
@verbaly/mcp 服务将翻译工作流提供为工具,并提供项目配置和目录的资源。Agent 可以创建草稿,但批准由人完成。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
9收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dir | string | 否 | 语言目录(默认值:locales) |
| root | string | 否 | 包含 verbaly.config 的项目根目录(默认为服务器工作目录) |
| locales | array | 否 | 所有语言环境,包括源语言 |
| sourceLocale | string | 否 | 编写内容所用的语言(默认值:en) |
详细介绍
在代码中编写文本,以各种语言发布。
一款 i18n 编译器和轻量级运行时,支持 React、Vue、Svelte、Next.js、Nuxt、SvelteKit、Astro 和纯 HTML。
无需同步维护键文件,参数类型从文本中推导,并通过 CI 门禁阻止有问题的翻译。
设计理念
大多数 i18n 工具都要求你为每个句子创建一个键,按语言分别写入文件,再手动让这些文件与代码保持同步。Verbaly 则反其道而行:
// with key files: name it, write it in en.json, es.json, pt.json, keep them in sync
t('dashboard.welcome_back', { name });
// with Verbaly: write the sentence where it is used
t`Welcome back, ${name}`;
// and the compiler writes a stable key and a typed call for you
t('ESsQIvlA', { name });
发布的运行时经 gzip 压缩后仅 3.35 KB,且零依赖。每次发布时,都会通过此仓库中的检查进行测量(pnpm --filter verbaly size)。
快速开始
pnpm add verbaly @verbaly/vite
pnpm add -D @verbaly/compiler # the verbaly command: init, extract, check
npx verbaly init
// vite.config.ts
import verbaly from '@verbaly/vite';
export default { plugins: [verbaly()] };
// anywhere in your app: extracted and typed on save
import { t, setLocale } from 'verbaly/app';
t`Hello ${name}`;
await setLocale('es'); // loads only the Spanish module
verbaly/app 是项目自己的模块:插件会根据你的配置生成它,其中已包含你的语言和目录。Next.js、Nuxt、SvelteKit 和 Astro 都有各自的一行设置:在上方选择对应框架,或阅读完整文档:**https://verbaly-web.vercel.app/docs**。
Verbaly 的优势
✍️ 无需键文件你只需写出句子。编译器会为其命名,并让每种语言的文件始终与你的代码保持同步。 | 🧷 从文本推导类型{name}、复数、货币和日期都来自消息本身,因此错误或缺失的参数会导致编译失败。 | 🛑 有问题的内容不会发布verbaly check 会用通俗易懂的语言指出缺失的翻译,以及丢失了 {param}、标签或复数形式的翻译。 |
🪶 轻巧快速零依赖、每种语言一个模块,并且每次发布都会与 i18next 进行热路径基准测试。 | 🔄 适配各种工作流为译者提供纯 JSON、XLIFF、CSV 和 gettext PO,支持 Android 和 iOS 导出,也支持由人工审核的 AI 草稿。 | 🤖 为 Agent 做好准备提供 MCP 服务、Agent Skill 和llms.txt,Agent 可以撰写草稿,但绝不能批准草稿。 |
npx verbaly-studio
Studio 通过 localhost 提供项目服务:显示缺少什么、什么出了问题、机器写了什么,以及每段文本在代码中的位置。JSON 文件是数据库,git 则记录历史;每次保存都会运行与 verbaly check 相同的验证,而且绝不会修改源文本。
对比
| Verbaly | i18next | Lingui | Paraglide | typesafe-i18n | |
|---|---|---|---|---|---|
| 类型安全的键和参数 | ✅ 从文本推断 | 插件/手动 | 部分支持 | ✅ | ✅ |
| 运行时大小(gzip) | 3.35KB,零依赖 | 13.6KB(19.0 +react) | 2.2KB(3.3 +react) | 编译后 | 1.2KB |
| 设置 | 1 个 Vite 插件 | 配置繁琐 | 宏 + Babel/SWC | inlang 项目 | 生成器 |
| 键维护 | 无需维护,自动提取 | 手动 | 提取 → 编译步骤 | 手动 | 手动 |
| 动态/CMS 内容 | ✅ 真正的运行时路径 | ✅ | ✅ | ⚠️ 较弱 | ✅ |
| 纯 HTML(无框架) | ✅ DOM 解释器 | ❌ | ❌ | ❌ | ❌ |
| 缺失翻译拦截 | ✅ 仅导致 CI 失败 | 运行时警告 | CI 步骤 | ✅ | ❌ |
| 错误翻译拦截 | ✅ 仅导致 CI 失败 | ❌ | ❌ | ❌ | ❌ |
| 目录格式 | 纯 JSON | JSON | PO/JSON | inlang 格式 | TS 文件 |
大小为各库主入口在 React 外置时的 min+gzip 大小,使用相同方法于 2026-10-15 测得。
编码 Agent
claude mcp add verbaly -- npx -y @verbaly/mcp
MCP 服务通过工具向你的 Agent 提供完整流程,并提供结构化输出以及用于读取配置和目录的资源。机器翻译会一直保留为草稿,直到有人批准(使用 verbaly review --approve 或 Studio);批准操作特意不作为工具提供。Agent Skill 会指导写入、提取、检查和翻译流程(npx degit AronSoto/verbaly/skills/verbaly .claude/skills/verbaly),文档还发布了 llms.txt。
软件包
| 软件包 | 内容 |
|---|---|
verbaly | 运行时:t、Intl 格式、区域设置辅助工具和 DOM 解释器 |
@verbaly/compiler | 提取、类型化代码生成、门禁和 verbaly 命令 |
@verbaly/vite · @verbaly/unplugin | 打包工具插件:Vite,以及 webpack、Rollup、esbuild 和 Rspack |
@verbaly/react · @verbaly/vue · @verbaly/svelte | 框架适配器:hooks 或组合式函数,以及 <Trans> |
@verbaly/next · @verbaly/nuxt · @verbaly/sveltekit | 服务端渲染:按请求确定语言,无闪烁地进行水合 |
@verbaly/astro | Astro 集成:.astro 提取和按语言静态构建 |
@verbaly/mcp | MCP 服务:将翻译流程作为 Agent 的工具 |
@verbaly/studio | 本地审核面板 |
所有软件包共用一个版本号,每次发布都通过 CI 发布,并附带 npm 来源证明。
编辑器:悬停即可查看键对应的文本
生成的键是哈希,因此在差异中看到 t('a1B2c3D4') 并不能告诉你任何信息。i18n-ally 扩展在你将其指向目录后,会以内联方式显示实际文本。只需两个文件,无须更改 Verbaly 配置:
.vscode/settings.json
{
"i18n-ally.localesPaths": ["locales"],
"i18n-ally.keystyle": "flat",
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "en"
}
.vscode/i18n-ally-custom-framework.yml
languageIds:
- javascript
- typescript
- javascriptreact
- typescriptreact
- vue
- svelte
- astro
usageMatchRegex:
- "[^\\w\\d]t\\(\\s*['\"`]({key})['\"`]"
monopoly: true
keystyle 必须与目录匹配:点分键使用 flat,分组使用 nested。请用该扩展读取,而不要用它写入:它的提取和重命名操作假定键由你管理,而这里负责管理的是编译器。
开发
pnpm install
pnpm build # tsdown: ESM + CJS + .d.ts
pnpm test # each package's suite
pnpm typecheck
pnpm --filter verbaly bench # the hot path against i18next
Verbaly 处于 0.x 阶段:API 在次要版本之间仍可能发生变化,每项变更都会记录在变更日志中。欢迎贡献:请参阅 CONTRIBUTING.md。
反馈
赞助
Verbaly 采用 MIT 许可、没有依赖项,由独立开发者构建。如果它为你节省了时间,赞助项目将为迈向 1.0 提供资金支持:更多集成、更快发布和长期维护。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。