PHP langsys/langsys-php

حزمة PHP SDK الأساسية: عميل واحد لأي تطبيق PHP — سواء كان PHP عادي أو إطار عمل أو عملية خلفية (worker) أو واجهة سطر أوامر (CLI). العبارة الموجودة في الشيفرة البرمجية هي مفتاح البحث وهي أيضًا القيمة الافتراضية باللغة الأساسية، فلا حاجة إلى ملف مفاتيح ولا إلى خطوة استخراج. تتم الترجمة على الخادم، فتصل الصفحة مترجمة جاهزة.

هذا SDK للواجهة الخلفية، لذا لا توجد ساحة تجريب داخل المتصفح في هذه الصفحة — فالمتصفح لا يستطيع تشغيل PHP. هل تستخدم Laravel؟ تغلّف حزمة Laravel هذا العميل بتوجيه Blade وبرمجية وسيطة وواجهة facade. المرجع الكامل: README.

هل تستخدم وكيل برمجة بالذكاء الاصطناعي؟ أعطه هذا الموجّه
Add Langsys translation to this PHP app.

1. Read https://docs.langsys.dev/llms.txt, then follow
   https://docs.langsys.dev/learn/sdk/php/ for the install and setup.
2. The English text in the code is the translation key. Wrap user-facing
   strings as they are: no keys file, no extraction step, and no
   hand-written plural or gender branches (Langsys generates those).
3. Read the Langsys project id and API key from environment variables.
   The write key is for development and servers only; anything shipped
   to the browser gets the read-only key.
4. Keep brand names and user-generated content out of translation.

التثبيت

composer require langsys/langsys-php

PHP 7.4 أو أحدث، مع الإضافات curl وjson وintl — فإضافة intl هي التي تعرض صيغ الجمع وتنسّق الأرقام والتواريخ لكل لغة محلية.

.env
# A server can hold a WRITE key — it never reaches visitors. A write key is
# what lets phrases your pages use for the first time register themselves.
LANGSYS_API_KEY=your-api-key
LANGSYS_PROJECT_ID=your-project-id

ليس لديك مشروع أو مفاتيح بعد؟ يوفّر لك البدء السريع كليهما في دقيقتين.

العميل

عميل واحد لكل طلب. يقرأ بيانات اعتماده من البيئة ويخزّن كتالوج كل لغة محلية مؤقتًا، لذا فإن ترجمة صفحة ما تكلّف استدعاءً واحدًا لواجهة API على الأكثر.

عرض المصدر ↗
<?php
require 'vendor/autoload.php';

use LangsysSDKClient;

// Reads LANGSYS_API_KEY and LANGSYS_PROJECT_ID from the environment.
$langsys = new Client();
$langsys->setLocale('es-es');

ترجمة

تأخذ translate() اللغة معاملًا ثانيًا والفئة معاملًا ثالثًا. مرّر null للغة لاستخدام اللغة الحالية للعميل.

عرض المصدر ↗
// translate($phrase, $locale, $category, $contentBlockId, $params)
echo $langsys->translate('Order confirmed', null, 'Checkout');   // current locale
echo $langsys->translate('Order confirmed', 'fr-fr', 'Checkout'); // an explicit one

// A phrase the project doesn't have yet renders as written — never blank.

القيم داخل الجملة

تستخدم العناصر النائبة الصيغة {name}، وهي الصيغة نفسها التي تخزّنها كل حزم Langsys SDK، فيُعرض فهرس واحد بشكل مطابق من واجهة PHP الخلفية وواجهة JS الأمامية.

عرض المصدر ↗
// Pass values as params, never build the string yourself.
echo $langsys->translate('Hello, {name}!', null, 'Greetings', null, ['name' => $user->name]);

// sprintf('Hello, %s!', $name) would register "Hello, Sarah!", "Hello, Ahmed!", …
// — one catalog entry per value, billed as words, and impossible to undo.

صيغ الجمع

شاهد · 1:14 صيغ الجمع

اكتب الجملة بصيغة واحدة مسطّحة: يولّد Langsys صيغ الجمع الخاصة بكل لغة أثناء الترجمة، وتعرض حزمة SDK الصيغة المطابقة لعددك.

عرض المصدر ↗
// Written flat. Langsys generates each locale's plural forms during
// translation and the SDK picks the branch that matches the count.
echo $langsys->translate('You have {count} new messages.', null, 'Inbox', null, ['count' => $count]);

