پشتیبانی از زبان ها و فرهنگ های مختلف

برنامه ها شامل منابعی هستند که می توانند مختص یک فرهنگ خاص باشند. برای مثال، یک برنامه می‌تواند شامل رشته‌های فرهنگ خاص باشد که به زبان محلی فعلی ترجمه می‌شوند.

این یک تمرین خوب است که منابع خاص فرهنگ را از بقیه برنامه خود جدا نگه دارید. Android منابع خاص زبان و فرهنگ را بر اساس تنظیمات محلی سیستم حل می کند. می توانید با استفاده از فهرست منابع در پروژه اندروید خود، از مناطق مختلف پشتیبانی کنید.

می توانید منابع متناسب با فرهنگ افراد با استفاده از برنامه خود را مشخص کنید. شما می توانید هر نوع منبعی را که برای زبان و فرهنگ کاربران شما مناسب است ارائه دهید. برای مثال، اسکرین شات‌های زیر برنامه‌ای را نشان می‌دهند که رشته و منابع قابل ترسیم را در محلی پیش‌فرض en_US دستگاه و زبان اسپانیایی es_ES نمایش می‌دهد.

این برنامه بسته به محل فعلی متن و نماد متفاوتی را نشان می دهد

شکل 1. برنامه با استفاده از منابع مختلف بسته به محل فعلی.

وقتی پروژه ای را با استفاده از ابزار Android SDK ایجاد می کنید، ابزارها یک دایرکتوری res/ را در سطح بالای پروژه ایجاد می کنند. در این دایرکتوری res/ زیر شاخه هایی برای انواع منابع مختلف وجود دارد. همچنین چند فایل پیش فرض وجود دارد، مانند فایل res/values/strings.xml که مقادیر رشته شما را نگه می دارد.

پشتیبانی از زبان های مختلف فراتر از استفاده از منابع محلی خاص است. برخی از کاربران زبانی را انتخاب می‌کنند که از اسکریپت‌های راست به چپ (RTL) مانند عربی یا عبری برای منطقه UI خود استفاده می‌کند. سایر کاربرانی که محلی UI خود را روی زبانی تنظیم می کنند که از اسکریپت های LTR استفاده می کند، مانند انگلیسی، ممکن است محتوا را به زبانی که از اسکریپت های RTL استفاده می کند، مشاهده یا تولید کنند. برای پشتیبانی از هر دو نوع کاربر، برنامه شما باید موارد زیر را انجام دهد:

  • از طرح‌بندی RTL UI برای مناطق RTL استفاده کنید.
  • جهت داده های متنی که در پیام های قالب بندی شده نمایش داده می شود را شناسایی و اعلام کنید. معمولاً، همانطور که در این راهنما توضیح داده شده است، می توانید روشی را فراخوانی کنید که جهت داده های متنی را برای شما تعیین می کند.

دایرکتوری های محلی و فایل های منبع ایجاد کنید

برای افزودن پشتیبانی برای مناطق بیشتر، دایرکتوری های اضافی در داخل 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 locale) در /values-b+es/strings.xml :

<resources>
    <string name="hello_world">¡Hola Mundo!</string>
</resources>

نماد پرچم ایالات متحده (محل محلی پیش فرض) در /mipmap/country_flag.png :

نماد پرچم ایالات متحده

شکل 2. نماد مورد استفاده برای محلی پیش فرض (en_US).

نماد پرچم اسپانیا ( es_ES locale) در /mipmap-b+es+ES/country_flag.png :

نماد پرچم اسپانیا

شکل 3. نماد مورد استفاده برای منطقه es_ES .

توجه: می‌توانید از واجد شرایط پیکربندی، مانند واجد شرایط محلی، در هر نوع منبعی استفاده کنید. به عنوان مثال، ممکن است بخواهید نسخه های بومی سازی شده نقشه های bitmap خود را ارائه دهید. برای اطلاعات بیشتر، به محلی سازی برنامه خود مراجعه کنید.

از منابع موجود در برنامه خود استفاده کنید

منابع موجود در کد منبع و سایر فایل‌های XML را با استفاده از ویژگی name هر منبع ارجاع دهید: R.<resource type>.<resource name> . روش‌های مختلفی وجود دارد که یک منبع را از این طریق می‌پذیرد، همانطور که در مثال‌های زیر نشان داده شده است:

