لماذا تدويل PHP ليس مجرد "ترجمة كلمات"
\n\nتخيل: لقد كتبت مشروع PHP رائعًا. إنه يعمل، ويسعد المستخدمين، ويحقق أرباحًا. لكن في يوم من الأيام، تلاحظ في الإحصائيات أن 30% من الزوار من ألمانيا، و15% من اليابان، و10% من الإمارات. موقعك يتحدث الروسية فقط. يغادر المستخدمون دون أن يجدوا زر "شراء" بلغتهم.
\n\nهل هذا الموقف مألوف؟ تدويل (i18n) تطبيقات PHP ليس مجرد استبدال كلمات في القالب. إنه نهج معماري يسمح لرمزك بـ "فهم" الثقافة، والعملة، والتواريخ، وحتى اتجاه النص (من اليسار إلى اليمين أو من اليمين إلى اليسار).
\n\nفي هذه المقالة، سنشرح كيفية تحويل موقع PHP عادي إلى منصة متعددة اللغات باستخدام الأدوات الأصلية وأفضل الممارسات. ستتعلم كيف يعمل gettext في PHP، وما الفرق بين التوطين والتدويل، وكيف لا تقع في فخ الصيغ الجمع.
\n\ni18n مقابل l10n: ما الفرق (ولماذا هذا مهم)
\n\nقبل كتابة الكود، دعنا نتفق على المصطلحات. التدويل (i18n) هو إعداد الكود للترجمة: استخراج النصوص، التعامل مع تنسيقات الأرقام، التواريخ، العملات. التوطين (l10n) هو عملية الترجمة والتكييف لمنطقة معينة.
\n\nتشبيه بسيط: التدويل هو بناء منزل بغرف فارغة يمكن وضع أي أثاث فيها. التوطين هو ترتيب الأثاث وفقًا لأذواق ساكن معين.
\n\nبالنسبة لمطور PHP، هذا يعني: لا تقم بتضمين النصوص في الكود! أبدًا. حتى لو كان الموقع بالروسية فقط حاليًا. يجب تغليف كل عبارة في دالة ترجمة.
\n\nمجموعة التقنيات لـ i18n في PHP
\n\nفي نظام PHP البيئي، هناك عدة أدوات قوية. سننظر في نهجين رئيسيين: gettext الكلاسيكي و ICU MessageFormat الحديث عبر إضافة intl.
1. Gettext — جد تعدد اللغات
\n\nGettext في PHP هو المعيار الفعلي للعديد من أنظمة إدارة المحتوى (WordPress، Drupal). يستخدم ملفات .po و .mo لتخزين الترجمات. المزايا: البساطة، دعم صيغ الجمع، التكامل مع Poedit.
2. ICU MessageFormat — للمنطق المعقد
\n\nإضافة PHP intl (التدويل) توفر الفئات MessageFormatter و NumberFormatter. هذا هو الخيار للمشاريع التي تحتاج إلى قوالب معقدة مع اختيار حالة الإعراب والجنس والعدد.
3. مكتبات التغليف
\n- \n
- symfony/translation — مكون Symfony، يعمل مع YAML/XLIFF و gettext. \n
- laravel-localization — لـ Laravel (حزمة mcamara/laravel-localization). \n
- zend-i18n — لـ Laminas (Zend Framework سابقًا). \n
عمليًا: إعداد gettext في PHP من الصفر
\n\nلنفترض أن لدينا سكريبت بسيط index.php يعرض تحية. سنجعله متعدد اللغات.
الخطوة 1. تحضير الكود
\n\nقم بتغليف جميع النصوص في الدالة _() (اسم مستعار لـ gettext()):
<?php\n// index.php\necho _("مرحبًا بكم في موقعنا!");\n\n$items = 5;\n// لصيغ الجمع نستخدم ngettext\necho ngettext("%d منتج", "%d منتجات", $items);\n?>\n\nالخطوة 2. إنشاء ملف .pot
\n\nقم بتثبيت gettext على الخادم أو استخدم xgettext:
xgettext -o locales/messages.pot index.php --from-code=UTF-8\n\nالخطوة 3. إنشاء الترجمة
\n\nانسخ messages.pot إلى locales/ar_SA/LC_MESSAGES/messages.po وقم بتحريره:
msgid "مرحبًا بكم في موقعنا!"\nmsgstr "Welcome to our site!"\n\nmsgid "%d منتج"\nmsgid_plural "%d منتجات"\nmsgstr[0] "%d product"\nmsgstr[1] "%d products"\n\n