Đa ngôn ngữ cho application
Một ứng dụng android tốt và hướng tới nhiều người sử dụng trên thế giới thì phải hỗ trợ nhiều ngôn ngữ khác nhau. Không chỉ là ngôn ngữ về văn bản không thôi mà còn về các tập tin về hình ảnh, âm thanh cũng phải vậy. Nhiều bạn lập trình android đã biết về multi language trong android. Chỉ cần tạo ...
Một ứng dụng android tốt và hướng tới nhiều người sử dụng trên thế giới thì phải hỗ trợ nhiều ngôn ngữ khác nhau. Không chỉ là ngôn ngữ về văn bản không thôi mà còn về các tập tin về hình ảnh, âm thanh cũng phải vậy.
Nhiều bạn lập trình android đã biết về multi language trong android. Chỉ cần tạo ra các thư mục chứa các resource ngôn ngữ khác nhau theo quy tắc, sau đó app sẽ tự động chuyển ngôn ngữ theo máy. Search trên mạng cũng toàn hướng dẫn kiểu này. Nhưng có thể nhiều người chưa biết cách vẫn là các folder resource như trên và có thể change language trực tiếp ngay trong application luôn. Bài này tôi xin chia sẻ về cách mà tôi tìm hiểu được để có thể tạo luôn chức năng change ngôn ngữ trong app.
Trong app của chúng ta sẽ có 2 activity. Một activity(MainActivity.java) tượng trưng cho manf hình home hoặc các màn hình khác của các bạn. Một acticvity(ChangeLanguage.java) tượng trưng cho man hình setting. Bởi vậy mà trong file AndroidManifest.xml chúng ta cần khai báo như sau:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.framgia.multilanguage" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ChangeLanguage" android:label="@string/app_name" > </activity> </application> </manifest>
Việc tiếp theo chúng ta cần tạo ra các folder chứa các string value với các ngôn ngữ khác nhau. Ở đây tôi đã tạo 3 folder tương ứng với 3 loại ngôn ngữ của Việt Nam, Japan, và French.
Trong 3 folder trên tôi sẽ tạo 3 file string.xml lần lượt chứa 3 loại ngôn ngữ tương ứng:
- File string.xml trong folder values-vn:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">MultiLanguage</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="language">vi</string> <string name="content">Tin từ Công ty Viễn thông quốc tế VNPT-I vừa cho biết, vào lúc 5h45 ngày 23/4/2015, tuyến cáp quang biển AAG lại bị đứt song VNPT-I vẫn chưa xác định chính xác điểm đứt, chỉ phát hiện có sự cố sụt nguồn.</string> </resources>
- File string.xml trong folder values-ja:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">MultiLanguage</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="language">ja</string> <string name="content">国際電気通信会社からのニュースVNPTは、私はちょうど、VNPT-壊れが、私は破裂の正確なポイントを決定するには至っていないのAAG海底ケーブルは、唯一検出さ5h45日2015年4月23日に、言った電力損失事件。</string> </resources>
- File string.xml trong folder values-fr:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">MultiLanguage</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="language">french</string> <string name="content">Nouvelles de la Société internationale des télécommunications VNPT-je viens de dire, à 5h45 Jour 23/04/2015, câble sous-marin AAG à VNPT brisé mais je ne ai pas encore de déterminer le point exact de la rupture, seulement détecté incidents de perte de puissance.</string> </resources>
Trong main activity UI(activity_main.xml) của chúng ta sẽ có nhiệm vụ hiển thị nội dung và go tới màn hình setting.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_awidth="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.framgia.multilanguage.MainActivity" > <TextView android:id="@+id/language" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:text="@string/language" /> <TextView android:id="@+id/content" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="38dp" android:text="@string/content" /> <Button android:id="@+id/button1" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/content" android:layout_centerHorizontal="true" android:onClick="goToSetting" android:layout_marginTop="101dp" android:text="Go to Setting" /> </RelativeLayout>
Trong phần setting có các button phục vụ cho việ set tới các ngôn ngữ khác nhau.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_awidth="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.framgia.multilanguage.MainActivity" > <Button android:id="@+id/vi_btn" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:onClick="change" android:text=" Vi " /> <Button android:id="@+id/ja_btn" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/vi_btn" android:layout_alignBottom="@+id/vi_btn" android:layout_marginLeft="30dp" android:layout_toRightOf="@+id/fr_btn" android:onClick="change" android:text=" Ja " /> <Button android:id="@+id/fr_btn" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/vi_btn" android:layout_below="@+id/vi_btn" android:layout_marginTop="24dp" android:onClick="change" android:text=" Fr " /> <Button android:id="@+id/button1" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/fr_btn" android:layout_centerVertical="true" android:layout_marginLeft="38dp" android:onClick="back" android:text="Back" /> </RelativeLayout>
Như vậy là chúng ta đã hoàn thành được 80%. Việc cuối cùng mà chúng ta cần phải làm đó là xử lý thay đổi ngôn ngữ và lưu giá trị ngôn ngữ mà chúng ta thay đổi vào SharedPreferences.
À tý quên béng mất chưa nói tới phần này. Đó là tại đây tôi sẽ tạo ra một file Libs.java chưa các method phục vụ cho việc change ngôn ngữ.
package com.framgia.multilanguage; import java.util.Locale; import android.app.Activity; import android.content.SharedPreferences; public class Libs { /* ------------------------------------- */ private static Locale myLocale; private String lang = ""; // Lưu ngôn ngữ đã cài đặt public static void saveLocale(String lang, Activity activity) { String langPref = "Language"; SharedPreferences prefs = activity.getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString(langPref, lang); editor.commit(); } // Load lại ngôn ngữ đã lưu và thay đổi chúng public static void loadLocale(Activity activity) { String langPref = "Language"; SharedPreferences prefs = activity.getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); String language = prefs.getString(langPref, ""); changeLang(language, activity); } // method phục vụ cho việc thay đổi ngôn ngữ. public static void changeLang(String lang,Activity activity) { if (lang.equalsIgnoreCase("")) return; myLocale = new Locale(lang); saveLocale(lang, activity); Locale.setDefault(myLocale); android.content.res.Configuration config = new android.content.res.Configuration(); config.locale = myLocale; activity.getBaseContext().getResources().updateConfiguration(config, activity.getBaseContext().getResources().getDisplayMetrics()); } }
Ok rồi đấy. Việc còn lại của chúng ta là xử lý load ngôn ngữ trong file MainActivity.java. Ở file này tôi sẽ để load ngôn ngữ và setContentView vào trong onResume vì nếu người dùng vào setting ngôn ngữ xong không nhấn nút back của app mà nhấn nút back của device thì vẫn refesh ngôn ngữ như thường.
package com.framgia.multilanguage; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); /* --------- Change language */ SharedPreferences prefs = getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); String lang = prefs.getString("Language", "vi"); Log.e("DEBUG", lang); Libs.loadLocale(this); /* --------- Change language */ setContentView(R.layout.activity_main); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void goToSetting(View view){ Intent intent = new Intent(MainActivity.this, ChangeLanguage.class); startActivity(intent); } }
Và file ChangeLanguage.java
package com.framgia.multilanguage; import java.util.Locale; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; public class ChangeLanguage extends Activity { String lang = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_language); } public void back(View view) { Intent intent = new Intent(ChangeLanguage.this, MainActivity.class); startActivity(intent); } public void change(View view) { switch (view.getId()) { case R.id.vi_btn: lang = "vi"; break; case R.id.ja_btn: lang = "ja"; break; case R.id.fr_btn: lang = "fr"; break; default: break; } Libs.changeLang(lang, ChangeLanguage.this); Log.e("LANG", lang); } }
Có vẻ như đã khá ổn. Giờ chúng ta chỉ việc build và chạy thôi. Trên đây chỉ là một ví dụ demo mà tôi làm với cái mà tôi mới tự học hỏi được từ internet. Hy vọng sẽ giúp ích cho các bạn trong việc tạo nên các ứng dụng đa ngôn ngữ. Chúc các bạn ứng dụng vào project của mình thành công, chúc ứng dụng của các bạn đem lại sự tiện lợi và thân thiện nhất tới người sử dụng.
Đây là link download file apk demo, chiến đấu đê các bạn. https://drive.google.com/file/d/0B7td9WR1ZtQ0dzFpdXZnYTIxd0k/view?usp=sharing