多言語対応¶
リソースの国際化とは、ユーザの環境に合わせた言語の表示ができるような仕組みです。例えば、国際化を対応している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")); } } |