I1n について
i1n は、エンジニアリング、プロダクト、コンテンツチーム向けのオープンソースのローカライズプラットフォームで、CLI、SDK、MCP サーバーを備えています。翻訳ファイルをダッシュボードと同期し、型付きキーを生成でき、AI 翻訳と競合を考慮した更新に対応します。
主な機能
- 01翻訳の抽出、プッシュ、プル
- 02用語ルールに基づく AI 翻訳
- 03三者差分によるダッシュボード編集の保持
- 04型付き TypeScript キーの生成
- 05ロケールファイルのオフライン検証
- 06複数の翻訳形式に対応
活用シーン
- 01コーディングエージェントでハードコード文字列をローカライズ
- 02チームのダッシュボードで編集した翻訳を同期
- 03CI でカバレッジとプレースホルダーを検査
MCP 対応
MCP サーバーは、状態確認、検証、同期、翻訳、抽出、言語管理、検索、ブリッジ設定のツールを提供します。AI アシスタントがローカライズ作業を実行でき、プッシュ時の競合は既定で中止されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
9掲載時のツール一覧 · 3 週間前に更新
このツールにパラメーターはありません。
詳細
i1n.ai
製品・エンジニアリングチーム向けの AI ローカライズプラットフォームです。 Lokalise、Phrase、Crowdin の代替として、ダッシュボード、CLI、MCP サーバーを提供します。

