Androidアプリを多言語化(Localization)しよう
こんにちわfukasawaです。今日もAndroidしてますか?
昨日(2011/11/16)、Android4.0(Ice Cream Sandwich)のソースコードが公開されました。Honeycombでは公開されなかったので、もう公開されないのかと心配してました。つまづいた時にソース覗いてみるとヒントになる事がたくさん隠されています。
さて、今回はアプリの多言語化についてです。
- デフォルトはAndroid OSの言語設定で表示する。 OSの設定が日本語の場合はアプリの言語も日本語で表示、それ以外の場合は英語で表示する。
- アプリ内で任意に言語を選択できる。
こんな要件を想定して簡単なサンプルを作ってみます。
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の言語設定とは関係なしに言語が切り替わります。
英語で表示
日本語で表示
おお、切り替わりました。
実際にはメニューから設定画面を呼び出して切り替えるUIが多いかなと思います。 Androidでの多言語化はとっても簡単なので、アプリを作った際は是非対応しましょう。 そして日本から世界中で愛されるアプリを発信していきましょう!
でわでわ
今回のEclipseプロジェクトファイルです。 *このサンプルはAndroid2.2 ~ 4.0で動作確認しています。
参考サイト android developers - localization