PO-файлы
AI-перевод PO-файлов с помощью Lingo.dev CLI
Что такое PO-файлы?
PO (Portable Object) — это текстовый формат файлов, используемый GNU gettext для интернационализации софта. В них хранятся исходные строки и их переводы, и они широко применяются в open source-проектах.
Например:
msgid ""
msgstr ""
"Project-Id-Version: Example Project 1.0\n"
"Language: en\n"
msgid "Welcome"
msgstr "Welcome"
msgctxt "navigation"
msgid "Home"
msgstr "Home"
msgid "You have %d message"
msgid_plural "You have %d messages"
msgstr[0] "You have %d message"
msgstr[1] "You have %d messages"
Что такое Lingo.dev CLI?
Lingo.dev CLI — это бесплатный open source CLI для перевода приложений и контента с помощью AI. Он создан, чтобы заменить традиционные системы управления переводами и легко интегрируется в существующие пайплайны.
Подробнее см. в разделе Обзор.
О данном гайде
В этом гайде рассказывается, как переводить PO-файлы с помощью Lingo.dev CLI.
Вы узнаете, как:
- Создать проект с нуля
- Настроить пайплайн перевода
- Генерировать переводы с помощью AI
Что понадобится
Для работы с Lingo.dev CLI убедитесь, что установлен Node.js v18+:
❯ node -v
v22.17.0
Шаг 1. Создайте проект
В директории вашего проекта создайте файл i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {}
}
Этот файл определяет поведение пайплайна перевода: какие языки использовать и где на файловой системе лежит контент для локализации.
Подробнее о доступных свойствах см. в разделе i18n.json.
Шаг 2. Настройте исходную локаль
Исходная локаль — это оригинальный язык и регион, на которых написан ваш контент. Чтобы её настроить, укажите свойство locale.source в файле i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {}
}
Исходная локаль должна быть указана в формате BCP 47 language tag.
Полный список кодов локалей, поддерживаемых Lingo.dev CLI, смотрите в разделе Поддерживаемые коды локалей.
Шаг 3. Настройка целевых локалей
Целевые локали — это языки и регионы, на которые вы хотите перевести свой контент. Чтобы настроить целевые локали, укажите свойство locale.targets в файле i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {}
}
Шаг 4. Создайте исходный контент
Если вы ещё не сделали этого, создайте один или несколько PO-файлов с контентом для перевода. Эти файлы должны находиться по пути, который содержит исходную локаль (например, в виде имени каталога как en/ или как часть имени файла, например messages.en.po).
Шаг 5. Создайте bucket
-
В файле
i18n.jsonдобавьте объект"po"в объектbuckets:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "po": {} } } -
В объекте
"po"определите массив из одного или нескольких паттерновinclude:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "po": { "include": ["./[locale]/example.po"] } } }Эти паттерны определяют, какие файлы переводить.
Сами паттерны:
- должны содержать
[locale]как плейсхолдер для выбранной локали - могут указывать на пути к файлам (например,
"[locale]/messages.po") - могут использовать звёздочки как подстановочные знаки (например,
"[locale]/*.po")
Рекурсивные glob-паттерны (например,
**/*.po) не поддерживаются. - должны содержать
Шаг 6. Настройте LLM
Lingo.dev CLI использует большие языковые модели (LLM) для перевода контента с помощью ИИ. Чтобы использовать одну из этих моделей, вам нужен API-ключ от поддерживаемого провайдера.
Чтобы быстро начать работу, рекомендуем использовать Lingo.dev Engine — нашу собственную платформу с бесплатным лимитом 10 000 токенов в месяц:
-
Выполните следующую команду:
npx lingo.dev@latest loginЭто откроет ваш браузер по умолчанию и попросит пройти аутентификацию.
-
Следуйте инструкциям.
Шаг 7. Генерация переводов
В каталоге, где находится файл i18n.json, выполните следующую команду:
npx lingo.dev@latest run
Эта команда:
- Считывает файл
i18n.json. - Находит файлы, которые нужно перевести.
- Извлекает переводимый контент из файлов.
- Использует настроенную LLM для перевода извлечённого контента.
- Записывает переведённый контент обратно в файловую систему.
При первой генерации переводов создаётся файл i18n.lock. Этот файл отслеживает, какой контент уже переведён, чтобы избежать лишних повторных переводов при следующих запусках.
Пример
en/example.po
msgid ""
msgstr ""
"Project-Id-Version: Example Project 1.0\n"
"Language: en\n"
msgid "Welcome"
msgstr "Welcome"
msgctxt "navigation"
msgid "Home"
msgstr "Home"
msgid "You have %d message"
msgid_plural "You have %d messages"
msgstr[0] "You have %d message"
msgstr[1] "You have %d messages"
msgid "Save"
msgstr "Save"
es/example.po
msgid ""
msgstr ""
"Project-Id-Version: Example Project 1.0\n"
"Language: es\n"
msgid "Welcome"
msgstr "Bienvenido"
msgctxt "navigation"
msgid "Home"
msgstr "Inicio"
msgid "You have %d message"
msgid_plural "You have %d messages"
msgstr[0] "Tienes %d mensaje"
msgstr[1] "Tienes %d mensajes"
msgid "Save"
msgstr "Guardar"
i18n.json
{
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {
"po": {
"include": ["./[locale]/example.po"]
}
},
"$schema": "https://lingo.dev/schema/i18n.json"
}
i18n.lock
version: 1
checksums:
cdba37b4ade3da08cf12eccfde49d625:
Welcome/singular: 3180ad6b8de344b781637750259e0f53
Home/singular: 104a3db3b671c04e167eafbe21e57881
You%20have%20%25d%20message/singular: 1691abfe2c5d017cda86e298d34f3524
You%20have%20%25d%20message/plural: 2d37831bf51cc2cf75e812c0e61c6861
Save/singular: f7a2929f33bc420195e59ac5a8bcd454
Cancel/singular: 2e2a849c2223911717de8caa2c71bade
Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9
Name/singular: 9368b5a047572b6051f334af5aa76819
Email%20Address/singular: 0ee22bbbe989a0c61a18023407d12dc2
Message/singular: f2f72126bd244cfc534eab395e054362
Loading.../singular: 82b4ea7ed1439094d7c4be13aaba9a66
Success!%20Changes%20saved./singular: 906371aaeec474803e22ae959605dad8
Error%3A%20Request%20failed./singular: cdeaab2374e34c0e396cdb2596a9824e
Add%20to%20Cart/singular: c93a29ccf502ff71bf08924dcdea9179
Out%20of%20Stock/singular: 6673fc95c2cee3c713e0d60c8184e289
Price%3A%20%24%25s/singular: a860f7b395e4a9d916a48717f9f8837a