i18n.json — файл конфигурации, который управляет CLI Lingo.dev и интеграциями CI/CD. Он задаёт, какие языки переводить, где находится переводимый контент и какой backend перевода использовать.
Минимальный пример#
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "ja"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
}
}
}Поле $schema включает автодополнение и валидацию в IDE. Поле version отслеживает версию схемы для совместимости с автоматическими миграциями.
Локаль#
Раздел locale задаёт исходный и целевые языки:
{
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
}
}| Поле | Описание |
|---|---|
locale.source | Язык, на котором написан исходный контент. Все переводы выполняются из этой локали. |
locale.targets | Массив целевых языков. Для каждого из них создаётся отдельный файл или раздел — в зависимости от формата bucket. |
Коды языков соответствуют стандарту BCP 47 — поддерживаются en, en-US, es-ES, zh-Hans, а также платформенные форматы, например Android-формат en-rUS.
Чтобы вывести список доступных кодов локалей:
npx lingo.dev@latest show locale sources # Available source languages
npx lingo.dev@latest show locale targets # Available target languagesBuckets#
Buckets задают шаблоны поиска файлов и правила обработки. Каждый ключ bucket определяет формат файла, а его значение настраивает, какие файлы включать или исключать:
{
"buckets": {
"json": {
"include": ["locales/[locale].json"],
"exclude": ["locales/[locale]/internal.json"]
},
"markdown": {
"include": ["docs/[locale]/*.md"]
}
}
}| Поле | Описание |
|---|---|
include | Массив шаблонов файлов с плейсхолдером [locale]. Поддерживаются glob-шаблоны (*). |
exclude | Необязательно. Массив шаблонов, которые нужно пропускать при обработке. |
lockedKeys | Необязательно. Ключи, значения которых копируются из исходного текста без перевода. См. Блокировка ключей. |
ignoredKeys | Необязательно. Ключи, полностью исключённые из перевода — они не появляются в целевых файлах. См. Игнорирование ключей. |
preservedKeys | Необязательно. Ключи, которые один раз инициализируются из исходного текста, а затем защищаются от автоматических обновлений. См. Сохранение ключей. |
injectLocale | Необязательно. Ключи, в которые код целевой локали подставляется автоматически. |
Шаблоны включения#
В шаблонах включения используется плейсхолдер [locale], который во время выполнения заменяется на настроенные коды локалей:
locales/[locale].json→locales/en.json,locales/es.jsondocs/[locale]/*.md→docs/en/*.md,docs/es/*.md
Рекурсивные glob-шаблоны (**/*.json) не поддерживаются. Вместо них используйте явные пути к каталогам.
Пользовательские разделители локалей#
По умолчанию коды локалей в именах файлов используют дефис (-) в качестве разделителя: en-US.json. Чтобы использовать подчёркивания, передайте объект с полем delimiter:
{
"include": [
"standard/[locale].json",
{ "path": "legacy/[locale].json", "delimiter": "_" }
]
}В результате получится legacy/en_US.json вместо legacy/en-US.json.
Нотация путей ключей#
Массивы lockedKeys, ignoredKeys и preservedKeys используют запись с прямой косой чертой (/) для вложенных ключей и звёздочкой (*) для wildcard-шаблонов:
{
"lockedKeys": ["brand/name", "config/*"]
}Полный список поддерживаемых типов bucket см. в разделе Поддерживаемые форматы.
Провайдер#
Раздел provider настраивает LLM-провайдера напрямую для перевода. Этот раздел необязателен — если его не указать, CLI будет использовать движок локализации в Lingo.dev.
{
"provider": {
"id": "openai",
"model": "gpt-4o-mini",
"prompt": "Translate the provided text from {source} to {target}."
}
}| Поле | Описание |
|---|---|
provider.id | Идентификатор провайдера: openai, anthropic, google, mistral, openrouter или ollama. |
provider.model | Название модели у провайдера, например gpt-4o-mini или claude-3-haiku. |
provider.prompt | Системный промпт. {source} и {target} заменяются кодами локалей во время выполнения. |
provider.baseUrl | Необязательно. Пользовательский API endpoint (обязательно для Ollama: http://localhost:11434). |
Подключение движка#
Чтобы направлять переводы через определённый движок локализации, добавьте поле engineId:
{
"engineId": "eng_SxjMwMsfOIsvV1wh"
}Если задано engineId, к каждому запросу на перевод автоматически применяются тональность бренда, глоссарий, инструкции и конфигурация модели вашего движка. Если поле не указано, но задано LINGO_API_KEY, CLI использует движок по умолчанию в вашей организации.
Полное руководство по настройке см. в разделе Подключите свой движок.
Переменные окружения#
| Переменная | Обязательно | Описание |
|---|---|---|
LINGO_API_KEY | Для Lingo.dev Engine | Ваш API-ключ Lingo.dev. |
LINGO_API_URL | Нет | Пользовательский базовый URL API (для self-hosted или staging). |
OPENAI_API_KEY | Для провайдера OpenAI | API-ключ OpenAI. |
ANTHROPIC_API_KEY | Для провайдера Anthropic | API-ключ Anthropic. |
GOOGLE_API_KEY | Для провайдера Google | API-ключ Google. |
MISTRAL_API_KEY | Для провайдера Mistral | API-ключ Mistral. |
OPENROUTER_API_KEY | Для провайдера OpenRouter | API-ключ OpenRouter. |
Полный пример#
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"],
"lockedKeys": ["brand/name", "brand/tagline"],
"ignoredKeys": ["internal/*"]
},
"markdown": {
"include": ["docs/[locale]/*.md"]
}
},
"engineId": "eng_SxjMwMsfOIsvV1wh"
}Миграция версий#
CLI автоматически мигрирует старые конфигурации i18n.json на последнюю версию схемы. Он создаёт резервную копию текущего файла, обновляет схему и сохраняет все настройки. Ручное вмешательство не требуется.
