دعم لغات وثقافات مختلفة

تتضمن التطبيقات موارد يمكن أن تكون خاصة بثقافة معينة. على سبيل المثال، يمكن أن يتضمن التطبيق سلاسل خاصة بثقافة معينة تتم ترجمتها إلى لغة المنطقة المحلية الحالية.

إنها ممارسة جيدة أن تضع موارد خاصة بثقافة محدّدة منفصلة عن بقية تطبيقك. التعامل مع Android الموارد الخاصة باللغة والثقافات استنادًا إلى إعداد اللغة على النظام. إِنْتَ تقديم الدعم للغات مختلفة باستخدام دليل الموارد في لمشروع Android الخاص بك.

يمكنك تحديد موارد مصممة خصيصًا لثقافات الأشخاص الذين يستخدمون التطبيق. يمكنك توفير أي نوع موارد يكون يتناسب مع لغة وثقافات المستخدمين. على سبيل المثال، تُظهر لقطات الشاشة التالية تطبيقًا يعرض سلسلة وموارد قابلة للرسم اللغة التلقائية en_US على الجهاز واللغة الإسبانية اللغة es_ES.

يعرض التطبيق
نص ورمز مختلفان اعتمادًا على اللغة الحالية

الشكل 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:

تمثل رمز علم
الولايات المتحدة

الشكل 2. رمز يُستخدَم للّغة التلقائية (en_US).

رمز العلم الإسباني (لغة واحدة (es_ES)) في /mipmap-b+es+ES/country_flag.png:

رمز علم
أسبانيا

الشكل 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. بالنسبة مزيد من المعلومات، راجع حدِّد اللغات التي يتوافق معها تطبيقك.

تنسيق النص في الرسائل

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

تتم كتابة اللغات مثل العربية والعبرية والفارسية والأوردية بتنسيق RTL. ومع ذلك، هناك بعض العناصر، مثل الأرقام والعناصر المضمّنة يتم كتابة نص LTR ضمن نص RTL بخلاف ذلك. اللغات التي تستخدم نصوص LTR، بما في ذلك الإنجليزية، تكون ثنائية الاتجاه أيضًا، لأنّها قد تحتوي على نصوص برمجية من اليمين إلى اليسار وتحتاج إلى عرضها بتنسيق من اليمين إلى اليسار

وغالبًا ما تنشئ التطبيقات مثيلات من هذا النوع من النصوص المعاكسة المضمّنة، مثلاً عن طريق إدراج بيانات نصية عشوائية اللغة واتجاه النص العشوائي في الرسائل المترجمة. غالبًا ما لا يتضمن هذا المزيج من الاتجاهات إشارة واضحة للمكان بداية النص المعاكس ونهايته، لذا فإن الخطوات التي يتم إنشاؤها يمكن أن يتسبب النص في تجربة مستخدم سيئة.

على الرغم من أن معالجة النظام الافتراضية للنص ثنائي الاتجاه تعرض عادةً النص كما هو متوقع، فقد لا يظهر النص بشكل صحيح عندما يكون تطبيقك يُدرجها في رسالة مترجمة. فيما يلي أمثلة على المواقف التي يحتمل أن يظهر فيها النص بشكل غير صحيح:

  • تم إدراج النص في بداية الرسالة:

    يتصل بك "PERSON_NAME"

  • نص يبدأ برقم، مثل العنوان أو رقم الهاتف:

    987 654-3210

  • النص الذي يبدأ بعلامات ترقيم، مثل رقم هاتف:

    +19876543210

  • النص الذي ينتهي بعلامة ترقيم:

    هل أنت متأكّد؟

  • النص الذي يحتوي على كلا الاتجاهين حاليًا:

    وكلمة نسبة مئوية هي كلمة باللغة العبرية عن الموز.

مثال

