آموزش قدم به قدم ساخت نرم افزار چند زبانه (با بهتر است بگوییم چند زبانه کردن نرم افزار)
آموزش قدم به قدم ساخت نرم افزار چند زبانه
بعد اینکه یک نرم افزار چند زبانه منتشر کردم دوستان سوال داشتند چطور میشه نرم افزار چند زبانه ساخت در مطالب سایت هست اما در این مقاله جزئی تر به این موضوع می پردازیم :
1- روش نوشتن استرینگ ریسورس برای زبانهای مختلف
2- روش استفاده از استرینگ ریسورس ها
3- روش تنظیم زبان به زبانی دیگر
4-روش تنظیم ui اختصاصی برای هر زبان
قدم اول ساخت استرینگ ریسورس ها
در پروژه به پوشه ی res سربزنید (: یک پوشه با نام values مشاهده می کنید پوشه ی values را باز کنید و روی strings.xml کلیک کنید تا باز شود از خط اول یکی کپی بگیرید و آن را به شکل زیر تغییر دهید
<string name="ok">ok</string>
در اینجا استرینگ ها را نامگذاری می کنیم کد بالا از عناصر زیر تشکیل شده
<string name="ok">//نام استرینگ
ok //متنی که قرا است با صدا کردن این استرینگ دیده شود
</string>
همه ی کار همین است ! هر چند جمله یا کلمه در نرم افزار دارید این کار را برایش انجام دهید .(به انگلیسی )
وقتی تمام جملات را به شکل بالا نوشتید برای ترجمه به چند زبان دیگر باید از پوشه ی values کپی بگیرید و نام آن را به شکل زیر تغییر بدهید و محتویات فایل strings.xml را به زبان فوق ترجمه کنید مثلا برای فارسی :
<string name="ok"> قبول</string>
برای زبان فارسی values-fa و برای آلمانی values-de و نام پوشه ی سایر زبانها را در ادامه خواهید دید پس تا اینجا باید پوشه هایی با کد زبان مورد نظر داشته باشیم :
کد زبانها و نام پوشه در اندروید تا اندروید 4
Language | Locale | values/strings.xml |
German | de | values-de/strings.xml |
Chinese | zh | values-zh/strings.xml |
Czech | cs | values-cs/strings.xml |
Dutch | nl | values-nl/strings.xml |
French | fr | values-fr/strings.xml |
Italian | it | values-it/strings.xml |
Japanese | ja | values-ja/strings.xml |
Korean | ko | values-ko/strings.xml |
Polish | pl | values-pl/strings.xml |
Russian | ru | values-ru/strings.xml |
Spanish | es | values-es/strings.xml |
Arabic | ar | values-ar/strings.xml |
Bulgarian | bg | values-bg/strings.xml |
Catalan | ca | values-ca/strings.xml |
Croatian | hr | values-hr/strings.xml |
Danish | da | values-da/strings.xml |
Finnish | fi | values-fi/strings.xml |
Greek | el | values-el/strings.xml |
persian | fa | values-fa/strings.xml |
Hindi | hi | values-hi/strings.xml |
Hungarian | hu | values-hu/strings.xml |
Indonesian | in | values-in/strings.xml |
Latvian | lv | values-lv/strings.xml |
Lithuanian | lt | values-lt/strings.xml |
Norwegian | nb | values-nb/strings.xml |
Portuguese | pt | values-pt/strings.xml |
Romanian | ro | values-ro/strings.xml |
Serbian | sr | values-sr/strings.xml |
Slovak | sk | values-sk/strings.xml |
Slovenian | sl | values-sl/strings.xml |
Swedish | sv | values-sv/strings.xml |
Tagalog | tl | values-tl/strings.xml |
Thai | th | values-th/strings.xml |
Turkish | tr | values-tr/strings.xml |
Ukrainian | uk | values-uk/strings.xml |
Vietnamese | vi | values-vi/strings.xml |
قدم سوم استفاده از استرینگ ریسورس ها
در XML برای نوشتن کلمه مثلا ok هر گز ننویسید
//اشتباه
<Button
android:background="@drawable/button_matrial"
android:text="ok"/>
بلکه آدرس استرینگی که به ok اشاره می کند را بدهید
//صحیح
<Button
android:background="@drawable/button_matrial"
android:text="@string/ok"/>
و برای ست کردن متن در داخل class ها
هرگز ننویسیم
btnOk.setText("ok");
بلکه بنویسیم :
btnOk.setText(getResources().getString(R.string.ok));
تغییر زبان برنامه بصورت دستی :
وقتی مراحل بالا را طی کردید اندروید موقع اجرای برنامه ی شما روی دستگاه با توجه به زبان فعلی دستگاه ترجمه را بصورت اتوماتیک انتخاب می کند مثلا اگر زبان گوشی انگلیسی باشد زبان برنامه خودکار انگلیسی و اگر فارسی باشد بصورت اتوماتیک فارسی خواهد شد .
اما می توانیم تغییر زبان را دستی نیز انجام بدهیم مثلا در مواقعی که گوشی زبان فارسی ندارد اما استفاده کننده فارسی زبان است .
برای اینکار کافی است متد زیر را در کلاسی که از اپلیکیشن اکستند شده بکار ببریم (کلاس G معروف استاد)
public static void setLocale(String lang) {
Locale myLocale;
myLocale = new Locale(lang);
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
}
و برای صدا زدن :
// در اکتیویتی انتخاب زبان زبان انتخابی کاربر را در پرفیینس ها ذخیره کنید سپس در کلا جی به شکل زیر به آن اشاره کنید
String language =preferences.getString("Mlanguage", systemLanguage);
setLocale(language);
شاد باشید (:
سلام برای فونت هم این چنین قابلیتی وجود داره . همین طور سرعتی و روان که بر اساس زبان فونت رو ست کنه؟
ممنون
چند زبانه بودن نر افزار می توانند در زبانهای راست به چپ و چپ به راست باعث نامناسب بودن چینش ها شود .
برای رفع این مشکل می توان برای زبان های راست به چپ یک ui و برای چپ به راست ui دیگری ساخت تا اندروید بطور خودکار متاسب با زبان برنامه برای کاربر نمایش دهد .
برای این کار برای هر زبان در زیر پوشه res یک فلودر با کد زبان مورد نظر می سازیم و xml را درآن قرار می دهیم.
مثلا برای فارسی
layout-fa
برای عربی
layout-ar
وlayout هم برای مواردی که تعیین نمی کنید .
نکته فایل xml موجود در چوشه ها از نظر نام و id موارد داخلش یکسان است و تنها چینش و رنگ بندی و.... فرق خواهد کرد .
برای تغییر فونت متاسب با زبان می توان بطور زیر شرط گذاشت که اگر زبان فارسی بود از فلان فونت و اگر انگلیسی بود از فلان فونت استفاده کن.البته شاید راه بهتری وجود داشته باشد .
آپدیت
از API Level 17 به بعد (Android 4.2 و بالاتر ) اندروید چینش راست به چپ را بطور خودکار پشتیبانی می کند ، که خیلی خوب است و لازم نمی شود برای زبان های راست به چپ layout های جداگانه ای طراحی کنیم و خودش چینش ها را برعکس می کند ،هر چند اندروید این قابلیت را دارد اما ممکن است بعضی گوشی ها زبان فارسی را نداشته باشند و چینش ها نا منظم باشند پس برای اینکه با به هم ریختگی مواجه نشویم به روش زیر عمل می کنیم
در AndroidManifest.xml در تگ application خط زیر را قرار می دهیم
android:supportsRtl="true"
می شود :
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
سپس کدهای زیر را در activity قرار می دهیم
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void forceRTLIfSupported() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){ getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); } }
و در onCreate() به شکل زیر صداش می کنیم
forceRTLIfSupported()
این قضیه برای زمانی است که زبان برنامه فارسی است اما زبان گوشی فارسی نیست
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .