دعم اتجاه اللغة العربية على تطبيق اندرويد RTL اجباريا

لعل الاندرويد هو واحد من ابسط المنصات بالنسبة للمطورين و هذا ما يجعله محبوبا خصوصا بعد دخول كوتلن من الباب الواسع للاندرويد هذا جعل القيام بالعديد من الاشياء اكثر بساطة لكن احيانا نلتقي ببعض المعضلات اي مهما فعلت فلن تنجو منها و اليوم سنتحدث عن دعم rtl في الاندرويد حسنا كل الامور على ما يرام الى حين صدور الاصدار 17 من الاندرويد حيث تغير كل شيء .
للعلم : لدي وثائق تتبث ان هذه مؤامرة صهيو امريكية روسية برمجية ماسونية بالاتفاق مع جوجل لجعل المبرمجين العرب مجانين 😂.
دعم اتجاه اللغة العربية على تطبيق RTL اجباريا
قبل الكارثة:
حسنا يمكنك ببساطة  جعل views على اليمين من خلال الكرافيتي Gravity لكن هذا ما لا تحمد عقباه لانه ليس في كل مرة ستنجح الخطة اما في ما يخص direction فهو مختص لا يوجد باصدارات اقدم من  الاصدار 17 jelly bean
تشخيص المعضلة:
فرضا ان شخصا يضع اللغة الانجليزية كلغة لجهازه الاندرويد لكنه عربي و لديه تطبيق عربي (تطبيقك مثلا) و في هذا التطبيق فيه drawerLayout ستظهر كما في الصورة الثانية و نحن نريد ان نصل الى نتيجة  الصورة الاولى :
صورة لواجهة من اليمين الى اليسار RTL صورة لواجهة من اليسار الى اليمين LTR
و لا اظن ان المستخذم يريد رؤية هذا .
الاشكال البرمجي : ان جوجل غيرت من الطريقة في ثلات اصدارات مختلفة
هكذا كان عليه الامر قبل الاصدار 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 . و قد احدث هذه المقالة لاتحدث عن التعامل مع عدة لغات .
    المصادر :

    هل ترغب في مثل هذه التدوينات

    اسماعيل ايت بلا

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

    اترك لنا تعليقا

    الاشتراك بالقائمة البريدية

    توصل باحدث مواضيعنا و كن على اطلاع باخر اخبار وتقنيات الاندرويد