تصميم تطبيق أندرويد بأكثر من لغة


(عمار الخوالدة) #1

###السلام عليكم ورحمة الله وبركاته …

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


فهرس الموضوع :

  • فهم المبدأ / التعامل مع ملف strings.xml .
  • التعامل مع ملف strings من داخل الـ Java .
  • إنشاء ملفات نصية للغات اخرى .
  • روابط مهمة ذات علاقة .

أولا : فهم المبدأ / التعامل مع ملف strings.xml .

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

  • Button
  • TextVeiw

الآن علينا أن نقوم بتسمية هذه المكونات عن طريق الخاصية Text وستكون التسمية باللغة الانجليزية (ستفهم سبب جعلها اللغة الافتراضية لاحقا) لكن توقف لحظة ! إذا قمنا بتغيير الخاصية Text وجعلناها باللغة الانجليزية كيف سنقوم بترجمة النص لاحقا ؟ هل من الممكن لهذه الخاصية أن تحوي قيمتين أو أكثر ؟

بالطبع هذا سؤال جيد وإذا فهمت جوابه ستفهم مبدأ تعدد اللغات في أندرويد ، يوجد في تطبيقك في مجلد res مجلد باسم values بمعنى القيم ، الملف اللذي يهمنا في هذا المجلد هو ملف strings.xml ووظيفته جمع قيم النصوص اللتي يتم استخدامها في التطبيق ، لفهم الأمر أكثر قم بفتح هذا الملف وستجد شيئا كهذا :

<resources>
    <string name="app_name">My App</string>
</resources>

لاحظ الـ Tag باسم string ستجد انه يحوي الخاصية name قيمتها app_name ويحتوي النص My App ، يمكنك أن تشبه الأمر بالمتغيرات ، وكأنك تقول أن هناك متغير نصي (من نوع String) اسمه app_name وقيمته My App ، لكن ماذا يعني هذا ؟

ستفهم هذا بعد المثال قم بإنشاء قيمة نصية اخرى باسم button وقيمتها Click me بحيث يصبح الملف strings.xml بهذا الشكل :

<resources>
    <string name="app_name">My App</string>
    <string name="button">Click me</string>
</resources>

ربما تتساءل عن المكان اللذي سنستخدم فيه هذا النص ، اذهب الآن الى الـ Layout اللتي اضفنا المكونات اليها ، الآن سنجعل الزر اللذي أضفناه يأخذ القيمة Click me وسنتعلم ذلك بطريقتين يمكنك استخدام المناسب لك منهما لكن يجب أن تعرف الطريقتين :

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

بعد الضغط عليه ستظهر لك نافذة ابحث فيها عن الاسم اللذي اعطيناه للنص الذي قمنا بإنشائه (الاسم اللذي نبحث عنه هو button وقيمته Click me) :

ستلاحظ الآن أن النص الخاص بالزر قد تغير مع أننا لم نعدل على الخاصية Text بشكل مباشر بل قمنا بتمرير قيمة من ملف strings إليها .

  • الطريقة الثانية : باستخدام الـ XML : اذهب إلى منطقة تعديل الـXML في الـ Layout ولاحظ وجود الخاصية Text بين خصائص الزر بهذا الشكل :
        android:text="New Button"

سنقوم بتغييرها لكن بطريقة غير مباشرة بل عن طريق استدعاء القيمة من ملف الـ strings :

android:text="@string/button"

لاحظ أننا قمنا بكتابة @string وهي للدلالة على أننا سنجلب نص من الملف strings وبعدها نضع اسم النص واللذي سيتغير في نص الزر ليصبح Click me .

قم بنفس العملية مع الـ TextView بحيث يصبح كود الـ xml في ملف strings كالتالي :

<resources>
    <string name="app_name">My App</string>
    <string name="button">Click me</string>
    <string name="txt">Hello</string>
</resources>

قم بجعل قيمة الـ TextView مساوية لقيمة txt في ملف strings كما تعلمت وفعلت مع الـ Button .

لذلك وبعد هذا الشرح يفترض أنك قد فهمت مبدأ العمل مع ملف strings لكن ماذا عن مبدأ الترجمة ؟ في التطبيقات متعددة اللغات سيكون هناك أكثر من ملف strings وكل ملف strings يكون للغة معينة وهذا ما سنتعلم أن نفعله في باقي أجزاء الدرس .


