关于 I1n
i1n 是面向工程、产品和内容团队的开源本地化平台,包含 CLI、SDK 和 MCP 服务。它可与仪表板同步翻译文件、生成类型化键,并支持 AI 翻译及冲突感知更新。
主要功能
- 01提取、推送和拉取翻译
- 02按术语规则进行 AI 翻译
- 03通过三方差异保留仪表板编辑
- 04生成类型化 TypeScript 键
- 05离线检查语言文件
- 06支持多种翻译格式
适用场景
- 01通过编码 Agent 本地化硬编码字符串
- 02同步团队仪表板中编辑的翻译
- 03在 CI 中检查覆盖率和占位符
MCP 相关
MCP 服务提供状态、检查、同步、翻译、提取、语言管理、搜索和桥接设置等工具。AI 助手可执行本地化任务,推送遇到冲突时默认中止。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
9收录的工具列表 · 更新于 3 周前
此工具无需参数。
详细介绍
i1n.ai
面向产品和工程团队的 AI 本地化平台。 Lokalise、Phrase 和 Crowdin 的替代方案。提供仪表板、CLI 和 MCP 服务。

此仓库包含 i1n.ai 的开源(MIT)CLI、SDK 和 MCP 服务。翻译文件保留在你的仓库中。你的 AI Agent 会提取字符串、推送字符串、按照术语规则进行翻译,并拉取带类型的键。产品、运营和内容团队成员可以直接在仪表板中编辑文案,而不必向你提交工单;下一次执行 i1n pull 就会将他们的更改同步到仓库中。
适用对象
- 工程师: 将语言环境文件保留在 git 中,使用
i1n push/i1n pull同步,获取带类型的键(i1n.d.ts),并通过 CI 检查发现缺失的键或损坏的占位符。 - AI Agent(Claude Code、Cursor、Windsurf、Codex): MCP 服务将整个流程封装为工具,因此“国际化此组件”最终会转换为
t('key')调用,并填充所有语言环境。 - 产品、运营和内容团队: 在仪表板中编辑各种语言的文案,并使用术语规则、审核队列和角色功能。推送操作绝不会静默覆盖他们的编辑内容(三方差异比较)。
工作流程
- 提取: Agent 找出硬编码的字符串,并调用
i1n_extract_and_translate。 - 推送: 使用三方差异比较将键推送到 i1n,从而保留仪表板中的编辑内容。
- 翻译: 使用 AI 翻译成 182 种语言,并提供占位符保护、品牌语调和术语规则。
- 拉取: 将语言环境文件和生成的 TypeScript 类型放回仓库。
- 检查: 在 CI 中运行
npx i1n check --min-coverage 95,在发布前发现偏差。
通过 Bridge Mode 与你当前使用的库配合使用(i18next、next-intl、vue-i18n、react-intl)。支持的格式:JSON、ARB、Android XML、iOS .strings、YAML。
已在 belo 投入生产使用。这是一家拥有 350 万用户的拉美金融科技公司,约有 30 名产品和运营人员使用该仪表板。
📦 安装
# To use the CLI (global)
npm install -g i1n
# To use the SDK + types (in your app)
npm install i1n
# Local CLI usage (optional)
npm install -D i1n
支持 npm、pnpm、yarn 和 bun。
🏁 快速入门
# 1. Initialize (auth + auto-detect setup)
i1n init
# 2. Push your translation keys
i1n push
# 3. Pull translations + auto-generated TypeScript types
i1n pull
✨ 主要功能和命令
🛠️ i1n init
通过交互式设置为你的工作区做好准备。
- 通过 API 密钥进行身份验证。
- 还没有密钥? 如果你还没有密钥,CLI 会清楚地说明如何开始使用。
- 自动检测框架(Next.js、Vite、Expo、Flutter、Rails 等)。
- 将配置保存到
i1n.config.json(通过.gitignore自动忽略)。 - AI 编排: 可选为你的 AI 编码工具设置规则。
⬆️ i1n push
将本地翻译同步到 i1n。
- 检测新增的键和源内容变更。
- 智能翻译:提供缺失键的翻译选项,并在继续前估算费用。
- 高效的缓存层 — 重复翻译的费用仅为全新翻译的一小部分。
- 三方差异比较 — 推送只会发送你实际更改的(键、语言)对,绝不会覆盖通过控制面板或其他队友所做的编辑。完整的冲突处理模型请参阅团队工作流。
标志:
--translate [langs]— 推送后触发 AI 翻译(例如:--translate es,fr,ja)--strategy <mode>— 处理实际冲突的方式:interactive(TTY 中的默认值)、ours、theirs、abort--force—--strategy ours的简写(用本地值覆盖服务端;具有破坏性)
⬇️ i1n pull
下载翻译并生成类型安全的 ID。
- 以已配置的格式更新本地语言环境文件。
- 生成
i1n.d.ts,提供完整的 IDE 自动补全。
📊 i1n limits
实时用量跟踪。
- 查看当前套餐和额度用量。
- 监控启用的语言槽位和可用容量。
✅ i1n check
在发布前发现有问题的翻译。专为 CI 打造。
- 检测每种语言缺失的键、损坏的插值占位符(翻译中丢失了
{{count}})、空值和格式错误的文件。 - 如果翻译覆盖率低于设定阈值,
--min-coverage 95会使构建失败。 - 使用
--json供工具处理。退出代码:0表示无问题,1表示发现错误,2表示配置问题。 - 完全离线 — 无需 API 调用,CI 中也无需密钥。
# .github/workflows/ci.yml
- name: Validate translations
run: npx i1n check --min-coverage 95
🧠 i1n setup-ai
让你的 IDE 成为本地化专家。
- 为 Cursor(
.mdc)、Claude Code(CLAUDE.md)、Windsurf 等生成项目专属规则。 - 确保 AI Agent 遵循你的命名约定、文件结构和品牌风格。
🔌 i1n mcp
面向 AI 编码助手的 MCP 服务。
启动 Model Context Protocol 服务,让 Cursor、Claude Code、Windsurf 和其他 AI 助手可以直接从你的 IDE 执行 i1n 命令。
# Add to Claude Code
claude mcp add i1n -- npx i1n mcp
# Or add to .mcp.json / cursor config
{
"mcpServers": {
"i1n": {
"command": "npx",
"args": ["i1n", "mcp"]
}
}
}
提供 9 种工具:
| 工具 | 描述 |
|---|---|
i1n_status | 获取项目状态、套餐、限制和启用的语言 |
i1n_check | 离线验证语言环境文件:缺失的键、损坏的占位符、覆盖率 |
i1n_push | 使用三方差异比较推送本地翻译文件(保留服务端编辑;发生冲突时中止,以便 Agent 解决) |
i1n_pull | 拉取翻译并生成类型安全的 TypeScript 定义 |
i1n_translate | 使用 AI 将键翻译成指定语言 |
i1n_add_language | 添加新语言,可选自动翻译 |
i1n_extract_and_translate | 从代码中提取字符串,推送为键,并翻译成所有语言 |
i1n_search | 按名称或值搜索现有翻译键 |
i1n_setup_bridge | 检测你的 i18n 库(i18next、vue-i18n、next-intl 等),并端到端配置 i1n bridge 模式 |
**示例:**告诉你的 AI Agent“将这个组件国际化”:
- Agent 读取你的文件并找出硬编码的字符串
- 它使用提取的字符串调用
i1n_extract_and_translate - i1n 推送这些键,将其翻译成所有启用的语言,并生成类型
- Agent 使用
t('key')调用重写你的组件
👥 团队工作流
i1n 专为多人并行编辑翻译的团队而设计 — 不同分支中的开发人员、在控制面板中工作的文案人员,以及通过 MCP 操作的 AI Agent。运行 i1n push 时无需担心本地工作树会覆盖其他人的编辑。
push 如何决定发送哪些内容
每次 push 前,CLI 都会:
- 读取本地语言环境文件(
L)。 - 向服务端查询现有哪些键,以及每个键的最后修改时间(仅包含元数据的轻量级调用,大小约为完整 pull 的 1/50)。
- 如果自上次同步后服务端有任何变更,则获取完整的服务端状态(
S)。 - 将每个
(namespace, key, lang)与上次同步的基线(P,存储在locales/.i1n-push-state.json中)进行三方差异比较。
对于每个 (key, lang),差异比较会将其归入以下类别之一:
| 本地 | 服务端 | 基线 | 操作 |
|---|---|---|---|
== 服务端 | — | — | 未变更,跳过 |
== 基线 | 已变更 | — | 仅服务端变更 — 自动拉取到本地语言环境文件 |
| 已变更 | == 基线 | — | 本地编辑 — 推送此项 |
| 已变更 | 已变更 | 双方都有变更 | 冲突 — 交互式解决 |
| 缺失 | 存在 | 基线中存在 | 发出警告,不传播(没有删除操作) |
只会发送本地确实有变更的语言。未修改的语言不会包含在载荷中,因此服务端会按语言合并并保留它们。不会再出现“我的 push 悄悄覆盖了我从未打开过的 yield_rate”。
发生实际冲突时
实际冲突是指自上次同步以来,你和其他人都编辑了同一个 (key, lang),且改成了不同的值。CLI 会显示每个冲突,并让你选择:
Conflict 1/3: common.greeting [en_us]
› Keep local: "Hello there"
Accept server: "Hi"
Abort push
- 本地 → 推送你的值,覆盖服务端。
- 服务端 → 丢弃你的本地值,并将服务端的值自动拉取到你的文件中。
- 中止 → 退出;不会推送任何内容。
对于批处理、CI 或非交互式环境,请传入一种策略:
i1n push --strategy theirs # accept all server values, push nothing for conflicts
i1n push --strategy ours # local wins (alias: --force)
i1n push --strategy abort # exit on any conflict
在非 TTY 环境中(例如未指定策略标志的 CI),push 会中止,并显示冲突差异,方便你在代码中解决。
自动拉取仅服务端变更
如果队友或有人在仪表板中更新了你从未修改过的键,push 时会自动将服务端的值写入你的本地文件,并在需要时重新生成 i1n.d.ts。最终,工作树会反映实际状态——你的 git diff 会显示引入的变更,方便你将其与自己的变更一起提交。
MCP push(AI Agent)
MCP i1n_push 工具会执行相同的差异比较,但默认在冲突时中止,因为 AI Agent 不应默默替人选择一方。响应中会报告冲突,以便 Agent 在重试前决定拉取、询问你或手动解决。
全新检出
locales/.i1n-push-state.json 按设计被 gitignore 忽略——它是工作树状态,类似于 .git/index。在全新克隆或不包含此文件的新分支中,基线会根据服务端合成。此时,任何与服务端不一致的本地内容都会被视为冲突(CLI 无法判断你是在本地编辑过,还是数据已过期)。如果你刚刚克隆仓库并希望干净地拉取所有内容,请先运行 i1n pull。
📁 支持的格式
| 格式 | 框架 | 文件示例 |
|---|---|---|
| 嵌套 JSON | i18next、next-intl、vue-i18n | en/common.json |
| 扁平 JSON | React Native、通用 | locales/en.json |
| ARB | Flutter / Dart | app_en.arb |
| YAML | Ruby on Rails | en.yml |
| Android XML | 原生 Android | strings.xml |
| Apple Strings | iOS / macOS | Localizable.strings |
| TypeScript | 类型安全 JSON | locales/en.ts |
🧩 SDK 用法
i1n 包含一个适用于 Web 和移动端 JS/TS 项目的运行时 SDK。你可以通过两种方式使用它:
独立模式 — 替换你的 i18n 库
直接使用 i1n 原生引擎,无需外部依赖。
import { init, t, setLocale } from "i1n";
// Load your translation resources
init({
locale: "en_us",
resources: {
en_us: {
auth: { login: "Login", title: "Welcome back, {user}" },
items_one: "One item",
items_other: "{count} items",
},
es_es: {
auth: { login: "Entrar", title: "Bienvenido de nuevo, {user}" },
items_one: "Un elemento",
items_other: "{count} elementos",
},
},
});
// Autocomplete and type-safety work out of the box after 'i1n pull'
t("auth.login"); // "Login"
// Support for default values (useful during development)
t("new.key", { defaultValue: "Coming soon..." }); // "Coming soon..."
// Variables & Plurals
t("auth.title", { user: "Fran" }); // "Welcome back, Fran"
t("items", { count: 5 }); // "5 items"
// Switch language at runtime
setLocale("es_es");
t("auth.login"); // "Entrar"
键解析会自动兼容嵌套和扁平结构——使用项目偏好的格式即可。
桥接模式——保留你的库,增加类型安全
已经在使用 i18next、vue-i18n 或 react-intl?只需一行代码即可将其接入 i1n,并获得完整的自动补全。
import i18next from "i18next";
import { registerI1n, t } from "i1n";
// Set up i18next as usual
await i18next.init({
lng: "en",
resources: {
/* ... */
},
});
// Connect to i1n — one line
registerI1n((key, params) => i18next.t(key, params));
// Now t() uses i18next under the hood, but with strict type checking
t("common.greeting", { name: "World" }); // Powered by i18next, typed by i1n
适用于任何库:
- vue-i18n:
registerI1n((key, params) => i18n.global.t(key, params)) - react-intl:
registerI1n((key, params) => intl.formatMessage({ id: key }, params)) - 自定义:
registerI1n((key) => myLookup(key))
复数形式
使用 _zero、_one、_other 后缀定义复数形式:
// In your translation files:
// "items_zero": "No items"
// "items_one": "One item"
// "items_other": "{count} items"
t("items", { count: 0 }); // "No items"
t("items", { count: 1 }); // "One item"
t("items", { count: 5 }); // "5 items"
插值
普遍支持以下三种语法:{var}、{{var}}、%{var}
JavaScript(不使用 TypeScript)
SDK 可在纯 JS 中运行,只是没有自动补全:
import { init, t } from "i1n";
init({ locale: "en_us", resources: { en_us: { greeting: "Hello {name}" } } });
t("greeting", { name: "World" }); // "Hello World"
⚛️ React / Preact 集成
若想获得即插即用的体验,请使用这种极简 Provider 模式。
import { createContext, useContext, useState, useEffect } from "react";
import { init, t, getLocale, setLocale as sdkSetLocale } from "i1n";
// 1. Initialize with wordings
// (In a real app, you'd probably import these from your locales folder)
init({
locale: "en_us",
resources: {
/* ... */
},
});
const STORAGE_KEY = "i1n-locale";
const I1nContext = createContext({
locale: "en_us",
setLocale: (l: string) => {},
});
// 2. Persistent Provider
export function I1nProvider({ children, defaultLocale = "en_us" }) {
const [locale, setLocaleState] = useState(() => {
return localStorage.getItem(STORAGE_KEY) || defaultLocale;
});
// Keep SDK in sync
useEffect(() => {
sdkSetLocale(locale);
}, [locale]);
const setLocale = (newLocale: string) => {
localStorage.setItem(STORAGE_KEY, newLocale);
setLocaleState(newLocale);
};
return (
<I1nContext.Provider value={{ locale, setLocale }}>
{children}
</I1nContext.Provider>
);
}
// 3. Simple Hook
export const useI1n = () => ({ t, ...useContext(I1nContext) });
用法:
const { t, setLocale } = useI1n();
return (
<div>
<h1>{t("auth.title", { user: "Fran" })}</h1>
<button onClick={() => setLocale("es_es")}>Español</button>
</div>
);
非 JS 平台
Flutter、Android 和 iOS 项目不使用 SDK,而是使用 i1n pull 生成的翻译文件(.arb、.xml、.strings),并配合各自的原生本地化系统。
🛡️ 开发者体验
🔒 隐私与安全
- 自动忽略:
i1n init会自动将敏感配置文件添加到你的.gitignore。 - 密钥管理:API 密钥仅存储在本地,不会提交到版本控制中。
- 加密传输:所有同步操作都通过安全的 HTTPS 通道进行。
🔒 零配置类型安全(TypeScript)
CLI 会生成轻量级声明文件(i1n.d.ts),自动为 i1n 包补充项目专属的键。
- 拉取:运行
i1n pull。CLI 会生成locales/i1n.d.ts,并自动更新你的tsconfig.json,让 IDE 立即找到这些声明。 - 用法:从
i1n导入t,即可获得完整的自动补全和编译时检查。无需手动映射路径。
import { t } from "i1n";
// Full autocomplete & compile-time checking
t("auth.login.title");
// ERROR: Argument of type '"auth.login.titlse"' is not assignable...
t("auth.login.titlse");
// Dynamic strings still pass through — useful for `t(item.name)`,
// runtime-built keys, etc.
declare const dynamicKey: string;
t(dynamicKey);
严格的字面量检查已于
1.3.0发布:传入不在I1nKeys中的硬编码字符串 现在会触发 TypeScript 错误(运行时不再静默显示[i1n] Missing translation警告)。类型为string的变量仍可正常使用,无需类型转换。
💳 定价
| 方案 | 价格 | 键(共享池) | 语言 | 每月 AI 翻译量 |
|---|---|---|---|---|
| Starter | $0 | 200 | 2 | 2,000 |
| Pro | $29/mo | 2,000 | 3 | 10,000 |
| Business | $99/mo | 8,000 | 6 | 30,000 |
| Enterprise | From $399/mo | Custom (25k+) | Unlimited | Custom |
所有方案均免费提供 CLI、SDK 和 MCP 服务。Starter 无需信用卡。 按组织定价,而非按处理的字数定价。所有方案均支持无限查看者。
Pro 终身版起价 $199,仅限前 200 位用户。
📄 许可证
MIT — © 2026 i1n.ai
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。