Lingo.dev - інструментарій i18n з відкритим кодом для локалізації на основі LLM
MCP •CLI • CI/CD •SDK • Compiler
| Інструмент | Випадок використання | Швидка команда |
|---|---|---|
| MCP | Налаштування i18n з AI-підтримкою для React-додатків | Промпт: Set up i18n |
| CLI | Переклад JSON, YAML, markdown, CSV, PO файлів | npx lingo.dev@latest run |
| CI/CD | Автоматизований конвеєр перекладу у GitHub Actions | uses: lingodotdev/lingo.dev@main |
| SDK | Переклад у runtime для динамічного контенту | 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 є недетермінованою. Перевіряйте згенерований код перед комітом.
Підтримувати переклади синхронізованими — нудно. Ви додаєте новий рядок, забуваєте його перекласти, випускаєте зламаний UI для міжнародних користувачів. Або ви надсилаєте 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 робить переклади автоматичними. Кожен push запускає переклад. Відсутні рядки заповнюються до того, як код потрапить у продакшен. Не потрібна дисципліна — pipeline все обробляє.
Підтримувані платформи:
- 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 |
Увімкнути паралельну обробку |
Статичні файли перекладів підходять для міток інтерфейсу, але що робити з контентом, створеним користувачами? Повідомлення в чаті, описи продуктів, тікети підтримки — контент, який не існує під час збірки, неможливо попередньо перекласти. Ви змушені показувати неперекладений текст або будувати власний конвеєр перекладу.
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
Традиційна інтернаціоналізація є інвазивною. Ви обгортаєте кожен рядок у функції t(), вигадуєте ключі перекладу (home.hero.title.v2), підтримуєте паралельні JSON-файли і спостерігаєте, як ваші компоненти роздуваються через шаблонний код локалізації. Це настільки виснажливо, що команди відкладають інтернаціоналізацію, доки вона не перетвориться на масштабний рефакторинг.
Lingo.dev Compiler усуває зайві церемонії. Пишіть 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/ у систему контролю версій.
Ключові можливості:
- Нульове навантаження на продуктивність у runtime
- Без ключів перекладу чи JSON-файлів
- Без функцій
t()або обгорток<T> - Автоматичне виявлення тексту для перекладу у JSX
- Підтримка TypeScript
- ICU MessageFormat для роботи з множиною
- Ручне перевизначення через атрибут
data-lingo-override - Вбудований віджет редактора перекладів
Режими збірки:
pseudotranslator: режим розробки із перекладами-заповнювачами (без витрат на API)real: генерація реальних перекладів за допомогою LLMcache-only: production-режим із попередньо згенерованими перекладами з CI (без API-викликів)
Підтримувані фреймворки:
- Next.js (App Router з React Server Components)
- Vite + React (SPA та SSR)
Планується підтримка додаткових фреймворків.
Ми вітаємо ваш внесок. Будь ласка, дотримуйтесь цих рекомендацій:
- Проблеми: Повідомити про баг або запропонувати функцію
- Pull request-и: Внесіть зміни
- Кожен 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 • اردو • भोजपुरी • অসমীয়া • ગુજરાતી • मराठी • ଓଡ଼ିଆ • ਪੰਜਾਬੀ • සිංහල • தமிழ் • తెలుగు
Додавання нової мови:
- Додайте код локалі до
i18n.json, використовуючи BCP-47 формат - Надішліть pull request
Формат локалі 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