2

grails からメールを送信しようとしていますが、メール テンプレートは多言語である必要があります。

GSP を文字列としてレンダリングしたり、grails メール プラグインで GSP をレンダリングしたりできることがわかりました。

GSP では、messages.properties から静的メッセージを読み取り、言語ごとに定義し、電子メールが多言語になると想定しています。

今ここに私が直面している問題があります

テンプレートでは、言語は常に en_US に設定されています。以下の API を使用して、テンプレートの文字列を取得しています。送信メッセージを文字列としてデータベースにも保存する必要があるため、メールプラグインを直接使用していません

    def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])

lang パラメータを使用した言語の設定に関するフォーラムの他の投稿も読みましたが、それでも言語は en_US のみに設定されています。

上記のメソッドは、言語を指定してサポートを呼び出しますか? この種の多言語メールを行うために速度テンプレートを使用するオプションはありますか?

4

2 に答える 2

1

リクエスト処理スレッド内からメールを送信する場合 (コントローラー アクションなど)、リクエストから適切なロケールを自動的に取得する必要があります。バックグラウンド スレッドから送信している場合、「現在の要求」コンテキストがないため、使用するロケールがわかりません。

使用する正しい言語を知る別の方法がある場合 (たとえば、各ユーザーの優先言語をデータベースに保存する場合)、LocaleContextHolder

def savedContext = LocaleContextHolder.getLocaleContext()
LocaleContextHolder.setLocale(correctLocaleForThisUser)
try {
  def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])
  // etc. etc.
} finally {
  LocaleContextHolder.setLocaleContext(savedContext)
}

を正確に決定する方法はcorrectLocaleForThisUser、アプリケーションによって異なります。各ユーザーの優先言語をUserドメイン オブジェクトのプロパティとしてデータベースに保存できます。または、コントローラー アクションからexecutorプラグインのrunAsyncようなものを使用している場合は、アクセスできる間にリクエスト ロケールを保存してから再利用できます。非同期タスクで:

// SomeController.groovy
def sendEmail() {
  // get locale from the thread-local request and save it in a local variable
  // that the runAsync closure can see
  Locale localeFromRequest = LocaleContextHolder.getLocale()
  runAsync {
    def savedContext = LocaleContextHolder.getLocaleContext()
    // inject the locale extracted from the request
    LocaleContextHolder.setLocale(localeFromRequest)
    try {
      def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])
      // etc. etc.
    } finally {
      LocaleContextHolder.setLocaleContext(savedContext)
    }        
  }
}
于 2013-09-06T11:43:27.307 に答える
0

正しい翻訳のリストを含むモデルを作成することで、これを回避できますか?

例えば:

def messages = [:]
messages['hello.world'] = messageSource.getMessage(
        "hello.world",
        null,
        new Locale("nb")
)
def template = groovyPageRenderer.render(
        template: '/mail/email',
        model:[messages:messages]
)

そして、ビューで次のように記述します。

<html>
    <head>
       <title>${messages['hello.world']}</title>
    </head>
    <body>
    </body>
</html>
于 2013-09-06T11:27:13.080 に答える