4

後でローカライズされるメッセージを永続化する「標準的な」方法を知っているかどうかを尋ねます。これにはメッセージパラメータも含まれることに注意してください。たとえば、リソース バンドルにコード「msg1」と 1 つのパラメーターを含むメッセージがあります。

msg1 = Hello {0}

メッセージをオブジェクトに関連付け、永続化したい。後で、さまざまなクライアントがさまざまな言語設定でオブジェクトを要求します。

obj.setDisplayMsg(msgSource.getMessage("msg1", "World", locale))

私は想像できます:

  1. メッセージ コードとパラメーターを含む最上位オブジェクトとしてメッセージを格納します。私はパフォーマンスを恐れています - 翻訳なしの単純なエラーメッセージの場合、別のテーブルに別のオブジェクトを持つことは、単一の varchar 列よりもはるかに悪いように思えます。
  2. メッセージコードとそのパラメーターを文字列表現でエンコードし、休止状態のカスタムタイプマッピングを使用する
  3. でも、もう(できれば春に)解決してるからやり直さなくていいんじゃない?

ありがとう

更新: 現在、途中でいくつかのことを行っています。メッセージをシリアライズされたメッセージ オブジェクトとして、マップされたテーブル内の単一の列に格納しています。私はまだ完全に満足しています.データベースで直接データを表示することはできません.

4

3 に答える 3

0

i18n メッセージをデータベースに保存する唯一の使用例は、アプリケーションに UI を追加して編集したい場合です。そうでなければ、物事を複雑にすることに意味がなく、代わりにファイルを使用することをお勧めします。

まず第一に、メッセージを解決するたびに基礎となるストレージ (DB またはファイル) に問い合わせるべきではありません。それらはめったに変更されず、非常に頻繁に読み取られるため、キャッシュの優れた使用例です。

次に、メッセージ パラメーターをローカライズする場合は、単純にそれらをストレージに個別のメッセージとして保持し、最初にパラメーターの値を取得してから、実際のメッセージを取得するときにそれを渡します。

ここまでで、メッセージに加えた変更をアプリケーションに表示させるにはどうすればよいか疑問に思っていることでしょう。まあ、ReloadableResourceBundleMessageSourceを使用するだけです。それはあなたのためにもキャッシュします!ただし、ファイルはアプリケーション アーカイブ (JAR、WAR、EAR など) のに置くことを忘れないでください。いずれにせよ、構成をコードから分離して保持することをお勧めします。ええ、もちろんSpringはすでにそれを愛しています!

しかし、何らかの理由で DB を使用してメッセージを保存したい場合は、独自のMessageSourceを実装する必要があります。パラメータを同じテーブルに保存します。また、キャッシュを使用し、DB 内のデータが変更されたときにキャッシュを無効にすることを忘れないでください。

于 2013-10-19T21:03:05.140 に答える
-1

私の知る限り、Spring は i18n メッセージを DB OOTB に保存することをサポートしていません。ただし、DB からそれらをフェッチする独自の ResourceBundle を作成できます。

これを達成する方法については、多くの例があります: http://forum.springsource.org/showthread.php?15223-AbstractMessageSource-using-DB-table-instead-of-props-file

Java web-app 用のデータベース支援 i18n

于 2012-10-05T07:32:44.653 に答える