با شروع Android 7.0 (سطح API 24)، اندروید پشتیبانی پیشرفتهتری را برای کاربران چند زبانه ارائه میکند و به آنها اجازه میدهد چندین منطقه را در تنظیمات انتخاب کنند. اندروید این قابلیت را با افزایش تعداد زبانهای پشتیبانی شده و تغییر روشی که سیستم منابع را حل میکند، فراهم میکند.
این سند با توضیح استراتژی تفکیک منابع در نسخههای اندروید پایینتر از 7.0 (سطح API 24) شروع میشود. در مرحله بعد، استراتژی بهبود یافته وضوح منابع در اندروید 7.0 را شرح می دهد. در آخر توضیح میدهد که چگونه میتوان از تعداد گستردهای از مناطق برای پشتیبانی از کاربران چندزبانه بیشتر استفاده کرد.
چالش ها در حل منابع زبان
قبل از اندروید 7.0، اندروید همیشه نمیتوانست با موفقیت برنامهها و مناطق سیستم را مطابقت دهد.
به عنوان مثال، فرض کنید که شرایط زیر را دارید:
- زبان پیشفرض برنامه شما
en_US
(انگلیسی ایالات متحده) است و همچنین دارای رشتههای اسپانیایی بومیسازی شده در فایلهای منبعes_ES
است. - یک دستگاه روی
es_MX
تنظیم شده است
وقتی کد جاوا شما به رشتهها اشاره میکند، سیستم رشتهها را از فایل منبع پیشفرض ( en_US
) بارگیری میکند، حتی اگر برنامه دارای منابع اسپانیایی باشد که تحت es_ES
ترجمه شدهاند. این به این دلیل است که وقتی سیستم نمی تواند مطابقت دقیقی را پیدا کند، با حذف کد کشور از محلی به جستجوی منابع ادامه می دهد. در نهایت، اگر مطابقت پیدا نشد، سیستم به حالت پیش فرض باز می گردد که en_US
است.
اگر کاربر زبانی را انتخاب کند که برنامه اصلاً از آن پشتیبانی نمیکند، مانند زبان فرانسوی، سیستم بهطور پیشفرض روی en_US
خواهد بود. به عنوان مثال:
جدول 1. وضوح منبع بدون تطابق دقیق محلی.
تنظیمات کاربر | منابع برنامه | وضوح منابع |
---|---|---|
fr_CH | پیش فرض (en) de_DE es_ES fr_FR it_IT | fr_CH => Fail را امتحان کنید سعی کنید fr => شکست استفاده از پیش فرض (en) |
در این مثال، سیستم رشته های انگلیسی را نمایش می دهد بدون اینکه بداند کاربر می تواند انگلیسی را بفهمد یا خیر. این رفتار امروزه بسیار رایج است.
بهبود در استراتژی حل منابع
Android 7.0 (سطح API 24) وضوح منابع قویتری را به ارمغان میآورد و بهطور خودکار موارد جایگزین بهتری را پیدا میکند. با این حال، برای سرعت بخشیدن به وضوح و بهبود قابلیت نگهداری، باید منابع را به رایج ترین گویش والد ذخیره کنید. برای مثال، اگر قبلاً منابع اسپانیایی را در فهرست values-es-rUS
ذخیره میکردید، آنها را به فهرست values-b+es+419
منتقل کنید که حاوی اسپانیایی آمریکای لاتین است. به طور مشابه، اگر رشتههای منبعی در فهرستی به نام values-en-rGB
دارید، نام دایرکتوری را به values-b+en+001
(انگلیسی بینالمللی) تغییر دهید، زیرا رایجترین والد رشتههای en-GB
en-001
است. مثالهای زیر توضیح میدهند که چرا این شیوهها عملکرد و قابلیت اطمینان وضوح منابع را بهبود میبخشند.
نمونه های تفکیک منابع
با نسخههای Android بالاتر از 7.0، موردی که در جدول 1 توضیح داده شده است به طور متفاوتی حل میشود:
جدول 2. یک استراتژی وضوح بهبود یافته برای زمانی که هیچ تطابق محلی دقیقی وجود ندارد.
تنظیمات کاربر | منابع برنامه | وضوح منابع |
---|---|---|
| پیش فرض (en) de_DE es_ES fr_FR it_IT | fr_CH => Fail را امتحان کنید سعی کنید fr => شکست کودکان fr => fr_FR را امتحان کنید از fr_FR استفاده کنید |
اکنون کاربر به جای انگلیسی، منابع فرانسوی را دریافت می کند. این مثال همچنین نشان می دهد که چرا باید رشته های فرانسوی را در fr
به جای fr_FR
برای اندروید 7.0 یا بالاتر ذخیره کنید. در اینجا مسیر عمل مطابق با نزدیکترین گویش والد است و وضوح را سریعتر و قابل پیش بینی تر می کند.
علاوه بر این منطق وضوح بهبود یافته، اندروید اکنون زبان های کاربر بیشتری را برای انتخاب ارائه می دهد. بیایید مثال بالا را دوباره با ایتالیایی که به عنوان زبان کاربر اضافی مشخص شده است، اما بدون پشتیبانی برنامه برای زبان فرانسوی، امتحان کنیم.
جدول 3. وضوح منبع زمانی که برنامه فقط با دومین تنظیمات محلی ترجیحی کاربر مطابقت دارد.
تنظیمات کاربر | منابع برنامه | وضوح منابع |
---|---|---|
| پیش فرض (en) de_DE es_ES it_IT | fr_CH => شکست را امتحان کنید سعی کنید fr => شکست فرزندان fr => شکست را امتحان کنید امتحان کنید_CH => شکست امتحانش کن => شکست کودکان آن را امتحان کنید => it_IT استفاده از it_IT |
کاربر همچنان زبانی را دریافت میکند که میفهمد، حتی اگر برنامه فرانسوی را پشتیبانی نمیکند.
طراحی برنامه خود برای پشتیبانی از مناطق اضافی
اندروید ابزارهایی را ارائه میکند که بومیسازی محتوای برنامه را آسانتر میکند و کاربران را به زبانهای دلخواهشان درگیر میکند. توصیه میکنیم از تکنیکهای زیر برای پیکربندی برنامه خود استفاده کنید تا بتواند زبانهای مختلف و قراردادهای قالببندی را به روشی مقیاسپذیر در خود جای دهد.
زبان هایی را که برنامه شما پشتیبانی می کند را مشخص کنید
برای اطمینان از اینکه زبان ها به درستی حل می شوند، زبان هایی را که برنامه شما از آن پشتیبانی می کند با استفاده از ویژگی resConfigs
در فایل build.gradle
سطح ماژول مشخص کنید.
نمونه کد زیر نحوه استفاده از resConfigs
برای نشان دادن زبان های پشتیبانی شده نشان می دهد. در این مثال، برنامه از هر دو زبان انگلیسی و اسپانیایی پشتیبانی می کند.
شیار
android { defaultConfig { ... resConfigs "en", "es" } }
کاتلین
android { defaultConfig { ... resConfigs("en", "es") } }
LocaleList API
با شروع Android 7.0 (سطح API 24)، Android API LocaleList.getDefault()
را نشان میدهد که به برنامهها اجازه میدهد مستقیماً لیست زبانهایی را که کاربر مشخص کرده است جستجو کنند. این API به شما امکان میدهد رفتار برنامههای پیچیدهتر و نمایش بهینهتر محتوا را ایجاد کنید. برای مثال، جستجو میتواند نتایج را به چندین زبان بر اساس تنظیمات کاربر نشان دهد. برنامههای مرورگر میتوانند از پیشنهاد ترجمه صفحات به زبانی که کاربر قبلاً میداند اجتناب کنند، و برنامههای صفحهکلید میتوانند بهطور خودکار همه طرحبندیهای مناسب را فعال کنند.
فرمت کننده ها
تا قبل از Android 6.0 (سطح API 23)، Android تنها از یک یا دو منطقه برای بسیاری از زبانهای رایج (en، es، ar، fr، ru) پشتیبانی میکرد. از آنجایی که تنها چند نوع از هر زبان وجود داشت، برنامهها میتوانستند برخی از اعداد و تاریخها را بهعنوان رشتههای کدگذاری شده سخت در فایلهای منبع ذخیره کنند. با این حال، با مجموعه گستردهای از مناطق پشتیبانی شده اندروید، میتواند تفاوتهای قابلتوجهی در قالبهای تاریخ، زمان، واحد پول و اطلاعات مشابه حتی در یک منطقه وجود داشته باشد. کدنویسی سخت قالب های شما می تواند تجربه گیج کننده ای را برای کاربران نهایی ایجاد کند. بنابراین، هنگام توسعه برای اندروید 7.0 یا نسخههای بالاتر، مطمئن شوید که بهجای اعداد کدنویسی سخت و رشتههای تاریخ از قالبکنندهها استفاده کنید.
به عنوان مثال، اندروید 7.0 و بالاتر شامل پشتیبانی از 27 زبان عربی است. این مناطق می توانند بیشتر منابع را به اشتراک بگذارند، اما برخی ارقام ASCII را ترجیح می دهند، در حالی که برخی دیگر ارقام بومی را ترجیح می دهند. به عنوان مثال، هنگامی که می خواهید جمله ای با یک متغیر رقمی مانند "انتخاب یک پین 4 رقمی" ایجاد کنید، از فرمت کننده ها مانند شکل زیر استفاده کنید:
format(locale, "Choose a %d-digit PIN", 4)