کاتلین

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

جاوا

// 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، همانطور که در مثال زیر نشان داده شده است، می‌توانید هر زمان که ویژگی XML یک مقدار سازگار را پذیرفت، به منبعی با نحو @<resource type>/<resource name> مراجعه کنید:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/country_flag" />

توجه : برای اطمینان از اولویت بندی صحیح تنظیمات زبان کاربر، زبان هایی را که برنامه شما پشتیبانی می کند با استفاده از ویژگی resConfigs مشخص کنید. برای اطلاعات بیشتر، به تعیین زبان هایی که برنامه شما پشتیبانی می کند مراجعه کنید.

قالب بندی متن در پیام ها

یکی از رایج ترین کارهایی که در یک اپلیکیشن وجود دارد، قالب بندی متن است. پیام های محلی شده با درج متن و داده های عددی در موقعیت های مناسب قالب بندی می شوند. متأسفانه، هنگامی که با داده های RTL UI یا RTL سروکار داریم، قالب بندی ساده می تواند خروجی متن نادرست یا حتی ناخوانا را نمایش دهد.

زبان هایی مانند عربی، عبری، فارسی و اردو به صورت RTL نوشته می شوند. با این حال، برخی از عناصر، مانند اعداد و متن LTR تعبیه شده، با LTR در متن RTL نوشته می شوند. زبان هایی که از اسکریپت های LTR استفاده می کنند، از جمله انگلیسی، نیز دو طرفه هستند، زیرا می توانند حاوی اسکریپت های RTL تعبیه شده باشند که باید RTL نمایش داده شوند.

برنامه‌ها اغلب نمونه‌هایی از این نوع متن جاسازی‌شده در جهت مخالف را تولید می‌کنند، مانند درج داده‌های متنی از یک زبان دلخواه و یک جهت متن دلخواه در پیام‌های محلی. این اختلاط جهت‌ها معمولاً نشان‌دهنده واضحی از شروع و پایان متن مخالف جهت ندارد، بنابراین متن ایجاد شده توسط برنامه می‌تواند باعث تجربه کاربری ضعیف شود.

اگرچه مدیریت پیش‌فرض سیستم از متن دوطرفه معمولاً متن را همانطور که انتظار می‌رود نمایش می‌دهد، ممکن است زمانی که برنامه شما آن را در یک پیام محلی قرار می‌دهد، متن به درستی نمایش داده نشود. موارد زیر نمونه‌هایی از موقعیت‌هایی هستند که احتمال دارد متن اشتباه ظاهر شود:

  • متن درج شده در ابتدای پیام:

    PERSON_NAME با شما تماس می گیرد

  • متنی که با یک شماره شروع می شود، مانند آدرس یا شماره تلفن:

    987 654-3210

  • متنی که با علائم نگارشی شروع می شود، مانند شماره تلفن:

    +19876543210

  • متنی که با علامت گذاری به پایان می رسد:

    مطمئنی؟

  • متنی که از قبل شامل هر دو جهت است:

    کلمه בננה عبری به معنای موز است.

مثال

فرض کنید یک برنامه گاهی اوقات نیاز دارد پیام "آیا منظور شما %s بود؟" را با آدرسی که در زمان اجرا به جای %s درج شده است را نمایش دهد. این برنامه از زبان‌های UI مختلف پشتیبانی می‌کند، بنابراین پیام از یک منبع محلی خاص می‌آید و زمانی که دستگاه روی یک منطقه RTL تنظیم شده است، از جهت RTL استفاده می‌کند. به عنوان مثال، برای یک UI عبری، پیام به صورت زیر ظاهر می شود:

האם התכוונת ל %s ؟

با این حال، آدرس پیشنهادی ممکن است از پایگاه داده‌ای بیاید که متنی را در زبان محلی ندارد. به عنوان مثال، اگر آدرس برای مکانی در کالیفرنیا باشد، با استفاده از متن انگلیسی در پایگاه داده ظاهر می شود. اگر آدرس "15 Bay Street, Laurel, CA" را در پیام RTL بدون ارائه هیچ راهنمایی در مورد جهت متن وارد کنید، نتیجه مورد انتظار یا صحیح نیست:

