Lingo.dev + .json-dictionary

Lingo.dev CLI переводит JSON-файлы, где каждая переводимая строка содержит несколько ключей локалей в одном объекте. В отличие от стандартного формата JSON, который разделяет локали по разным файлам, формат json-dictionary хранит все переводы вместе с ключами локалей, например: {"en": "Hello", "es": "Hola"}.

Быстрая настройка

Создайте конфигурационный файл i18n.json:

{
  "locale": {
    "source": "en",
    "targets": ["es", "fr", "de"]
  },
  "buckets": {
    "json-dictionary": {
      "include": ["content/pages.json"]
    }
  }
}

Структура файла

Формат json-dictionary хранит переводы в виде вложенных объектов с ключами локалей:

{
  "title": {
    "en": "Welcome to our site",
    "es": "Bienvenido a nuestro sitio"
  },
  "navigation": {
    "home": {
      "en": "Home",
      "es": "Inicio"
    },
    "about": {
      "en": "About Us",
      "es": "Acerca de nosotros"
    }
  },
  "staticValue": "Это не будет переведено",
  "pages": [
    {
      "title": {
        "en": "Page One",
        "es": "Página Uno"
      }
    }
  ]
}

Перевод всего

npx lingo.dev@latest i18n

CLI автоматически:

  • Извлекает только переводимые объекты (те, которые содержат ключи локалей)
  • Сохраняет неизменными значения, не подлежащие переводу
  • Добавляет ключи целевых локалей рядом с существующими
  • Сохраняет порядок ключей локалей (сначала исходная, затем остальные в алфавитном порядке)

Поведение ключей

Определение переводимости: Только объекты, содержащие ключ вашей исходной локали, считаются переводимыми. Простые строки, числа, булевы значения и объекты без ключей локалей остаются неизменными.

Порядок ключей: При добавлении переводов ключ исходной локали отображается первым, за ним следуют другие локали в алфавитном порядке:

{
  "message": {
    "en": "Original text",
    "de": "Deutscher Text",
    "es": "Texto en español",
    "fr": "Texte français"
  }
}

Поддержка вложенности: Работает с глубоко вложенными структурами и массивами, содержащими переводимые объекты.

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

Исключение файлов

"json-dictionary": {
  "include": ["content/*.json"],
  "exclude": ["content/config.json"]
}