mcpField
I
I1n

I1n

本地服务
i1n.ai开发工具23 周前更新

关于 I1n

i1n 是面向工程、产品和内容团队的开源本地化平台,包含 CLI、SDK 和 MCP 服务。它可与仪表板同步翻译文件、生成类型化键,并支持 AI 翻译及冲突感知更新。

主要功能

  1. 01提取、推送和拉取翻译
  2. 02按术语规则进行 AI 翻译
  3. 03通过三方差异保留仪表板编辑
  4. 04生成类型化 TypeScript 键
  5. 05离线检查语言文件
  6. 06支持多种翻译格式

适用场景

  1. 01通过编码 Agent 本地化硬编码字符串
  2. 02同步团队仪表板中编辑的翻译
  3. 03在 CI 中检查覆盖率和占位符

MCP 相关

MCP 服务提供状态、检查、同步、翻译、提取、语言管理、搜索和桥接设置等工具。AI 助手可执行本地化任务,推送遇到冲突时默认中止。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"i1n-cli": {
"command": "npx",
"args": [
"-y",
"i1n"
]
}
}
}
启动命令npx -y i1n

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmi1n1.4.7

工具

9

收录的工具列表 · 更新于 3 周前

此工具无需参数。

详细介绍

i1n.ai

面向产品和工程团队的 AI 本地化平台。 Lokalise、Phrase 和 Crowdin 的替代方案。提供仪表板、CLI 和 MCP 服务。

npm license MCP Listed on MCP Servers Security: DeepSec SaaSHub

demo

此仓库包含 i1n.ai 的开源(MIT)CLI、SDK 和 MCP 服务。翻译文件保留在你的仓库中。你的 AI Agent 会提取字符串、推送字符串、按照术语规则进行翻译,并拉取带类型的键。产品、运营和内容团队成员可以直接在仪表板中编辑文案,而不必向你提交工单;下一次执行 i1n pull 就会将他们的更改同步到仓库中。

免费方案 · 无需信用卡 · i1n.ai · 文档


适用对象

  • 工程师: 将语言环境文件保留在 git 中,使用 i1n push / i1n pull 同步,获取带类型的键(i1n.d.ts),并通过 CI 检查发现缺失的键或损坏的占位符。
  • AI Agent(Claude Code、Cursor、Windsurf、Codex): MCP 服务将整个流程封装为工具,因此“国际化此组件”最终会转换为 t('key') 调用,并填充所有语言环境。
  • 产品、运营和内容团队: 在仪表板中编辑各种语言的文案,并使用术语规则、审核队列和角色功能。推送操作绝不会静默覆盖他们的编辑内容(三方差异比较)。

工作流程

  1. 提取: Agent 找出硬编码的字符串,并调用 i1n_extract_and_translate。
  2. 推送: 使用三方差异比较将键推送到 i1n,从而保留仪表板中的编辑内容。
  3. 翻译: 使用 AI 翻译成 182 种语言,并提供占位符保护、品牌语调和术语规则。
  4. 拉取: 将语言环境文件和生成的 TypeScript 类型放回仓库。
  5. 检查: 在 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“将这个组件国际化”:

  1. Agent 读取你的文件并找出硬编码的字符串
  2. 它使用提取的字符串调用 i1n_extract_and_translate
  3. i1n 推送这些键,将其翻译成所有启用的语言,并生成类型
  4. Agent 使用 t('key') 调用重写你的组件

👥 团队工作流

i1n 专为多人并行编辑翻译的团队而设计 — 不同分支中的开发人员、在控制面板中工作的文案人员,以及通过 MCP 操作的 AI Agent。运行 i1n push 时无需担心本地工作树会覆盖其他人的编辑。

push 如何决定发送哪些内容

每次 push 前,CLI 都会:

  1. 读取本地语言环境文件(L)。
  2. 向服务端查询现有哪些键,以及每个键的最后修改时间(仅包含元数据的轻量级调用,大小约为完整 pull 的 1/50)。
  3. 如果自上次同步后服务端有任何变更,则获取完整的服务端状态(S)。
  4. 将每个 (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。


📁 支持的格式

格式框架文件示例
嵌套 JSONi18next、next-intl、vue-i18nen/common.json
扁平 JSONReact Native、通用locales/en.json
ARBFlutter / Dartapp_en.arb
YAMLRuby on Railsen.yml
Android XML原生 Androidstrings.xml
Apple StringsiOS / macOSLocalizable.strings
TypeScript类型安全 JSONlocales/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 包补充项目专属的键。

  1. 拉取:运行 i1n pull。CLI 会生成 locales/i1n.d.ts,并自动更新你的 tsconfig.json,让 IDE 立即找到这些声明。
  2. 用法:从 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$020022,000
Pro$29/mo2,000310,000
Business$99/mo8,000630,000
EnterpriseFrom $399/moCustom (25k+)UnlimitedCustom

所有方案均免费提供 CLI、SDK 和 MCP 服务。Starter 无需信用卡。 按组织定价,而非按处理的字数定价。所有方案均支持无限查看者。

Pro 终身版起价 $199,仅限前 200 位用户。


📄 许可证

MIT — © 2026 i1n.ai

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。