האם התכונת ל 15 Bay Street, Laurel, CA؟

شماره خانه در سمت راست آدرس ظاهر می شود، نه در سمت چپ همانطور که در نظر گرفته شده است. این باعث می شود شماره خانه بیشتر شبیه یک کد پستی عجیب باشد. اگر متن RTL را در پیامی قرار دهید که از جهت متن LTR استفاده می کند، همین مشکل ممکن است رخ دهد.

توضیح و راه حل

مشکل در این مثال به این دلیل رخ می دهد که فرمت کننده متن مشخص نمی کند که "15" بخشی از آدرس است، بنابراین سیستم نمی تواند تعیین کند که آیا "15" بخشی از متن RTL است که قبل از آن می آید یا متن LTR. که بعد از آن می آید

برای حل این مشکل از متد unicodeWrap() از کلاس BidiFormatter استفاده کنید. این روش جهت یک رشته را تشخیص می‌دهد و آن را در نویسه‌های قالب‌بندی یونیکد می‌پیچد که آن جهت را اعلام می‌کنند.

قطعه کد زیر نحوه استفاده از unicodeWrap() نشان می دهد:

کاتلین

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

جاوا

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 (سطح API 18) یا بالاتر را هدف قرار می‌دهد، از نسخه BidiFormatter موجود در Android Framework استفاده کنید. در غیر این صورت، از نسخه BidiFormatter موجود در کتابخانه پشتیبانی استفاده کنید.

اعداد را قالب بندی کنید

برای تبدیل اعداد به رشته در منطق برنامه خود از رشته های قالب ، نه فراخوانی روش استفاده کنید:

کاتلین

var myIntAsString = "$myInt"

جاوا

String myIntAsString = String.format("%d", myInt);

این اعداد را به طور مناسب برای منطقه شما قالب بندی می کند، که ممکن است شامل استفاده از مجموعه اعداد متفاوتی باشد.

هنگامی که از String.format() برای ایجاد یک پرس و جوی SQL در دستگاهی استفاده می‌کنید که از مجموعه‌ای از ارقام خاص خود استفاده می‌کند، مانند زبان فارسی و بیشتر زبان‌های عربی، اگر هر یک از پارامترهای کوئری اعداد باشد، مشکلاتی پیش می‌آید. این به این دلیل است که شماره در ارقام محلی قالب بندی شده است و این ارقام در SQL نامعتبر هستند.

برای حفظ اعداد با فرمت ASCII و معتبر نگه داشتن پرس و جوی SQL، در عوض باید از نسخه بارگذاری شده String.format() استفاده کنید که شامل یک محلی به عنوان اولین پارامتر است. از آرگومان محلی Locale.US استفاده کنید.

پشتیبانی از آینه‌بندی طرح‌بندی

افرادی که از اسکریپت های RTL استفاده می کنند، یک رابط کاربری RTL را ترجیح می دهند که شامل منوهای تراز راست، متن تراز راست و فلش های رو به جلو که به سمت چپ اشاره می کنند.

شکل 4 تضاد بین نسخه LTR یک صفحه نمایش در برنامه تنظیمات و همتای RTL آن را نشان می دهد:

ناحیه اعلان در نزدیکی گوشه سمت راست بالا به سمت راست تراز شده است، دکمه منو در نوار برنامه در نزدیکی گوشه سمت چپ بالا قرار دارد، محتوای قسمت اصلی صفحه به سمت چپ تراز شده است و LTR نشان داده می شود، و دکمه بازگشت نزدیک گوشه پایین سمت چپ است و به سمت چپ اشاره می کند.ناحیه اعلان در نزدیکی گوشه سمت چپ بالا تراز چپ است، دکمه منو در نوار برنامه نزدیک گوشه سمت راست بالا، محتوای قسمت اصلی صفحه به سمت راست تراز شده و RTL ظاهر می شود، و دکمه بازگشت نزدیک گوشه پایین سمت راست است و به سمت راست اشاره می کند
شکل 4. انواع LTR و RTL یک صفحه تنظیمات.

هنگام اضافه کردن پشتیبانی RTL به برنامه خود، نکات زیر را در نظر داشته باشید:

