Java Language
ローカリゼーションと国際化
サーチ…
備考
Javaには、アプリケーションをローカライズするための強力で柔軟なメカニズムが用意されていますが、ユーザーのロケールを無視したり変更したりするプログラムを悪用してしまうこともあります。
あなたのユーザーは、以前使用していたフォーマットにローカライズされたデータを見ることが予想され、これを手動でサポートしようとするのは愚かな作業です。ここでは、「常に」特定の方法で表示されていると想定されるコンテンツをユーザーが表示することを期待するさまざまな方法の小さな例を示します。
日付 | 数字 | 現地通貨 | 外国通貨 | 距離 | |
---|---|---|---|---|---|
ブラジル | |||||
中国 | |||||
エジプト | |||||
メキシコ | 20/3/16 | 1.234,56 | $ 1,000.50 | 1,000円50米ドル | |
英国 | 20/3/16 | 1,234.56 | £1,000.50 | 100 km | |
米国 | 3/20/16 | 1,234.56 | $ 1,000.50 | 1,000.50 MXN | 60 mi |
一般リソース
- Wikipedia: 国際化とローカリゼーション
Javaリソース
- Javaチュートリアル: 国際化
- Oracle: 国際化:Javaプラットフォームにおけるロケールの理解
- JavaDoc:
Locale
「ロケール」を使用して自動的にフォーマットされた日付
ピンチでSimpleDateFormatter
は素晴らしいですが、名前のように、スケールがうまくいかないことが示唆されています。
アプリケーション全体に"MM/dd/yyyy"
をハードコードすると、国際ユーザーは幸せにならないでしょう。
Javaがあなたのために仕事をするようにしましょう
DateFormat
のstatic
メソッドを使用して、ユーザーの正しい書式を取得します。デスクトップアプリケーション( デフォルトのロケールに依存する)の場合は、次のように呼び出します。
String localizedDate = DateFormat.getDateInstance(style).format(date);
style
は、 DateFormat
指定された書式化定数( FULL
、 LONG
、 MEDIUM
、 SHORT
など)の1 DateFormat
です。
ユーザーがロケールをリクエストの一部として指定するサーバー側アプリケーションの場合、代わりにgetDateInstance()
に明示的に渡す必要があります。
String localizedDate =
DateFormat.getDateInstance(style, request.getLocale()).format(date);
文字列の比較
大文字小文字を区別しない2つの文字列の比較
"School".equalsIgnoreCase("school"); // true
使用しないでください
text1.toLowerCase().equals(text2.toLowerCase());
言語は大文字と小文字を変換するための異なる規則を持っています。 「私」は英語で「私」に変換されます。しかし、トルコでは「私」は「ı」になります。 toLowerCase()
を使用する必要がある場合は、 Locale
: String.toLowerCase(Locale)
を予期するオーバーロードを使用します。
軽い違いを無視して2つの文字列を比較する:
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true
大文字小文字を無視して、自然言語の順序に則った文字列をソートします(照合キーを使用して:
String[] texts = new String[] {"Birne", "äther", "Apfel"};
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.SECONDARY); // ignore case
Arrays.sort(texts, collator::compare); // will return {"Apfel", "äther", "Birne"}
ロケール
java.util.Locale
クラスは、指定されたテキスト、数値、日付または操作をローカライズするための「地理的、政治的または文化的」領域を表すために使用されます。したがって、Localeオブジェクトは、国、地域、言語、さらには言語の変形を含むことができます。例えば、ある国の特定の地域で話されているか、その言語が由来する国とは異なる国で話されます。
Localeインスタンスは、入力の変換、出力の変換、内部操作の必要がある場合など、アクションをローカライズする必要があるコンポーネントに渡されます。 Localeクラスは、それ自体で国際化やローカライズを行うことはできません
言語
言語は、ISO 639の2文字または3文字の言語コード、または最大8文字の登録済み言語サブタグでなければなりません。言語に2文字と3文字の言語コードがある場合は、2文字のコードを使用します。言語コードの完全なリストはIANA Language Subtag Registryにあります。
言語コードは大文字と小文字を区別しませんが、Localeクラスは常に小文字の言語コードを使用します
ロケールの作成
java.util.Locale
インスタンスを作成するには、次の4つの方法があります。
Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method
Java ResourceBundle
次のようなResourceBundleインスタンスを作成します。
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));
私がプロパティファイルi18n.properties
を持っているとします:
message=This is locale
出力:
This is locale
ロケールの設定
他の言語を使用して状態を再現したい場合は、 setDefault()
メソッドを使用できます。その使用法:
setDefault(Locale.JAPANESE); //Set Japanese