La localización como un paso de la canalización.
Envuelve una cadena en _(), completa cada configuración regional con un comando y edita cualquier traducción en tiempo real en tu aplicación en ejecución: archivos .po de principio a fin, escritos directamente en tu repositorio. O gestiona todo tú mismo con una API HTTP real.
Herramientas de compilación para JavaScript y TypeScript.
Cuatro paquetes npm llevan a Echo Lingua desde una cadena marcada hasta una traducción enviada, sin salir de su base de código: el tiempo de ejecución @echo-lingua/i18n, extraer y compilar con @echo-lingua/i18n-cli, completar cada localización con @echo-lingua/sdk, y editar en vivo en el navegador con @echo-lingua/inline-editor. El mismo @echo-lingua/i18n-cli también maneja PHP y Laravel; vea herramientas de compilación para cada plataforma a continuación.
@echo-lingua/i18n
Envuelva las cadenas en _(); el i18n-cli extrae un .po por localización y compila un tiempo de ejecución diminuto.
@echo-lingua/sdk
Completa cada configuración regional a través de la API, desde la CLI o un cliente tipado.
Traducir →@echo-lingua/inline-editor
Una barra de herramientas solo para desarrollo para editar traducciones en la aplicación en ejecución.
Editar en el navegador →Envuelve una cadena. Envía un pequeño entorno de ejecución.
Envuelva el texto de la interfaz en _() desde el tiempo de ejecución @echo-lingua/i18n; la herramienta @echo-lingua/i18n-cli escanea su código fuente, hidrata un .po por localización y compila los traducidos en un tiempo de ejecución compacto con marcadores de posición, plurales y texto enriquecido. Añada un contexto, flags o una nota al modelo directamente en el sitio de la llamada. El tiempo de ejecución es opcional y solo para JS; la CLI es la mitad agnóstica al proyecto.
marca cadenas, añade banderas cuando las necesitesimport { _, EL } from '@echo-lingua/i18n'; _('Save changes'); _('Hello {name}', { name }); _('You have {count} item', 'You have {count} items', { count }); // La cola de opciones: banderas, un msgctxt y una nota para el modelo. _('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', });
extraer → compilar# El tiempo de ejecución para su aplicación, la cadena de herramientas para su compilación npm i @echo-lingua/i18n npm i -D @echo-lingua/i18n-cli # Analiza el código e hidrata un .po por configuración regional npx echo-lingua-i18n extract # Compilar los catálogos traducidos en el entorno de ejecución npx echo-lingua-i18n compile
Herramientas de compilación para cada plataforma.
El extractor y compilador, @echo-lingua/i18n-cli, es agnóstico al proyecto. Escanea JavaScript, TypeScript y PHP (incluyendo plantillas .phtml), hidrata los mismos archivos .po y los compila a lo que sea que su entorno de ejecución lea de forma nativa: el catálogo JS, un .mo binario para PHP gettext(), o JSON plano para Laravel __(). No hay un tiempo de ejecución de Echo Lingua que adoptar fuera de JS; usted mantiene el suyo. Cualquier otra pila de gettext (Python, Go, C) impulsa la misma plataforma a través de la API HTTP a continuación.
marcar cadenas en PHP o .phtml<?php // Marcar cadenas con las funciones de gettext / Laravel que ya utiliza _('Account settings'); ngettext('one invoice', '{count} invoices', $n); pgettext('nav', 'Home'); __('Welcome back'); // clave de cadena de Laravel
compilar objetivos nativos// i18n.config.mjs — una configuración para toda la cadena de herramientas export default { locales: ['de', 'fr'], include: ['src/**/*.{php,phtml}'], compileTargets: ['mo'], // o ’laravel’ (JSON plano), o ’js’ }; # Escribe un .mo nativo por localización para PHP gettext() npx echo-lingua-i18n sync
Traduce desde la CLI o desde tu propio código.
El cliente de la API y la CLI de traducción. echo-lingua translate lee tu configuración, completa el .po de cada configuración regional a través de la API y los escribe de vuelta. O llama al cliente tipado desde tu propio código: crea un trabajo, espera a que termine y descarga el resultado con la estructura del repositorio.
la CLI de traducción# Completa el .po de cada configuración regional a través de la API, en el lugar npm i @echo-lingua/sdk # Lee tu configuración y vuelve a escribir las traducciones npx echo-lingua translate
o el cliente tipadoimport { EchoLingua } from '@echo-lingua/sdk'; const el = new EchoLingua({ apiKey: process.env.ECHO_LINGUA_KEY }); // Crea un trabajo, espera a que termine y descarga el archivo zip con la estructura del repositorio. 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);
Edita las traducciones en la aplicación en ejecución.
Una barra de herramientas solo para desarrollo se integra en tu aplicación. Mantén pulsado Alt y haz clic en cualquier cadena traducida para editar su traducción en tiempo real, corregir el origen en inglés, añadir contexto o indicadores, o dejar que la IA corrija, acorte o vuelva a traducir. Gestiona formas plurales, sobrescribe el inglés mostrado y ejecuta todo el bucle de extracción → traducción → compilación; cada cambio se escribe directamente en tu repositorio.
añadir el plugin de Vite (solo desarrollo)// 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
El editor en el navegador. Se vincula con @echo-lingua/i18n: una transformación de Babel asigna cada clic a la llamada _() exacta, y un servidor de desarrollo lee y escribe tus archivos .po y el código fuente. Nunca se envía a producción.
O configúralo tú mismo.
¿No usas JavaScript o estás automatizando desde otra plataforma? Todas las funciones anteriores son llamadas HTTP simples: una clave con ámbito, un POST y un webhook firmado cuando termine. Funciona con cualquier proyecto gettext, en cualquier lenguaje.
Estima el coste y luego crea el trabajo.
Comprueba primero el tamaño y el coste con /v1/jobs/estimate (no se cobra nada) y luego crea la ejecución con el mismo cuerpo. Cada entrada de inputs es un archivo .po con su propio targetLanguage; sourceLanguage y contextMode son obligatorios, quality es draft, standard o 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 · tamaño + coste, no se cobra nada{
"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 · el trabajo creado{
"id": "job_8f2c41",
"status": "QUEUED",
"sourceLanguage": "en",
"contextMode": "ui-label",
"quality": "standard",
"createdAt": 1726669120000
}Un token de portador. Los ámbitos que le concedas.
Crea claves en la aplicación; cada una se muestra once, incluye una fecha de caducidad y se puede revocar. El uso se atribuye por clave. Autentícate con una sola cabecera:
cada solicitudAuthorization: Bearer elk_live_2b7f…
# elk_-prefixed. Se muestra una vez al crearlo, guárdalo en un secreto.translate:write
Crea trabajos, reintenta entradas fallidas y cancela ejecuciones.
jobs:read
Consulta el estado y recuentos de los trabajos, lista los trabajos y descarga los resultados.
Entrega firmada, sin sondeos.
Registra un punto de conexión para job.completed y job.failed. Cada entrega incluye una firma HMAC-SHA256 del cuerpo sin procesar; verifícala antes de confiar en ella. Los reintentos utilizan un retroceso exponencial acotado.
entrega · cabeceras y cuerpoPOST https://your-app.example/hooks/echo-lingua X-EchoLingua-Signature: 9f86d0818… (hex HMAC-SHA256 del cuerpo sin procesar) 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, sobre el cuerpo sin procesarimport { createHmac, timingSafeEqual } from 'node:crypto'; // Verifica sobre el cuerpo de solicitud SIN PROCESAR, antes del análisis 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); }
Traduce al publicar y abre la solicitud de incorporación de cambios (PR).
Inicia un trabajo desde la integración continua, deja que el webhook firmado te avise cuando termine, descarga el resultado con la estructura del repositorio y abre una solicitud de incorporación de cambios, sin usar el navegador.
.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
# Un webhook job.completed firmado abre la PR con los catálogos traducidos.Los puntos de conexión que realmente utilizarás.
Los puntos de conexión anteriores son los que más usarás. Ver todos los puntos de conexión en la documentación →
Publica todos tus idiomas directamente desde tu canal de desarrollo.
Crea una clave con ámbito, haz un POST con un trabajo y configura el webhook. El cargo fijo de tu primer mes corre por nuestra cuenta.
Obtener una clave de API