أردرويد

لمطوري التطبيقات: إظهار الأحرف العربية في التطبيق حتى في الأجهزة غير المعربة.

انتهيت منذ فترة قليلة من تطوير تطبيق سيرى النور قريبا جدا. ورغبت باستخدام مجموعة ArabicReshape التي أنشأها المطور عبدالعزيز الحسين والذي أجرينا معه لقاء في وقت سابق. هذه المجموعة تقوم برسم الأحرف العربية كي تظهر صحيحة على جميع الأجهزة، المعربة وغير المعربة.

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

public static String reshape(String Str)

ومن ثم عرض النص المرتجع منها لن يظهره بأحرف عربية.

بحثت عن الحل ووجدته بعد عدة محاولات. الحل ببساطة هو ربط العنصر المرئي (كعنصر نصي أو زر) بملف خطوط Font يدعم الأحرف العربية. فلو أردنا مثلا استخدام ملف الخطوط DroidSans-Bold.ttf، نقوم بإنشاء مجلد بداخل مجلد موجود مسبقا وهو assets ونسميه fonts ومن ثم ننسخ ملف الخط إليه.

والآن نقوم، بعد وضع مجموعة ArabicReshape.java في ملفات المشروع المصدرية، بكتابة الكود التالي: (على فرض أننا نريد إظهار النص في داخل زر Button)

Typeface droidBold = Typeface.createFromAsset(getAssets(),"fonts/DroidSans-Bold.ttf");

String ardroid = ArabicReshape.reshape("موقع أردرويد");

ardroidButton = (Button)findViewById(R.id.ardroiddButton);

ardroidButton.setTypeface(droidBold);

ardroidButton.setText(ardroid);

النتيجة ستكون على الشكل التالي:

بالتوفيق، وكل الشكر مجددا للأخ عبدالعزيز.

وائل العلواني

وائل العلواني.. مدون سوري ومطور تطبيقات أندرويد.. مهتم بالتقنية وآخر تطوراتها.. يعمل في شركة خاصة في مجال تقصي الأعمال BI وتعدين البيانات Data Mining

54 من التعليقات

