2016-08-15 19 views
1

thymeleafspring 4で書かれている既存のアプリケーションをローカライズする必要があります。 静的コンテンツの場合、messages_FR.propertiesおよびmessages_ES.propertiesの作成と従来のSpring i18n戦略がうまく機能します。spring/thymeleaf i18nデータベースコンテンツ

この問題は、動的コンテンツ(データベースレコードに格納されています)に起因します。 コンテンツの以前のバージョンはth:text="${product.title}"で表示されています。今

データベースの内容

は、私は2つの追加の行を持っているテーブル 製品と行 タイトルためので、LANGの接尾辞を持つフィールドを複製してローカライズされています title_EStitle_FR

、今このディスプレイを作成する必要があります、すなわちフランス語のローカルの場合はth:text="${product.title_FR}"などを使用する必要があります。th:text=${@beans.i18n(product.title)}

このようなロジックを実装するために推奨される方法は何ですか?

何か助けていただければ幸いです。

+0

あなたはどういう意味だったのですか?以前のバージョンのコンテンツはth:text = "$ {product.title}"で表示されていましたが、このディスプレイをローカルにする必要があります。それがデータベースにある場合は、どのようなローカリゼーションを話していますか? – sanluck

+0

申し訳ありませんが、あまり正確ではありません。私は投稿を更新しました。はい、**ローカル固有の**データがDBに格納されていて、** i18n **関連のロジックを既存の**ビュー**に実装する方法を尋ねていました。 – Yev

+0

この洗練された決定のために、あなた自身の方言でThymeleafを拡張する必要があると思います。データベースに追加の列 'ローカリゼーション'を作成し、より高いレベルでローカライズを聞く方がよいとします。 – sanluck

答えて

1

あなたはいくつかの可能性があります。

  • あなたi18nのように独自のBeanを使用してth:textを使用します。 LocaleContextHolderを使用して、要求のロケールにアクセスすることができます(名前では完全にはわかりません)。あなたはキーを解決する方法を完全に制御します。
  • データベースに対してキーを解決するMessagesResolverを作成します。次に、i18n:#{...}の標準式を使用します。メッセージレゾリューションが内部キャッシュを使用しているときに、キャッシュエビクションを処理する必要があります。

これはほとんどの場合、いくつかのBean呼び出しをより良い構文でラップするためであるため、独自の方言を書く必要はありません。

おそらく最も簡単な方法は、Beanを使用してそれに応じてテキスト表現を適合させることです。 2番目の方法は、すべてのメッセージをデータベースに対して解決できるという利点があり、実行時にプロパティファイル内の値を簡単に上書きできるという利点があります。

+0

面白いこと、ありがとう。 – Yev