التدويل (i18n) في PHP: من الأساسيات إلى الحلول الحديثة
\n\nالتدويل (i18n) هو عملية تصميم البرمجيات بحيث يمكن تكييفها بسهولة مع لغات ومناطق مختلفة دون تغيير الكود. في PHP، توجد عدة طرق لتنفيذ i18n، من الدوال المدمجة إلى المكتبات القوية. في هذه المقالة، سنستعرض الأدوات الرئيسية وأفضل الممارسات.
\n\nلماذا نحتاج إلى التدويل؟
\nالهدف الرئيسي لـ i18n هو فصل نص الواجهة عن الكود. يتيح ذلك:
\n- \n
- إضافة لغات جديدة دون تغيير منطق التطبيق \n
- دعم إعدادات محلية متعددة (تنسيقات التواريخ والأرقام والعملات) \n
- تبسيط عملية الترجمة للمترجمين \n
- الامتثال للمعايير الإقليمية (مثل تنسيق رقم الهاتف) \n
الدعم المدمج: gettext
\nتقدم PHP آلية قوية gettext للعمل مع الترجمات. هذا هو النهج الكلاسيكي المستخدم في معظم أنظمة Linux.
\n\nالتثبيت والإعداد
\nتأكد من تثبيت إضافة gettext. في معظم توزيعات Linux، تكون متاحة افتراضيًا. بالنسبة لنظام Windows، قد تحتاج إلى تفعيل php_gettext.dll في ملف php.ini.
إنشاء ملفات الترجمة
\nأولاً، أنشئ دليلاً للإعدادات المحلية. الهيكل النموذجي:
\nlocale/\n ru_RU/\n LC_MESSAGES/\n messages.po\n messages.mo\n en_US/\n LC_MESSAGES/\n messages.po\n messages.mo\n\nملفات .po (Portable Object) هي ملفات نصية تحتوي على الترجمات. مثال على محتوى messages.po للغة الروسية:
msgid "Welcome"\nmsgstr "Добро пожаловать"\n\nmsgid "Hello, %s!"\nmsgstr "Здравствуйте, %s!"\n\nقم بترجمة .po إلى .mo الثنائي باستخدام الأداة msgfmt:
msgfmt locale/ru_RU/LC_MESSAGES/messages.po -o locale/ru_RU/LC_MESSAGES/messages.mo\n\nالاستخدام في الكود
\nمثال على سكريبت PHP مع gettext:
\n<?php\n// تعيين الإعداد المحلي والمجال\n$locale = 'ru_RU';\nputenv("LANG=$locale");\nsetlocale(LC_ALL, $locale);\nbindtextdomain('messages', __DIR__ . '/locale');\ntextdomain('messages');\n\n// ترجمة السلاسل\necho gettext('Welcome'); // سيطبع "Добро пожаловать"\necho _('Hello, %s!', 'Иван'); // سيطبع "Здравствуйте, Иван!"\n?>\n\nالدالة _() هي اختصار لـ gettext(). للترجمة مع العناصر النائبة، استخدم sprintf():
echo sprintf(_('Hello, %s!'), $username);\n\nالنهج الحديث: symfony/translation
\nللمشاريع الكبيرة، من الأسهل استخدام مكتبة symfony/translation. تقدم واجهة أكثر مرونة، ودعمًا لتنسيقات مختلفة (YAML، XLIFF، JSON)، وتتكامل بسهولة مع الأطر.
\n\nالتثبيت عبر Composer
\ncomposer require symfony/translation\n\nمثال على الاستخدام
\n<?php\nrequire_once __DIR__ . '/vendor/autoload.php';\n\nuse Symfony\\Component\\Translation\\Translator;\nuse Symfony\\Component\\Translation\\Loader\\ArrayLoader;\n\n$translator = new Translator('ru_RU');\n$translator->addLoader('array', new ArrayLoader());\n\n// إضافة الترجمات مباشرة (للغرض التوضيحي)\n$translator->addResource('array', [\n 'Welcome' => 'Добро пожаловать',\n 'Hello %name%' => 'Здравствуйте, %name%',\n], 'ru_RU');\n\n// التبديل إلى الإنجليزية\n$translator->setLocale('en_US');\n$translator->addResource('array', [\n 'Welcome' => 'Welcome',\n 'Hello %name%' => 'Hello, %name%',\n], 'en_US');\n\n// الاستخدام\necho $translator->trans('Welcome'); // "Welcome"\necho $translator->trans('Hello %name%', ['%name%' => 'John']); // "Hello, John"\n?>\n\nالعمل مع ملفات YAML
\nأنشئ ملف messages.ru.yaml: