تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Changing App language dynamically
#1
بسم الله الرحمن الرحيم


تغيير لغة التطبيق حسب اختيار المستخدم


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


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



المجلد values داخل مجلد Resources وهذا ما سنركز عليه وايضا على ملف strings داخل المجلد values.


values: هذا المجلد يضم ملفات عدة منها: strings, styles, and colors وكل ملف مختص بأمر معين ولكن سنركز فقط على ملف strings.


strings: ملف وظيفته خزن النصوص من عناوين وارقام (Ads ID) بحيث كل نص يعطى له اسم معين وعن طريق هذا الاسم نقوم باسناد النص الى اداة معينة.



طيب ما علاقة كل هذه التوضيحات بموضوعنا: كيف اجعل المستخدم يختار لغة التطبيق بنفسه؟


لندخل الان الى صلب الموضوع:



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

values
values-en

بحيث سيبقى values يحوي اللغة الافتراضية كأن تكون عربية او أية لغة اخرى و values-en المجلد الذي سيحتوي على النصوص الانكليزية وهكذا مع بقية اللغات.

طيب أين ملف strings؟ وما دورها؟


هذا الملف عند تكرارك لمجلد values سيتم تكرار ملف strings مع محتوياته لذا قم فقط بتغيير النصوص الى اللغة التي تريد دعمها مع الابقاء على الاسماء كما هي.


مثال:

محتوى ملف strings داخل مجلد values:
PHP كود :
<resources>
 
   <string name="app_name">تغيير لغة التطبيق</string>
 
 <string name="helloText">مرحبا</string>
</
resources
محتوى نفس الملف داخل مجلد values-en:
PHP كود :
<resources>
 
   <string name="app_name">RuntimeAppLanguage</string>
 
 <string name="helloText">Hello</string>
</
resources

كما تلاحظ ان الـ name هي نفسها فقط قمنا بتغيير او ترجمة النصوص.



الان نأتي الى كيفية استخدام هذه الـ names:

1- عن طريق خواص الاداة.
2- برمجيا.

مثال:
PHP كود :
<TextView
        android
:id="@+id/testText"
 
       android:layout_width="wrap_content"
 
       android:layout_height="wrap_content"
 
       android:text="@string/helloText"
 
       android:textSize="24sp"
 
       android:layout_centerInParent="true" /> 
او
PHP كود :
myText FindViewById<TextView>(Resource.Id.testText);

 
           myText.Text GetString(Resource.String.helloText); 

كل ما سبق سينجم عن تغيير لغة التطبيق وفقا للغة الجهاز.


أما ان اتحنا للمستخدم تغيير اللغة حسب اختياره فعلينا ان نقوم بالامور التالية:

1- 
PHP كود :
using Android.Content;
using Android.OS;

using Java.Util;

namespace 
RuntimeAppLanguage
{
 
   internal class LanguageManager
    
{
 
       private const string MYLANGUAGE "myLanguage";
 
       private const string MYPREF "myPreference";

 
       public static Context LoadLanguage(Context context)
 
       {
 
           var loadedLanguage GetLanguage(contextLocale.Default.Language);
 
           return ChangeLanguage(contextloadedLanguage);
 
       }

 
       public static Context ChangeLanguage(Context contextstring language)
 
       {
 
           SaveLanguage(contextlanguage);
 
           if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
 
           {
 
               return ChangeForAPI24(contextlanguage);
 
           }
 
           return ChangeForLegacy(contextlanguage);
 
       }

 
       private static string GetLanguage(Context contextstring Language)
 
       {
 
           var privatePreference context.GetSharedPreferences(MYPREFFileCreationMode.Private);
 
           return privatePreference.GetString(MYLANGUAGELanguage);
 
       }

 
       private static void SaveLanguage(Context contextstring language)
 
       {
 
           var privatePreference context.GetSharedPreferences(MYPREFFileCreationMode.Private);
 
           var editor privatePreference.Edit();
 
           editor.PutString(MYLANGUAGElanguage);
 
           editor.Apply();
 
       }

 
       private static Context ChangeForAPI24(Context contextstring language)
 
       {
 
           // for api >= 24
 
           var locale = new Locale(language);
 
           Locale.Default = locale;
 
           var configuration context.Resources.Configuration;
 
           configuration.SetLocale(locale);
 
           configuration.SetLayoutDirection(locale);

 
           return context.CreateConfigurationContext(configuration);
 
       }

 
       private static Context ChangeForLegacy(Context contextstring language)
 
       {
 
           var locale = new Locale(language);
 
           Locale.Default = locale;
 
           var resources context.Resources;
 
           var configuration resources.Configuration;
 
           configuration.Locale locale;
 
           resources.UpdateConfiguration(configurationresources.DisplayMetrics);

 
           return context;
 
       }
 
   }


هذا الكلاس وظيفته يسمح للمستخدم تغيير لغة التطبيق بنفسه وحفظ اللغة التي اختارها.


كيفية استخدام هذا الكلاس:

داخل MainActivity سنعمل override لهذه الدالة ونستدعي بداخلها دالة تغيير اللغة عند تشغيل التطبيق:
PHP كود :
protected override void AttachBaseContext(Context @base)
 
       {
 
           base.AttachBaseContext(LanguageManager.LoadLanguage(@base));
 
       

الجزء الخاص باختيار المستخدم اللغة التي يريدها:

PHP كود :
public override bool OnOptionsItemSelected(IMenuItem item)
 
       {
 
           switch (item.ItemId)
 
           {
 
               case Resource.Id.arItem:
 
                   LanguageManager.ChangeLanguage(this"ar");
 
                   Recreate();
 
                   return true;
 
               case Resource.Id.enItem:
 
                   LanguageManager.ChangeLanguage(this"en");
 
                   Recreate();
 
                   return true;
 
               default:
 
                   return base.OnOptionsItemSelected(item);
 
           }
 
       

طبعا كما تلاحظون هذا جزء من الكود الخاص بالـ menu Smile.


فيديو توضيحي:





الكود كاملاً ستجده على GitHub من الرابط التالي:




نسأل الله التوفيق

تحياتي لكم
الرد }}}
تم الشكر بواسطة: محمد كريّم , sendbad100 , Amir_Alzubidy , Amir_Alzubidy , elgokr , Miloud


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم