この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちわ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