Skip to content

Latest commit

 

History

History
510 lines (383 loc) · 21.8 KB

File metadata and controls

510 lines (383 loc) · 21.8 KB

Lingo.dev

Lingo.dev - інструментарій i18n з відкритим кодом для локалізації на основі LLM


MCPCLICI/CDSDKCompiler

Release License Last Commit Product Hunt #1 DevTool місяця Product Hunt #1 DevTool тижня Product Hunt #2 продукт дня Github trending


Швидкий старт

Інструмент Випадок використання Швидка команда
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

Lingo.dev MCP

Налаштування 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'.

Асистент:

  1. Налаштувати маршрутизацію на основі локалі (наприклад, /en, /es, /pt-BR)
  2. Налаштувати компоненти перемикання мови
  3. Реалізувати автоматичне визначення локалі
  4. Згенерувати необхідні конфігураційні файли

Примітка: генерація коду за допомогою AI є недетермінованою. Перевіряйте згенерований код перед комітом.

Читати документацію →


Lingo.dev CLI

Підтримувати переклади синхронізованими — нудно. Ви додаєте новий рядок, забуваєте його перекласти, випускаєте зламаний 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

Як це працює:

  1. Витягує контент для перекладу з налаштованих файлів
  2. Надсилає контент провайдеру LLM для перекладу
  3. Записує перекладений контент назад у файлову систему
  4. Створює файл 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
  • Google
  • Mistral
  • OpenRouter
  • Ollama

Читати документацію →


Lingo.dev CI/CD

Переклади — це функція, яка завжди «майже готова». Інженери зливають код без оновлення локалей. 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 }}

Вимоги до налаштування:

  1. Додайте LINGODOTDEV_API_KEY до секретів репозиторію (Settings > Secrets and variables > Actions)
  2. Для 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

Статичні файли перекладів підходять для міток інтерфейсу, але що робити з контентом, створеним користувачами? Повідомлення в чаті, описи продуктів, тікети підтримки — контент, який не існує під час збірки, неможливо попередньо перекласти. Ви змушені показувати неперекладений текст або будувати власний конвеєр перекладу.

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:

Читати документацію →


Lingo.dev Compiler

Традиційна інтернаціоналізація є інвазивною. Ви обгортаєте кожен рядок у функції 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: генерація реальних перекладів за допомогою LLM
  • cache-only: production-режим із попередньо згенерованими перекладами з CI (без API-викликів)

Підтримувані фреймворки:

  • Next.js (App Router з React Server Components)
  • Vite + React (SPA та SSR)

Планується підтримка додаткових фреймворків.

Читати документацію →


Внесок у проєкт

Ми вітаємо ваш внесок. Будь ласка, дотримуйтесь цих рекомендацій:

  1. Проблеми: Повідомити про баг або запропонувати функцію
  2. Pull request-и: Внесіть зміни
    • Кожен PR потребує changeset: pnpm new (або pnpm new:empty для не-релізних змін)
    • Перед відправкою переконайтесь, що всі тести проходять
  3. Розробка: це монорепозиторій pnpm + turborepo
    • Встановлення залежностей: pnpm install
    • Запуск тестів: pnpm test
    • Збірка: pnpm build

Підтримка: Спільнота Discord

Історія зірок

Якщо Lingo.dev корисний для вас, поставте нам зірку та допоможіть досягти 10 000 зірок!

[

Графік історії зірок

](https://www.star-history.com/#lingodotdev/lingo.dev&Date)

Локалізована документація

Доступні переклади:

English中文日本語한국어EspañolFrançaisРусскийУкраїнськаDeutschItalianoالعربيةעבריתहिन्दीPortuguês (Brasil)বাংলাفارسیPolskiTürkçeاردوभोजपुरीঅসমীয়াગુજરાતીमराठीଓଡ଼ିଆਪੰਜਾਬੀසිංහලதமிழ்తెలుగు

Додавання нової мови:

  1. Додайте код локалі до i18n.json, використовуючи BCP-47 формат
  2. Надішліть pull request

Формат локалі BCP-47: language[-Script][-REGION]

  • language: ISO 639-1/2/3 (нижній регістр): en, zh, bho
  • Script: ISO 15924 (регістр заголовка): Hans, Hant, Latn
  • REGION: ISO 3166-1 alpha-2 (верхній регістр): US, CN, IN
  • Приклади: en, pt-BR, zh-Hans, sr-Cyrl-RS