装好一个 CLI,给 Cursor 发一条提示词,你的 Next.js 项目就能从纯英文 JSX 变成可运行的多语言应用:带 [locale] 路由、自动生成的翻译键,每次推送都自动同步。globalize.now 是 AI 驱动的本地化基础设施,专门补上 Cursor 跳过的 i18n 工作:提取硬编码字符串、生成 next-intl 键和语言文件,并在每次 Git 推送时保持翻译同步。下文的演示基于标准的 App Router 项目。我们的测试仓库全程耗时:13 分 40 秒。
用 Cursor 构建 Next.js 界面,到底哪里出了问题?
Cursor 优化的目标是“能跑的 UI”,而不是架构。它根据自然语言指令生成代码,再通过提示词修改局部代码,所以 JSX 会按人写快速原型的方式来写:文本直接内联,没有翻译键,没有语言文件,也没有 [locale] 路由段。
Cursor 生成的典型 Next.js 页面大概长这样:
// app/page.tsx
export default function Home() {
return (
<main>
<h1>Welcome to Acme</h1>
<p>Get started in seconds.</p>
<button>Sign up</button>
</main>
)
}
一个页面就有三处硬编码字符串。真实应用里,几十个组件加起来有几百处。Pages Router 以前内置了 i18n 配置,App Router 成为默认方案后这项配置被移除了,开发者得自己配置中间件、动态路由段,再接入 next-intl 之类的外部库。Cursor 的默认行为不会替你做其中任何一件事。
结果就是我们在 为什么每次发布,Lovable 应用的翻译都会出问题 里讲过的那套老路:代码库越长越大,硬编码字符串不断堆积,“下个月加上西班牙语”变成耗时数周的重构。
如何在 Cursor 项目中接入 globalize.now?
在 globalize.now 连接你的仓库。首次转换只需在应用内运行一次:它读取仓库,把硬编码字符串替换为翻译键,并提交一个 PR 供你审阅。之后每次推送,都会自动翻译新增的内容。
如果想在 Cursor 里完成这次首轮转换,在项目根目录安装 Skill 即可:
npx skills add globalize-now/globalize-skills
CLI 会检测你的技术栈,为 Cursor 选好对应的预设,并把 Agent 规则安装到项目中。在 Next.js 16 App Router 项目上,输出如下:
✓ Stack detected: Next.js 16 (App Router)
✓ Editor detected: Cursor
✓ Preset selected: globalize-guide + next-intl
✓ Installed 4 skill files to .cursor/rules/
Done in 1.2s
Skill 文件与你现有的 Cursor 规则放在一起。它们告诉 Cursor Agent 如何提取字符串、如何生成符合 next-intl 约定的键,以及如何配置 [locale] 路由段。一切都在本地完成,你的代码不会被上传。
如果你用的是 Claude Code 或 Codex 而不是 Cursor,CLI 会为这些工具安装对应的 Skill 文件。后续流程完全一致。
Agent 如何从 Cursor 代码库中提取硬编码字符串?
打开 Cursor 的 Agent 面板,发送一条提示词:
Set up i18n for this project. Use English, Spanish, German, and Arabic.
Agent 加载已安装的规则,扫描 app/ 和 components/ 目录,然后给出报告。对于一个 12 页的营销站点,报告通常长这样:
Detected Next.js 16 with App Router.
Found 47 hardcoded strings across 12 components.
Best fit: next-intl. RTL required for Arabic.
Plan:
- Install next-intl
- Move app/* into app/[locale]/*
- Generate i18n/request.ts and middleware.ts
- Extract 47 strings to messages/en.json
- Convert JSX to useTranslations / getTranslations calls
Proceed? (y/n)
Agent 做的,正是 next-intl 文档里所说的“最麻烦的部分”:中间件、动态路由段、请求配置,以及逐个组件改用翻译 Hook。你审阅计划并确认后,Agent 会以一次多文件修改的形式完成改动,你可以在 Cursor 的 diff 视图中接受或拒绝。
它如何生成 next-intl 翻译键和语言文件?
你批准计划后,Agent 会生成标准的 next-intl 目录结构。仓库里新增四样东西:
i18n/
request.ts
routing.ts
middleware.ts
messages/
en.json
es.json
de.json
ar.json
app/
[locale]/
layout.tsx
page.tsx
...
在 messages/en.json 中,提取出的 47 个字符串会变成带命名空间的键,按组件或路由分组:
{
"Home": {
"heading": "Welcome to Acme",
"lede": "Get started in seconds.",
"signupCta": "Sign up"
}
}
原来的 page.tsx 会被改写:客户端组件使用 useTranslations,服务端组件使用 getTranslations。这一步是自动区分的,Agent 会检查组件是否带有 "use client" 指令,再选用对应的 Hook。
西班牙语、德语和阿拉伯语的 JSON 文件会生成首轮翻译,并遵循 Agent 根据你的组件名和 prop 名构建的术语表。品牌词保持英文。RTL 也已接入布局:dir 属性由 locale 决定,能识别的地方,CSS 逻辑属性会取代固定的 left/right 工具类。
这和我们在生产环境 monorepo 上跑过的端到端流程是同一套,详见 AI Agent 给真实 monorepo 做国际化,会发生什么?。演示形式一样,只是输入不同。
首次运行之后,Git 推送同步是如何工作的?
首次转换只做一次,同步则永远持续。
Agent 完成后,你在控制台把仓库连接到 globalize.now。从此之后:
Push to main
↓
globalize.now diffs against last synced state
↓
New hardcoded strings get extracted + keyed
↓
Translations generated for every configured locale
↓
PR opened with locale file updates
不需要打开 Cursor,也不需要运行 Claude Code。同步发生在 Git 层,所以无论下一批 UI 是哪个工具写的,都能照常工作。下周 Cursor 重新生成某个组件、多加了三个按钮,这些按钮会在下一个 PR 里带着翻译一起出现。
没有手动导出,没有审核队列,也没有 CSV 来回倒腾。承诺与我们在 如何用 globalize.now 让你的应用走向全球 中写的一致:配置一次,每次推送自动同步。
如果你已经手写了 next-intl 配置呢?
Agent 会先读取它。
如果 i18n/request.ts 已存在,Agent 会沿用你的配置,而不是覆盖它。如果 messages/en.json 里已经有 Pricing.heading,Agent 会复用这个键,而不是新建一个。如果你的命名空间约定是 pricing.heading(小写加点号),而不是 Pricing.heading(PascalCase 加嵌套),Agent 也会照着你的风格来。
Agent 唯一不会做的,就是悄悄覆盖已有的语言文件。遇到键冲突,它会停下来询问。这一行为写在 npx skills add globalize-now/globalize-skills 安装的 Skill 规则里,不需要你另行配置。
globalize.now 就是为此而生。连接你的 Next.js 仓库,转换只需在应用内运行一次;之后在编辑器里的工作由 npx skills add globalize-now/globalize-skills Skill 接手。了解运作方式,请访问 globalize.now。
globalize.now 把硬编码的应用文案转换为可直接翻译的语言文件,并在你持续发布时保持同步更新。
免费试用 globalize.now