ضع تعليقًا

  • ماشاء الله تبارك الله
    اخبار جميلة جدا والله يقويكم ويزيدكم من علمه
    وبارك الله في اخونا ابو ابراهيم اللي بصماته واضحة في الاندرويد واهتمامه في لغتنا العزيزة

  • يعطيك العافية اخ وائل وشكرا للاخ عبد العزيز ربي يوفقكم ويبارك فيكم ويجزيكم كل خير ..

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

  • السلام عليكم

    اعذروا جهلي يا جماعة من الناحية التطويرية، ولكن لي سؤال وهو: كيف سنستفيد من ذلك؟ هل بذلك تم حل مشكلة التعريب في أجهزة أندرويد أم ماذا؟

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

    • سلام عليكم،
      أخي العزيز بما أنك ما شاء الله خبير بالأندريود فأنا أشتريت جهازي من أمريكا وهو جالكسي تاب واي فاي وموديل P1010
      وبعد معاناة وبحث طويل حصلت على التعريب ولكن لم يعمل والجهاز أصبح غير صالح للأستعمال الآن بسبب مشكلة الريستارت التي تحدث تلقائياً وبشكل مستمر دون توقف.
      فيرجى الأفادة أخي العزيز والله يوفقك بدراستك إن شاء الله

  • جهود مباركة اخي وائل ولا انسى الاخ عبد العزيز
    ما فهمته من الموضوع ان التعريب او تشبيك الحروف هو في حدود الويدجت المضمنه في التطبيقات ،هل هذا صحيح؟
    للامام

    • شكرا أخي سطام.
      نعم.. التعريب وتشبيك الحروف هنا هو في حدود التطبيق ككل، الويدجيت، العناصر المرئية (أزرار، قوائم،…) وأي نص آخر في التطبيق.

    • شكرا fedail..
      بالنسبة للينك التي وضعتها، فهي تتحدث عن الـ NDK وهو مختلف عن الـ SDK. تطبيقات الأندرويد تكتب بالجافا باستخدام الأندرويد SDK، ولكن بعض المكتبات البرمجية المتخصصة والتي لن تكون كتابتها بالجافا عملية (كمكتبات التشفيرSSL وال openGL وغيرها) فيمكن كتابتها بالأندرويد NDK. أنصحك بالإطلاع على المكدس البرمجي لنظام الأندرويد Android Software Stack لمشاهدة كيفية توضع طبقة الجافا على طبقة السي\سي بلس بلس والتي بدورها تتوضع على نواة لينيكس.
      ولكن مع ذلك، يمكن استخدام السي شارب وغيرها في عمل التطبيقات باستخدام مشروع مونو mono project ولكنه غير مكتمل ويعاني من الكثير من العقبات والمشاكل..
      تحية

      • أخي الكريم ممكن ان تضع لنا اسماء بعض المراجع التي ترى انها مفيدة في تعليم الجافا ؟

        مع الشكر على مجهودك المتواصل هنا

    • شكراً اخي وائل على التوضيح
      ولكن بحد علمي ان مشروع مونو كان لتفعيل تطبيقات الدوت نت على منصة اللينوكس وهي قديمة منذ 5 سنوات او أكثر

  • تسلم اناملك على البحث المفيد وعندي سؤال

    مادا لو تم تغيير الخط بالرئيسي للغة العربية في الجهاز الى ما اشرت اليه ببداية ؟

    هل سيتم بهده الطريقة تعريب الجهاز ؟

    • هذا هو الحل الأول الذي لجأت إليه أول ما اشتريت جهازي من حوالي السنة ونصف. نعم تظهر الأحرف بالعربية ولكنها مقطعة، ويلزمك بداية أن يكون جهازك عليه صلاحيات الجذر (رووت).
      تحية

  • السلام عليكم
    الاخ عبد العزيز له جزيل الشكر
    ولكن يوجد بالكود بعض النقص
    وللعلم فان
    ArabicReshaping
    موجود في مكتبة
    ICU
    التي هي موجودة بالفعل في الاندرويد
    this class supports shaping , deshaping , tashkeel and more options
    hope this helps;

      • بالطبع
        بما ان حضرتك مطور ان شاء الله تستوعب النص ده
        Text transformations are necessary when modern display technology is not
        * available or when text needs to be transformed to or from legacy formats that
        * use “shaped” characters. Since the Arabic script is cursive, connecting
        * adjacent letters to each other, computers select images for each letter based
        * on the surrounding letters. This usually results in four images per Arabic
        * letter: initial, middle, final, and isolated forms. In Unicode, on the other
        * hand, letters are normally stored abstract, and a display system is expected
        * to select the necessary glyphs. (This makes searching and other text
        * processing easier because the same letter has only one code.) It is possible
        * to mimic this with text transformations because there are characters in
        * Unicode that are rendered as letters with a specific shape
        * (or cursive connectivity). They were included for interoperability with
        * legacy systems and codepages, and for unsophisticated display systems

        وده رابط المكتبة
        http://site.icu-project.org/
        وهيا مكتبة جافا زي اي مكتبه ممكن تضعها في البرنامج وهدفها
        internationalization
        الاندرويد بالفعل بيستخدم نسخة السي من المكتبة دي لكن خصائص العربي غير مفعله
        وده اللي المطور اليهودي كان بيستفسر عنه من احد مهندسي جوجل في اللنك ده

        الاستخدام الاساسي للكلاس كالتالي
        private static ArabicShaping reshaper = new ArabicShaping(
        ArabicShaping.LENGTH_GROW_SHRINK | ArabicShaping.LETTERS_SHAPE);
        reshaper.shape(string);
        الكلاس فيها مشكلة مع الاندرويد وانا الحمد لله حليتها
        الداله دي بتنقل الشتكيل من المجال(u0600)
        to unicode arabic transformation table B
        الاندرويد مبيظرش التشكيل ده كويس
        الحل هو تعديل الكلاس لجعلها تتخطي التشكيل

        اما deshaping
        convert reshaping result back to canonical form
        private static ArabicShaping deshaper = new ArabicShaping(
        ArabicShaping.LENGTH_GROW_SHRINK | ArabicShaping.LETTERS_UNSHAPE);
        مثلا ابراهيم كيبورد تنتج حروف في المجال
        (u\FE70)
        لاتستخدم في البحث مثلا
        اتمني افادتكم واي استفسار موجود ان شاء الله

  • السلام عليكم أخي د. أسعد .. وأخى وائل العلوني

    هذه الطريقة هي المستخدمة في برامج القرآن الكريم لحفص وورش ونافع
    http://www.ce4arab.com/vb7/showthread.php?t=258683

    وفي برامج كتب أذكى ..
    http://www.ce4arab.com/vb7/showthread.php?t=268437

    وهي والحمد لله تعمل كما أشار اخي الكريم وائل العلواني على كل نسخ أندرويد حتى التي لا تدعم العربية ولا تحوي الخط ..

    أرحب بكتابة مقال لأردويد في هذا الموضوع باستخدم برنامج ICU كما أشار أخي د.أسعد وأشير أنه لا مشكلة للتشكيل في آي سي يو ..

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

    شكرا لكم ..
    وليد

  • السلام عليكم
    اخ وائل اشكرك على هذه المقالة الرائعة
    ولكن عندي استفسار بسيط
    انا وضعت كل السترنكس(string) في ملف منفصل هو string.xml
    وعند عمل خاصية الري شيب تعمل ولكن من دون ربط الحروف
    ولكن عندما اضع الـ(string) في نفس ملف البرنامج الرئيسي فان ربط الحروف
    يعمل بشكل ممتاز.
    سؤالي ما الحل لابقاء strings داخل ملف string.xml وتفعيل خاصية arabicreshape في نفس الوقت؟

    مع الشكر والتقدير

  • أهلا أخي أحمد..
    يمكنك ابقاء النصوص في ملف ال string.xml، واستدعائها قبل رسمها.. مثلا:
    String reshaped = ArabicReshape.reshape(getString(R.string.app_name))

    ومن ثم استخدامه على غرار:
    textView.setText(reshaped))

    اذا الفكرة في استخدام دالة getString()

  • رائع جداً، مشكورين يا اخوان.

    عندي سؤال: أنا الأن بصدد تطوير برنامجي ليظهر بعض المعلومات للمستخدم عن طريق ال-Notifications.

    واحد من البرميترز المستخدمه هو النص الذي يظهر في أعلى الشاشه لينبه المستخدم ومن ثم المستخدم يستطيع سحب هذا التنبيه إلى الأسفل ليرى كامل التنبيه. المشكلة أن المكان الذي يظهر فيه هذا النص لا قدرة لي على التحكم به… بمعنى أخر لا استطيع إستخدام:
    (endActivityButton.setTypeface(typeface

    هل هناك طريقة أخرى لذلك؟؟؟

    شكراً،
    علاء

    • أهلا علاء..
      يبدو لي أفضل حل مؤقت هو استخدام صورة أو أيقونة (لا أعرف ان كان هذا ممكنا في حالتك) لأنني واجهت مشكلة مشابهة، واستخدمت هذا الحل..

      تحياتي..

  • السلام عليكم ……..

    أخي وائل انا استعملت ال (ArabicReshape ) في المشروع اللي عندي ولكن اللغة العربية تظهر على شكل مربعات على ال (Emulator) علما اني استعمل ال (netbeans ) لتطوير برامج الانتدرويد افيدونا بارك الله فيكم !؟

  • السلام عليكم ……..

    أخي وائل انا استعملت ال (ArabicReshape ) في المشروع اللي عندي ولكن اللغة العربية تظهر على شكل مربعات على ال (Emulator) علما اني استعمل ال (netbeans ) لتطوير برامج الانتدرويد افيدونا بارك الله فيكم !؟

  • السلام عليكم ……

    لقد قمت سابقا بالسؤال بالنسبة للغة العربية على تطبيق الاندرويد وكنت ابرمج على النت بينز لكني تحولت الى ال (Eclipse) وقد ظهرت اللغة العربية في بعض الشاشات بالنسبة ( استعملت ال ListView , buttons , ولكن عندما قمت بتطبيقها على ال menu وال Dialog لم تظهر عليهما اللغة العربية الرجاء تحديد امكانية هذا ال application وهل يجب علي كلما اردت ان استعملها في ال View Component أن ابرمجها ك (custom View )?

    وشكرا على تعاونكم !

  • صحيح.. لم تنجح معي الطريقة في ال menu وال dialog، لذلك قمت بوضع الكلام على شكل صور.. سأحاول فيها من جديد،، ربما هناك طريقة لذلك..
    لم أفهم سؤالك الثاني أخي نوفل.. ممكن توضح..

    تحياتي

  • السلام عليكم …..

    أقصد عندما اردت استعمالها على ال ListView اضطررت الى ان اعمل Custom Adapter لكي تظهر اللغة العربية وفي البرنامج الذي اطوره الشاشة الرئيسية عندي هي ListView واريد اذا ضغط المستخدم على ال button أن يظهر له Dialog box فيه مجموعة من الخيارات باللغة العربية لكي يتمكن من الانتقال الى الشاشات التي اريده غير الموجودة في ال listView الاصلية
    الان انا احاول ان اعمل custom Dialog فيه ListView أخرى لا أدري ما إمكانية ذلك ؟
    وإذا لم يمكن الرجاء المساعدة وهل هنالك منتدى لمبرمجي الاندرويد العرب يناقشون فيه مشاكلهم ؟
    وشكرا جزيلا ……………

  • فهمت عليك أخي نوفل..
    نعم يمكنك عمل custom dialog باستخدام هذا الدرس:
    http://www.androidpeople.com/android-custom-dialog-example/

    ولكني غير متأكد من إمكانية وضع نص عربي بداخله (مع أني أرى أنه لا مانع من عمل ذلك).

    عن المنتدى أو مكان لمناقشة المشاكل، لا أعلم بصراحة ولكن يمكنك الاطلاع على موقع الكمبيوتر الكفي ce4arab، قد تجد ساحة للنقاش هناك.. وإن كنت متحمسا لبدء منتدى لمناقشة برمجة الأندرويد، أطلب منك التواصل معي على [email protected] .. لعلنا نفتتح شيئا شبيها.. وبرعاية أردرويد.

    تحياتي لك

  • شكراً على هذه المقالة الممتازة ، أود أن أسأل، أنا فلاش ديفيلوبر و أريد أن اصمم تطبيق فيه بحث، المشكلة أنا حروف العربيه فقط في هذا التطبيق وفقط عند الكتابة تظهر مقتطعة ومن اليسار إلى اليمين مع أن باقي الكلمات تظهر بشكل صحيح عند العرض ،، heeeeeeeeelllllpppppppppp 🙂

  • السلام عليكم
    الرجاء من الاخوة مساعدتي في الاتي:
    عندي هاتف سامسونغ غلاكسي اسي samsung galaxy ace اسباني ويعمل بنطام اندرويد ، لكن المشكلة هو ان لوحة المفاتيح لا تكتب اللغة العربية ،وغوغل العربي تظهر الحروف منفصلة .
    هل هناك برنامج يضاف للهاتف حتى يصبح يكتب الرسائل sms وبحث المركيت باللغة العربية
    وشكرا

  • ﺍﻟﻠـﮧ يعطيك العافية اخوي وائل .. هذا ماكان ينقصني حقيقة لضمان عمل التطبيق وظهورة بشكل صحيح بالإضافة الى جمال الخط بالتطبيق ..

    والشكر موصول للمهندس عبدالعزيز .. بارك ﺍﻟﻠـﮧ فيكم ..

  • جزاك الله خيراً أخي الحبيب وائل ، والله هذا ما كنت أحتاجه تماماً والحمد لله ، أشكرك مرةأخرى ، وطبعاً لن أنسى صاحب هذا العمل الرائع المهندس عبد العزيز ، جزاه الله عنّا خيراً ..

  • أخي وائل أريد منك المساعدة:
    جهازي أندرويد htc wildfire لم أستطع أن أعمل له رووت ففي كل مرة يقول لي error: failed to get root, is your firmware too new?

  • السلام عليكم
    لو سمحتم انا كنت عايز اعرفا زاى احط ملف ArabicReshape فى المشروع مع العلم انى بستخدم برنامج eclipse شكراً ..

  • أعتقد بأن تطبيق آردرويد بحاجة لهذه الطريقة او الإضافة لأنه يوجد لدي جهاز لا يدعم العربية و عندما أنزل تطبيق آردرويد لا يقبل التشغيل لأن جهازي لا يدعم العربية

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

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

  • شكرا لك
    سؤال : كيف استطيع الكتابه في التكست بوكس باللغه العربيه ؟
    وأيضا الكتابه اعلى السكرين او الفورم للتطبيق

%d bloggers like this: