Справочник по настройке

Полное описание всех опций конфигурации @lingo.dev/compiler.

Основные параметры

ОпцияТипПо умолчаниюОписание
sourceRootstring"src"Корневая директория с исходным кодом для перевода
lingoDirstring".lingo"Директория для метаданных и кэша переводов
sourceLocalestring(обязательно)Код исходной локали (например, "en", "en-US")
targetLocalesstring[](обязательно)Массив кодов целевых локалей для перевода
useDirectivebooleanfalseТребовать директиву 'use i18n' для включения перевода
modelsstring | object"lingo.dev"Конфигурация провайдера переводов (см. Провайдеры переводов)
promptstringundefinedКастомный шаблон промпта для перевода
buildMode"translate" | "cache-only""translate"Режим сборки (см. Режимы сборки)

Пример

{
  sourceRoot: "./app",
  lingoDir: ".lingo",
  sourceLocale: "en",
  targetLocales: ["es", "de", "fr", "ja"],
  useDirective: false,
  models: "lingo.dev",
  buildMode: "translate",
}

Опции для разработки

Настройте поведение для разработки через объект dev:

ОпцияТипПо умолчаниюОписание
dev.usePseudotranslatorbooleanfalseИспользовать фейковые переводы вместо настоящего AI (рекомендуется для разработки)
dev.translationServerStartPortnumber60000Стартовый порт для сервера переводов (автоматически выбирает 60000-60099)
dev.translationServerUrlstringundefinedКастомный URL сервера переводов (для продвинутого использования)

Пример

{
  dev: {
    usePseudotranslator: true, // Fast fake translations
    translationServerStartPort: 60000, // Default port range
  }
}

Почему псевдопереводчик? Всё происходит мгновенно (без API-запросов), сразу видно, что переводится, и можно протестировать интерфейс с разной длиной текста — и всё это без затрат на API.

Сохранение локали

Настройте, как будут сохраняться изменения локали:

ОпцияТипПо умолчаниюОписание
localePersistence.type"cookie""cookie"Сейчас поддерживается только сохранение через cookie
localePersistence.config.namestring"locale"Имя cookie
localePersistence.config.maxAgenumber31536000Максимальный срок действия cookie в секундах (по умолчанию: 1 год)

Пример

{
  localePersistence: {
    type: "cookie",
    config: {
      name: "user-locale",
      maxAge: 31536000, // 1 year
    },
  },
}

Нужна своя система сохранения? Реализуйте Custom Locale Resolvers, чтобы использовать localStorage, параметры URL или базу данных.

Плюрализация

Настройте автоматическое определение плюрализации:

ОпцияТипПо умолчаниюОписание
pluralization.enabledbooleantrueВключить автоматическое определение ICU MessageFormat
pluralization.modelstring"groq:llama-3.1-8b-instant"LLM-модель для определения форм плюрализации

Пример

{
  pluralization: {
    enabled: true,
    model: "groq:llama-3.1-8b-instant", // Fast model for plural detection
  },
}

Как это работает: Компилятор определяет формы плюрализации в вашем тексте (например, «У вас 5 элементов») и преобразует их в ICU MessageFormat ({count, plural, one {1 item} other {# items}}).

Отключите для ускорения: Если не используете плюрализацию, отключите эту функцию, чтобы не делать LLM-запросы.

Провайдеры перевода

Опция models настраивает, какой LLM-провайдер(ы) использовать для перевода.

Простая настройка

Используйте одного провайдера для всех переводов:

{
  models: "lingo.dev" // Recommended: Lingo.dev Engine
}

Расширенная конфигурация

Используйте сопоставление пар локалей для детального управления:

{
  models: {
    "en:es": "groq:llama-3.3-70b-versatile", // English to Spanish
    "en:de": "google:gemini-2.0-flash",      // English to German
    "*:fr": "openai:gpt-4o",                 // Any locale to French
    "*:*": "anthropic:claude-3-5-sonnet",    // Fallback for all others
  }
}

Паттерны:

  • "source:target": Конкретная пара локалей (например, "en:es")
  • "*:target": Любой исходный язык к определённому целевому (например, "*:de")
  • "source:*": Конкретный исходный язык к любому целевому (например, "en:*")
  • "*:*": Фолбэк для всех пар

Смотрите Поставщики переводов для синтаксиса и настройки API-ключей.

Кастомные промпты для перевода

Настройте промпт для перевода с помощью плейсхолдеров:

{
  prompt: `Translate from {SOURCE_LOCALE} to {TARGET_LOCALE}.
Use a formal tone and preserve all technical terms.
Do not translate brand names or product names.`
}

Доступные плейсхолдеры:

  • {SOURCE_LOCALE}: Код исходной локали (например, "en")
  • {TARGET_LOCALE}: Код целевой локали (например, "es")

Компилятор добавляет контекст о переводимом тексте (расположение компонента, окружающие элементы) к вашему кастомному промпту.

Переопределение через переменные окружения

Переопределяйте конфигурацию с помощью переменных окружения:

# Override build mode
LINGO_BUILD_MODE=cache-only npm run build

# Set API key
LINGODOTDEV_API_KEY=your_key_here
GROQ_API_KEY=gsk_...
GOOGLE_API_KEY=...
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
MISTRAL_API_KEY=...
OPENROUTER_API_KEY=...

Полный пример

// 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, {
    // Core
    sourceRoot: "./app",
    lingoDir: ".lingo",
    sourceLocale: "en",
    targetLocales: ["es", "de", "fr", "ja"],
    useDirective: false,

    // Build mode
    buildMode: process.env.NODE_ENV === "production" ? "cache-only" : "translate",

    // Models
    models: {
      "en:es": "groq:llama-3.3-70b-versatile",
      "*:*": "lingo.dev",
    },

    // Custom prompt
    prompt: "Translate from {SOURCE_LOCALE} to {TARGET_LOCALE}. Use a professional tone.",

    // Development
    dev: {
      usePseudotranslator: true,
      translationServerStartPort: 60000,
    },

    // Locale persistence
    localePersistence: {
      type: "cookie",
      config: {
        name: "locale",
        maxAge: 31536000,
      },
    },

    // Pluralization
    pluralization: {
      enabled: true,
      model: "groq:llama-3.1-8b-instant",
    },
  });
}

Типы TypeScript

Импортируйте типы конфигурации для типобезопасности:

import type { LingoConfig } from "@lingo.dev/compiler";

const config: LingoConfig = {
  // ...config
};

Часто задаваемые вопросы

Нужно ли настраивать все параметры? Нет. Только sourceLocale и targetLocales обязательны. Остальные имеют разумные значения по умолчанию.

В чём разница между sourceRoot и lingoDir? sourceRoot — это место, где находится ваш исходный код (например, ./app, src). lingoDir — это место хранения метаданных переводов (по умолчанию: .lingo).

Можно ли использовать разные модели для разных локалей? Да. Используйте сопоставление пар локалей в опции models. Смотрите Поставщики переводов.

Нужно ли коммитить .lingo/ в git? Да. Директория .lingo/ содержит метаданные переводов и кэш. Её стоит хранить под версионным контролем вместе с кодом.

Как отключить плюрализацию? Установите pluralization.enabled: false. Это отключит определение форм множественного числа и уменьшит количество обращений к LLM.

Дальнейшие шаги