بسم الله الرحمن الرحيم
تغيير لغة التطبيق حسب اختيار المستخدم
عند انشاء تطبيق يدعم لغة واحدة فقط فان ذلك سيقلل من انتشاره على مستوى عالمي لذا ترى الكثير من التطبيقات تدعم العديد من اللغات.
لذا في هذا الدرس سنتعلم كيفية جعل التطبيق متعدد اللغات بحيث يتغير لغة التطبيق بتغيير لغة الجهاز وليس هذا فقط بل احيانا نحتاج تغيير لغة التطبيق فقط بدون تغيير لغة الجهاز ،أي باختيار المستخدم وهذا ما سنتعلمه في هذا الدرس ايضا.
المجلد 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(context, Locale.Default.Language);
return ChangeLanguage(context, loadedLanguage);
}
public static Context ChangeLanguage(Context context, string language)
{
SaveLanguage(context, language);
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
{
return ChangeForAPI24(context, language);
}
return ChangeForLegacy(context, language);
}
private static string GetLanguage(Context context, string Language)
{
var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
return privatePreference.GetString(MYLANGUAGE, Language);
}
private static void SaveLanguage(Context context, string language)
{
var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
var editor = privatePreference.Edit();
editor.PutString(MYLANGUAGE, language);
editor.Apply();
}
private static Context ChangeForAPI24(Context context, string 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 context, string language)
{
var locale = new Locale(language);
Locale.Default = locale;
var resources = context.Resources;
var configuration = resources.Configuration;
configuration.Locale = locale;
resources.UpdateConfiguration(configuration, resources.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 .
فيديو توضيحي:
الكود كاملاً ستجده على GitHub من الرابط التالي:
نسأل الله التوفيق
تحياتي لكم