تصل صيغ الجمع التي يولّدها Langsys إلى PHP اعتبارًا من الإصدار 1.3.2 من langsys/langsys-php؛ أما الإصدارات الأقدم فتعرض صيغة الجمع لكل عدد، بما في ذلك 1.

التوافق في الجنس

تصرّف الإسبانية والفرنسية والروسية {username} has been invited بحسب الشخص المقصود. يولّد Langsys هذه الفروع أثناء الترجمة — بالطريقة نفسها التي يولّد بها صيغ الجمع — ويُسمّى الوسيط باسم المتغيّر مع إلحاق _gender به: male أو female أو other. مرّره متى كنت تعرفه. كيف يعمل ذلك، وكيف تعثر على العبارات التي تحتاج إليه ←

تمرير معامل الجنس عرض المصدر ↗
// Pass the agreement argument alongside the value it inflects.
echo $langsys->translate('{username} has been invited', null, 'Team', null, [
    'username'        => $user->name,
    'username_gender' => $user->gender, // 'male' | 'female' | 'other'
]);

لا تعرف الجنس؟ مرّر 'other' صراحةً — فهو الفرع المحايد. وإذا لم يكن موجودًا، فإن حزمة SDK تأخذ الفرع other نيابةً عنك، ليبقى المعنى سليمًا في الجملة.

الفئات

تحدد الفئة نطاق العبارة، لذا يمكن أن تُترجم الكلمات نفسها ترجمات مختلفة في سياقات مختلفة.

// Same word, two meanings — the category disambiguates.
echo $langsys->translate('Home', null, 'Main Menu');     // es: "Inicio"
echo $langsys->translate('Home', null, 'Home repairs');  // es: "Casa"

اللغة المحلية للزائر

حدّدها من خلال التوجيه الخاص بك أو إعدادات المستخدم، أو دع العميل يقرأ ترويسة Accept-Language الخاصة بالمتصفح.

عرض المصدر ↗
use LangsysSDKLocaleLocaleDetector;

// Explicit, from your own routing or the user's settings:
$langsys->setLocale('pt-br');

// Or from the browser: without setLocale(), getLocale() reads Accept-Language
// and falls back to the project's base locale.
$locale = $langsys->getLocale();

// The same detection, from a header your framework hands you:
$locale = LocaleDetector::fromAcceptLanguage($request->getHeaderLine('Accept-Language'));

في قوالبك

تمنح أداة مساعدة صغيرة واجهاتك اسمًا قصيرًا وتقوم بترميز المخرجات للحماية منها.

helpers.php
<?php
// helpers.php — one client per request, one short name in your templates.
use LangsysSDKClient;

function t(string $phrase, string $category, array $params = []): string
{
    static $langsys = null;
    $langsys ??= (new Client())->setLocale($_SESSION['locale'] ?? 'en-us');

    return htmlspecialchars($langsys->translate($phrase, null, $category, null, $params));
}

// In a template:
// <h1><?= t('Welcome to our store', 'Home') ?></h1>

اكتشاف الرموز (Tokens) على الخادم

مع مفتاح كتابة، تُدرَج كل عبارة لم يرها المشروع من قبل في قائمة الانتظار أثناء عرضها، وتُسجَّل بعد إرسال الاستجابة — فيرى الزائر نص لغتك الأساسية فورًا، وتُترجم العبارة للزائر التالي. ومع مفتاح للقراءة فقط لا يُسجَّل شيء ولا يتعطل شيء.

عرض المصدر ↗
// With a write key, translate() queues every phrase the project doesn't have
// and sends them after the response, from a shutdown handler. Nothing to call.
// With a read key the queue is simply dropped — no errors.

// Or register up front, e.g. from a deploy script:
$langsys->registerPhrases([
    ['phrase' => 'Order confirmed', 'category' => 'Checkout'],
    ['phrase' => 'Copyright 2026', 'category' => 'Footer', 'translatable' => false],
]);

صفحات كاملة

هل لديك الصفحة بالفعل كسلسلة HTML؟ ترجمها دفعة واحدة، بما في ذلك قسم الرأس.

عرض المصدر ↗
// An HTML page you already have as a string: <title>, meta and OpenGraph
// tags, and the body — phrases and content blocks — in one pass.
ob_start();
// … your app renders the page …
$html = ob_get_clean();

echo $langsys->setLocale('es-es')->translatePage($html, 'Home');

التخزين المؤقت

عرض المصدر ↗
// Catalogs are cached for an hour (a file cache by default; Redis or none
// via LANGSYS_CACHE_DRIVER). After editing translations in the dashboard:
$langsys->clearCache('es-es');
ابحث في المستندات ومركز التعلّم