Lingo.dev - LLMベースのローカライゼーションのためのオープンソースi18nツールキット
MCP •CLI • CI/CD •SDK • Compiler
| ツール | ユースケース | クイックコマンド |
|---|---|---|
| MCP | ReactアプリのAI支援i18nセットアップ | プロンプト: Set up i18n |
| CLI | JSON、YAML、Markdown、CSV、POファイルの翻訳 | npx lingo.dev@latest run |
| CI/CD | GitHub Actionsでの自動翻訳パイプライン | uses: lingodotdev/lingo.dev@main |
| SDK | 動的コンテンツのランタイム翻訳 | npm install lingo.dev |
| Compiler | i18nラッパーなしのビルド時Reactローカライゼーション | withLingo()プラグイン |
Reactアプリでi18nを設定することは、経験豊富な開発者にとってもエラーが発生しやすいことで知られています。AIコーディングアシスタントはこれをさらに悪化させます。存在しないAPIを幻覚し、ミドルウェア設定を忘れ、ルーティングを壊したり、迷子になる前に半分の解決策を実装したりします。問題は、i18nのセットアップには複数のファイル(ルーティング、ミドルウェア、コンポーネント、設定)にわたる正確な一連の協調的な変更が必要であり、LLMがそのコンテキストを維持するのに苦労することです。
Lingo.dev MCPは、AIアシスタントにフレームワーク固有のi18n知識への構造化されたアクセスを提供することで、この問題を解決します。推測する代わりに、アシスタントはNext.js、React Router、TanStack Start向けの検証済み実装パターンに従います。
対応IDE:
- Claude Code
- Cursor
- GitHub Copilot Agents
- Codex (OpenAI)
対応フレームワーク:
- Next.js (App Router & Pages Router v13-16)
- TanStack Start (v1)
- React Router (v7)
使用方法:
IDE でMCPサーバーを設定した後(クイックスタートガイドを参照)、アシスタントに次のようにプロンプトします:
Set up i18n with the following locales: en, es, and pt-BR. The default locale is 'en'.
アシスタントは以下を実行します:
- ロケールベースのルーティングを設定(例:
/en、/es、/pt-BR) - 言語切り替えコンポーネントをセットアップ
- 自動ロケール検出を実装
- 必要な設定ファイルを生成
注意: AI支援によるコード生成は非決定的です。コミット前に生成されたコードを確認してください。
翻訳を同期し続けることは面倒です。新しい文字列を追加し、翻訳を忘れ、国際ユーザーに壊れたUIを提供してしまいます。または、JSONファイルを翻訳者に送り、数日待ってから、手動で彼らの作業をマージし直します。10以上の言語にスケールすることは、常に同期がずれる数百のファイルを管理することを意味します。
Lingo.dev CLIはこれを自動化します。翻訳ファイルを指定し、1つのコマンドを実行すると、すべてのロケールが更新されます。ロックファイルが既に翻訳されたものを追跡するため、新しいコンテンツまたは変更されたコンテンツに対してのみ支払います。JSON、YAML、CSV、POファイル、およびマークダウンに対応しています。
セットアップ:
# Initialize project
npx lingo.dev@latest init
# Run translations
npx lingo.dev@latest run仕組み:
- 設定されたファイルから翻訳可能なコンテンツを抽出
- LLMプロバイダーにコンテンツを送信して翻訳
- 翻訳されたコンテンツをファイルシステムに書き戻し
i18n.lockファイルを作成して完了した翻訳を追跡(冗長な処理を回避)
設定:
initコマンドはi18n.jsonファイルを生成します。ロケールとバケットを設定してください:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es", "fr", "de"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
}
}
}providerフィールドはオプションです(デフォルトはLingo.dev Engine)。カスタムLLMプロバイダーの場合:
{
"provider": {
"id": "openai",
"model": "gpt-4o-mini",
"prompt": "Translate from {source} to {target}"
}
}サポートされているLLMプロバイダー:
- Lingo.dev Engine(推奨)
- OpenAI
- Anthropic
- Mistral
- OpenRouter
- Ollama
翻訳は常に「もうすぐ完成」の機能です。エンジニアはロケールを更新せずにコードをマージします。QAはステージング環境で翻訳の欠落を発見します。さらに悪い場合は、ユーザーが本番環境で発見します。根本原因は、翻訳が締め切りのプレッシャー下でスキップしやすい手動ステップであることです。
Lingo.dev CI/CDは翻訳を自動化します。すべてのプッシュが翻訳をトリガーします。欠落している文字列はコードが本番環境に到達する前に補完されます。規律は不要です。パイプラインが処理します。
サポートされているプラットフォーム:
- GitHub Actions
- GitLab CI/CD
- Bitbucket Pipelines
GitHub Actionsのセットアップ:
.github/workflows/translate.ymlを作成:
name: Translate
on:
push:
branches: [main]
permissions:
contents: write
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lingo.dev
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}セットアップ要件:
- リポジトリシークレットに
LINGODOTDEV_API_KEYを追加(Settings > Secrets and variables > Actions) - PRワークフローの場合: Settings > Actions > Generalで「Allow GitHub Actions to create and approve pull requests」を有効化
ワークフローオプション:
翻訳を直接コミット:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}翻訳を含むプルリクエストを作成:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
pull-request: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}利用可能な入力:
| 入力 | デフォルト | 説明 |
|---|---|---|
api-key |
(必須) | Lingo.dev APIキー |
pull-request |
false |
直接コミットではなくPRを作成 |
commit-message |
"feat: update translations via @LingoDotDev" |
カスタムコミットメッセージ |
pull-request-title |
"feat: update translations via @LingoDotDev" |
カスタムPRタイトル |
working-directory |
"." |
実行するディレクトリ |
parallel |
false |
並列処理を有効化 |
静的な翻訳ファイルはUIラベルには有効ですが、ユーザー生成コンテンツはどうでしょうか?チャットメッセージ、商品説明、サポートチケットなど、ビルド時に存在しないコンテンツは事前翻訳できません。未翻訳のテキストを表示するか、カスタム翻訳パイプラインを構築するしかありません。
Lingo.dev SDKは実行時にコンテンツを翻訳します。任意のテキスト、オブジェクト、HTMLを渡すと、ローカライズされたバージョンが返されます。リアルタイムチャット、動的通知、またはデプロイ後に到着するあらゆるコンテンツに対応します。JavaScript、PHP、Python、Rubyで利用可能です。
インストール:
npm install lingo.dev使用方法:
import { LingoDotDevEngine } from "lingo.dev/sdk";
const lingoDotDev = new LingoDotDevEngine({
apiKey: process.env.LINGODOTDEV_API_KEY,
});
// Translate objects (preserves structure)
const translated = await lingoDotDev.localizeObject(
{ greeting: "Hello", farewell: "Goodbye" },
{ sourceLocale: "en", targetLocale: "es" },
);
// { greeting: "Hola", farewell: "Adiós" }
// Translate text
const text = await lingoDotDev.localizeText("Hello!", {
sourceLocale: "en",
targetLocale: "fr",
});
// Translate to multiple languages at once
const results = await lingoDotDev.batchLocalizeText("Hello!", {
sourceLocale: "en",
targetLocales: ["es", "fr", "de"],
});
// Translate chat (preserves speaker names)
const chat = await lingoDotDev.localizeChat(
[{ name: "Alice", text: "Hello!" }],
{ sourceLocale: "en", targetLocale: "es" },
);
// Translate HTML (preserves markup)
const html = await lingoDotDev.localizeHtml("<h1>Welcome</h1>", {
sourceLocale: "en",
targetLocale: "de",
});
// Detect language
const locale = await lingoDotDev.recognizeLocale("Bonjour le monde");
// "fr"利用可能なSDK:
- JavaScript SDK - Webアプリ、Node.js
- PHP SDK - PHP、Laravel
- Python SDK - Django、Flask
- Ruby SDK - Rails
従来のi18nは侵襲的です。すべての文字列をt()関数でラップし、翻訳キー(home.hero.title.v2)を考案し、並列JSONファイルを維持し、コンポーネントがローカライゼーションの定型コードで肥大化するのを見守ります。あまりにも面倒なため、チームは国際化を遅らせ、最終的に大規模なリファクタリングになってしまいます。
Lingo.devコンパイラーは煩雑な作業を排除します。プレーンな英語テキストでReactコンポーネントを記述できます。コンパイラーはビルド時に翻訳可能な文字列を検出し、ローカライズされたバリアントを自動的に生成します。キー、JSONファイル、ラッパー関数は不要です。複数の言語で動作するReactコードを記述するだけです。
インストール:
pnpm install @lingo.dev/compiler認証:
# Recommended: Sign up at lingo.dev and login
npx lingo.dev@latest login
# Alternative: Add API key to .env
LINGODOTDEV_API_KEY=your_key_here
# Or use direct LLM providers (Groq, OpenAI, Anthropic, Google)
GROQ_API_KEY=your_key設定(Next.js):
// next.config.ts
import type { NextConfig } from "next";
import { withLingo } from "@lingo.dev/compiler/next";
const nextConfig: NextConfig = {};
export default async function (): Promise<NextConfig> {
return await withLingo(nextConfig, {
sourceRoot: "./app",
sourceLocale: "en",
targetLocales: ["es", "fr", "de"],
models: "lingo.dev",
dev: { usePseudotranslator: true },
});
}設定(Vite):
// vite.config.ts
import { lingoCompilerPlugin } from "@lingo.dev/compiler/vite";
export default defineConfig({
plugins: [
lingoCompilerPlugin({
sourceRoot: "src",
sourceLocale: "en",
targetLocales: ["es", "fr", "de"],
models: "lingo.dev",
dev: { usePseudotranslator: true },
}),
react(),
],
});プロバイダーのセットアップ:
// app/layout.tsx (Next.js)
import { LingoProvider } from "@lingo.dev/compiler/react";
export default function RootLayout({ children }) {
return (
<LingoProvider>
<html>
<body>{children}</body>
</html>
</LingoProvider>
);
}言語切り替え:
import { useLocale, setLocale } from "@lingo.dev/compiler/react";
export function LanguageSwitcher() {
const locale = useLocale();
return (
<select value={locale} onChange={(e) => setLocale(e.target.value)}>
<option value="en">English</option>
<option value="es">Español</option>
</select>
);
}開発: npm run dev(疑似翻訳を使用、API呼び出しなし)
本番: usePseudotranslator: falseを設定し、next buildを実行
.lingo/ディレクトリをバージョン管理にコミットします。
主な機能:
- ランタイムパフォーマンスコストゼロ
- 翻訳キーやJSONファイル不要
t()関数や<T>ラッパーコンポーネント不要- JSX内の翻訳可能なテキストの自動検出
- TypeScriptサポート
- 複数形のためのICU MessageFormat
data-lingo-override属性による手動オーバーライド- 組み込み翻訳エディターウィジェット
ビルドモード:
pseudotranslator: プレースホルダー翻訳を使用する開発モード(APIコストなし)real: LLMを使用して実際の翻訳を生成cache-only: CIから事前生成された翻訳を使用する本番モード(API呼び出しなし)
対応フレームワーク:
- Next.js(React Server ComponentsのApp Router)
- Vite + React(SPAおよびSSR)
追加のフレームワークサポートを予定しています。
コントリビューションを歓迎します。以下のガイドラインに従ってください。
- Issue: バグ報告や機能リクエスト
- プルリクエスト: 変更を送信
- すべてのPRにはchangesetが必要です:
pnpm new(リリース対象外の変更の場合はpnpm new:empty) - 送信前にテストが通過することを確認してください
- すべてのPRにはchangesetが必要です:
- 開発: これはpnpm + turborepoのモノレポです
- 依存関係のインストール:
pnpm install - テストの実行:
pnpm test - ビルド:
pnpm build
- 依存関係のインストール:
サポート: Discordコミュニティ
Lingo.devが役に立つと思ったら、スターを付けて10,000スター達成にご協力ください!
[
](https://www.star-history.com/#lingodotdev/lingo.dev&Date)
利用可能な翻訳:
English • 中文 • 日本語 • 한국어 • Español • Français • Русский • Українська • Deutsch • Italiano • العربية • עברית • हिन्दी • Português (Brasil) • বাংলা • فارسی • Polski • Türkçe • اردو • भोजपुरी • অসমীয়া • ગુજરાતી • मराठी • ଓଡ଼ିଆ • ਪੰਜਾਬੀ • සිංහල • தமிழ் • తెలుగు
新しい言語の追加:
BCP-47ロケール形式: language[-Script][-REGION]
language: ISO 639-1/2/3 (小文字):en、zh、bhoScript: ISO 15924 (タイトルケース):Hans、Hant、LatnREGION: ISO 3166-1 alpha-2 (大文字):US、CN、IN- 例:
en、pt-BR、zh-Hans、sr-Cyrl-RS