多言語対応

リソースの国際化とは、ユーザの環境に合わせた言語の表示ができるような仕組みです。例えば、国際化を対応しているWebサイトでは、日本のユーザの場合、日本語を表示しますが、アメリカやイギリスの訪問者であれば、英語を表示します。
つまり、国際化されたアプリケーションでは

  • ユーザが優先/指定する言語を表示できるような仕組みを提供します。
  • アプリケーション内に複数言語を表示するために各言語版のリソースを提供します。
  • 言語を簡単に追加できるようにします。

Java言語では、java.util.ResourceBundleというクラスを提供し、上の2)や3)を解決します。
  java.util.ResourceBundleは、プロパティファイルを使用してそのリソースを管理することができます。
  ResourceBundleには、ロケール固有のオブジェクトが含まれています。プログラムで String などのロケール固有のリソースが必要な時は、ユーザーのロケールに合ったResourceBundleからロードできます。

propertiesファイル

properties(プロパティ)ファイルは次のような特徴を持つファイルです。

  • 拡張子は「.properties」のテキストファイル
  • プログラムで使用する各種設定を記述するために用いられる
  • 内容に「キー=値」の形式で記述

propertiesファイルの定義例

propertiesファイルの書き方例:
  user.properties

1
2
3
#ログインページ用  
user.id = ユーザID  
user.email = Eメール  
  • 「キー=値」の形式で記述します。
  • 行頭に「#」の行はコメントと見なします。

このpropertiesファイルの名前の規約:
  普通:カスタム名_言語コード_国別propertiesコード、
  デフォルト:カスタム名. properties
  たとえば:
    myres_en_US.properties
    myres_zh_CN.properties
    myres.properties
  中国語で操作システムの下で、もしmyres_zh_CN.properties、myres.properties 2つのファイルが存在は、myres_zh_CN.propertiesを使用しますが、myres_zh_CN.propertiesが存在しない時には、デフォルトのmyres.properties使用。
  propertiesファイルに日本語などASCII文字以外の文字列を記述する場合には、Unicodeに変換する必要があります。Unicodeへ変換するには、J2SEに付属しているnative2asciiツールを使用します。(D:\Android\JDK\jdk1.6.0_18\bin)
  propertiesファイルをsrcの目録下(こうしなければならない、あるいはあなたを配置のcalsspath下。)

リソースの国際化

以下はリソースの国際化 一般的な手順について説明します。
  myres.properties

1
2
aaa=good
bbb=thanks

myres_en_US.properties

1
2
aaa=good
bbb=thanks

myres_ja_JP.properties

1
2
aaa=\u3088\u3044
bbb=\u3042\u308A\u304C\u3068\u3046
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.util.Locale; 
import java.util.ResourceBundle; 

public class TestResourceBundle { 
        public static void main(String[] args) {
                Locale locale1 = new Locale("zh", "CN");
                ResourceBundle resb1 = ResourceBundle.getBundle("myres", locale1);
                System.out.println(resb1.getString("aaa"));

                ResourceBundle resb2 = ResourceBundle.getBundle("myres", Locale.getDefault());
                System.out.println(resb1.getString("aaa"));

                Locale locale3 = new Locale("en", "US");
                ResourceBundle resb3 = ResourceBundle.getBundle("myres", locale3);
                System.out.println(resb3.getString("aaa"));
        }
}