ثانيا : التعامل مع ملف strings من داخل الـ Java .

سنتعلم الآن طريقة استدعاء قيم من الملف strings بداخل أكواد الجافا ، والفائدة من هذا هو المساعدة على ترجمة النصوص الغير موجودة في الـ Layout مثلا لو أردت عرض رسالة Toast كيف سيتم ترجمتها لو لم تربطها بملف strings ؟

قم بوضع قيمة جديدة في ملف strings تحوي الرسالة اللتي نريد عرضها في رسالة الـ Toast وليكن اسم النص msg ومحتواه :
This is a message .
يجب أن يصبح الكود في ملف strings هكذا :

<resources>
    <string name="app_name">My App</string>
    <string name="button">Click me</string>
    <string name="txt">Hello</string>
    <string name="msg">This is a message .</string>
</resources>

الآن قم بربط الزر بحدث ضغط عن طريق خاصية onClick (يفترض أنك تعرف الطريقة لذلك لن أشرحها) أو باستخدام دالة setOnClickListener بالنسبة لي سأستخدم الطريقة الأولى ، إنتبه الآن إلى طريقة كتابة النص في مكان النص في الـ Toast :

    public void onClick(View view) {
        Toast.makeText(this , R.string.msg , Toast.LENGTH_LONG).show();
    }

لاحظ أن الاستدعاء تم عن طريق استخدام الكلاس R ولاحظ أننا كتبنا string للدلالة على أننا سنقوم باستدعاء نص ثم كتبنا اسم النص وهو msg .

الآن يجب أن يظهر البرنامج بهذا الشكل بعد التشغيل والضغط على الزر :


ثالثا : إنشاء ملفات نصية للغات اخرى .

عندما نقوم بجعل التطبيق يدعم أكثر من لغة فنحن لا ننشئ أكثر من ملف strings فقط بل ننشئ أكثر من ملف values وبداخله ملف strings اخر ، وللتفريق بين مجلدات values يتم وضع كود اللغة بعد الاسم بهذه الطريقة (المثال على اللغة العربية) : values-ar

يمكنك انشاء الملف بالطريقة العادية وتسمية الملفات مع وضع رمز اللغة ، لكن الـ Android Studio يوفر لنا طريقة اسهل لفعل ذلك ، اضغط بالزر الأيمن على مجلد res ومن قائمة new اختر الخيار المحدد كما في الصورة :

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

ستصبح النافذة بشكل آخر ، من قائمة Language اختر اللغة اللتي تريد أن تضيفها إلى برنامجك ويمكنك أيضا تحديد البلد المستهدف بهذه اللغة من القائمة اللتي بجانبها (لا أرى منها فائدة في اللغة العربية لأن اللغة العربية نفسها بغض النظر عن المنطقة فاختر Any Region) :

الآن في مجلد values-ar قم بإنشاء ملف xml جديد ، قمت بتعريب الكلمات في الأعلى (اياك ان تعدل على اسم النص بل عدل على قيمته فقط) ويصبح المجلد كالآتي :

<resources>
    <string name="app_name">تطبيقي</string>
    <string name="button">إضغطني</string>
    <string name="txt">مرحبا</string>
    <string name="msg">هذه رسالة .</string>
</resources>

لكن ماذا عن تغيير اللغة كيف تتم ؟

لقد تمت بالفعل ! نظام الاندرويد تلقائيا سيقوم بتحديدها حيث أنه سيقوم بتغيير اللغة الى العربية اذا كانت لغة الجهاز بالعربية وسيقوم بجعل التطبيق يستخدم الـ strings الإنجليزية اذا كانت لغة الجهاز انجليزية أما إن وجدت لغة لم تتم الترجمة اليها سيستخدم تلقائيا الملف الانجليزي فاللغة الانجليزية لا تحتاج الى اضافة بل هي نفسها اللغة الموجودة في values العادية .

لذلك لتختبر تطبيقك ما عليك إلا أن تغير لغة الجهاز وستتغير لغة التطبيق تلقائيا ، وهذه الصورة من جهازي :


رابعا : روابط مهمة ذات علاقة .


أخطاء الترجمة في السكربت ديسكورس Discourse.org/ الترجمة والتدقيق يطرح هنا