توجه: برای مشاهده دستورالعمل‌های طراحی اضافی مربوط به آینه‌سازی چیدمان، از جمله فهرستی از عناصری که مناسب آینه هستند و نیستند، دستورالعمل‌های طراحی متریال دو جهته را ببینید.

برای انعکاس طرح‌بندی UI در برنامه‌تان به گونه‌ای که RTL در محلی RTL ظاهر شود، مراحل بخش‌های زیر را کامل کنید.

فایل های ساخت و مانیفست را تغییر دهید

فایل build.gradle و فایل مانیفست برنامه ماژول برنامه خود را به صورت زیر تغییر دهید:

build.gradle (Module: app)

شیار

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

کاتلین

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

AndroidManifest.xml

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

توجه: اگر برنامه شما Android 4.1.1 (سطح API 16) یا پایین‌تر را هدف قرار می‌دهد، ویژگی android:supportsRtl به همراه مقادیر ویژگی start و end که در فایل‌های طرح‌بندی برنامه شما ظاهر می‌شود نادیده گرفته می‌شود. در این مورد، انعکاس طرح RTL به طور خودکار در برنامه شما اتفاق نمی افتد.

منابع موجود را به روز کنید

در فایل‌های منبع طرح‌بندی موجود خود، به ترتیب left و right را به start و end تبدیل کنید. این به چارچوب اجازه می دهد تا عناصر رابط کاربری برنامه شما را بر اساس تنظیمات زبان کاربر تراز کند.

توجه: قبل از به‌روزرسانی منابع خود، نحوه پشتیبانی از برنامه‌های قدیمی یا برنامه‌هایی را که Android نسخه 4.1.1 (سطح API 16) و پایین‌تر را هدف قرار می‌دهند، بیاموزید.

برای استفاده از قابلیت‌های تراز RTL چارچوب، ویژگی‌های فایل‌های طرح‌بندی خود را که در جدول 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. رفتار تراز عنصر UI بر اساس نسخه SDK هدف و ویژگی های تعریف شده

هدف قرار دادن اندروید 4.2
(سطح API 17) یا بالاتر؟
چپ و راست تعریف شده؟ شروع و پایان تعریف شده است؟ نتیجه
بله بله بله start و end استفاده می شود که left و right را نادیده می گیرد
بله بله خیر left و right استفاده می شود
بله خیر بله start و end استفاده می شود
خیر بله بله left و right استفاده می شود ( start و end نادیده گرفته می شود)
خیر بله خیر left و right استفاده می شود
خیر خیر بله start و end به left و right حل می شود

منابع خاص جهت و زبان را اضافه کنید

این مرحله شامل افزودن نسخه‌های خاصی از طرح‌بندی، طرح‌بندی‌ها و فایل‌های منبع مقادیر است که حاوی مقادیر سفارشی‌سازی‌شده برای زبان‌ها و جهت‌های متنی مختلف است.

در Android 4.2 (سطح API 17) و بالاتر، می‌توانید از واجد شرایط منبع -ldrtl (طرح-جهت-راست به چپ) و -ldltr (طرح-جهت-چپ به راست) استفاده کنید. برای حفظ سازگاری با منابع موجود، نسخه‌های قدیمی‌تر Android از واجد شرایط زبان یک منبع برای استنباط جهت متن صحیح استفاده می‌کنند.

فرض کنید می خواهید یک فایل طرح بندی خاص برای پشتیبانی از اسکریپت های RTL مانند زبان های عبری، عربی و فارسی اضافه کنید. برای انجام این کار، همانطور که در مثال زیر نشان داده شده است، یک پوشه 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.

توجه: منابع خاص زبان بر منابع اختصاصی layout-direction اولویت دارند که بر منابع پیش فرض اولویت دارند.

از ویجت های پشتیبانی شده استفاده کنید

از Android 4.2 (سطح API 17)، اکثر عناصر UI فریمورک از جهت متن RTL به صورت خودکار پشتیبانی می کنند. با این حال، چندین عنصر چارچوب، مانند ViewPager ، جهت متن RTL را پشتیبانی نمی‌کنند.

ویجت‌های صفحه اصلی از جهت متن RTL پشتیبانی می‌کنند تا زمانی که فایل‌های مانیفست مربوطه آن‌ها شامل انتساب ویژگی android:supportsRtl="true" باشد.

