Локализация как этап конвейера.
Оберните строку в _(), заполните все локали одной командой и редактируйте любой перевод в реальном времени в запущенном приложении — файлы .po проходят весь путь и записываются прямо в ваш репозиторий. Либо управляйте процессом самостоятельно через полноценный HTTP API.
Инструменты сборки для JavaScript и TypeScript.
Четыре npm-пакета превращают Echo Lingua из помеченной строки в готовый перевод, не покидая вашу кодовую базу: среда выполнения @echo-lingua/i18n, извлечение и компиляция с @echo-lingua/i18n-cli, заполнение каждой локали с @echo-lingua/sdk и редактирование в режиме реального времени в браузере с @echo-lingua/inline-editor. Тот же @echo-lingua/i18n-cli также обрабатывает PHP и Laravel; см. инструменты сборки для каждой платформы ниже.
@echo-lingua/i18n
Оберните строки в _(); i18n-cli извлекает .po для каждой локали и компилирует компактную среду выполнения.
@echo-lingua/sdk
Заполните все локали через API — с помощью CLI или типизированного клиента.
Перевести →@echo-lingua/inline-editor
Панель инструментов только для разработчиков для редактирования переводов в запущенном приложении.
Редактирование в браузере →Оберните строку. Получите компактную среду исполнения.
Оберните текст интерфейса в _() из среды выполнения @echo-lingua/i18n; инструмент @echo-lingua/i18n-cli сканирует исходный код, наполняет .po для каждой локали и компилирует переведенные строки в компактную среду выполнения с поддержкой плейсхолдеров, плюральных форм и форматированного текста. Добавьте контекст, флаги или примечание к модели прямо на месте вызова. Среда выполнения опциональна и доступна только для JS; CLI является проектно-независимой частью.
размечайте строки, добавляйте флаги при необходимостиimport { _, EL } from '@echo-lingua/i18n'; _('Save changes'); _('Hello {name}', { name }); _('You have {count} item', 'You have {count} items', { count }); // Хвостовые параметры: флаги, msgctxt и примечание для модели. _('Order', {}, { context: 'verb' }); _('Save', {}, { flags: [EL.CONTEXT_UI_LABEL] }); _('There is a file', 'There are {count} files', { count }, { flags: [EL.QUALITY_PRO, EL.CONTEXT_LEGAL], comment: 'Shown under the section title', });
извлечение → компиляция# Среда выполнения для вашего приложения, инструментарий для вашей сборки npm i @echo-lingua/i18n npm i -D @echo-lingua/i18n-cli # Сканирование кода, гидратация .po для каждой локали npx echo-lingua-i18n extract # Компиляция переведенных каталогов в среду исполнения npx echo-lingua-i18n compile
Инструменты сборки для каждой платформы.
Экстрактор и компилятор, @echo-lingua/i18n-cli, является проектно-независимым. Он сканирует JavaScript, TypeScript и PHP (включая шаблоны .phtml), наполняет одни и те же файлы .po и компилирует их в то, что ваше приложение читает нативно: JS-каталог, бинарный файл .mo для PHP gettext() или плоский JSON для Laravel __(). Среда выполнения Echo Lingua не требуется вне JS; вы используете свою собственную. Любой другой стек gettext (Python, Go, C) управляет той же платформой через HTTP API ниже.
помечайте строки в PHP или .phtml<?php // Помечайте строки функциями gettext / Laravel, которые вы уже используете _('Account settings'); ngettext('one invoice', '{count} invoices', $n); pgettext('nav', 'Home'); __('Welcome back'); // Laravel string-key
компиляция нативных таргетов// i18n.config.mjs — один конфиг для всей цепочки инструментов export default { locales: ['de', 'fr'], include: ['src/**/*.{php,phtml}'], compileTargets: ['mo'], // или «laravel» (плоский JSON), или «js» }; # Записывает нативный .mo файл для каждой локали для PHP gettext() npx echo-lingua-i18n sync
Переводите через CLI или собственный код.
API-клиент и CLI перевода. echo-lingua translate читает вашу конфигурацию, заполняет .po для каждой локали через API и записывает их обратно. Или используйте типизированный клиент в своем коде — создайте задание, дождитесь его выполнения и скачайте вывод в структуре репозитория.
translate CLI# Заполнение файла .po для каждой локали через API на месте npm i @echo-lingua/sdk # Читает вашу конфигурацию, записывает переводы обратно npx echo-lingua translate
или типизированный клиентimport { EchoLingua } from '@echo-lingua/sdk'; const el = new EchoLingua({ apiKey: process.env.ECHO_LINGUA_KEY }); // Создайте задание, дождитесь его завершения и скачайте zip-архив в структуре репозитория. const job = await el.createJob({ sourceLanguage: 'en', contextMode: 'ui-label', quality: 'standard', inputs: [{ filename: 'de/messages.po', targetLanguage: 'de', content }], }); const done = await el.waitForJob(job.id, { onProgress: (j) => log(j.status) }); const zip = await el.downloadJob(done.id);
Редактирование переводов в запущенном приложении.
Панель инструментов только для разработчиков, внедряемая в приложение. Удерживайте Alt и нажмите на любую переведенную строку, чтобы отредактировать ее в реальном времени, исправить английский исходник, добавить контекст или флаги, либо позволить ИИ исправить, сократить или перевести ее заново. Управляйте формами множественного числа, переопределяйте отображаемый английский текст и запускайте полный цикл «извлечение → перевод → компиляция» — все изменения записываются прямо в репозиторий.
добавить Vite-плагин (только для разработки)// vite.config.ts — dev only import { echoLinguaBabel, echoLinguaInlineEditor } from '@echo-lingua/inline-editor'; export default defineConfig(({ command }) => ({ plugins: [ react(command === 'serve' ? { babel: { plugins: [echoLinguaBabel()] } } : {}), echoLinguaInlineEditor(), ], }));
@echo-lingua/inline-editor
Редактор в браузере. Работает в паре с @echo-lingua/i18n — Babel-трансформация привязывает каждый клик к точному вызову _(), а сервер разработки читает и записывает ваши .po файлы и исходный код. Никогда не попадает в продакшн.
Или настройте все самостоятельно.
Используете не JavaScript или автоматизируете из другого стека? Все функции выше доступны через обычные HTTP-запросы: scoped-ключ, один POST-запрос и подписанный вебхук по завершении. Это работает с любым проектом gettext, на любом языке.
Оцените стоимость, затем создайте задание.
Сначала оцените размер и стоимость с помощью /v1/jobs/estimate — оплата не взимается — затем создайте задание с тем же телом запроса. Каждая запись inputs — это файл .po со своим targetLanguage; sourceLanguage и contextMode обязательны, quality является draft, standard или pro.
POST /v1/jobs/estimatecurl -X POST https://api.echo-lingua.com/v1/jobs/estimate \ -H "Authorization: Bearer $ECHO_LINGUA_KEY" \ -H "Content-Type: application/json" \ -d @job.json # same body as the create call — nothing is charged
200 · размер + стоимость, оплата не взимается{
"entries": 550,
"chunks": 10,
"words": 7400,
"chargedMicros": 2386500,
"creditRequiredMicros": 2505825
}POST /v1/jobscurl -X POST https://api.echo-lingua.com/v1/jobs \ -H "Authorization: Bearer $ECHO_LINGUA_KEY" \ -H "Content-Type: application/json" \ -d '{ "sourceLanguage": "en", "contextMode": "ui-label", "quality": "standard", "inputs": [ { "filename": "de/messages.po", "targetLanguage": "de", "content": "…" }, { "filename": "ar/messages.po", "targetLanguage": "ar", "content": "…" } ] }'
201 · созданная задача{
"id": "job_8f2c41",
"status": "QUEUED",
"sourceLanguage": "en",
"contextMode": "ui-label",
"quality": "standard",
"createdAt": 1726669120000
}Один токен Bearer. Права доступа, которые вы ему предоставляете.
Создавайте ключи в приложении: каждый имеет once, срок действия и может быть отозван. Расходы привязываются к конкретному ключу. Аутентификация осуществляется через единственный заголовок:
каждый запросAuthorization: Bearer elk_live_2b7f…
# elk_-prefixed. Показывается один раз при создании, сохраните его в секретах.translate:write
Создавайте задачи, повторяйте неудачные элементы, отменяйте запуски.
jobs:read
Получайте статус и счетчики задач, список задач и скачивайте результаты.
Подписанная доставка вместо опросных запросов.
Зарегистрируйте эндпоинт для job.completed и job.failed. Каждое сообщение подписано алгоритмом HMAC-SHA256 по телу запроса — проверяйте подпись перед обработкой. При сбоях используется экспоненциальная задержка повторов.
доставка · заголовки и телоPOST https://your-app.example/hooks/echo-lingua X-EchoLingua-Signature: 9f86d0818… (шестнадцатеричный HMAC-SHA256 необработанного тела запроса) X-EchoLingua-Timestamp: 1726669123456 X-EchoLingua-Delivery: whd_3f9c8a { "id": "whd_3f9c8a", "type": "job.completed", "createdAt": 1726669123456, "data": { "jobId": "job_8f2c41", "status": "COMPLETE", "downloadUrl": "/v1/jobs/job_8f2c41/download" } }
verify.ts для проверки исходного тела запросаimport { createHmac, timingSafeEqual } from 'node:crypto'; // Проверка по НЕОБРАБОТАННОМУ телу запроса до разбора JSON. export function verify(rawBody, signature, secret) { const expected = createHmac('sha256', secret).update(rawBody).digest('hex'); const a = Buffer.from(signature); const b = Buffer.from(expected); return a.length === b.length && timingSafeEqual(a, b); }
Переводите при релизе, открывайте пул-реквест.
Запускайте задачу из CI, получайте уведомление по подписанному вебхуку, скачивайте архив в структуре репозитория и открывайте pull request без участия браузера.
.github/workflows/translate.ymlname: Translate on release
on:
release:
types: [published]
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Kick off a translation job
run: |
curl -sS -X POST https://api.echo-lingua.com/v1/jobs \
-H "Authorization: Bearer ${{ secrets.ECHO_LINGUA_KEY }}" \
-H "Content-Type: application/json" \
-d @job.json
# Подписанный вебхук job.completed открывает PR с переведенными каталогами.Эндпоинты, которые вы будете использовать чаще всего.
Приведенные выше эндпоинты понадобятся вам в первую очередь. Все эндпоинты в документации →
Переводите все локали прямо из вашего пайплайна.
Создайте ключ с ограничениями, отправьте задачу через POST и настройте вебхук. Плата за обслуживание за первый месяц — за наш счет.
Получить API-ключ