2010-12-01 6 views
1

速度テンプレートのプロパティファイルから静的テキストを動的に読み取ることは可能ですか?

grezすべての 私は静的なテキストを含むVMテンプレート を使用するJava eeアプリケーション(春のフレームワーク)があります:

<span> hello world </span> 

<span> <fmt:message key="hi.message" /> </span> 

と私はそれがJSPのようにユーザーロケールに応じてプロパティファイル(en/fr)からそのテキストを読み取ることができるので、すべてのロケールに1つのテンプレートを使用し、テキストは動的です

注:速度は私のビュー技術ではありませんアプリで使用されている、私は電子メールのみを送信するテンプレートを使用しています。

答えて

0

だから解決策は私たちになるだろう

model.put("messagesource", this.messagesource); 
// adding this e.g. should do the trick 
model.put("keyHelloCustomer", "the_key_you_use_in_your_properties_file"); 
model.put("noArgs", new Object[]{}); 
model.put("locale", yourOwnPrivateMethodToDetermineWhichLocaleToUse()); 

や電子messageSource VM内:

${messageSource.getMessage($keyHelloCustomer, $noArgs, $locale)} 

参照: http://forum.springsource.org/showthread.php?t=82018

+0

それはいくつかの人で動作しますが、私にとってはいつも例外が発生しています。 ???任意のアイデア –

+0

解決: model.put( "myKey"、 "my.key"); $ {messageSource.getMessage($ myKey、$ noArgs、$ locale)} –

+0

ロケールをfrに変更すると、message_frというプロパティファイルが表示されるという別の問題があります。 ????、 どうしてか分かりません ? –

2

Spring MVCには非常に便利なVelocimacros(Spring MVC documentationを参照)が付属しています。それらの1つは#springMessageTextです。あなたのhello.vmファイルで

<span>#springMessageText("hi.message", "Hello Default!")</span> 

このマクロは(春からビルトインResourceBundleMessageSourceを使用して)現在のロケールに応じて、あなたのメッセージソースからメッセージを読み込みます。

messages_fr_FR.properties

hi.message=Bonjour 

messages_en_GB.propertie

hi.message=Hello 

何のバンドルが現在のロケールで使用できない場合は、デフォルトのメッセージは、 "デフォルトのhello!"使用されている。

デフォルトでは、Springはメッセージ* .propertiesファイルを読み取ります。 SpringMVCが現在のロケールについて知っているどのよう

<bean id="messageSource" 
    class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
     <value>messages</value> 
     <value>othermessages</value> 
     </list> 
    </property> 
</bean> 

:しかし、あなたは(ここでは、メッセージ* .propertiesファイルとothermessages * .propertiesファイル)をごservlet.xml構成で複数のメッセージソースを指定することができますか?

これはすべての内蔵SpringMVCです。 ResourceBundleMessageSourceは、Localeに従ってキーを読み取ります。 LocaleResolverはデフォルトで(クライアント要求に沿って送信されたロケールを使用して)設定されていますが、register your own localeResolverとすることができます。

springmvc velocimacrosvelocity tools(非常に便利です)をすべてチェックすることをお勧めします。

+0

私は本当に混乱しています、そして、私のVMでそれを使用する方法についてもう少し助け、多分サンプルが必要です –

+0

私の答えを修正しました。 –

+0

キーのデフォルト値を設定したくない場合はどうすればいいですか? –

2

Velocity ToolsのResourceToolクラスは、ResourceBundleにアクセスしてメッセージをフォーマットするためのツールです。前の質問に対する答えはhow to set up Velocity Tools

です。ツール設定ファイルで、次の行を追加してResourceToolを有効にします。デフォルトのロケールを指定できますが、通常はロケールがHttpServletRequest.getLocale()から使用されます。

Toolbox configuration example: 
<tools> 
    <toolbox scope="request"> 
    <tool class="org.apache.velocity.tools.generic.ResourceTool" 
       bundles="myresources" 
       locale="en_US"/> 
    </toolbox> 
</tools> 

あなたのリソースバンドルを使用すると、多分これが最善の完全にプログラム的な構成を使用して示されている

$text.bar     -> The args are {0} and {1}. 
$text.bar.insert(4)  -> The args are 4 and {1}. 
$text.bar.insert(4,true) -> The args are 4 and true. 

テンプレートに次のように使用することができます

bar=The args are {0} and {1}. 

が含まれている場合は、毎回手動でロケールを設定することができます。

EasyFactoryConfiguration config = new EasyFactoryConfiguration(); 
config.toolbox("request").tool(ResourceTool.class) 
    .property("bundles", "myresources") 
    .property("locale", "en_US"); 

ToolManager manager = new ToolManager(false, false); 
manager.configure(config); 

Context context = manager.createContext(); 
context.put("name", "Jarl"); 

Template template = Velocity.getTemplate("mytemplate.vm"); 

StringWriter writer = new StringWriter(); 
template.merge(context, writer); 
System.out.println(writer.toString()); 

mytemplate.vm:

$text.greeting $name 

myresources_en_US.properties:私たちは、私の場合のように、Webアプリケーションの外にマクロを使用することはできません

greeting=Hello 

出力

Hello Jarl 
+0

あなたは私に上記のコードの詳細を教えてもらえますか?それは私には分かりません。 –

+0

明確にするために答えを編集しました。 – Jarl

+0

com.foo.moreResourcesとは何ですか?プロパティファイル内のキーにアクセスするのは$ text.myKeyですか?ツールボックスはどのプロパティファイルをフランス語または英語から読み込むのかを知る方法はありますか? –

1

これが原因であなたのエンコーディングのため、手動で(通常のツールで)ページのエンコーディングを変更するために最初にしようとしています。

私は少し離れていますが、それほど遠くはありません.Springは自動的にiso-8859-1にエンコーディングを設定します。私はそれをutf-8に設定しました。しかし、私のヘブライ文字列はgibrishに変更され、右のエンコーディングを手で選ぶ機会は、それを正しく解読していないようです。

この問題を解決するには本当に感謝しています。

関連する問題