Xử lý Đa ngôn ngữ với các country khác nhau

Chào các bạn, sau một tháng làm việc vất vả, hôm nay tôi lại quay trở lại với một chút kiến thức, có thể nó sẽ giúp ích cho bạn đỡ bối rối rất nhiều khi làm việc với đa ngôn ngữ mà gặp phải những loại ngôn ngữ được sử dụng ở nhiều các quốc gia khác nhau. Ví dụ như ngôn ngữ tiếng Trung chẳng hạn. Nó được sử dụng ở Trung quốc và đài loan, trong android thì chúng đều là zh. Vậy làm sao để cho smartphone của chúng ta có thể nhận biết được chúng. Tôi chắc chắn là nó đã làm không ít các lập trình viên của chúng ta bối rối và phải ra tay search đâu. Ít nhất thì tôi cũng đã gặp vài người. kaka. Với những bạn chưa làm việc với đa ngôn ngữ bao giờ hoặc với những bạn đã làm việc với đa ngôn ngữ mà chưa gặp trường hợp này thì nào, let's go. Chúng ta cùng đi qua một ví dụ nho nhỏ để làm rõ làm sao để giải quyết vấn đề trên nhé.

Trước tiên tất nhiên là tôi sẽ tạo một project có tên MultiLanguage. Tên package là gì tùy bạn nhé, ở đây tôi lấy luôn cái package mặc định của tôi là com.example..hehe.

Tạo thêm một class LanguageViewActivity.java. Ở đây tôi làm hơi ngược tý, class này sẽ là class hiển thị text, và sẽ là class được vào đầu tiên khi bật app. Nội dung file như sau:

package com.example.multilanguage;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

public class LanguageViewActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_language);
		SharedPrefControl.updateLangua(getApplicationContext());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void goToChangeLang(View view) {
		Intent intent = new Intent(this, MainActivity.class);
		startActivity(intent);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

}

Trong file này chúng ta chỉ cần chú ý tới dòng code SharedPrefControl.updateLangua(getApplicationContext());

Đây là dòng cập nhật lại ngôn ngữ đã cài đặt. Nội dung file layout của activity này:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.multilanguage.MainActivity"
    tools:ignore="MergeRootFrame" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text_lang" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="goToChangeLang"
        android:text="Button" />

</LinearLayout>

Trong project này tôi có tạo ra thêm 2 thư mục là: values-zh-rCN tương ứng với tiếng trung gốc, và values-zh-rTW tương ứng với tiếng trung sử dụng ở Đài Loan. Vậy cả thư mục values mặc định nữa chúng ta sẽ có 3 file string lần lượt có nội dung như sau:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">MultiLanguage</string>
    <string name="text_lang">Poor students can not have good morals! heaven! I have been sickly nephew from small, home circumstances no conditions should learn in top grades under, so I never get me in good sir sir Mr. ?? I was too me too !! injured</string>
    <string name="action_settings">Settings</string>

</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">MultiLanguage</string>
    <string name="text_lang">可怜的学生不可能有良好的道德!天!我一直从小,家里的情况没有条件应该在最好的成绩在学习体弱多病的侄子,所以我从来没有让我的好先生,先生?先生我太跟风!受伤</string>
    <string name="action_settings">Settings</string>

</resources>

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">MultiLanguage</string>
    <string name="text_lang">可憐的學生不可能有良好的道德!天!我一直從小,家裡的情況沒有條件應該在最好的成績在學習體弱多病的侄子,所以我從來沒有讓我的好先生,先生?先生我太跟風!受傷</string>
    <string name="action_settings">Settings</string>

</resources>

Tiếp theo chúng ta sẽ cần lưu giá trị key language vào và lấy ra để sử dụng đồng thời thưc hiện việc cập nhật ngôn ngữ luôn.:

package com.example.multilanguage;

import java.util.Locale;

import android.content.Context;
import android.content.SharedPreferences;

public class SharedPrefControl {
	// lưu giá trị ngôn ngữ
	public static void savingPreferences(Context context, String key,
			String lang) {
		SharedPreferences pre = context.getSharedPreferences("ViDuLang",
				context.MODE_PRIVATE);
		SharedPreferences.Editor editor = pre.edit();
		editor.putString(key, lang);
		editor.commit();
	}

	// lấy giá trị ngôn ngữ or country
	public static String getPreferences(Context context, String key) {
		SharedPreferences pre = context.getSharedPreferences("ViDuLang", 0);
		String curLang = pre.getString(key, "");
		return curLang;
	}

	public static void updateLangua(Context context) {
		String lang = getPreferences(context, "lang");
		String country = getPreferences(context, "country");
		if(lang == null || lang.equals("")) lang = "en";
		if(country == null) country = "";
		Locale myLocale = null;
		if (country.equals(""))
			myLocale = new Locale(lang);
		else
			myLocale = new Locale(lang, country);
		if (myLocale == null)
			return;
		// Locale.setDefault(myLocale);
		android.content.res.Configuration config = new android.content.res.Configuration();
		config.locale = myLocale;
		context.getResources().updateConfiguration(config,
				context.getResources().getDisplayMetrics());
	}

}

đây là class quan trọng nhất. Điều đặc biệt cần chú ý ở đây là việc chúng ta set country cho locale default. Đây cũng là điểm mấu chốt trng ví dụ lần này. hihi.

Ok, vậy còn gì nhỉ. Giờ chỉ còn tạo cho no một giao diện để thực hiện việc chọn ngôn ngữ và đổi thôi nhỉ 😃 Tôi làm luôn vào file MainActivity.java

package com.example.multilanguage;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void changeLanguage(View view) {
		String lang = "";
		String country = "";
		switch (view.getId()) {
		case R.id.en:
			lang = "en";
			break;
		case R.id.zh_CN:
			lang = "zh";
			country = "CN";
		case R.id.zh_TW:
			lang = "zh";
			country = "TW";
			break;
		}
		SharedPrefControl.savingPreferences(getApplicationContext(), "lang", lang);
		SharedPrefControl.savingPreferences(getApplicationContext(), "country", country);
		SharedPrefControl.updateLangua(getApplicationContext());
		Intent intent = new Intent(this, LanguageViewActivity.class);
		startActivity(intent);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

}

File layout của class này là:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.multilanguage.MainActivity"
    tools:ignore="MergeRootFrame" >

    <Button
        android:id="@+id/en"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="changeLanguage"
        android:text="English" />

    <Button
        android:id="@+id/zh_CN"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="changeLanguage"
        android:text="China" />

    <Button
        android:id="@+id/zh_TW"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="changeLanguage"
        android:text="Taiwan" />

</LinearLayout>

Còn một điều quan trọng không kém nữa là trong file AndroidManifest chúng ta cần thêm android:configChanges="locale" vào nữa.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.multilanguage"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.multilanguage.MainActivity"
            android:configChanges="locale"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.example.multilanguage.LanguageViewActivity"
            android:configChanges="locale"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Ok, vậy là đã xong. Bạn đã có thể chạy thử. Trên đây là một chút chút kinh nghiệm mà mình rút ra được, mong muốn phần nào giúp ích được cho các bạn khi làm việc vơi đa ngôn ngữ. Chúc các bạn thành công với công việc.

Đây là file project của mình, mời các bạn tham khảo nhé: https://drive.google.com/file/d/0B7td9WR1ZtQ0Zzl1eU45SFRxcXM/view?usp=sharing Mật khảu giải nén là : framgia


All Rights Reserved