上記の回答に加えて、国際化を実装するか、メッセージバンドルからメッセージを取得する必要がある次の場所がある可能性があります。
- ビュー
- コントローラー
- サービス
- フィルター
- ユーティリティ ファイル (例: util パッケージまたは一般化された例外メッセージ処理内)
- Shiro セキュリティ レスト レルムなどの特殊ファイル
以下は、詳細な使用シナリオです。
ビュー:- メッセージ タグで利用可能な taglib があります。ビューでこれを使用します。
controllers :- メッセージ メソッドはデフォルトでここで利用可能で、ロケール変換は自動的に処理されます。ここにリンクの説明を入力してください
service: 次のように、サービス内で taglibs を呼び出すことができます。
def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
または、messageSource Bean を次のように注入します。
def messageSource
4. フィルター / ユーティリティ / 特殊ファイル:- これらについては、以下のようなものを作成して、全体で使用できます。
String i18nMessage(def input,String defaultMessage) {
String[] languageCode = RequestContextHolder.currentRequestAttributes().request.getHeader("Accept-Language").split("-")
Locale locale = languageCode.length == 2 ? new Locale(languageCode[0], languageCode[1]) : new Locale(languageCode[0])
String message = defaultMessage
try {
message = messageSource.getMessage(input.code,input?.args?.toArray(),locale)
}catch (NoSuchMessageException nsme ){
log.info("No such error message--> ${nsme.getMessage()}")
}
return message
}
また、以下の例外が発生した場合:
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
次に、リクエスト リスナーを web.xml に追加する必要がある場合があります。
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
注: web.xml はデフォルトでは使用できないため、テンプレートから生成する必要があります。
これらは、メッセージ バンドルの変換が必要になる最も一般的な場所です。ポイント4の解決策は、ほとんどすべての場合に機能します。ここでロケールが手動で処理されていることに気付いた場合は、オプションで requestHeader または request params からフェッチした後に渡すことができます。
それが役に立てば幸い。