لنفترض أن أحد التطبيقات يحتاج أحيانًا إلى عرض الرسالة "تم تعني %s?"، مع إدراج عنوان بدلاً من %s في وقت التشغيل. يتوافق التطبيق مع لغات واجهة المستخدم المختلفة، لذلك تأتي الرسالة من لغة خاصة بلغة المورد وتستخدم اتجاه من اليمين إلى اليسار عند ضبط الجهاز على لغة من اليمين إلى اليسار. على سبيل المثال، بالنسبة للغة العبرية في واجهة المستخدم، تظهر الرسالة على النحو التالي:

هي هَا هُوَهَا كَامِلْ طَرِيقْ %s؟

ومع ذلك، قد يأتي العنوان المقترَح من قاعدة بيانات لا تتضمّن نصًا. بلغة المنطقة المحلية. على سبيل المثال: إذا كان العنوان يشير إلى مكان في كاليفورنيا، فإنها تظهر في قاعدة البيانات باستخدام النص الإنجليزي. إذا قمت بإدراج العنوان "15 شارع السلام، القاهرة" في رسالة من اليمين إلى اليسار بدون تقديم تلميحات بشأن اتجاه النص، فإن النتيجة ليست متوقعة أو صحيحة:

א 䏕ו تعرَّف على منطقة إل 15 باي ستريت، لوريل، كاليفورنيا؟

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

الشرح والحل

تحدث المشكلة في هذا المثال لأن أداة تنسيق النص لا تحديد أن "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، يتم عرضه في الموضع الصحيح:

صدأ الحديد 2: 15 شارع باي، لوريل، كاليفورنيا?

استخدِم الطريقة unicodeWrap() في كل جزء من النص الذي تدرجه في رسالة مترجمة إلا عندما ينطبق أحد الشروط التالية:

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

