一个会说所有语言的无头 CMS
内容建模一次,用可链式调用的 SDK 查询,并从边缘节点分发每种语言——不需要单独的翻译流水线,也不必为每种语言复制条目。
内容模型 · blog-posts
一个条目 · 三种语言
3 locales · 2 published · 1 draft
01 · Query
每个页面一次链式调用
这个 SDK 读起来像一个数据库客户端:选择模型、加过滤条件、展开关联、指定语言。返回的结果已经本地化好了。
- 无需编写 API 层即可筛选、排序和分页。
- 请求某种语言就得到那种语言——回退逻辑由我们处理。
- 在同一次往返中展开关联,而不是发出 N+1 次请求。
const { data } = await client
.from("blog-posts")
.language("tr")
.expand(["author", "category"])
.eq("status", "published")
.order("publishedAt", "desc")
.limit(10)200 OK · 41ms · edge cache HIT
10 entries · tr · author + category expanded
02 · Capabilities
一个多语言 CMS 真正需要的一切
内容建模、按字段本地化和发布状态——底层复用翻译平台所用的同一套 MCP 与 CDN 管道。
Content models
在控制台中定义字段一次,每个条目都会继承该 schema 及其校验规则。
Per-field localization
把某个字段标记为本地化,它就会为每种语言存储一个值——包括 URL slug。
Relations & expand
关联作者、分类或产品,并用 expand 在一次请求中一并取回。
Draft → published
条目带有状态,因此未完成的翻译永远不会出现在生产环境的读者面前。
MCP for agents
AI 代理通过带类型的 MCP 工具来创建、翻译和发布条目,而不是去抓取管理后台界面。
Edge delivery
读取请求由与你的翻译相同的 CDN 提供,并具备 stale-while-revalidate 的容错能力。
03 · Adapters
直接放进你已经在用的框架里
一个 provider,一个 hook。各适配器的唯一区别在于它们如何接入各自框架的生命周期。
Next.js
@better-i18n/content/adapters/nextjs
React
@better-i18n/content/adapters/react
Expo
@better-i18n/content/adapters/expo
Vue
@better-i18n/content/adapters/vue
Svelte
@better-i18n/content/adapters/svelte
Vanilla JS
@better-i18n/content
04 · Better together
内容与翻译共用同一个 CDN
条目和界面文案通过同一条流水线发布,因此一次发版绝不会只翻译一半:界面文案和 CMS 中的内容会同时上线。
UI strings
从代码中扫描出键,结合术语表上下文翻译,然后发布到边缘节点。
Long-form entries
带有按字段本地化、草稿和关联关系的建模内容。
读者真正会打开的内容
按条目、语言和国家统计浏览量——让你只翻译真正被关注的内容。
“卡尔纳的双语学校是一个适应性很强的学校。在这里,你可以找到自己的兴趣和爱好。”

Tevfik Can Karanfil
创始人,Carna