Lingo.dev — open-source i18n toolkit для локализации на базе LLM
MCP •CLI • CI/CD •SDK • Compiler
| Инструмент | Сценарий использования | Быстрая команда |
|---|---|---|
| MCP | AI-помощь при настройке i18n для React-приложений | Prompt: 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 | Локализация React на этапе сборки без i18n-обёрток | withLingo() plugin |
Настроить i18n в React-приложениях — это всегда куча граблей, даже для опытных разработчиков. AI-ассистенты только усугубляют: придумывают несуществующие API, забывают про middleware, ломают роутинг или делают всё наполовину и теряются. Проблема в том, что настройка i18n требует чёткой последовательности изменений в разных файлах (роутинг, middleware, компоненты, конфиги), а 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)
Использование:
После настройки MCP-сервера в своей IDE (см. быстрый старт), просто попросите ассистента:
Set up i18n with the following locales: en, es, and pt-BR. The default locale is 'en'.
Ассистент сделает следующее:
- Настроит роутинг по локали (например,
/en,/es,/pt-BR) - Добавит компоненты для переключения языка
- Реализует автоматическое определение локали
- Сгенерирует нужные конфиги
Важно: Генерация кода с помощью AI непредсказуема. Проверьте код перед коммитом.
Держать переводы в актуальном состоянии — это боль. Добавил новую строку, забыл перевести — и вот уже сломанный интерфейс для пользователей из других стран. Или отправил JSON-файлы переводчикам, ждал несколько дней, потом вручную сливал их работу. А если языков больше 10, то это уже сотни файлов, которые постоянно расходятся.
Lingo.dev CLI всё автоматизирует. Просто укажи папку с переводами, запусти одну команду — и все локали обновятся. Lockfile отслеживает, что уже переведено, так что платишь только за новое или изменённое. Поддерживаются JSON, YAML, CSV, PO и markdown-файлы.
Установка:
# 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-воркфлоу: включите "Allow GitHub Actions to create and approve pull requests" в Settings > Actions > General
Опции воркфлоу:
Коммитить переводы напрямую:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}Создавайте pull request'ы с переводами:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
pull-request: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Доступные параметры:
| Параметр | По умолчанию | Описание |
|---|---|---|
api-key |
(обязательный) | API-ключ Lingo.dev |
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 — веб-приложения, 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: генерация реальных переводов с помощью LLMcache-only: продакшн-режим с использованием заранее сгенерированных переводов из CI (без API-запросов)
Поддерживаемые фреймворки:
- Next.js (App Router с React Server Components)
- Vite + React (SPA и SSR)
Планируется поддержка других фреймворков.
Будем рады вашим вкладом! Пожалуйста, следуйте этим рекомендациям:
- Issues: Сообщить об ошибках или предложить новые функции
- Pull Requests: Отправить изменения
- Для каждого 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