(クイックリファレンス)

10 国際化

Authors: Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith ,
Japanese Translation: T.Yamamoto, Japanese Grails Doc Translating Team
このドキュメントの内容はスナップショットバージョンを元に意訳されているため、一部現行バージョンでは未対応の機能もあります。

Version: 2.1.0.BUILD-SNAPSHOT

10 国際化

Grailsの国際化対応(i18n)は、Spring MVC 国際化対応を通して実現しています。 ユーザ指定のロケール別にビューで表示されるテキストをカスタマイズできます。LocaleクラスについてJavadocから以下に引用します:

Locale オブジェクトは、特定の地理的、国家的、または文化的地域を表すためのものです。ある操作で Locale を必要とするタスクがある場合、その操作をロケールに依存する操作といいます。この場合、情報は Locale によりユーザに合わせて調整されます。たとえば、数値を表示するのは、ロケールに依存する操作です。この数値は、ユーザの国や地域、文化の習慣や規則に従ってフォーマットする必要があります。

ロケールは言語コード国コードで構成されます。例えば、"en_US"はアメリカ+英語、"en_GB"は英国+英語です。

10.1 メッセージバンドルを理解する

複数ロケールの表示に対応するには、それぞれの言語ごと複数のメッセージバンドルを用意します。メッセージバンドルはシンプルなJavaのプロパティファイルとしてgrails-app/i18nディレクトリに配置します。

各メッセージバンドルファイル名はmessagesからはじまり、ロケール名称で終わります。Grailsでは幾つかの言語のメッセージバンドルをgrails-app/i18nディレクトリに同梱しています。例として:
  • messages.properties
  • messages_da.properties
  • messages_de.properties
  • messages_es.properties
  • messages_fr.properties
  • ...

ユーザがロケールを指定していない場合、デフォルトでmessages.propertiesを参照します。 独自のメッセージバンドルを作成するには、末尾がロケールのプロパティファイルを新規に作成します。たとえば、messages_ja_JP.propertiesとすれば日本国+日本語になります。

10.2 ロケールの変更

デフォルトでAccept-Languagヘッダーによりロケールが決まります。リクエストパラメータにlangを指定することでロケールを変更できます。

/book/list?lang=es

この指定でGrailsがユーザのロケールを変更して、後のリクエストでも使用できるようにクッキーに保存します。

10.3 メッセージ読込

ビュー内でのメッセージ読み込み

メッセージを使うもっとも一般的な場所はビューの中です。ビューでメッセージを取得するには単にmessageタグを使います。

<g:message code="my.localized.content" />

以下のようなキーがmessages.properties(妥当なロケール接尾辞が付いている)に有る場合、Grailsがメッセージを取得できます:

my.localized.content=Hola, Me llamo John. Hoy es domingo.

メッセージは引数を含めることも可能です。例として:

<g:message code="my.localized.content" args="${ ['Juan', 'lunes'] }" />

位置パラメータがメッセージに指定されていると動的に設定されます:

my.localized.content=Hola, Me llamo {0}. Hoy es {1}.

コントローラとタグライブラリ内でのメッセージ読み込み

コントローラでメッセージを読み込む場合はタグをメソッドとして実行します:

def show() {
    def msg = message(code: "my.localized.content", args: ['Juan', 'lunes'])
}

タグライブラリでも同じ方法が使用できます。タグライブラリがカスタムネームスペースを使用している場合は必ず接頭辞g.を使用します:

def myTag = { attrs, body ->
    def msg = g.message(code: "my.localized.content", args: ['Juan', 'lunes'])
}

10.4 スカッフォルドとi18n

Grailsのスカッフォルドテンプレートでのコントローラとビューはi18nに完全対応しています。GSPはラベルやボタンなどにmessageタグを使用し、コントローラはflashメッセージを使用して国際化にロケール対応メッセージを使用しています。