الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اريد صنع برنامج متتعدد اللغات بلغة #C

بدأه RedRoose11 في 3 أبريل 2013 · 6 رد · 1,342 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم 

اريد صنع برنامج متتعدد اللغات بلغة #C 

مع العلم نجحت في عمل التعدد عربي وانجلزي فقط بــ Form الرئيسي في البرنامج واحتاج الى تعريف اللغة في المشروع كامل 

عبر الفيديو ....




في لغة فيجوال بيسكك نستخدم الاداه Module والمشكله لا اعرف ما البديل عنها في السي شارب 

لان Module i هو الملف الي نعرف فيه اللغة لتكون متاحه للمشروع كامل ؟؟؟؟!!!!

#3

أخي الكريم هناك طرق متعددة لتعدد اللغات سواء باستخدام الـ Setting الذي يتضمنه المشروع

وسواء عن طريق ملفات XML  أو عن طريق ملف قاعدة بيانات

وسواء عن طريق الكود

 

كل طريقة تكون مناسبة في حالات معينة أو ربما تتبع رغبة المبرمج

 

سأقول لك طريقة أنا استخدمتها مؤخرا

 

أعرف صنف ستاتيكي وأسمه L  وأنا عادة ما استخدم الحرف الواحد عندما أحتاج استخدامه بكثرة في الكود حتى لا أرتبك بكتابة الاسم كامل أي L.lblName  بدلا من استخدامه Language.lblName

 

المهم داخل الصنف الستاتيكي أعرف الخانات التي ستخضع للتغير تبعا للغة

فمثلا

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication2
{
    public class L
    {

        static L()
        {
            Language = Languages.Arabic; // لتعيين لغة افتراضية 
        }


        public enum Languages
        {
            English,
            Arabic,
            Chinese,
        }


        public static void SwitchTo(Languages Language)
        {
            L.Language = Language;
        }

        public static Languages Language { get; set; }


        public static string mnuiHome { get { return (new string[] { "Home", "الرئيسية" })[(int)Language]; } }
        public static string mnuiRegister { get { return (new string[] { "Register", "اشتراك" })[(int)Language]; } }
        public static string mnuiSearch { get { return (new string[] { "Search", "بحث" })[(int)Language]; } }
        public static string mnuiContact { get { return (new string[] { "Contact", "اتصل بنا" })[(int)Language]; } }
        public static string btnSearch { get { return (new string[] { "Search", "بحث" })[(int)Language]; } }
        public static string btnRegister { get { return (new string[] { "Register", "اشتراك" })[(int)Language]; } }
        public static string sndEmlBtnSend { get { return (new string[] { "Send", "إرسال" })[(int)Language]; } }
        public static string sndEmlBtnClear { get { return (new string[] { "Clear", "مسح" })[(int)Language]; } }
        public static string sndEmlLblName { get { return (new string[] { "Name :", "الاسم :" })[(int)Language]; } }
        public static string sndEmlLblEmail { get { return (new string[] { "Email :", "الإيميل :" })[(int)Language]; } }
        public static string sndEmlLblSubject { get { return (new string[] { "Subject :", "العنوان :" })[(int)Language]; } }
        public static string sndEmlLblMessage { get { return (new string[] { "Message :", "الرسالة :" })[(int)Language]; } }
        public static string golMapOurLocation { get { return (new string[] { "Our Loacation", "موقعنا" })[(int)Language]; } }
        public static string srhNoKeywords { get { return (new string[] { "Please type some keyword(s) to search on it(s).", "الرجاء إدخال كلمة أو كلمات للبحث عنها." })[(int)Language]; } }
        public static string srhNoResults { get { return (new string[] { "Sorry, No Results Found Matching Your Search Criteria.", "معذرةً، لم يتم العثور على أية نتيجة تطابق بحثك." })[(int)Language]; } }
        public static string srhResults { get { return (new string[] { "About {0} results are found.", "تم العثور على {0} نتيجة تطابق بحثك." })[(int)Language]; } }

    }

}

 

تم تعريف تعداد باللغات التي سيتم التبديل بينها

 

ومتحول يعبر عن اللغة الحالية يكون من النوع التعداد السابق

 

ومنهج نمرر له اللغة ليتم التحويل بين اللغات وذلك بربطه بكومبو بوكس أو أي طريق للاختيار بين اللغات

 

ثم نعرف خصائص للقراءة فقط كل واحدة ستقابل أحد العناصر أو الأماكن التي ستخضع لتعدد اللغات مثل الليبل والعناوين وعناصر اللوائح وشريط الحالة وأسماء الأزرار

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

كمثال لدينا زر اسمه btnOk  ونحتاج استخدام خاصية الـ Text  و الـتلميح ToolTip  فنعرف خاصية داخل اللغة واحدة btnOkTxt  و الأخرى btnOkTip

