توی این آموزش ، یه برنامه با همدیگه میسازیم که از چهار زبان مختلف پشتیبانی کنه : اسپانیایی ، فارسی ، فرانسه ای و انگلیسی !
خوب ، اول از همه یه پروژه توی اندروید استودیو میسازیم . حالا ، توی پوشه Values و فایل Strings.xml که نوشته های برنامه اندروید رو توی این فایل می نویسیم ، راست کلیک میکنیم و گزینه Open Translations Editor رو انتخاب میکنیم :
حالا ، توی پنجره باز شده ، از سمت چپ و بالا روی آیکن Add Locale کلیک میکنیم :
حالا میتونیم هر زبانی که خواستیم رو اضافه کنیم ، که همونطور که گفتم ، ۴ تا زبان مورد نیاز رو اضافه میکنیم . هر زبانی که اضافه کنیم ، یه فایل جدید Strings.xml اضافه میشه توی فولدر Vaulues که جلوش کد زبان و اون کشور رو نوشته . وقتی که ۴ زبان مورد نیاز رو اضافه کردیم :
زبان پیشفرض که انگلیسی هست و کد en رو داره . دومین زبانمون با کد es مربوط به زبان اسپانیایی هست ، زبان سوم با کد fa زبان فارسی هست و زبان چهارم با کد fr مربوط به زبان فرانسه هست . حالا ما باید تمام چیزهایی که توی فایل string.xml اصلی هست رو کپی کنیم و توی اون سه تا فایل ( زبان ) پیست کنیم . زبان پیشفرض ما انگلیسی هست با این کدها :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<resources> <string name="app_name">MultipleLanguage</string> <string name="welcome">Welcome</string> <string name="email">Email</string> <string name="password">Password</string> <string name="login">LOGIN</string> <string name="signup">Do not have account?Sign Up</string> <string name="changeLang">CHANGE LANGUAGE</string> </resources> |
ما کدهای بالا رو کپی میکنیم ، و مثلا توی فایل strings.xml مربوط به زبان فارسی ، پیست میکنیم و ترجمه رو انجام میدیم . دقت کنید که فقط متن های داخل عبارات strings ترجمه میشه و اون آی دی های داخلش رو کاری نداریم ( باید واسه هر چهار تا زبان این آی دی ها یکسان باشن ) . فایل strings.xml مربوط به زبان فارسی بعد از تغییرات ( خط اول رو خود اندروید استودیو به صورت پیشفرض اضافه میکنه ، وقتی توی مراحل قبل زبان رو اضافه میکنیم ) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">برنامه چند زبانه اندروید لایف</string> <string name="welcome">خوش آمدید</string> <string name="email">ایمیل</string> <string name="password">رمز عبور</string> <string name="login">ورود</string> <string name="signup">حساب کاربری ندارید ؟ ثبت نام کنید</string> <string name="changeLang">تغییر زبان</string> </resources> |
واسه زبان های اسپانیایی و فرانسه هم عملیات ترجمه رو به همین روش انجام میدیم ( میتونید از گوگل ترنزلیت کمک بگیرید ) .
حالا توی لایوت خودمون ، یه سری تکست ویو و ادیت تکست و Button قرار میدیم و نکته مهم اینه که واسه دادن متن بهشون ، از فایل strings.xml اصلی استفاده میکنیم . لایه گرفیکی ما با این کدها :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context="ir.androidlife.multiplelanguage.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/welcome" android:textSize="30sp" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/email" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/password" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="@string/signup" /> <Button android:id="@+id/changeMyLang" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="@string/changeLang" /> </LinearLayout> |
حالا میایم و توی اکتیویتی اصلی ، یه دایالوگ تعریف میکنیم و اون ۴ تا زبان رو بهش میدیم و میگیم یه آرایه هست با چهار تا عنصر که زمانی که دایالوگ نمایش داده شد ، اگه ۰ انتخاب شد ، منظورمون اولین زبان توی لیست هست که کاربر انتخاب کرده ، اگه ۱ بود دومین زبان و به همین ترتیب …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
private void showChangeLanguageDialog() { //array of languages to display in alert dialog final String[] listItems = {"اسپانیایی", "فارسی", "فرانسه", "انگلیسی"}; AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this); mBuilder.setTitle("انتخاب زبان"); mBuilder.setSingleChoiceItems(listItems, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { if(i == 0) { //Spanish setLocale("es"); recreate(); } else if(i == 1) { //Persian setLocale("fa"); recreate(); } else if(i == 2) { //French setLocale("fr"); recreate(); } else if(i == 3) { //English setLocale("en"); recreate(); } //dismiss alert dialog when language selected dialogInterface.dismiss(); } }); AlertDialog mDialog = mBuilder.create(); //Show alert dialog mDialog.show(); } |
توی کدهای بالا ، اگه دقت کنید ( مثه وقتی که یه دختر از توی خیابون رد میشه و بهش دقت میکنید ! ) ، یه تابع استفاده کردیم به نام setLocale که این تابع ، انگاری کار اصلی که همون تعیین زبان هست رو انجام میده . به عبارت دیگه ، تعیین میکنه که کدوم فایل strings.xml باید لود بشه تا لایه گرافیکی ما ، متن ها رو ازش بخونه . این کدهای تابع setLocale هست :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private void setLocale(String lang) { Locale locale = new Locale(lang); locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); //Save data to shared preferences SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit(); editor.putString("My_Lang", lang); editor.apply(); } |
میخوایم کاری کنیم ، که وقتی کاربر یه زبان رو انتخاب کرد ، و وقتی از برنامه خارج شد ، همون زبان توی برنامه ذخیره بشه ، یعنی وقتی کاربر دوباره به برنامه مراجعه کرد ، همون زبان رو واسش نشون بده و نه زبان پیشفرض ( انگلیسی ) . از SharedPreferences استفاده میکنیم :
1 2 3 4 5 6 7 8 9 |
public void loadLocale() { SharedPreferences prefs = getSharedPreferences("Settings", Activity.MODE_PRIVATE); String language = prefs.getString("My_Lang", ""); setLocale(language); } |
و در آخر ، میخوایم با انتخاب هر زبان ، متنی که توی اکشن بار برنامه هم نشون داده میشه تغییر کنه . ( اگه کد پایین رو اضافه نکنیم ، برنامه بازم اجرا میشه ، منتها واسه هر چهار تا زبان ، فقط متن پیشفرض که انگلیسی باشه رو نشون میده . ) واسه ترجمه متن اکشن بار :
1 2 3 4 5 6 |
android.support.v7.app.ActionBar actionBar = getSupportActionBar(); actionBar.setTitle(getResources().getString(R.string.app_name)); |
بسیار خوب ! وقت آن رسیده است که برنامه رو اجرا کنیم :
واسه دانلود سورس ، میتونید برنامه اندروید لایف رو از کافه بازار نصب کنید و از اونجا سورس رو دانلود کنید