リソースの多言語対応


Androidは機器の状態、言語設定に応じて、アプリケーションのリソース(画像、文字列、その他Rawデータ)を自動で選択できます。

英語やドイツ語など各地域にあわせたリソースを用意するだけで、さまざまな地域へ向けたローカライゼーションが可能です。
今回は英語対応を例に、多言語リソースの使い方を解説します。

リソースの種類

リソースは右図のように、いくつかの種類があり、resディレクトリ以下に配置します。

drawableの中には画像、valuesの中には文字列、といった具合です。これらリソースの種類・タイプでプロジェクトのres以下の構成が決まります。
リソースの構成は多言語対応だけでなく、多解像度対応などでも重要な要素となります。

リソースとディレクトリの関係

ディレクトリ リソースの種類
anim/ アニメーション用
color/ 色の定義
drawable/ ビットマップ(.png .9.png .jpg .gif)、図形
layout/ レイアウト(UIの定義)ファイル
menu/ オプションメニューやコンテキストメニュー、サブメニュー用
raw/ バイナリファイル。mp3などInputStream
values/ 文字列(string.xml)などXML形式の標準りソース
xml/ 任意のXMLファイル。Resources.getXML()で利用

多言語対応

リソースの多言語対応は、res/以下のディレクトリ(たとえばres/values)に修飾子を付与するだけで、簡単に作成できます。

日本語と英語(デフォルト)に対応する場合、下記2つのリソースを用意します。

  • values/string.xml
  • values-ja/string.xml

valuesディレクトリに修飾子としてjaを付与します。これで日本語ロケールの場合は、日本語でメッセージが表示されます。
※今回は、国外のユーザーに対して分り易くするためデフォルトを英語(en)としています。

values/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, orientationSensorActivity!</string>
    <string name="app_name">orientationSensorActivity</string>
</resources>

values-ja/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">こんにちは!アクティビティ! </string>
    <string name="app_name">方位センサ アクティビティ</string>
</resources>

プロジェクト内では、文字列リソースをR.string.helloやR.string.app_nameと表現できます。いままでのStringと同じ扱いですね。しかし、多言語対応に当たって、ひとつの疑問が浮かびます。それは2つ以上リソースがある場合は、使い分ける必要があるのか?ということです。
Androidはリソース切り替えを自動的に行い、使い分けを意識しなくてもよい設計になっています。
多言語対応にあたって、基本的には開発者はres/以下に各言語・地域向けのリソースを用意するだけです。

対応言語を増やすには

言語を示す修飾子は、ISO 639-1形式で指定できます。
参考1:http://www.loc.gov/standards/iso639-2/php/code_list.php
参考サイトには、 en / ja 以外の言語コードも詳しく掲載されています。

たとえば、
values-fr を追加した場合、
ロケールがフランス語の場合は一緒に読み込んで更新します

また、更に地域を指定したい場合はUS/FRなどISO 3166-1-alpha-2
参考2:http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
を確認して下さい。現在の修飾子に追加して指定することになります。

書式は 「rUS, rCA」など地域コード(リージョンコード)の先頭に「r」をつけて下さい。

使い分け

言語コードと地域コードを組み合わせることで、より詳細な指定が可能です。
values-fr- :フランス語指定
values-fr-rCA: カナダ圏かつロケールがフランス語

One Comment