Androidアプリを多言語化(Localization)しよう

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちわfukasawaです。今日もAndroidしてますか?

昨日(2011/11/16)、Android4.0(Ice Cream Sandwich)のソースコードが公開されました。Honeycombでは公開されなかったので、もう公開されないのかと心配してました。つまづいた時にソース覗いてみるとヒントになる事がたくさん隠されています。

さて、今回はアプリの多言語化についてです。

  1. デフォルトはAndroid OSの言語設定で表示する。
     OSの設定が日本語の場合はアプリの言語も日本語で表示、それ以外の場合は英語で表示する。
  2. アプリ内で任意に言語を選択できる。

こんな要件を想定して簡単なサンプルを作ってみます。

1.言語ファイルの用意

デフォルトでres/valuesフォルダがあらかじめ作成されますが、さらにres/values-jaフォルダを作成し、strings.xmlを作成します。 今回は日本語以外の言語が選択された場合は英語とするので、values/strings.xmlには英語、values-ja/strings.xmlには日本語を設定します。

ファイル構成

res/values/strings.xml

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

    <string name="app_name">Localize</string>
    <string name="hello">Namaste!</string>
    <string name="summary">Displaying the English.</string>
    <string name="language">日本語で表示する</string>

</resources>

res/values-ja/strings.xml

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

    <string name="app_name">Localize</string>
    <string name="hello">こんにちわ!</string>
    <string name="summary">日本語で表示しています。</string>
    <string name="language">Show in English</string>

</resources>

設定→言語と入力→言語 から日本語以外を選択してこのアプリを起動します。

おお、これだけで[a]の要件は満たせました。えらい簡単です。

2.アプリ内で言語を変更する

ポイントはViewを再読み込みしないと言語設定が反映されない点です。
何通りかやり方はあると思いますが、Activity.setContentView()又はLayoutInflater.inflate()を再度呼んでViewを再構築するのが、スマートかと思います。

public class LocalizeActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initialize();
	}

	/**
	 * 初期化します。
	 */
	private void initialize() {
		setContentView(R.layout.main);

		// 言語の切替え
		Button langage = (Button) findViewById(R.id.language);
		langage.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {

				Locale locale = Locale.getDefault(); 			// アプリで使用されているロケール情報を取得
				if (locale.equals(Locale.JAPAN)) {
					locale = Locale.US;
				} else {
					locale = Locale.JAPAN;
				}
				Locale.setDefault(locale); 						// 新しいロケールを設定
				Configuration config = new Configuration();
				config.locale = locale; 						// Resourcesに対するロケールを設定
				Resources resources = getBaseContext().getResources();
				resources.updateConfiguration(config, null); 	// Resourcesに対する新しいロケールを反映

				initialize(); 									// ※ ポイント 初期化し直し再描画させます。
			}
		});
	}
}

今度はボタンを押すとOSの言語設定とは関係なしに言語が切り替わります。

英語で表示

en

日本語で表示

ja

  おお、切り替わりました。

実際にはメニューから設定画面を呼び出して切り替えるUIが多いかなと思います。
Androidでの多言語化はとっても簡単なので、アプリを作った際は是非対応しましょう。
そして日本から世界中で愛されるアプリを発信していきましょう!

でわでわ

今回のEclipseプロジェクトファイルです。
*このサンプルはAndroid2.2 ~ 4.0で動作確認しています。

参考サイト
android developers - localization