السلام عليكم
اريد توفير موقعي على اكثر من لغة وابحث عن اسهل طريقة لانشاء ترجمة لعبارات الموقع بدون تكرار تعديل الملفات
موقعي بالكامل مبرمج ب php
واريد انشاء نسخ متعددة /en مثلا
هل لديكم مقترحات ؟
وعليكم السلام ورحمة الله
دعنا نقسم الأمر إلى عدة نقاط حتى يسهل شرحه و يصبح أوضح :
يجب بداية إذا دخل الزائر لموقعي أول مرة أن أختار له اللغة الافتراضية و أخزنها بال Session أو بال Cookie وقد يكون اختيارها لعدة أسباب , مثلاً بلد المستخدم تستخدم هذه اللغة أو معظم زوار الموقع يستخدمون هذه اللغة أو أي طريقة تجدها مناسبة.
عند اختيار الزائر لأي لغة , يجب أن أعدل هذه القيمة في ال Session أو ال Cookie بناءً على اختيار الزائر .
من الممكن أيضاً إذا كان الشخص قد سجّل دخوله أن نحفظ له اللغة التي اختارها ضمن الداتابيز , حتى لا يضطر كل مرة لاختيار اللغة من جديد .
والبيانات الثابتة هي التي لا تتغير بشكل ما أو ضمن أي نشاط معين لأحد الأشخاص , مثل اسم الموقع أو ال Labels الخاصة بالموقع (تواصل معنا - اضغط هنا - الرئيسية الخ ... ))
وهذه البيانات من السهل التعامل معها , بجعل ملف json لكل لغة باسمها يحوي كل هذه ال labels و قبل استدعاء أي صفحة نستدعي ملف اللغة المناسب لنستخدمه
وكمثال على ذلك :
كما يمكن جعل ملف php يقوم بإرجاع مصفوفة تحوي هذه الأمور بدل ملف ال json .
وهنا نقصد على الأغلب البيانات المخزنة في الداتابيز , وفي الحقيقة هي الأصعب في التعامل , الآن يأتي السؤال كيف نخزن الترجمات في الداتابيز و نستدعيها ؟
هناك طريقتين :
هي جعل أسماء الحقول مرفقة باسم اللغة مثال ذلك :
لاحظ أننا أضفنا اسم اللغة كلاحقة لكل من ال summary وال title وهكذا ببساطة يمكنني عند جلب هذا السطر القيام بشيء مشابه لهذا :
<?php echo $row->title_{$_SESSION["language"]} ?>
وهذه الطريقة جيدة إذا كان الموقع بسيط ولا يحتوي الكثير من الداتا أو اللغات , ولكن تخيل معي لو كان الموقع يحوي 10 لغات , هل من المعفول إضافة 10 حقول لكل جدول ؟! هنا نلجأ للطريقة الثانية .
هي إضافة جدول ترجمة لكل جدول يحتاج هذه العملية , وجعل العلاقة one to many أي كل تصنيف مثلاً له عدة ترجمات :
نلاحظ أننا في الجدول الأساسي نضع كل شيء لا نحتاج ترجمته , وفي جدول الترجمة نضع حقل اللغة و حقل يرجعنا للجدول الرئيسي Foreign key بالإضافة لكل الحقول التي نحتاج ترجمتها , كما هو موضح في الصورة.
الآن لجلب هذه الترجمات نقوم بسطر Sql بسيط :
أهم ما يمكن ملاحظته ضمن هذه التعليمة أننا أدخلنا اللغة المختارة من المستخدم (ar) في نهاية التعليمة لجلب الترجمة المرادة.
مشكلة الطريقة الثانية أنها تكلفنا المزيد من SQL لجلب البيانات , ويمكن تجنب ذلك بعمل cache للترجمة وتحديثها كل مدة معينة , وال cache يمكن أن يكون ضمن ملفات json أو باستخدام أحد التقنيات الحديثة مثل redis .
تحياتي
التعليقات