Lokalisierung als Pipeline-Schritt.
Umschließen Sie eine Zeichenfolge mit _(), füllen Sie jedes Gebietsschema mit einem Befehl und bearbeiten Sie jede Übersetzung live in Ihrer laufenden App – .po-Dateien von Anfang bis Ende direkt zurück in Ihr Repo geschrieben. Oder steuern Sie das Ganze selbst mit einer echten HTTP-API.
Build-Tools für JavaScript & TypeScript.
Vier npm-Pakete bringen Echo Lingua von einem markierten String zur ausgelieferten Übersetzung, ohne dass Sie Ihre Codebasis verlassen müssen: die @echo-lingua/i18n-Laufzeitumgebung, Extrahieren und Kompilieren mit @echo-lingua/i18n-cli, Befüllen jeder Locale mit @echo-lingua/sdk und Live-Bearbeitung im Browser mit @echo-lingua/inline-editor. Dasselbe @echo-lingua/i18n-cli handhabt auch PHP und Laravel; siehe Build-Tools für jede Plattform unten.
@echo-lingua/i18n
Umschließen Sie Strings mit _(); der i18n-cli extrahiert eine .po pro Locale und kompiliert eine kleine Laufzeitumgebung.
@echo-lingua/sdk
Füllen Sie jedes Gebietsschema über die API – vom CLI oder einem typisierten Client aus.
Übersetzen →@echo-lingua/inline-editor
Eine Entwickler-Toolbar zum Bearbeiten von Übersetzungen in der laufenden App.
Im Browser bearbeiten →Zeichenfolgen umschließen. Eine kleine Laufzeitumgebung ausliefern.
Umschließen Sie UI-Text mit _() aus der @echo-lingua/i18n-Laufzeitumgebung; das @echo-lingua/i18n-cli-Tool scannt Ihren Quellcode, hydratisiert eine .po pro Locale und kompiliert die übersetzten in eine kompakte Laufzeitumgebung mit Platzhaltern, Pluralen und Rich Text. Fügen Sie direkt an der Aufrufstelle einen Kontext, Flags oder eine Notiz zum Modell hinzu. Die Laufzeitumgebung ist optional und nur für JS; die CLI ist der projektunabhängige Teil.
Strings markieren, bei Bedarf Flags hinzufügenimport { _, EL } from '@echo-lingua/i18n'; _('Save changes'); _('Hello {name}', { name }); _('You have {count} item', 'You have {count} items', { count }); // Das Optionsende: Flags, ein msgctxt und eine Notiz für das Modell. _('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', });
Extrahieren → Kompilieren# Die Laufzeitumgebung für Ihre App, die Toolchain für Ihren Build npm i @echo-lingua/i18n npm i -D @echo-lingua/i18n-cli # Den Code scannen, ein .po pro Gebietsschema hydrieren npx echo-lingua-i18n extract # Die übersetzten Kataloge für die Laufzeit kompilieren npx echo-lingua-i18n compile
Build-Tools für jede Plattform.
Der Extraktor und Compiler, @echo-lingua/i18n-cli, ist projektunabhängig. Er scannt JavaScript, TypeScript und PHP (einschließlich .phtml-Templates), hydratisiert dieselben .po-Dateien und kompiliert sie in das Format, das Ihre Laufzeitumgebung nativ liest: den JS-Katalog, eine binäre .mo für PHP gettext() oder flaches JSON für Laravel __(). Es gibt keine Echo Lingua-Laufzeitumgebung außerhalb von JS, die übernommen werden muss; Sie behalten Ihre eigene. Jeder andere gettext-Stack (Python, Go, C) steuert dieselbe Plattform über die unten stehende HTTP-API.
Strings in PHP oder .phtml markieren<?php // Markieren Sie Strings mit den gettext- / Laravel-Funktionen, die Sie bereits verwenden _('Account settings'); ngettext('one invoice', '{count} invoices', $n); pgettext('nav', 'Home'); __('Welcome back'); // Laravel String-Key
Native Targets kompilieren// i18n.config.mjs — eine Konfiguration für die gesamte Toolchain export default { locales: ['de', 'fr'], include: ['src/**/*.{php,phtml}'], compileTargets: ['mo'], // oder 'laravel' (flaches JSON) oder 'js' }; # Schreibt eine native .mo-Datei pro Locale für PHP gettext() npx echo-lingua-i18n sync
Übersetzen Sie über die CLI oder Ihren eigenen Code.
Der API-Client und die Translate-CLI. echo-lingua translate liest Ihre Konfiguration, füllt das .po jedes Gebietsschemas über die API und schreibt sie zurück. Oder rufen Sie den typisierten Client aus Ihrem eigenen Code auf – erstellen Sie einen Job, warten Sie darauf und laden Sie die Repository-förmige Ausgabe herunter.
die translate-cli# Füllen Sie die .po-Dateien für jedes Gebietsschema direkt über die API npm i @echo-lingua/sdk # Liest Ihre Konfiguration, schreibt die Übersetzungen zurück npx echo-lingua translate
oder der typisierte Clientimport { EchoLingua } from '@echo-lingua/sdk'; const el = new EchoLingua({ apiKey: process.env.ECHO_LINGUA_KEY }); // Einen Job erstellen, darauf warten und das Repository-förmige Zip herunterladen. 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);
Übersetzungen in der laufenden App bearbeiten.
Eine Entwickler-Toolbar wird in Ihre App eingebunden. Halten Sie Alt gedrückt und klicken Sie auf eine beliebige übersetzte Zeichenfolge, um deren Übersetzung live zu bearbeiten, den englischen Quelltext zu korrigieren, Kontext oder Flags hinzuzufügen oder sie durch eine KI korrigieren, kürzen oder neu übersetzen zu lassen. Verwalten Sie Pluralformen, überschreiben Sie das angezeigte Englisch und führen Sie die gesamte Schleife von Extrahieren → Übersetzen → Kompilieren aus – jede Änderung wird direkt in Ihr Repo zurückgeschrieben.
Vite-Plugin hinzufügen (nur für Entwicklung)// 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
Der Editor im Browser. Gekoppelt mit @echo-lingua/i18n – eine Babel-Transformation ordnet jeden Klick dem exakten _()-Aufruf zu, und ein Dev-Server liest und schreibt Ihre .po-Dateien und den Quellcode. Wird nie in die Produktion ausgeliefert.
Oder implementieren Sie es selbst.
Sie verwenden kein JavaScript oder automatisieren von einem anderen Stack aus? Jede Funktion oben ist ein einfacher HTTP-Aufruf – ein definierter Key, ein POST, ein signierter Webhook bei Abschluss. Es steuert jedes gettext-Projekt, in jeder Sprache.
Kosten schätzen, dann den Job erstellen.
Testen Sie die Größe und Kosten zuerst mit /v1/jobs/estimate – es fallen keine Gebühren an –, erstellen Sie dann den Job mit demselben Body. Jeder inputs-Eintrag ist eine .po-Datei mit eigenem targetLanguage; sourceLanguage und contextMode sind erforderlich, quality ist draft, standard oder 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 · Größe + Kosten, keine Gebühren{
"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 · der erstellte Auftrag{
"id": "job_8f2c41",
"status": "QUEUED",
"sourceLanguage": "en",
"contextMode": "ui-label",
"quality": "standard",
"createdAt": 1726669120000
}Ein Bearer-Token. Die Berechtigungen, die Sie ihm erteilen.
Erstellen Sie Schlüssel in der App – jeder wird once angezeigt, hat ein Ablaufdatum und ist widerrufbar. Die Nutzung wird pro Schlüssel zugeordnet. Authentifizieren Sie sich mit einem einzigen Header:
jede AnfrageAuthorization: Bearer elk_live_2b7f…
# elk_-prefixed. Wird einmalig bei der Erstellung angezeigt; speichern Sie es in einem Secret.translate:write
Aufträge erstellen, fehlgeschlagene Einträge wiederholen, Läufe abbrechen.
jobs:read
Auftragsstatus und -anzahl lesen, Aufträge auflisten, Ausgabe herunterladen.
Signierte Zustellung statt Polling.
Registrieren Sie einen Endpunkt für job.completed und job.failed. Jede Zustellung ist über den Rohkörper HMAC-SHA256-signiert – verifizieren Sie sie, bevor Sie ihr vertrauen. Wiederholungen nutzen ein begrenztes exponentielles Backoff.
Zustellung · Header + BodyPOST https://your-app.example/hooks/echo-lingua X-EchoLingua-Signature: 9f86d0818… (Hex-HMAC-SHA256 des rohen Bodys) 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, über den Rohkörperimport { createHmac, timingSafeEqual } from 'node:crypto'; // Über den ROHEN Request-Body verifizieren, vor dem JSON-Parsing. 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); }
Bei Release übersetzen, Pull-Request öffnen.
Starten Sie einen Auftrag aus der CI, lassen Sie sich vom signierten Webhook den Abschluss bestätigen, ziehen Sie dann die Repository-förmige Ausgabe und öffnen Sie einen Pull-Request – ganz ohne Browser.
.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
# Ein signiertes `job.completed`-Webhook öffnet den PR mit den übersetzten Katalogen.Die Endpunkte, die Sie tatsächlich verwenden werden.
Die obigen Endpunkte werden Sie zuerst ansteuern. Alle Endpunkte in der Dokumentation ansehen →
Lizensieren Sie jedes Gebietsschema aus Ihrer Pipeline.
Erstellen Sie einen begrenzten Schlüssel, senden Sie einen Auftrag per POST und richten Sie den Webhook ein. Die Grundgebühr für den ersten Monat geht auf uns.
API-Schlüssel anfordern