تشتمل التطبيقات على موارد يمكن أن تكون خاصة بثقافة معينة. على سبيل المثال، يمكن أن يتضمن التطبيق سلاسل خاصة بثقافة تمت ترجمتها إلى لغة اللغة الحالية.
من الممارسات الجيدة فصل الموارد الخاصة بثقافة عن باقي التطبيق في حل مشكلة الموارد الخاصة باللغة والثقافة بناءً على إعدادات لغة النظام. يمكنك تقديم دعم للغات مختلفة باستخدام دليل الموارد في مشروع Android الخاص بك.
يمكنك تحديد الموارد المخصّصة لثقافات الأشخاص الذين يستخدمون تطبيقك. ويمكنك تقديم أي نوع موارد مناسب للغة المستخدمين وثقافتهم. على سبيل المثال، تعرض لقطات الشاشة التالية تطبيقًا يعرض سلسلة وموارد قابلة للرسم بلغة en_US
التلقائية للجهاز واللغة es_ES
الإسبانية.
![يعرض التطبيق نصًا ورمزًا مختلفًا
بناءً على اللغة الحالية](https://developer.android.com/static/images/training/languages_01.png?authuser=5&hl=ar)
الشكل 1. التطبيق يستخدم موارد مختلفة بناءً على اللغة الحالية.
عند إنشاء مشروع باستخدام أدوات SDK لنظام التشغيل Android، تنشئ الأدوات دليل res/
في المستوى الأعلى من المشروع. تتوفّر ضمن دليل res/
هذا أدلة فرعية لأنواع الموارد المختلفة. هناك أيضًا بعض الملفات التلقائية، مثل ملف res/values/strings.xml
الذي يحتوي على قيم السلسلة.
إنّ دعم لغات مختلفة لا يقتصر على استخدام موارد خاصة باللغة. يختار بعض المستخدمين لغة تستخدم نصوصًا برمجية من اليمين إلى اليسار (RTL)، مثل العربية أو العبرية، في لغة واجهة المستخدم الخاصة بهم. بالنسبة إلى المستخدمين الآخرين الذين ضبطوا لغة واجهة المستخدم على لغة تستخدم نصوص LTR، مثل الإنجليزية، يمكنهم عرض أو إنشاء محتوى بلغة تستخدم النصوص البرمجية من اليمين إلى اليسار. لدعم كلا النوعين من المستخدمين، يحتاج تطبيقك إلى ما يلي:
- يمكنك استخدام تخطيط واجهة المستخدم من اليمين إلى اليسار للغات التي تُكتب من اليمين إلى اليسار.
- يتيح لك هذا التقرير معرفة اتجاه البيانات النصية المعروضة داخل الرسائل المنسّقة وتوضيحها. يمكنك عادةً طلب طريقة تحدِّد اتجاه البيانات النصية نيابةً عنك، كما هو موضّح في هذا الدليل.
إنشاء أدلة اللغات وملفات الموارد
لإتاحة المزيد من اللغات، أنشِئ أدلة إضافية داخل res/
. يجب أن يتقيد اسم كل دليل بالتنسيق التالي:
<resource type>-b+<language code>[+<country code>]
على سبيل المثال، يحتوي values-b+es/
على موارد سلسلة
لللغات التي تحمل رمز اللغة es
. وبالمثل، يحتوي mipmap-b+es+ES/
على رموز للغات مع رمز اللغة es
ورمز البلد ES
.
يحمّل Android الموارد المناسبة وفقًا لإعدادات اللغة للجهاز في وقت التشغيل. لمزيد من المعلومات، يُرجى الاطّلاع على تقديم موارد بديلة.
بعد أن تقرر اللغات التي تريد دعمها، أنشئ الأدلة الفرعية للموارد وملفاتها. مثلاً:
MyProject/ res/ values/ strings.xml values-b+es/ strings.xml mipmap/ country_flag.png mipmap-b+es+ES/ country_flag.png
تعبئة ملفات الموارد بموارد مترجمة. في ما يلي أمثلة على ملفات موارد الصور والسلسلة المترجمة:
السلاسل الإنجليزية (اللغة التلقائية) باللغة /values/strings.xml
:
<resources> <string name="hello_world">Hello World!</string> </resources>
السلاسل الإسبانية (لغة es
) باللغة /values-b+es/strings.xml
:
<resources> <string name="hello_world">¡Hola Mundo!</string> </resources>
رمز علم الولايات المتحدة (اللغة التلقائية) باللغة
/mipmap/country_flag.png
:
![يُعد رمز علم الولايات المتحدة](https://developer.android.com/static/images/training/languages_us_flag.png?authuser=5&hl=ar)
الشكل 2. الرمز المستخدَم للّغة التلقائية (en_US).
رمز العلم الإسباني (لغة es_ES
) باللغة
/mipmap-b+es+ES/country_flag.png
:
![يُعد رمز علم إسبانيا](https://developer.android.com/static/images/training/languages_es_flag.png?authuser=5&hl=ar)
الشكل 3. الرمز المستخدَم للّغة es_ES
ملاحظة: يمكنك استخدام مؤهلات الإعداد، مثل مؤهل اللغة، على أي نوع مورد. على سبيل المثال، قد ترغب في توفير إصدارات مترجمة من عناصر الصورة النقطية القابلة للرسم. لمزيد من المعلومات، يُرجى الاطّلاع على ترجمة تطبيقك.
استخدام الموارد في تطبيقك
أشِر إلى الموارد في رمز المصدر وملفات XML الأخرى باستخدام
سمة name
لكل مورد:
R.<resource type>.<resource name>
. هناك مجموعة متنوعة من الطرق التي تقبل المورد بهذه الطريقة، كما هو موضح في الأمثلة التالية:
Kotlin
// Get a string resource val hello = resources.getString(R.string.hello_world) // Or supply a string resource to a method that requires a string TextView(this).apply { setText(R.string.hello_world) }
Java
// Get a string resource String hello = getResources().getString(R.string.hello_world); // Or supply a string resource to a method that requires a string TextView textView = new TextView(this); textView.setText(R.string.hello_world);
في ملفات XML، يمكنك الإشارة إلى مورد يتضمّن البنية
@<resource type>/<resource name>
عندما تقبل سمة XML
قيمة متوافقة، كما هو موضّح في المثال التالي:
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/country_flag" />
ملاحظة: لضمان منح الأولوية لإعدادات اللغة للمستخدِم بشكل صحيح، حدِّد اللغات التي يتيحها تطبيقك باستخدام السمة resConfigs
. ولمزيد
من المعلومات، يمكنك الاطّلاع على
تحديد اللغات التي يتيحها تطبيقك.
تنسيق النص في الرسائل
من أكثر المهام شيوعًا في التطبيقات تنسيق النص. يتم تنسيق الرسائل المترجمة عن طريق إدراج نص وبيانات رقمية في المواضع المناسبة. للأسف، عند التعامل مع واجهة مستخدم من اليمين إلى اليسار أو بيانات من اليمين إلى اليسار، يمكن أن يعرض التنسيق البسيط مخرجات نصية غير صحيحة أو غير قابلة للقراءة.
وتتم كتابة اللغات مثل العربية والعبرية والفارسية والأوردية من اليمين إلى اليسار. ومع ذلك، تتم كتابة بعض العناصر، مثل الأرقام ونص LTR المضمن، LTR داخل نص RTL بطريقة أخرى. إنّ اللغات التي تستخدم النصوص البرمجية من اليسار إلى اليمين، بما في ذلك الإنجليزية، تكون ثنائية الاتجاه أيضًا، لأنها قد تحتوي على نصوص من اليمين إلى اليسار (RTL)، ويجب عرضها من اليمين إلى اليسار.
تنشئ التطبيقات غالبًا مثيلات من هذا النوع من النصوص المعاكسة الاتجاه، مثلاً عن طريق إدراج بيانات نصية بلغة عشوائية واتجاه نص عشوائي في الرسائل المترجَمة. ولا يتضمن هذا المزيج من الاتجاهات في كثير من الأحيان مؤشرًا واضحًا لمكان بدء النص في الاتجاه المقابل وانتهائه، لذلك يمكن أن يتسبب النص الذي يتم إنشاؤه من خلال التطبيق في تجربة مستخدم سيئة.
على الرغم من معالجة النظام التلقائية للنص ثنائي الاتجاه عادةً لعرض النص كما هو متوقع، قد لا يتم عرض النص بشكل صحيح عندما يدرجه التطبيق في رسالة مترجمة. فيما يلي أمثلة على المواقف التي من المحتمل أن يظهر فيها النص بشكل غير صحيح:
-
تم إدراج النص في بداية الرسالة:
PERSON_NAME يتصل بك
-
النص الذي يبدأ برقم، مثل عنوان أو رقم هاتف:
987 654-3210
-
النص الذي يبدأ بعلامات ترقيم، مثل رقم الهاتف:
+19876543210
-
نص ينتهي بعلامة ترقيم:
هل أنت متأكّد من خيارك؟
-
النص الذي يحتوي على كلا الاتجاهين:
كلمة TABNPA هي العبرية التي تعني موزة.
مثال
لنفترض أن أحد التطبيقات يحتاج أحيانًا إلى عرض الرسالة "هل تقصد %s؟"، مع إدراج عنوان بدلاً من %s في وقت التشغيل. يتوافق التطبيق مع لغات واجهة مستخدم مختلفة، لذا تأتي الرسالة من مورد خاص بلغة معيّنة وتستخدم اتجاه RTL عند ضبط الجهاز على لغة من اليمين إلى اليسار. على سبيل المثال، بالنسبة إلى واجهة المستخدم العبرية، تظهر الرسالة على النحو التالي:
طلع تشمل كل يوم %s?
ومع ذلك، قد يأتي العنوان المقترَح من قاعدة بيانات لا تتضمن نصًا بلغة اللغة. على سبيل المثال، إذا كان العنوان لمكان في كاليفورنيا، فسيظهر في قاعدة البيانات باستخدام نص باللغة الإنجليزية. إذا أدخلت العنوان " 15 Bay Street, Laurel, CA" في رسالة RTL بدون تقديم أي تلميحات بشأن اتجاه النص، فلن تكون النتيجة متوقَّعة أو صحيحة:
삹 惯 15 Bay Street, Laurel, CA?
يظهر رقم المنزل على يمين العنوان، وليس على اليسار كما هو مطلوب. هذا يجعل رقم المنزل يبدو أشبه برمز بريدي غريب. يمكن أن تحدث المشكلة نفسها في حال تضمين نص من اليمين إلى اليسار في رسالة تستخدم اتجاه النص من اليسار إلى اليمين.
الشرح والحل
تحدث المشكلة في هذا المثال لأن أداة تنسيق النص لا تحدد أن "15" هو جزء من العنوان، لذلك لا يمكن للنظام تحديد ما إذا كان الرقم "15" جزءًا من نص RTL الذي يأتي قبله أم من نص LTR الذي يأتي بعده.
ولحلّ هذه المسألة، استخدِم الطريقة unicodeWrap()
من الفئة BidiFormatter
. تكتشف هذه الطريقة اتجاه السلسلة وتلفّها بأحرف تنسيق يونيكود التي تشير إلى ذلك الاتجاه.
ويوضّح مقتطف الرمز التالي كيفية استخدام unicodeWrap()
:
Kotlin
val mySuggestion = "15 Bay Street, Laurel, CA" val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance() // The "did_you_mean" localized string resource includes // a "%s" placeholder for the suggestion. String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))
Java
String mySuggestion = "15 Bay Street, Laurel, CA"; BidiFormatter myBidiFormatter = BidiFormatter.getInstance(); // The "did_you_mean" localized string resource includes // a "%s" placeholder for the suggestion. String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion));
نظرًا لأن الرقم "15" يظهر الآن داخل النص الذي تم تعريفه على أنه LTR، يتم عرضه في الموضع الصحيح:
빥 惯 15 Bay Street, Laurel, CA?
استخدِم الأسلوب unicodeWrap()
في كل جزء من النص تدرجه في رسالة مترجمة إلا في حال انطباق أي مما يلي:
- يتم إدراج النص في سلسلة يمكن للأجهزة قراءتها، مثل معرّف موارد منتظم (URI) أو طلب بحث بلغة الاستعلامات البنيوية (SQL).
- أنت تعرف أن جزء النص قد سبق التفافه بشكل صحيح.
ملاحظة: إذا كان تطبيقك يستهدف الإصدار Android 4.3 (المستوى 18 لواجهة برمجة التطبيقات) أو إصدارات أحدث، استخدِم إصدار BidiFormatter
المتوفّر في إطار عمل Android. وفي الحالات الأخرى، يمكنك استخدام إصدار
BidiFormatter
المتوفّر في "مكتبة الدعم".
تنسيق الأرقام
استخدِم تنسيق السلاسل، وليس استدعاءات الطريقة، لتحويل الأرقام إلى سلاسل في منطق تطبيقك:
Kotlin
var myIntAsString = "$myInt"
Java
String myIntAsString = String.format("%d", myInt);
ويؤدي ذلك إلى تنسيق الأرقام بشكل مناسب للغتك، والتي قد تتضمّن استخدام مجموعة أرقام مختلفة.
عند استخدام
String.format()
لإنشاء طلب بحث SQL
على جهاز تم ضبطه على لغة تستخدم مجموعتها الخاصة من الأرقام، مثل الفارسية ومعظم اللغات العربية، تحدث مشاكل إذا كان أي من معلَمات طلب البحث عبارة عن أرقام. وذلك لأن الرقم منسق بأرقام اللغة، وهذه الأرقام غير صالحة في SQL.
للحفاظ على الأرقام بتنسيق ASCII وإبقاء طلب بحث SQL صالحًا، عليك بدلاً من ذلك استخدام
النسخة المحملة بشكل زائد من
String.format()
التي تتضمّن لغة باعتبارها المعلَمة الأولى. استخدِم وسيطة اللغة
Locale.US
.
دعم النسخ المطابق للتخطيط
يفضّل المستخدمون الذين يستخدمون النصوص البرمجية من اليمين إلى اليسار استخدام واجهة المستخدم من اليمين إلى اليسار، والتي تتضمّن قوائم محاذية لليمين ونصًا تمت محاذاته لليمين وأسهم للأمام تشير إلى اليسار.
يوضح الشكل 4 التباين بين إصدار LTR للشاشة داخل تطبيق "الإعدادات" ونظيره من اليمين إلى اليسار:
![تمت محاذاة منطقة الإشعارات إلى اليمين بالقرب من أعلى اليمين، بالقرب من الزاوية العلوية اليسرى لكل من زر القائمة في شريط التطبيق، بينما محاذاة المحتوى في الجزء الرئيسي من الشاشة إلى اليسار مع عرض من اليسار إلى اليمين، بينما يظهر زر الرجوع بالقرب من أسفل اليمين ويشير إلى اليسار.](https://developer.android.com/static/images/training/basics/ltr-display.png?authuser=5&hl=ar)
![تمت محاذاة منطقة الإشعارات إلى اليمين بالقرب من الزاوية العلوية اليمنى، وأن يكون زر القائمة في شريط التطبيقات أعلى اليسار، وأن يكون المحتوى في الجزء الرئيسي من الشاشة بمحاذاة المحتوى](https://developer.android.com/static/images/training/basics/rtl-display.png?authuser=5&hl=ar)
عند إضافة إتاحة RTL إلى التطبيق، يُرجى مراعاة النقاط التالية:
- لا تتوفّر ميزة النسخ المطابق للنص من اليمين إلى اليسار في التطبيقات إلا في حال استخدامها على أجهزة تعمل بنظام التشغيل Android 4.2 (مستوى واجهة برمجة التطبيقات 17) أو الإصدارات الأحدث. للتعرّف على كيفية إتاحة النسخ المطابق للنص على الأجهزة القديمة، يمكنك الاطّلاع على إتاحة التطبيقات القديمة في هذا الدليل.
- لاختبار ما إذا كان تطبيقك متوافقًا مع اتجاه النص من اليمين إلى اليسار، اختبِر ذلك باستخدام خيارات المطوّرين كما هو موضّح في هذا الدليل وادعُ الأشخاص الذين يستخدمون النصوص البرمجية من اليمين إلى اليسار لاستخدام تطبيقك.
ملاحظة: للاطّلاع على إرشادات التصميم الإضافية المتعلقة بالنسخ المطابق للتنسيق، بما في ذلك قائمة بالعناصر غير المناسبة وغير المناسبة للنسخ المطابق، يُرجى الاطّلاع على إرشادات تصميم المواد للاتجاه الثنائي.
لإجراء نسخ مطابق لتنسيق واجهة المستخدم في تطبيقك بحيث يظهر من اليمين إلى اليسار (RTL) بلغة من اليمين إلى اليسار، أكمِل الخطوات الواردة في الأقسام التالية.
تعديل ملفات الإصدار والبيان
يمكنك تعديل ملف build.gradle
وبيان التطبيق ضمن وحدة تطبيقك
على النحو التالي:
build.gradle (Module: app)
رائع
android { ... defaultConfig { targetSdkVersion 17 // Or higher ... } }
Kotlin
android { ... defaultConfig { targetSdkVersion(17) // Or higher ... } }
AndroidManifest.xml
<manifest ... > ... <application ... android:supportsRtl="true"> </application> </manifest>
ملاحظة: إذا كان تطبيقك يستهدف الإصدار Android 4.1.1 (المستوى 16 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم، يتم تجاهل السمة android:supportsRtl
بالإضافة إلى أي قيم لسمة start
وend
تظهر في ملفات تنسيق تطبيقك. في هذه الحالة، لا يحدث النسخ المطابق لتخطيط RTL تلقائيًا في تطبيقك.
تعديل الموارد الحالية
يمكنك تحويل left
وright
إلى start
وend
، على التوالي، في ملفات موارد التنسيق الحالية.
يتيح ذلك لإطار العمل محاذاة عناصر واجهة المستخدم في تطبيقك بناءً على إعدادات اللغة لدى المستخدم.
ملاحظة: قبل تعديل الموارد، تعرَّف على كيفية تقديم الدعم للتطبيقات القديمة أو التطبيقات التي تستهدف الإصدار Android 4.1.1 (المستوى 16 من واجهة برمجة التطبيقات) والإصدارات الأقدم.
لاستخدام إمكانات محاذاة RTL في إطار العمل، عليك تغيير السمات في ملفات التنسيق التي تظهر في الجدول 1.
الجدول 1. السمات التي يمكن استخدامها عندما يتوافق تطبيقك مع توجيهات نصية متعددة
يوضّح الجدول 2 كيفية معالجة النظام لسمات محاذاة واجهة المستخدم استنادًا إلى إصدار حزمة تطوير البرامج (SDK) المستهدَف، وما إذا تم تحديد السمتَين left
وright
، وما إذا تم تحديد السمتَين start
وend
.
الجدول 2. سلوك محاذاة عناصر واجهة المستخدم استنادًا إلى إصدار حزمة تطوير البرامج (SDK) المستهدَف والسمات المحدَّدة
|
هل تم تحديد الإدخال لليسار واليمين؟ | هل تم تحديد البداية والنهاية؟ | النتيجة |
---|---|---|---|
نعم | نعم | نعم |
يتم استخدام start وend ، ما يؤدي إلى إلغاء
left وright .
|
نعم | نعم | لا | يتم استخدام left وright . |
نعم | لا | نعم | يتم استخدام start وend . |
لا | نعم | نعم |
يتم استخدام left وright (يتم تجاهل start وend )
|
لا | نعم | لا | يتم استخدام left وright . |
لا | لا | نعم |
يؤدي الضغط على start وend إلى left وright
|
إضافة مراجع حول الاتجاهات واللغات
تتضمن هذه الخطوة إضافة إصدارات محددة من التنسيق الخاص بك، وملفات موارد قابلة للرسم، وملفات موارد قيم تحتوي على قيم مخصصة للغات مختلفة واتجاهات نصية.
في نظام التشغيل Android 4.2 (المستوى 17 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام مؤهِّلي الموارد -ldrtl
(تنسيق الاتجاه من اليمين إلى اليسار) و-ldltr
(تنسيق الاتجاه من اليسار إلى اليمين). للحفاظ على التوافق مع الموارد الحالية، تستخدم الإصدارات القديمة من Android مؤهلات لغة المورد لاستنتاج اتجاه النص الصحيح.
لنفرض أنك تريد إضافة ملف تنسيق محدد يتوافق مع النصوص البرمجية من اليمين إلى اليسار،
مثل اللغات العبرية والعربية والفارسية. لإجراء ذلك، أضِف دليل layout-ldrtl/
في دليل res/
على النحو الموضّح في المثال التالي:
res/ layout/ main.xml This layout file is loaded by default. layout-ldrtl/ main.xml This layout file is loaded for languages using an RTL text direction, including Arabic, Persian, and Hebrew.
إذا أردت إضافة نسخة معيَّنة من التنسيق المصممة للنص العربي فقط، ستبدو بنية الدليل على النحو التالي:
res/ layout/ main.xml This layout file is loaded by default. layout-ar/ main.xml This layout file is loaded for Arabic text. layout-ldrtl/ main.xml This layout file is loaded only for non-Arabic languages that use an RTL text direction.
ملاحظة: يكون للموارد المخصّصة للغة الأولوية على الموارد الخاصة باتجاه التنسيق، والتي لها الأولوية على الموارد التلقائية.
استخدام التطبيقات المصغّرة المتوافقة
بدءًا من الإصدار 4.2 من Android (المستوى 17 من واجهة برمجة التطبيقات)، تتوافق معظم عناصر واجهة المستخدم في إطار العمل مع اتجاه النص من اليمين إلى اليسار تلقائيًا. مع ذلك، لا تتوافق بعض عناصر إطار العمل، مثل ViewPager
، مع اتجاه النص من اليمين إلى اليسار.
تتيح التطبيقات المصغّرة على الشاشة الرئيسية اتجاه النص من اليمين إلى اليسار (RTL) ما دامت
ملفات البيان المقابلة لها تشمل سمة تحديد السمة
android:supportsRtl="true"
.
تقديم الدعم للتطبيقات القديمة
إذا كان تطبيقك يستهدف الإصدار Android 4.1.1 (المستوى 16 لواجهة برمجة التطبيقات) أو إصدارًا أقدم، عليك تضمين
السمتَين left
وright
بالإضافة إلى
start
وend
.
للتحقق مما إذا كان التنسيق يحتاج إلى استخدام اتجاه النص من اليمين إلى اليسار، استخدِم المنطق التالي:
Kotlin
private fun shouldUseLayoutRtl(): Boolean { return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { View.LAYOUT_DIRECTION_RTL == layoutDirection } else { false } }
Java
private boolean shouldUseLayoutRtl() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { return View.LAYOUT_DIRECTION_RTL == getLayoutDirection(); } else { return false; } }
ملاحظة: لتجنّب مشاكل التوافق، استخدِم الإصدار 23.0.1 أو إصدارًا أحدث من أدوات إصدار حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
الاختبار باستخدام ميزة "خيارات المطوّرين"
على الأجهزة التي تعمل بنظام التشغيل Android 4.4 (المستوى 19 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يمكنك تفعيل فرض اتجاه تنسيق RTL في خيارات المطوّرين على الجهاز. يتيح لك هذا الإعداد رؤية النص الذي يستخدم النصوص البرمجية من اليسار إلى اليمين، مثل النص الإنجليزي، في وضع RTL.
تعديل منطق التطبيق
يصف هذا القسم جوانب محددة من منطق تطبيقك ليتم تحديثه عند تكييف تطبيقك للتعامل مع اتجاهات النص المتعددة.
تغييرات الخصائص
لمعالجة تغيير في أي موقع ذي صلة من اليمين إلى اليسار، مثل اتجاه
التنسيق أو معلمات التنسيق أو المساحة المتروكة أو اتجاه النص أو محاذاة النص أو
الموضع القابل للرسم، يمكنك استخدام
onRtlPropertiesChanged()
رد الاتصال. تتيح لك معاودة الاتصال هذه الحصول على اتجاه التنسيق الحالي وتعديل كائنات View
للنشاط وفقًا لذلك.
المشاهدات
إذا كنت تقوم بإنشاء أداة واجهة مستخدم ليست جزءًا مباشرةً من التسلسل الهرمي لعرض النشاط، مثل مربع حوار أو عنصر واجهة مستخدم يشبه نخب، فعيّن اتجاه التخطيط الصحيح بناءً على السياق. يوضح مقتطف الرمز التالي كيفية إكمال هذه العملية:
Kotlin
val config: Configuration = context.resources.configuration view.layoutDirection = config.layoutDirection
Java
final Configuration config = getContext().getResources().getConfiguration(); view.setLayoutDirection(config.getLayoutDirection());
هناك عدة طرق للفئة View
تتطلّب تفكيرًا إضافيًا:
onMeasure()
- قد تختلف قياسات العرض بناءً على اتجاه النص.
onLayout()
- إذا أنشأت تنفيذ تنسيق خاص بك، ستحتاج إلى طلب الرمز
super()
في إصدارonLayout()
وتعديل المنطق المخصّص للتوافق مع النصوص البرمجية من اليمين إلى اليسار. onDraw()
- في حال تنفيذ طريقة عرض مخصّصة أو إضافة وظائف متقدّمة إلى
رسم، يجب تعديل الرمز لإتاحة النصوص البرمجية من اليمين إلى اليسار. استخدِم
الرمز التالي لتحديد ما إذا كانت الأداة في وضع RTL:
Kotlin
// On devices running Android 4.1.1 (API level 16) and lower, // you can call the isLayoutRtl() system method directly. fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL
Java
// On devices running Android 4.1.1 (API level 16) and lower, // you can call the isLayoutRtl() system method directly. public boolean isLayoutRtl() { return (getLayoutDirection() == LAYOUT_DIRECTION_RTL); }
قابلة للرسم
إذا كان لديك ملف قابل للرسم يجب عكسه بتنسيق RTL، أكمل إحدى الخطوات التالية استنادًا إلى إصدار Android الذي يعمل على الجهاز:
-
على الأجهزة التي تعمل بنظام التشغيل Android 4.3 (المستوى 18 لواجهة برمجة التطبيقات) والإصدارات الأقدم،
أضِف ملفات موارد
-ldrtl
وحدِّدها. -
في نظام التشغيل Android 4.4 (المستوى 19 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام
android:autoMirrored="true"
عند تحديد العنصر القابل للرسم، ما يتيح للنظام إمكانية معالجة النسخ المطابق لتنسيق RTL.ملاحظة: يمكن استخدام السمة
android:autoMirrored
فقط مع العناصر القابلة للرسم البسيطة التي يكون فيها النسخ المطابق الثنائي الاتجاه ببساطة انعكاسًا بيانيًا لما هو قابل للرسم بالكامل. إذا كان العنصر القابل للرسم يحتوي على عناصر متعددة، أو إذا كان التعبير عن الشكل القابل للرسم يغيّر تفسيره، يمكنك إجراء النسخ المطابق بنفسك. كلّما أمكن، تواصَل مع خبير ثنائي الاتجاه لتحديد ما إذا كانت رسوماتك القابلة للرسم على المرآة منطقية للمستخدمين.
الجاذبية
إذا كان رمز تنسيق التطبيق يستخدم السمة Gravity.LEFT
أو السمة Gravity.RIGHT
، يجب تغيير هاتين القيمتين إلى Gravity.START
وGravity.END
على التوالي.
إذا كان لديك رمز لغة البرمجة Kotlin أو رمز Java يعتمد على السمتَين Gravity.LEFT
أو Gravity.RIGHT
،
يمكنك تعديله للتوافق مع هذا التغيير من خلال ضبط absoluteGravity
لمطابقة
layoutDirection
.
على سبيل المثال، إذا كنت تستخدم الرمز التالي:
Kotlin
when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) { Gravity.LEFT -> { // Handle objects that are left-aligned. } Gravity.RIGHT -> { // Handle objects that are right-aligned. } }
Java
switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.LEFT: // Handle objects that are left-aligned. break; case Gravity.RIGHT: // Handle objects that are right-aligned. break; }
قم بتغييره إلى ما يلي:
Kotlin
val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection) when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) { Gravity.LEFT -> { // Handle objects that are left-aligned. } Gravity.RIGHT -> { // Handle objects that are right-aligned. } }
Java
final int layoutDirection = getLayoutDirection(); final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection); switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.LEFT: // Handle objects that are left-aligned. break; case Gravity.RIGHT: // Handle objects that are right-aligned. break; }
وهذا يعني أنه يمكنك الاحتفاظ بالرمز البرمجي الحالي الذي يعالج قيم المحاذاة إلى اليسار والمحاذاة إلى اليمين، حتى إذا كنت تستخدم start
وend
لقيم الجاذبية لديك.
ملاحظة: عند تطبيق إعدادات الجاذبية، استخدم إصدارًا تحميلاً زائدًا من Gravity.apply()
يتضمن وسيطة layoutDirection
.
الهوامش والمساحة المتروكة
لإتاحة النصوص البرمجية من اليمين إلى اليسار في تطبيقك، اتّبِع أفضل الممارسات التالية المتعلّقة بقيم الهوامش والمساحة المتروكة:
-
ويمكنك استخدام
getMarginStart()
وgetMarginEnd()
بدلاً من السمات المكافئة للاتجاهاتleftMargin
وrightMargin
. -
عند استخدام
setMargins()
، يمكنك تبديل قيم الوسيطاتleft
وright
إذا رصد تطبيقك نصوصًا مكتوبة من اليمين إلى اليسار. -
إذا كان تطبيقك يتضمّن منطقًا مخصصًا للمساحة المتروكة، يمكنك إلغاء
setPadding()
وsetPaddingRelative()
.
إتاحة إعدادات اللغة المخصّصة حسب التطبيقات
في كثير من الحالات، يحدِّد المستخدمون متعددو اللغات لغة واحدة للنظام، مثل الإنجليزية، لكنّهم يريدون اختيار لغات أخرى لتطبيقات معيّنة، مثل الهولندية أو الصينية أو الهندية. لمساعدة التطبيقات في توفير تجربة أفضل لهؤلاء المستخدمين، يقدّم نظام التشغيل Android 13 الميزات التالية للتطبيقات التي تتوافق مع لغات متعددة:
-
إعدادات النظام: موقع مركزي يمكن للمستخدمين من خلاله اختيار لغة مفضّلة لكل تطبيق.
يجب أن يذكر تطبيقك السمة
android:localeConfig
في ملف البيان لإعلام النظام بأنّه يتيح استخدام عدة لغات. لمعرفة مزيد من المعلومات، يمكنك الاطّلاع على تعليمات إنشاء ملف موارد والإعلان عنه في ملف بيان التطبيق. -
واجهات برمجة التطبيقات الإضافية: تسمح واجهات برمجة التطبيقات المتاحة للجميع هذه، مثل طريقتَي l10n-placeholder1">
setApplicationLocales()
وl10n-placeholder2">getApplicationLocales()
فيLocaleManager
، للتطبيقات بضبط لغة مختلفة عن لغة النظام في وقت التشغيل.يمكن للتطبيقات التي تستخدم أدوات اختيار اللغة داخل التطبيقات استخدام واجهات برمجة التطبيقات هذه لمنح المستخدمين تجربة مستخدم متسقة بغض النظر عن المكان الذي يختارون فيه إعدادات اللغة المفضّلة. تساعدك واجهات برمجة التطبيقات العامة أيضًا في تقليل مقدار الرموز النموذجية، كما أنّها تتوافق مع حِزم APK المقسّمة. وتتيح أيضًا ميزة التحميل التلقائي للتطبيقات لتخزين إعدادات اللغة الخاصة بالمستخدم على مستوى التطبيقات.
للتوافق مع الأنظمة القديمة مع إصدارات Android السابقة، تتوفّر أيضًا واجهات برمجة تطبيقات مكافئة في AndroidX. ننصحك باستخدام Appcompat 1.6.0-beta01 أو الإصدارات الأحدث.
لمزيد من المعلومات، يمكنك الاطّلاع على تعليمات تنفيذ واجهات برمجة التطبيقات الجديدة.
راجع أيضًا
مراجع إضافية
للتعرُّف على المزيد من المعلومات عن التوافق مع الأجهزة القديمة، يمكنك الاطّلاع على المراجع التالية:
مشاركات المدونة
- لتسهيل الوصول إلى التطبيقات، احرص على أن تكون التطبيقات متوافقة مع الأجهزة المختلفة.
- كتابة المحتوى لجمهور عالمي