سؤال

أريد البدء في استخدام gettext للتعامل مع ترجماتي في مشاريع الويب (PHP 5).نظرًا لأنه معيار مستخدم على نطاق واسع ويتمتع بسمعة طيبة، يبدو أنه الخيار الأفضل.

ومع ذلك، أسمع أيضًا أشياء حول الخادم غير متوافق وأنه غير آمن.ماذا يعني هذا بالنسبة لمشاريعي التي تستخدمه بعد ذلك؟نظرًا لأنني أقوم ببناء أشياء يستخدمها العديد من الأشخاص، فمن المهم جدًا أن يعمل الكود الخاص بي.

هل نتحدث عن مشكلات بسيطة (مثل استمرار الأشخاص في استخدام PHP 4) أو مشكلات كبيرة مثل انخفاض توزيع وتثبيت gettext على خوادم الويب؟

هل كانت مفيدة؟

المحلول

تنطبق مشكلة سلاسل الرسائل فقط إذا كان الشخص يستخدم PHP مضمنًا (على سبيل المثال Apache's mod-php) ويقوم بتشغيل خادم يستخدم سلاسل الرسائل (مثل خادم Apache مع عامل mpm).

لذلك - لا تنطبق عليك مشكلة سلامة الخيط إذا:

  1. أنت تستخدم خادم NGINX (لا يستخدم سلاسل الرسائل.)
  2. يمكنك استخدام Apache (إما مع MPM مترابطة أم لا) وPHP في وضع fastcgi
  3. يمكنك استخدام Apache مع MPM غير المترابط (مثل prefork-MPM) وPHP في وضع mod-php.

لذلك - لا ينبغي لمعظم الأشخاص الذين لديهم تثبيت افتراضي لـ Apache أن يقلقوا بشأن عدم كون gettext آمنًا لسلسلة الرسائل، حيث أن تثبيت apache الافتراضي في معظم التوزيعات يستخدم prefork-MPM غير المترابط!

ملاحظة.أيضًا - ضع في اعتبارك أن Apache على Windows مترابطة.

نصائح أخرى

وأعتقد أن لعب بعض أكثر مع فب تعليقات اليدوية جزء يجب أن تسبوا مزيد من المعلومات .... واحد من التعليقات من دليل على قسم gettext

<اقتباس فقرة>   

ووGNU أعمال مكتبة gettext على   لكل عملية، لا أساس لكل موضوع.   وهذا يعني أنه في متعدد المستخدمين   وضع مثل خادم الويب اباتشي   انها ستعمل فقط مع MPM prefork   (أي عملية واحدة لكل مستخدم). عامل   وسوف MPMs الخيوط الأخرى لا تعمل.

     

وبالإضافة إلى ذلك، العديد من المستخدمين التحكم GNU   gettext من خلال وضع بيئة نظام   المتغيرات مثل LANG. هذه ليست   حل جيد لخادم الويب   البيئة بسبب العرق واضح   الشرط.

http://www.php.net/manual/en/gettext .setup.php

واجهت نفس المشكلة مع PHP 5.6.30 VC11 Theard Safe على نظام التشغيل Windows 10.تم العثور على الحل البديل وإصلاح هذه المشكلة هنا بواسطة Sirio3mil.

يبدو أن PHP مع TS يمكنه الوصول إلى مجلد اللغة المحلية فقط.لذا، عند استدعاء دالة setlocale وputenv بلغة أخرى غير لغة النظام، لا يمكن قراءة المجلد الذي يحتوي على .mo و.po.

الحل البديل هو أن يكون لديك مجلد لغة واحد فقط يحتوي على لغة النظام وأزواج متعددة من ملفات ‎.mo/.po لكل لغة مترجمة.سيتم تعيين المجال باللغة المطلوبة.

مثال مع الفرنسية السويسرية والألمانية والإيطالية:

هيكل المجلد

\Locale\fr_CH\LC_MESSAGES

  • fr_CH.mo + fr_CH.po // لغة النظام
  • de_CH.mo + de_CH.po
  • it_CH.mo + it_CH.po

شفرة

$lang = 'fr_CH' or 'de_CH' or 'it_CH'

bindtextdomain($lang, '.\Locale');
textdomain($lang);
bind_textdomain_codeset($lang, 'UTF-8');
setlocale (LC_ALL, $lang);
putenv('LC_ALL=' . $lang);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top