للمطورين

التوطين كخطوة في خط الأنابيب.

غلّف نصاً بـ _()، واملأ كل لغة بأمر واحد، وعدّل أي ترجمة مباشرة في تطبيقك قيد التشغيل — ملفات .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؛ تقوم أداة @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 والمصدر الخاص بك. لا يتم شحنه أبداً إلى الإنتاج.

واجهة برمجة تطبيقات http

أو قم بتوصيله بنفسك.

ألا تستخدم JavaScript، أو تقوم بالأتمتة من تقنية أخرى؟ كل ميزة أعلاه هي طلب HTTP عادي — مفتاح نطاق، طلب 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

قراءة حالة المهام والإحصاءات، سرد المهام، تنزيل المخرجات.

الخطافات (webhooks)

تسليم موقع، وليس بالاستعلام (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.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