دعم اتجاه اللغة العربية على تطبيق اندرويد RTL اجباريا
03 June
لعل الاندرويد هو واحد من ابسط المنصات بالنسبة للمطورين و هذا ما يجعله محبوبا خصوصا بعد دخول كوتلن من الباب الواسع للاندرويد هذا جعل القيام بالعديد من الاشياء اكثر بساطة لكن احيانا نلتقي ببعض المعضلات اي مهما فعلت فلن تنجو منها و اليوم سنتحدث عن دعم rtl في الاندرويد حسنا كل الامور على ما يرام الى حين صدور الاصدار 17 من الاندرويد حيث تغير كل شيء .
للعلم : لدي وثائق تتبث ان هذه مؤامرة صهيو امريكية روسية برمجية ماسونية بالاتفاق مع جوجل لجعل المبرمجين العرب مجانين 😂.
قبل الكارثة:
حسنا يمكنك ببساطة جعل views على اليمين من خلال الكرافيتي Gravity لكن هذا ما لا تحمد عقباه لانه ليس في كل مرة ستنجح الخطة اما في ما يخص direction فهو مختص لا يوجد باصدارات اقدم من الاصدار 17 jelly bean
تشخيص المعضلة:
فرضا ان شخصا يضع اللغة الانجليزية كلغة لجهازه الاندرويد لكنه عربي و لديه تطبيق عربي (تطبيقك مثلا) و في هذا التطبيق فيه drawerLayout ستظهر كما في الصورة الثانية و نحن نريد ان نصل الى نتيجة الصورة الاولى :
و لا اظن ان المستخذم يريد رؤية هذا .
الاشكال البرمجي : ان جوجل غيرت من الطريقة في ثلات اصدارات مختلفة
هكذا كان عليه الامر قبل الاصدار 17 او jelly bean
و هكذا اصبح عليه الامر في هذا الاصدار الى الاصدار 23
ثم اصبح هكذا في الاصدار 24 و ما بعده.
حل المشكلة :
الحل السريع استعمال مكتبة :
حسنا المرحلة التالية سنقوم بوضع اللغة لتعمل على كل التطبيق دون تكرار الكود في كل نافدة :
اما ان كنت مهتما بكيفية استعمال عدة لغات في تطبيقك فالامر ليس صعبا فيمكنك استعمال sharedPreferences . و قد احدث هذه المقالة لاتحدث عن التعامل مع عدة لغات .
المصادر :
للعلم : لدي وثائق تتبث ان هذه مؤامرة صهيو امريكية روسية برمجية ماسونية بالاتفاق مع جوجل لجعل المبرمجين العرب مجانين 😂.
قبل الكارثة:
حسنا يمكنك ببساطة جعل views على اليمين من خلال الكرافيتي Gravity لكن هذا ما لا تحمد عقباه لانه ليس في كل مرة ستنجح الخطة اما في ما يخص direction فهو مختص لا يوجد باصدارات اقدم من الاصدار 17 jelly bean
تشخيص المعضلة:
فرضا ان شخصا يضع اللغة الانجليزية كلغة لجهازه الاندرويد لكنه عربي و لديه تطبيق عربي (تطبيقك مثلا) و في هذا التطبيق فيه drawerLayout ستظهر كما في الصورة الثانية و نحن نريد ان نصل الى نتيجة الصورة الاولى :
و لا اظن ان المستخذم يريد رؤية هذا .
الاشكال البرمجي : ان جوجل غيرت من الطريقة في ثلات اصدارات مختلفة
هكذا كان عليه الامر قبل الاصدار 17 او jelly bean
Resources.getSystem().configuration.locale
و هكذا اصبح عليه الامر في هذا الاصدار الى الاصدار 23
configuration.setLayoutDirection(locale)
ثم اصبح هكذا في الاصدار 24 و ما بعده.
Resources.getSystem().configuration.locales.get(0)
المشكلة ليس هنا بل حتى ان بعض الدوال المستعملة في ما قبل الاصدار 17 اصبح قديمة اي DEPRECATED و هذه الدوال هي :
resources.updateConfiguration(configuration, resources.displayMetrics)
//&&
configuration.locale
حل المشكلة :
الحل السريع استعمال مكتبة :
class LocaleHelper {
fun onAttach(context: Context): Context {
//ار اقصد بها العربية
val locale ="ar"
return setLocale(context, locale)
}
//وضع اللغة لكل الاصدارات
private fun setLocale(context: Context, localeSpec: String): Context {
val locale = if (localeSpec == "system") {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Resources.getSystem().configuration.locales.get(0)
} else {
Resources.getSystem().configuration.locale
}
} else {
Locale(localeSpec)
}
Locale.setDefault(locale)
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
updateResources(context, locale)
} else {
updateResourcesLegacy(context, locale)
}
}
//موجه للاندرويد نوجا
@TargetApi(Build.VERSION_CODES.N)
private fun updateResources(context: Context, locale: Locale): Context {
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
return context.createConfigurationContext(configuration)
}
//استعمال الدوال القديمة للاصدارات القديمة
@Suppress("DEPRECATION")
private fun updateResourcesLegacy(context: Context, locale: Locale): Context {
val resources = context.resources
val configuration = resources.configuration
configuration.locale = locale
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLayoutDirection(locale)
}
//هذه الدالة ثم اهمالها في اصدارات حديثة
resources.updateConfiguration(configuration, resources.displayMetrics)
return context
}
}
حسنا المرحلة التالية سنقوم بوضع اللغة لتعمل على كل التطبيق دون تكرار الكود في كل نافدة :
class Myactivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(LocaleHelper().onAttach(base))
}
}
اتمنى ان يكون درس اليوم مفيدا لك و اظن اي مبرمج اندرويد عربي يجب ان يعلم كيف يتعامل مع الاتجاهات rtl و ltr و لا تنسى زيارتي على فايسبوك لتتوصل بجديد الاخبار .اما ان كنت مهتما بكيفية استعمال عدة لغات في تطبيقك فالامر ليس صعبا فيمكنك استعمال sharedPreferences . و قد احدث هذه المقالة لاتحدث عن التعامل مع عدة لغات .
المصادر :
اترك لنا تعليقا