وفي حال تشابهت العناصر نضيف إليها اختصار اسم الفورم مثلا منعا لتشابه الأسماء داخل ملف اللغة

 

الآن عندما تريد أن تلحق أي نص في أي مكان في البرنامج استبدله بالخاصية المقابلة في اللغة أي بدلا من btnOkTxt = "نعم" استخدم btnOkTxt = L.FrmMainBtnOkTxt

 

الأن كيف تتم الألية ؟

نلاحظ أننا استخدمنا خاصية بدلا من نص ثابت وبالتالي سيتم إظهار النصوص على الشاشات والعناصر وفق قيمة الخصائص القادمة من اللغة

 

لو راجعنا الكود السابق للاحظنا أن كل خاصية تعيد قيمة نصية من مصفوفة نصوص والـ Index  يتم تحديده من خلال (int)Language و التي تقوم بتحويل قيمة الخاصية Language  التي هي من نوع تعداد إلى رقم وبالتالي أصبح الإندكس يتغير تبعا للغة المحددة الحالية فلو كانت اللغة الإنكليزية سيجلب دائما الخانات الأولى

ولو كانت العربية سيجلب الخانات الثانية وهكذا

 

الآن لكل خاصية المقابلة لأحد العناصر نضع في الخانة الأولى الترجمة الإنجليزية وفي الثانية العربية ولو أردنا لغة ثالثة ورابعة نضيف خانات ثالثة ورابعة

 

إن من حسنات هذه الطريقة أنك تستطيع التبديل بين اللغات دون الحاجة لإقلاع البرنامج ودون الحاجة للعودة إلى الصفحة الرئيسية فقط يحتاج عمل تحديث للشاشات الظاهرة

 

من سلبيات هذه الطريقة أنك في حال قررت إضافة لغات جديدة فيجب التعديل على الملف وإعادة ترجمة الكود

لهذا هناك طريقة أخرى سبق وأستخدمتها وهي تعريف قالب شبيه بهذا ومن ثم استخدام نسخ منه كملفات XML  كل واحدة يعبر عن لغة و يتم القراءة منه عند التبيدل بين اللغات

وهذا مفيد أنك تستطيع إضافة لغات جديدة بإضافة ملفات إضافية فقط دون الحاجة للمساس بالكود

 

ومن حسنات الطريقتين أعلاه أنك لا تحتاج لتكرار الشاشات

 

هناك طريقة أكثر احترافية وهي تطوير على الطريقة الثانية لتشمل خصائص العناصر الأخرى وليس النصوص فقط

أي نظام شبيه بال CSS في برمجة المواقع وصفحات الويب

بحيث تحفظ في كل ملف لغة خصائص العناصر مثل الموقع والعرض والارتفاع والاتجاه واللون وخاصية Enable و Visible  والأهم الخطوط سواء اسمه أو نوعه أو حجمه

طبعا هذا يعطي مرونة أكثر للتحكم بالشكل العام من أجل كل لغة على حدا للحفاظ على التناسق

لأنه غاليا عند استخدام خط واحد متعدد اللغات سيكون من أجل لغة جيد ومن أجل البقية شكله مشوه

 

 

ملاحظة هامة : هذه الطريقة لا ينبغي استخدمها مع قواعد البيانات الضخمة بمعنى أن لا تتعامل مع بيانات تحضرها من جدول ثم تجعل النتيجة مقترنة بإحداى خصائص اللغة لأن استدعاء الخاصية له زمن حيث يقوم بإنشاء مصفوفة مع تعيين القيم ثم تحويل خاصية اللغة إلى رقم ثم استخدامه كأنديكس ثم استرجاع قيمة الخانة المحددة

لذا هذا الزمن من أجل حلقات بعشرات الآلاف سيسبب بطء ملحوظ

 

 

 

والله ولي التوفيق

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 3 أبريل 2013 في 22:45

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#4

انا أفضل استخدام Resources Files، حيث انها أسهل في التعامل.

 

لقد قمت بالتعديل على المثال الذي رفعه الاخ/محمد فؤاد تركي يبين كيف أتعامل مع Resources Files.

 

changeLanguage.rar

تم تعديل هذه المشاركة بواسطة AdhamAwadhi في 15 أبريل 2013 في 19:35

#6

مثال رائع

بارك الله فيك أخي الكريم

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#7

المثال  في المشاركة #4 يؤدي الغرض إلى أنه عمليا يعيد إقلاع البرنامج ككل ويغلق كل النوافذ الثانوية

ولهذا السبب تجنبت هذا الخيار وقمت باستخدام الطريقة التي شرحتها في المشاركة أعلاه #3

حيث الطريقة لا تتطلب لا إعادة الأقلاع ولا حتى العودة للصفحة الرئيسية فقط ما يحتاجه هو عمل ريفريش للعناصر

أما المثال في المشاركة #5 فهو ممتاز

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 16 أبريل 2013 في 12:48

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

مواضيع مشابهة