このリポジトリは、i1n.ai のオープンソース(MIT)CLI、SDK、MCP サーバーです。翻訳ファイルはリポジトリ内に保持されます。AI エージェントが文字列を抽出してプッシュし、用語ルールに従って翻訳してから、型付きキーをプルします。製品、運用、コンテンツの担当者はチケットを送る代わりにダッシュボードで文言を編集でき、次回の i1n pull で変更がリポジトリに反映されます。
無料プラン · クレジットカード不要 · i1n.ai · ドキュメント
対象ユーザー
- エンジニア: ロケールファイルを git で管理し、
i1n push/i1n pullで同期できます。型付きキー(i1n.d.ts)を利用でき、キー不足やプレースホルダーの破損を検出して失敗する CI チェックも行えます。 - AI エージェント(Claude Code、Cursor、Windsurf、Codex): MCP サーバーが一連の処理をツールとして公開するため、「このコンポーネントを国際化して」という指示で、
t('key')の呼び出しとすべてのロケールの入力まで完了します。 - 製品、運用、コンテンツチーム: 用語ルール、レビューボックス、ロールを利用しながら、ダッシュボードからすべての言語の文言を編集できます。プッシュによって編集内容が知らないうちに上書きされることはありません(三者間差分)。
一連の処理
- 抽出: エージェントがハードコードされた文字列を見つけ、
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。
ユーザー数 350 万人の中南米フィンテック企業、belo の本番環境で利用されており、約 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 に同期します。
- 新しいキーとソースの変更を検出します。
- スマート翻訳:不足しているキーの翻訳を、実行前にコストの見積もりを提示して提案します。
- 効率的なキャッシュ層により、繰り返しの翻訳コストは新規翻訳の一部で済みます。
- 3-way diff — push では、実際に変更した(キー、言語)のペアのみを送信し、ダッシュボードや他のチームメンバーによる編集を上書きすることはありません。競合モデルの詳細はチームのワークフローをご覧ください。
フラグ:
--translate [langs]— push 後に AI 翻訳を実行します(例:--translate es,fr,ja)--strategy <mode>— 実際に競合した場合の処理方法:interactive(TTY のデフォルト)、ours、theirs、abort--force—--strategy oursの短縮形です(サーバーの値をローカルの値で上書きします。破壊的な操作です)
⬇️ i1n pull
翻訳をダウンロードし、型安全な ID を生成します。
- 設定した形式でローカルのロケールファイルを更新します。
- IDE の完全な自動補完のために
i1n.d.tsを生成します。
📊 i1n limits
使用状況をリアルタイムで追跡します。
- 現在のプランとクレジットの使用状況を確認できます。
- 有効な言語スロットと利用可能な容量を確認できます。
✅ i1n check
リリース前に翻訳の不備を検出します。CI 向けに設計されています。
- 言語ごとの不足キー、補間プレースホルダーの不備(
{{count}}が翻訳で失われているなど)、空の値、形式が不正なファイルを検出します。 --min-coverage 95を指定すると、翻訳カバレッジがしきい値を下回った場合にビルドを失敗させます。- ツール連携には
--jsonを使用します。終了コード:0は問題なし、1はエラー検出、2は設定の問題です。 - 100%オフラインで動作します。CI での API 呼び出しやシークレットは不要です。
# .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 エージェントが命名規則、ファイル構成、ブランドの語調に従うようにします。
🔌 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 | 3-way diff でローカルの翻訳ファイルを push します(サーバー側の編集を保持し、競合時には中止してエージェントが解決できるようにします) |
i1n_pull | 翻訳を pull し、型安全な TypeScript 定義を生成します |
i1n_translate | AI を使って指定した言語にキーを翻訳します |
i1n_add_language | 自動翻訳を任意で実行しながら、新しい言語を追加します |
i1n_extract_and_translate | コードから文字列を抽出し、キーとして push して、すべての言語に翻訳します |
i1n_search | 名前または値で既存の翻訳キーを検索します |
i1n_setup_bridge | i18n ライブラリ(i18next、vue-i18n、next-intl など)を検出し、i1n ブリッジモードをエンドツーエンドで設定します |
例: AI エージェントに「このコンポーネントを国際化して」と指示します:
- エージェントがファイルを読み込み、ハードコードされた文字列を特定します
- 抽出した文字列を指定して
i1n_extract_and_translateを呼び出します - i1n がキーを push し、すべての有効な言語に翻訳して、型を生成します
- エージェントがコンポーネントを書き換え、
t('key')の呼び出しを使うようにします
👥 チームのワークフロー
i1n は、異なるブランチで作業する開発者、ダッシュボードで作業するコピーライター、MCP 経由で作業する AI エージェントなど、複数の人が並行して翻訳を編集するチーム向けに設計されています。i1n push は、ローカルの作業ツリーによって他のメンバーの編集が消される心配なく実行できます。
push で送信内容が決まる仕組み
push のたびに、CLI は次の処理を行います。
- ローカルのロケールファイル(
L)を読み込みます。 - サーバーに、存在するキーと各キーの最終更新日時を問い合わせます(メタデータのみの軽量な呼び出しで、全データを pull する場合の約 1/50 のサイズです)。
- 前回の同期以降にサーバー上で変更があった場合、サーバーの状態全体(
S)を取得します。 - 同期した最後のベースライン(
P、locales/.i1n-push-state.jsonに保存)と照らし合わせて、(namespace, key, lang)ごとに三者間の差分を計算します。
各 (key, lang) は、差分に応じて次のいずれかに分類されます。
| ローカル | サーバー | ベースライン | アクション |
|---|---|---|---|
== サーバー | — | — | 変更なし。スキップします |
== ベースライン | 変更あり | — | サーバーのみの変更 — ロケールファイルに自動 pull します |
| 変更あり | == ベースライン | — | ローカルの編集 — push します |
| 変更あり | 変更あり | 両方変更 | 競合 — 対話形式で解決します |
| なし | 存在 | ベースラインに存在 | 警告します。削除動詞がないため、変更を伝播しません |
実際にローカルで変更した言語のみが送信されます。編集していない言語はペイロードに含まれないため、サーバー側の言語ごとのマージによって保持されます。もう「一度も開いていない yield_rate が push によって気付かないうちに上書きされる」ことはありません。
実際に競合が発生した場合
実際の競合とは、最後の同期以降にあなたと他の誰かが同じ (key, lang) を異なる値に編集した状態です。CLI は競合ごとに値を表示し、どちらを選ぶか尋ねます。
Conflict 1/3: common.greeting [en_us]
› Keep local: "Hello there"
Accept server: "Hi"
Abort push
- Local → 自分の値を push し、サーバーの値を上書きします。
- Server → ローカルの変更を破棄し、サーバーの値をファイルに自動 pull します。
- 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 を中止するため、コード上で解決できます。
サーバーのみの変更の自動 pull
チームメイトやダッシュボード上の誰かが、あなたが一度も触れていないキーを更新した場合、push の実行時にサーバーの値がローカルファイルへ自動的に書き込まれ、必要に応じて i1n.d.ts が再生成されます。作業ツリーには実際の状態が反映されるため、git diff に取り込み内容が表示され、自分の変更と一緒にコミットできます。
MCP push(AI エージェント)
MCP の i1n_push ツールは同じ差分処理を実行しますが、AI エージェントが暗黙に勝者を選ぶべきではないため、競合時のデフォルト動作は abort です。競合はレスポンスで報告されるため、エージェントは再試行の前に pull するか、あなたに確認するか、手動で解決できます。
新しいチェックアウト
locales/.i1n-push-state.json は、.git/index と同様の作業ツリーの状態であるため、設計上 gitignore されています。新規クローンや新しいブランチでこのファイルが存在しない場合、ベースラインはサーバーから合成されます。その後、サーバーと異なるローカルの内容はすべて競合として扱われます(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 が含まれています。次の 2 つの方法で使用できます。
スタンドアロンモード — 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 をお使いですか? 1 行で 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"
文字列の補間
3 つの構文に汎用対応しています:{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 との連携
「プラグアンドプレイ」で使うには、このミニマルなプロバイダーパターンを使用してください。
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>
);
JavaScript 以外のプラットフォーム
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を生成し、IDE ですぐに認識されるようtsconfig.jsonを自動更新します。 - 使用方法:
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 | $399/mo から | カスタム(25k 以上) | 無制限 | カスタム |
CLI、SDK、MCP サーバーはすべてのプランで無料です。Starter ではクレジットカードは不要です。 処理した単語数ではなく、組織単位の料金です。すべてのプランで閲覧者数は無制限です。
Pro の買い切りプランは $199 からで、最初の 200 ユーザー限定です。
📄 ライセンス
MIT — © 2026 i1n.ai
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。