ملاحظة: إذا كان تطبيقك يستهدف الإصدار 4.3 من نظام التشغيل Android (المستوى 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 للشاشة داخل تطبيق "الإعدادات" ونظيره من اليمين إلى اليسار:

تتم محاذاة منطقة الإشعارات إلى اليمين بالقرب من الزاوية العلوية اليمنى،
           يكون زر القائمة في شريط التطبيقات بالقرب من أعلى الجانب الأيمن،
           تتم محاذاة المحتوى في الجزء الرئيسي من الشاشة إلى اليسار ويظهر
           LTR وزر الرجوع بالقرب من الزاوية السفلية اليسرى
           يشير إلى اليسار. محاذاة منطقة الإشعارات لليسار بالقرب من أعلى الجانب الأيسر،
            زر القائمة في شريط التطبيق بالقرب من أعلى الجانب الأيسر، سيتم عرض
            في الجزء الرئيسي من الشاشة تتم محاذاة اليمين
ويظهر بدلاً من ذلك،
            يكون زر الرجوع بالقرب من أسفل الجانب الأيمن ويشير إلى
            اليمين
الشكل 4. صيغ LTR وRTL لشاشة الإعدادات

عند إضافة دعم من اليمين إلى اليسار (RTL) إلى تطبيقك، احرِص على النقاط التالية في الاعتبار:

  • لا تتوفّر ميزة "النسخ المطابق للنص من اليمين إلى اليسار" إلا في التطبيقات عند استخدامها على الأجهزة التي تعمل بنظام التشغيل Android. Android 4.2 (المستوى 17 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث للتعرّف على كيفية استخدام النسخ المطابق للنص على الأجهزة الأقدم، راجِع تقديم الدعم للتطبيقات القديمة في هذا الدليل.
  • لاختبار ما إذا كان تطبيقك يتيح استخدام اتجاه النص من اليمين إلى اليسار، إجراء اختبار باستخدام خيارات المطوّرين كما هو موضّح في هذا الدليل ودعوة المستخدمين الذين يستخدمون النصوص البرمجية من اليمين إلى اليسار لاستخدام تطبيقك

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

لمحاكاة تنسيق واجهة المستخدم في تطبيقك بحيث يظهر من اليمين إلى اليسار بلغة من اليمين إلى اليسار، لإكمال الخطوات الواردة في الأقسام التالية.

تعديل الإصدار وملفات البيان

يمكنك تعديل ملف build.gradle وملف بيان التطبيق الخاصَين بوحدة تطبيقك. على النحو التالي:

build.gradle (Module: app)

Groovy

android {
    ...
    defaultConfig {
        targetSdkVersion 17 // Or higher
        ...
    }
}

Kotlin

android {
    ...
    defaultConfig {
        targetSdkVersion(17) // Or higher
        ...
    }
}

AndroidManifest.xml

<manifest ... >
    ...
    <application ...
        android:supportsRtl="true">
    </application>
</manifest>

ملاحظة: إذا كان تطبيقك يستهدف الإصدار 4.1.1 من نظام التشغيل Android (المستوى 16 من واجهة برمجة التطبيقات) أو الأقل، يتم تجاهل السمة android:supportsRtl إلى جانب أي قيم السمتين start وend التي تظهر في ملفات تخطيط التطبيق. في هذه الحالة، لا يحدث النسخ المطابق لتخطيط RTL تلقائيًا في تطبيقك.

تعديل الموارد الحالية

تحويل left وright إلى start و end، على التوالي، في ملفات موارد التنسيق الحالية. يتيح ذلك لإطار العمل مواءمة عناصر واجهة المستخدم في تطبيقك استنادًا إلى إعدادات اللغة لدى المستخدم.

ملاحظة: قبل تعديل الموارد، تعرَّف على كيفية توفير الدعم للتطبيقات القديمة، أو التطبيقات التي تستهدف الإصدار 4.1.1 من نظام التشغيل Android (المستوى 16 من واجهة برمجة التطبيقات) والإصدارات الأقدم.

لاستخدام إمكانيات محاذاة النص من اليمين إلى اليسار في إطار العمل، عليك تغيير السمات في ملفات التخطيط التي تظهر في الجدول 1.

الجدول 1. تتسم السمات إلى الاستخدام عندما يتيح تطبيقك عدة اتجاهات نصية

سمة متوافقة مع LTR فقط سمة متوافقة مع LTR وRTL
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

يوضح الجدول 2 كيفية تعامل النظام مع سمات محاذاة واجهة المستخدم بناءً على إصدار حزمة تطوير البرامج (SDK) المستهدَف، سواء كان السمتَين left وright وما إذا كانت السمتين start وend محددة.

الجدول 2. الاستناد إلى سلوك محاذاة عناصر واجهة المستخدم في إصدار حزمة تطوير البرامج (SDK) المستهدَف والسمات المحدَّدة

استهداف الإصدار 4.2 من نظام التشغيل Android
(المستوى 17 من واجهة برمجة التطبيقات) أو أعلى؟
هل تم تحديد المسار الأيمن والأيسر؟ هل تم تحديد البداية والنهاية؟ النتيجة
نعم نعم نعم يتم استخدام start وend، ويتم إلغاء left وright
نعم نعم لا يتم استخدام left وright.
نعم لا نعم يتم استخدام start وend.
لا نعم نعم يتم استخدام left وright (start يتم تجاهل end)
لا نعم لا يتم استخدام left وright.
لا لا نعم يتم تحويل start وend إلى left و right

إضافة مراجع متعلّقة بالتوجيهات واللغات

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

في Android 4.2 (المستوى 17 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام واجهة برمجة التطبيقات -ldrtl. (layout-direction-right-to-left) و-ldltr مؤهلات الموارد (layout-direction-left-to-right). للرجوع إلى الخلف التوافق مع الموارد الحالية، تستخدم إصدارات 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.

ملاحظة: تكون للموارد الخاصة بلغات معيّنة الأولوية على موارد خاصة بتوجيه التنسيق، والتي لها الأولوية على الموارد التلقائية الموارد.

استخدام التطبيقات المصغّرة المتوافقة

بدءًا من Android 4.2 (المستوى 17 من واجهة برمجة التطبيقات)، أصبحت معظم عناصر واجهة المستخدم في إطار العمل متوافقة مع التنسيق من اليمين إلى اليسار. اتجاه النص تلقائيًا. ومع ذلك، هناك العديد من عناصر إطار العمل، مثل ViewPager، لا يتيح استخدام النص من اليمين إلى اليسار. اتجاهك.

وتتوافق أدوات الشاشة الرئيسية مع اتجاه النص من اليمين إلى اليسار طالما وتتضمن ملفات البيان المقابلة تعيين السمة android:supportsRtl="true"

توفير الدعم للتطبيقات القديمة

إذا كان تطبيقك يستهدف الإصدار 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. أو أعلى من أجهزة Android أدوات إنشاء حِزم SDK:

الاختبار باستخدام ميزة "خيارات المطوّرين"

بالنسبة إلى الأجهزة التي تعمل بالإصدار 4.4 من نظام التشغيل Android (المستوى 19 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، يمكنك تفعيل فرض اتجاه التنسيق من اليمين إلى اليسار في خيارات المطوّرين على الجهاز فقط هذا الإعداد تتيح لك الاطّلاع على النص الذي يستخدم نصوص LTR، مثل النص الإنجليزي، باللغتَين من اليمين إلى اليسار. الحالي.

تعديل منطق التطبيق

يصف هذا القسم جوانب معيّنة من منطق تطبيقك يتم تحديثه عند تكييف تطبيقك للتعامل مع اتجاهات متعددة للنص.

تغييرات المواقع

لمعالجة تغيير في أي خاصية ذات صلة بـ 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()
في حالة تنفيذ طريقة عرض مخصّصة أو إضافة وظائف متقدمة إلى للرسم، يجب تحديث التعليمات البرمجية لتوافق النصوص البرمجية من اليمين إلى اليسار. يمكنك استخدام الرمز التالي لتحديد ما إذا كان التطبيق المصغر في وضع من اليمين إلى اليسار:

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);
}

قابل للرسم

إذا كان لديك عنصر قابل للرسم تحتاج إلى النسخ المطابق لتخطيط من اليمين إلى اليسار، أكمل استنادًا إلى إصدار Android الذي يعمل على الجهاز، اتّبِع إحدى هذه الخطوات:

  • بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 4.3 (المستوى 18 لواجهة برمجة التطبيقات) والإصدارات الأقدم، لإضافة وتحديد ملفات موارد -ldrtl.
  • في الإصدار 4.4 من نظام التشغيل Android (المستوى 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 في لإخبار النظام بأنه يدعم لغات متعددة. لمزيد من المعلومات، يُرجى مراجعة تعليمات إنشاء مورد والإقرار بذلك في ملف البيان لتطبيقك.

  • واجهات برمجة التطبيقات الإضافية: واجهات برمجة التطبيقات العامة هذه، مثل setApplicationLocales() أو getApplicationLocales() الطرق في LocaleManager، السماح للتطبيقات بضبط لغة مختلفة عن لغة النظام في وقت التشغيل.

    يمكن للتطبيقات التي تستخدم أدوات اختيار اللغة المخصّصة داخل التطبيق استخدام واجهات برمجة التطبيقات هذه لمنح المستخدمين تجربة مستخدم متسقة بغض النظر عن المكان الذي يختارون اللغة فيه والتفضيلات. كما تساعدك واجهات برمجة التطبيقات العامة في تقليل مقدار الرموز النموذجية، فهي تدعم حِزم APK المجزّأة. كما تتيح أيضًا ميزة التحميل التلقائي للتطبيقات لتخزين إعدادات لغة المستخدم على مستوى التطبيق.

    تتوفّر أيضًا واجهات برمجة تطبيقات مكافئة للتوافق مع الأنظمة القديمة مع إصدارات Android السابقة. في AndroidX. ننصح باستخدام Appcompat 1.6.0-beta01 أو أعلى.

    لمزيد من المعلومات، يُرجى الاطّلاع على تعليمات بدء تنفيذ API.

انظر أيضًا

مصادر إضافية

لمزيد من المعلومات حول التوافق مع الأجهزة القديمة، يمكنك الاطّلاع على المراجع التالية:

مشاركات المدونة