از برنامه های قدیمی پشتیبانی کنید

اگر برنامه شما Android 4.1.1 (سطح API 16) یا پایین‌تر را هدف قرار می‌دهد، علاوه بر start و end ، ویژگی‌های left و right را نیز اضافه کنید.

برای بررسی اینکه آیا طرح شما نیاز به استفاده از جهت متن RTL دارد، از منطق زیر استفاده کنید:

کاتلین

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

جاوا

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 Build Tools استفاده کنید.

با استفاده از گزینه های توسعه دهنده تست کنید

در دستگاه‌های دارای Android 4.4 (سطح API 19) یا بالاتر، می‌توانید جهت طرح‌بندی اجباری RTL را در گزینه‌های برنامه‌نویس روی دستگاه فعال کنید. این تنظیم به شما امکان می دهد متنی را ببینید که از اسکریپت های LTR، مانند متن انگلیسی، در حالت RTL استفاده می کند.

منطق برنامه را به روز کنید

این بخش جنبه های خاصی از منطق برنامه شما را برای به روز رسانی هنگام تطبیق برنامه خود برای مدیریت چندین جهت متن توضیح می دهد.

تغییر ملک

برای مدیریت تغییر در هر ویژگی مرتبط با RTL - مانند جهت طرح، پارامترهای طرح‌بندی، padding، جهت متن، تراز متن، یا موقعیت‌یابی قابل ترسیم - از پاسخ تماس onRtlPropertiesChanged() استفاده کنید. این پاسخ به شما امکان می دهد جهت طرح بندی فعلی را دریافت کرده و بر اساس آن اشیاء View یک فعالیت را به روز کنید.

بازدیدها

اگر در حال ایجاد یک ویجت رابط کاربری هستید که مستقیماً بخشی از سلسله مراتب نمای یک فعالیت نیست، مانند یک گفتگو یا یک عنصر UI مانند نان تست، جهت طرح بندی صحیح را بسته به زمینه تنظیم کنید. قطعه کد زیر نحوه تکمیل این فرآیند را نشان می دهد:

کاتلین

val config: Configuration = context.resources.configuration
view.layoutDirection = config.layoutDirection

جاوا

final Configuration config =
    getContext().getResources().getConfiguration();
view.setLayoutDirection(config.getLayoutDirection());

چندین متد از کلاس View نیاز به بررسی بیشتری دارند:

onMeasure()
اندازه‌گیری‌های نمایش ممکن است بسته به جهت متن متفاوت باشد.
onLayout()
اگر پیاده‌سازی طرح‌بندی خود را ایجاد می‌کنید، باید در نسخه onLayout() super() را فراخوانی کنید و منطق سفارشی خود را برای پشتیبانی از اسکریپت‌های RTL تطبیق دهید.
onDraw()
اگر یک نمای سفارشی را پیاده‌سازی می‌کنید یا قابلیت‌های پیشرفته‌ای را به طراحی اضافه می‌کنید، باید کد خود را برای پشتیبانی از اسکریپت‌های RTL به‌روزرسانی کنید. از کد زیر برای تعیین اینکه آیا ویجت شما در حالت RTL است استفاده کنید:

کاتلین

// 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

جاوا

// 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 (سطح API 18) و پایین‌تر، فایل‌های منبع -ldrtl را اضافه و تعریف کنید.
  • در Android 4.4 (سطح API 19) و بالاتر، هنگام تعریف ترسیم خود android:autoMirrored="true" استفاده کنید، که به سیستم امکان می دهد انعکاس طرح بندی RTL را برای شما انجام دهد.

    توجه: ویژگی android:autoMirrored فقط برای نقشه‌های ساده کار می‌کند که انعکاس دوطرفه آن‌ها صرفاً یک انعکاس گرافیکی کل قابل ترسیم است. اگر ترسیم شما حاوی عناصر متعددی است، یا اگر انعکاس نقشه شما تفسیر آن را تغییر می‌دهد، می‌توانید آینه‌سازی را خودتان انجام دهید. در صورت امکان، با یک متخصص دو جهته مشورت کنید تا مشخص شود که آیا نقشه های آینه ای شما برای کاربران منطقی است یا خیر.

