§メッセージによる国際化
§アプリケーションでサポートされる言語の指定
アプリケーションの言語は、特定の言語を識別する特殊な形式の文字列である言語タグを使用して指定します。言語タグは、英語の場合は「en」、特定の地域の方言(オーストラリアで使用される英語の場合は「en-AU」)、言語とスクリプト(ラテン文字で書かれたアゼルバイジャン語の場合は「az-Latn」)、またはこれらの組み合わせ(中国で使用される中国語、北京語、簡体字の場合は「zh-cmn-Hans-CN」)を指定できます。
最初に、`conf/application.conf`ファイルでアプリケーションがサポートする言語を指定する必要があります
play.i18n.langs = [ "en", "en-US", "fr" ]
これらの言語タグは、`play.i18n.Lang`インスタンスの作成に使用されます。アプリケーションでサポートされている言語にアクセスするには、`play.i18n.Langs`コンポーネントをクラスに注入できます
import play.i18n.Langs;
import play.i18n.Messages;
import play.i18n.MessagesApi;
import javax.inject.Inject;
import java.util.Collection;
import java.util.Collections;
import java.util.Locale;
public class MyService {
private final Langs langs;
@Inject
public MyService(Langs langs) {
this.langs = langs;
}
}
個々の`play.i18n.Lang`は、`lang.toLocale()`メソッドを使用して`java.util.Locale`オブジェクトに変換できます
java.util.Locale locale = lang.toLocale();
§メッセージの外部化
`conf/messages.xxx`ファイルにメッセージを外部化できます。
デフォルトの`conf/messages`ファイルはすべての言語に一致します。 `conf/messages.fr`や`conf/messages.en-US`など、追加の言語メッセージファイルを指定できます。
メッセージは、注入によって追加できる`MessagesApi`インスタンスを介して利用できます。その後、`play.i18n.Messages`オブジェクトを使用してメッセージを取得できます
class SomeService {
private final play.i18n.MessagesApi messagesApi;
@Inject
SomeService(MessagesApi messagesApi) {
this.messagesApi = messagesApi;
}
public void message() {
Collection<Lang> candidates = Collections.singletonList(new Lang(Locale.US));
Messages messages = messagesApi.preferred(candidates);
String message = messages.at("home.title");
}
}
`preferred(...)`を使用して`Messages`オブジェクトを取得したくない場合は、メッセージの言語を明示的に指定することでメッセージ文字列を直接取得できます
String title = messagesApi.get(Lang.forCode("fr"), "hello");
依存性注入を使用して、`play.i18n.MessagesApi`クラスを注入する必要があります。たとえば、Guiceを使用する場合は、次のようにします
public class MyClass {
private final play.i18n.MessagesApi messagesApi;
@Inject
public MyClass(MessagesApi messagesApi) {
this.messagesApi = messagesApi;
}
}
§コントローラーでの使用
コントローラーにいる場合は、現在の`Http.Request`を介して`Messages`インスタンスを取得できます
public Result index(Http.Request request) {
Messages messages = this.messagesApi.preferred(request);
String hello = messages.at("hello");
return ok(hellotemplate.render(messages));
}
`MessagesApi.preferred(request)`は、次の方法で言語を決定します
- `transientLang()`メソッドをチェックして、`Request`に一時的な言語が設定されているかどうかを確認します。
- リクエストで`PLAY_LANG` cookieを探します。
- リクエストの`Accept-Language`ヘッダーを確認します。
- アプリケーションのデフォルト言語を使用します。
フォーム処理の一部として`Messages`を使用するには、フォーム送信の処理を参照してください。
§テンプレートでの使用
Messagesオブジェクトを取得したら、テンプレートに渡すことができます
@(messages: play.i18n.Messages)
@messages.at("hello")
`messages.at`に相当する短い形式もあり、多くの人が便利だと感じています。
@(messages: play.i18n.Messages)
@messages("hello")
`messages.at(...)`または単に`messages(...)`を使用するローカライズされたテンプレートは、通常どおりに呼び出されます
public Result index(Http.Request request) {
Messages messages = this.messagesApi.preferred(request);
return ok(hellotemplate.render(messages));
}
§言語の変更
現在のリクエストの言語を変更する場合(ただし、将来のリクエストは変更しない場合)は、リクエストの一時的な言語を設定する`Request.withTransientLang(lang)`を使用します。
上記で説明したように、`MessagesApi.preferred(request)`を呼び出すと、リクエストの一時的な言語が考慮されます。これは、テンプレートの言語を変更する場合に便利です。
public Result index(Http.Request request) {
Lang lang = Lang.forCode("en-US");
Messages messages = this.messagesApi.preferred(request.withTransientLang(lang));
return ok(hellotemplate.render(messages));
}
言語を永続的に変更する場合は、`Result`で`withLang`を呼び出すことで変更できます。これにより、将来のリクエスト用に`PLAY_LANG` cookieが設定され、後続のリクエストで`MessagesApi.preferred(request)`を呼び出すときに使用されます(上記を参照)。
public Result index(Http.Request request) {
Lang lang = Lang.forCode("fr");
Messages messages = this.messagesApi.preferred(request.withTransientLang(lang));
return ok(hellotemplate.render(messages)).withLang(lang, messagesApi);
}
§メッセージのフォーマット
メッセージは、`java.text.MessageFormat`ライブラリを使用してフォーマットされます。たとえば、次のようなメッセージを定義した場合
files.summary=The disk {1} contains {0} file(s).
パラメータは次のように指定できます
Messages.get("files.summary", d.files.length, d.name)
§アポストロフに関する注意事項
メッセージは`java.text.MessageFormat`を使用しているため、単一引用符はパラメーター置換をエスケープするためのメタ文字として使用されることに注意してください。
たとえば、次のメッセージが定義されている場合
info.error=You aren''t logged in!
example.formatting=When using MessageFormat, '''{0}''' is replaced with the first parameter.
次の結果が期待されます
String errorMessage = messages.at("info.error");
Boolean areEqual = errorMessage.equals("You aren't logged in!");
String errorMessage = messages.at("example.formatting");
Boolean areEqual =
errorMessage.equals(
"When using MessageFormat, '{0}' is replaced with the first parameter.");
§HTTPリクエストからサポートされている言語を取得する
特定のHTTPリクエストでサポートされている言語を取得できます
public Result index(Http.Request request) {
List<Lang> langs = request.acceptLanguages();
String codes = langs.stream().map(Lang::code).collect(joining(","));
return ok(codes);
}
§明示的なMessagesApiの使用
`MessagesApi`のデフォルトの実装は、Scala APIである`DefaultMessagesApi`インスタンスによってサポートされています。ただし、`DefaultMessagesApi`をインスタンス化し、次のように手動で`MessagesApi`に注入できます
private MessagesApi explicitMessagesApi() {
return new play.i18n.MessagesApi(
new play.api.i18n.DefaultMessagesApi(
Collections.singletonMap(
Lang.defaultLang().code(), Collections.singletonMap("foo", "bar")),
new play.api.i18n.DefaultLangs().asJava()));
}
単体テスト用に`MessagesApi`インスタンスが必要な場合は、`play.test.Helpers.stubMessagesApi()`を使用することもできます。詳細は、アプリケーションのテストを参照してください。
**次へ:**依存性注入
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがありますか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。