週末プログラマーのチラシの裏

週末プログラマーが書く、チラシの裏のメモ書き

Androidアプリを国際化する

インターネットの世界は広大です。

開発されたAndroidアプリは、
ネットの力を使うことで全世界の人々が使えるのですから、
自分の作ったアプリを使ってくれる可能性があるユーザーの数は、計り知れません。

とはいえ、日本語のUIでアプリを作ってしまっては、
そのアプリを使えるユーザーは、日本語を使えるユーザーに限定されてしまいます。

Androidアプリを国際化する、なんていう仰々しいタイトルを打っていますが、
要はアプリを多言語対応すればよいのです。
多言語といっても、独語や仏語に対応する必要はなく、
とりあえず英語に対応していれば、(おそらく)何とかなります。
日本ほど、国民が英語にアレルギーを持っている国は、珍しいのではないでしょうか。
(そういう自分も英語苦手ですが…)

多言語対応するには?

Eclipseでプロジェクトを作成した時に勝手にできる、
hello worldをサンプルに話を進めます。

デフォルトの、"Hello world!"は英語として扱い、
これを日本語化することで、二言語対応を実現します。
英語の時は、"Hello world!"、日本語の時は"こんにちは!"と表示されるようにします。

Main Activityで、hello worldを描画しているのは下記の部分です。

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

このファイルは、下記の場所に格納されています。

/res/layout/activity_main.xml

中身をのぞいてみます。
下記のようになっています。

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

ここで表示する文字列の参照先となっているファイルは、下記の場所にあります。

/res/values/strings.xml

このxmlファイルに、"hello world"という文字列が格納されていることが確認できます。

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

    <string name="hello_world">Hello world!</string>

</resources>

では、どのように日本語対応を追加するのでしょうか。

このファイルにある"Hello world!"を"こんにちは!"に書き換えてしまっては、
英語の対応ができません。

Androidでは、OSの言語設定によって、アプリで表示される言語を変える仕組みが用意されています。
OSの言語が日本語なら、アプリで日本語用に用意した文字列が勝手に表示される、という感じです(便利!)

このような状態を作るためには、日本語用のリソースを別に用意し、
OSの言語設定によってどちらを表示させるかを変えればよいのです。

日本語対応を行うには、まず文字列リソースを作成するxmlファイルを作成します。
ここでは、ディレクトリ名が重要です。

/res/values-ja/strings.xml

このように、「values-ja」というディレクトリに、strings.xmlを作成します。

「values-ja」というディレクトリ名は、
日本語対応のルールとして、Androidで定められています
「ja」の部分には、ISO_639-1のコードを指定します。

参考:ISO 639-1コード一覧 - Wikipedia

このファイルに、下記のように記載することで、
OSの言語設定が日本語の場合に、"Hello world!"の部分を、"こんにちは!"と表示してくれるようになります。

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

    <string name="hello_world">こんにちは!</string>

</resources>

つまりこれは、OSの言語設定が日本語の場合、
勝手に"value-ja"のリソースを使ってくれるということになります。

概念としては下記の図のような感じでしょうか。

f:id:epiphaneia:20150506002743p:plain

各言語において、各表示項目の文字列を設定しておくことで、
OSの言語設定によって読出し先を変え、多言語対応を実現しています。
アプリ動作のためのソースコードを変える必要はないので、
非常にわかりやすい仕組みになっていると思います。