التوطين كخطوة في خط الأنابيب.
غلّف نصاً بـ _()، واملأ كل لغة بأمر واحد، وعدّل أي ترجمة مباشرة في تطبيقك قيد التشغيل — ملفات .po من البداية إلى النهاية، مكتوبة مباشرة إلى مستودعك. أو قم بإدارة الأمر بالكامل بنفسك باستخدام واجهة برمجة تطبيقات HTTP حقيقية.
أدوات بناء لـ 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 أدناه.
تحديد النصوص في PHP أو .phtml<?php // قم بتحديد النصوص باستخدام وظائف gettext / Laravel التي تستخدمها بالفعل _('Account settings'); ngettext('one invoice', '{count} invoices', $n); pgettext('nav', 'Home'); __('Welcome back'); // مفتاح سلسلة Laravel
تجميع أهداف أصلية// 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
ترجم من واجهة سطر الأوامر أو من الكود الخاص بك.
عميل واجهة برمجة التطبيقات وواجهة سطر أوامر الترجمة. يقرأ echo-lingua translate إعداداتك، ويملأ .po الخاص بكل لغة عبر واجهة برمجة التطبيقات، ويكتبها مرة أخرى. أو استدعِ العميل المكتوب من الكود الخاص بك — أنشئ مهمة، انتظر اكتمالها، وقم بتنزيل المخرجات بهيكل المستودع.
واجهة سطر أوامر الترجمة# املأ ملف .po الخاص بكل لغة عبر واجهة برمجة التطبيقات، في مكانه 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 عادي — مفتاح نطاق، طلب 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
قراءة حالة المهام والإحصاءات، سرد المهام، تنزيل المخرجات.
تسليم موقع، وليس بالاستعلام (polling).
سجل نقطة نهاية لـ 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); }
ترجم عند الإصدار، وافتح طلب سحب (PR).
ابدأ مهمة من نظام التكامل المستمر (CI)، ودع الخطاف الموقع يخبرك عند اكتمالها، ثم اسحب المخرجات المصممة كالمستودع وافتح طلب سحب، بدون متصفح في الحلقة.
.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