جاذبه

اگر کد طرح‌بندی برنامه شما از Gravity.LEFT یا Gravity.RIGHT استفاده می‌کند، این مقادیر را به ترتیب به Gravity.START و Gravity.END تغییر دهید.

اگر کد Kotlin یا جاوا دارید که به ویژگی‌های Gravity.LEFT یا Gravity.RIGHT بستگی دارد، می‌توانید با تنظیم absoluteGravity برای مطابقت با layoutDirection ، آن را برای کار با این تغییر تطبیق دهید.

به عنوان مثال، اگر از کد زیر استفاده می کنید:

کاتلین

when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

جاوا

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

آن را به شکل زیر تغییر دهید:

کاتلین

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.
    }
}

جاوا

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، از یک نسخه بارگذاری شده Gravity.apply() که شامل آرگومان layoutDirection است استفاده کنید.

حاشیه و بالشتک

برای پشتیبانی از اسکریپت‌های RTL در برنامه‌تان، بهترین روش‌های مربوط به مقادیر حاشیه و بالشتک را دنبال کنید:

  • از getMarginStart() و getMarginEnd() به‌جای معادل‌های مشخصه مخصوص جهت، leftMargin و rightMargin استفاده کنید.
  • وقتی از setMargins() استفاده می کنید، اگر برنامه شما اسکریپت های RTL را شناسایی کرد، مقادیر آرگومان های left و right را عوض کنید.
  • اگر برنامه شما دارای منطق padding سفارشی است، setPadding() و setPaddingRelative() را لغو کنید.

پشتیبانی از تنظیمات زبان هر برنامه

در بسیاری از موارد، کاربران چند زبانه، زبان سیستم خود را روی یک زبان - مانند انگلیسی - تنظیم می‌کنند، اما می‌خواهند زبان‌های دیگری را برای برنامه‌های خاص مانند هلندی، چینی یا هندی انتخاب کنند. برای کمک به برنامه‌ها برای ارائه تجربه بهتر برای این کاربران، Android 13 ویژگی‌های زیر را برای برنامه‌هایی که از چندین زبان پشتیبانی می‌کنند معرفی می‌کند:

  • تنظیمات سیستم : یک مکان متمرکز که در آن کاربران می توانند زبان مورد نظر را برای هر برنامه انتخاب کنند.

    برنامه شما باید ویژگی android:localeConfig در مانیفست خود اعلام کند تا به سیستم بگوید که از چندین زبان پشتیبانی می کند. برای کسب اطلاعات بیشتر، دستورالعمل‌های ایجاد یک فایل منبع و اعلام آن را در فایل مانیفست برنامه خود ببینید.

  • APIهای اضافی : این APIهای عمومی، مانند متدهای setApplicationLocales() و getApplicationLocales() در LocaleManager ، به برنامه ها اجازه می دهند زبانی متفاوت از زبان سیستم را در زمان اجرا تنظیم کنند.

    برنامه‌هایی که از انتخاب‌کننده‌های زبان درون‌برنامه‌ای سفارشی استفاده می‌کنند، می‌توانند از این APIها استفاده کنند تا بدون توجه به جایی که ترجیحات زبان خود را انتخاب می‌کنند، تجربه کاربری ثابتی را به کاربران ارائه دهند. APIهای عمومی همچنین به شما کمک می کنند تا میزان کدهای دیگ بخار را کاهش دهید و از APKهای تقسیم شده پشتیبانی می کنند. آنها همچنین از پشتیبان‌گیری خودکار برای برنامه‌ها برای ذخیره تنظیمات زبان کاربر در سطح برنامه پشتیبانی می‌کنند.

    برای سازگاری با نسخه های قبلی اندروید، API های معادل در AndroidX نیز موجود است. توصیه می کنیم از Appcompat 1.6.0-beta01 یا بالاتر استفاده کنید.

    برای کسب اطلاعات بیشتر، دستورالعمل‌های پیاده‌سازی APIهای جدید را ببینید.

همچنین ببینید

منابع اضافی

برای کسب اطلاعات بیشتر در مورد پشتیبانی از دستگاه های قدیمی، منابع زیر را مشاهده کنید:

پست های وبلاگ