для разработчиков

Локализация как этап конвейера.

Оберните строку в _(), заполните все локали одной командой и редактируйте любой перевод в реальном времени в запущенном приложении — файлы .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; инструмент @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
за пределами javascript

Инструменты сборки для каждой платформы.

Экстрактор и компилятор, @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 файлы и исходный код. Никогда не попадает в продакшн.

http api

Или настройте все самостоятельно.

Используете не JavaScript или автоматизируете из другого стека? Все функции выше доступны через обычные HTTP-запросы: scoped-ключ, один POST-запрос и подписанный вебхук по завершении. Это работает с любым проектом gettext, на любом языке.

быстрый старт

Оцените стоимость, затем создайте задание.

Сначала оцените размер и стоимость с помощью /v1/jobs/estimate — оплата не взимается — затем создайте задание с тем же телом запроса. Каждая запись inputs — это файл .po со своим targetLanguage; sourceLanguage и contextMode обязательны, quality является draft, standard или pro.

POST /v1/jobs/estimate
curl -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/jobs
curl -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.yml
name: 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/v1/jobstranslate:writeСоздать задачу перевода.
POST/v1/jobs/estimatetranslate:writeОценка размера и стоимости без создания задачи.
POST/v1/jobs/plantranslate:writeКлассификация элементов в режиме пробного прогона.
GET/v1/jobsjobs:readСписок ваших задач.
GET/v1/jobs/{id}jobs:readПолучить статус и счетчики конкретной задачи.
GET/v1/jobs/{id}/downloadjobs:readСкачать ZIP-архив с результатами (в структуре репозитория).
GET/v1/jobs/{id}/reviewjobs:readЭлементы, помеченные для проверки.
POST/v1/jobs/{id}/retrytranslate:writeПовторный запуск только неуспешных элементов.
POST/v1/jobs/{id}/canceltranslate:writeОтменить выполняющуюся задачу.
POST/v1/translate/texttranslate:writeПеревести блок текста «на лету» без создания задачи.
POST/v1/translate/codetranslate:writeПеревести строковые литералы в фрагменте кода.
POST/v1/translate/estimatetranslate:writeУзнать стоимость синхронного перевода без списания.
POST/v1/templatestranslate:writeСгенерировать пустые PO-шаблоны для локалей.
GET/v1/usagejobs:readИспользование за текущий период, расходы и лимиты.

Приведенные выше эндпоинты понадобятся вам в первую очередь. Все эндпоинты в документации →

Переводите все локали прямо из вашего пайплайна.

Создайте ключ с ограничениями, отправьте задачу через POST и настройте вебхук. Плата за обслуживание за первый месяц — за наш счет.

Получить API-ключ