Lingo.dev + .po (Gettext)

Lingo.dev CLI переводит файлы GNU gettext .po, сохраняя ссылки на msgid, метаданные и специфические для gettext форматы. CLI строго следует спецификации GNU gettext, работает с инструментами xgettext, msgfmt и Poedit, обрабатывает msgctxt для устранения неоднозначностей, поддерживает сложные правила множественных форм и сохраняет всю информацию о переводчике и сборке.

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

Настройка для файлов gettext portable object:

{
  "locale": {
    "source": "en",
    "targets": ["es", "fr", "de"]
  },
  "buckets": {
    "po": {
      "include": ["locale/[locale]/LC_MESSAGES/messages.po"]
    }
  }
}

Напоминание: [locale] — это плейсхолдер, который должен оставаться в конфигурации буквально, так как он заменяется на фактический локаль во время выполнения CLI.

Перевод PO-файлов

npx lingo.dev@latest i18n

Сохраняет ссылки на msgid, комментарии переводчиков и метаданные gettext при обновлении переводов msgstr.

Обработка структуры Gettext

Перевод базовых сообщений

#: src/main.c:42
msgid "Welcome to our application"
msgstr "Добро пожаловать в наше приложение"

#: src/dialog.c:15
#, c-format
msgid "You have %d new messages"
msgstr "У вас %d новых сообщений"

Множественные формы

#: src/counter.c:28
msgid "One file selected"
msgid_plural "%d files selected"
msgstr[0] "Выбран один файл"
msgstr[1] "Выбрано %d файла"
msgstr[2] "Выбрано %d файлов"

Обработка контекста

#: src/menu.c:12
msgctxt "menu item"
msgid "File"
msgstr "Файл"

#: src/toolbar.c:8
msgctxt "document type"
msgid "File"
msgstr "Документ"

Сохранение метаданных

Информация заголовка PO-файла


# Файл перевода для MyApp

# Copyright (C) 2024 MyCompany

# Этот файл распространяется на тех же условиях лицензии, что и пакет MyApp.

#
msgid ""

msgstr ""
"Project-Id-Version: MyApp 1.0\n"
"Report-Msgid-Bugs-To: [email protected]\n"
"POT-Creation-Date: 2024-01-15 10:30+0000\n"
"Language: ru\n"
"Content-Type: text/plain; charset=UTF-8\n"

Все метаданные заголовка и комментарии переводчиков сохраняются в точности.

Типы комментариев

  • Комментарии переводчика: # Здесь нужен контекст
  • Извлечённые комментарии: #. Заметка разработчика об использовании
  • Ссылочные комментарии: #: src/file.c:123
  • Комментарии-флаги: #, c-format, fuzzy

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

Несколько доменов

"po": {
  "include": [
    "locale/[locale]/LC_MESSAGES/messages.po",
    "locale/[locale]/LC_MESSAGES/errors.po"
  ]
}

Блокировка идентификаторов сообщений

"po": {
  "include": ["locale/[locale]/LC_MESSAGES/messages.po"],
  "lockedKeys": ["version", "copyright"]
}