Ch12. ローカライズ

ロケールクラス

ただの「地域」と「言語」を入れておくための入れ物。標準出力したとき、デフォルトでは環境の言語で表示される。設定した言語で表示される訳ではないので注意する。 標準出力で特定の言語で表示させたい場合は、表示するときのメソッドの引数に指定する。

import java.util.Locale;

public class LocalSample {
    public static void main(String[] args){
        Locale japan = Locale.getDefault();
        System.out.println(japan.getDisplayCountry() + " : " + japan.getDisplayLanguage());//'日本 : 日本語'

        Locale us = new Locale("it", "AU");
        System.out.println(us.getDisplayCountry() + " : " + us.getDisplayLanguage());//'オーストラリア : イタリア語'
        System.out.println(us.getDisplayCountry(us) + " : " + us.getDisplayLanguage(us));//'Australia : italiano'
        System.out.println(us.getCountry() + " : " + us.getLanguage());//'AU : it'

        Locale newLocale = new Locale.Builder().setLanguage("ja").setScript("Jpan").setRegion("AU").build();
        System.out.println(newLocale.getDisplayCountry() + " : " + newLocale.getDisplayLanguage());//'オーストラリア : 日本語'
    }
}

リソースバンドル

設定した言語に応じて表示を変更したい場合、変更したい文字を「リソース」として各言語ごとに分割して格納し設定に合わせて利用するクラスを動的に変更させることが出来る。

バンドルさせたいリソースは各クラスごとに分割する。

import java.util.ListResourceBundle;

public class MyResources extends ListResourceBundle {
    protected Object[][] getContents(){
        Object[][] contents = {
                {"send", "送信"},
                {"cancel", "取消"}
        };
        return contents;
    }
}
import java.util.ListResourceBundle;

public class MyResources_en_US extends ListResourceBundle {
    protected Object[][] getContents(){
        Object[][] contents = {
                {"send", "send now"},
                {"cancel", "delete"}
        };
        return contents;
    }
}
import java.util.Locale;
import java.util.ResourceBundle;

public class LocalSampleBundle {

    public static void main(String[] args){
        Locale japan = Locale.getDefault();
        Locale us = Locale.US;
        Locale[] locArray = {japan, us};
        for(Locale locale:locArray){
            ResourceBundle obj1 = ResourceBundle.getBundle("MyResources",locale); //''
            System.out.println("send : " + obj1.getString("send"));
            System.out.println("delete : " + obj1.getString("cancel"));
        }
    }
}

リソースのStringオブジェクトを利用したい場合はgetStringが利用可能だが、その他の型を利用したい場合getObjectインスタンスを取得し、キャストする必要がある。

import java.util.Locale;
import java.util.ResourceBundle;

public class UserListResource {
    public static void main(String[] args){
        ResourceBundle obj = ResourceBundle.getBundle("MyResource2", Locale.US);
        String var = (String)obj.getObject("send");
        String var2 = (String)obj.getObject("cancel");
        System.out.println(var + var2);//'おくるやめる'

        ResourceBundle obj2 = ResourceBundle.getBundle("MyResource2");
        String var3 = (String)obj2.getObject("send");
        String var4 = (String)obj2.getObject("cancel");
        System.out.println(var3 + var4);//'送信中止'
    }
}

バンドルされるリソースの形式はテキストでも構わない。

(IndexPage.properties)
register = P_登録
search = P_検索
(IndexPage_en_US.properties)
register = P_register
search = P_search
public class MyProperties {
    public static void main(String[] args){
        Locale japan = Locale.getDefault();
        Locale us = new Locale("en", "US");
        Locale[] locArray = {japan, us};

        for(Locale locale: locArray){
            ResourceBundle obj1 = ResourceBundle.getBundle("IndexPage",locale);
            System.out.println(obj1.getString("register")); //'P_登録''P_register'
            System.out.println(obj1.getString("search"));//'P_検索''P_search'
        }
    }
}

フォーマット

NumberFormatクラスを利用してLocaleに応じた数値の表示が可能になる。

import java.text.NumberFormat;
import java.util.Locale;

public class FormatSample {
    public static void main(String[] args){
        NumberFormat jpNum = NumberFormat.getInstance();
        NumberFormat jpCurrency = NumberFormat.getCurrencyInstance();

        System.out.println(jpNum.format(44294021)); //'44,294,021'
        System.out.println(jpCurrency.format(300000));//'¥300,000'

        NumberFormat frCurrency = NumberFormat.getCurrencyInstance(Locale.FRANCE);
        NumberFormat frNum = NumberFormat.getInstance(Locale.FRANCE);
        System.out.println(frNum.format(44294021));//'44 294 021'
        System.out.println(frCurrency.format(300000));//'300 000,00 €'

        Number yen = frCurrency.parse("300 000,00 €");
        System.out.println(yen);//'300000'

    }
}

日付のフォーマット