是否可以从速度模板中的属性文件中动态读取静态文本?

时间:2010-12-01 09:16:31

标签: spring spring-mvc java-ee velocity

所有的问候 我有一个使用vm模板的java ee应用程序(spring框架) 包含静态文本,如:

<span> hello world </span>

类似于:

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

我想知道是否可以从属性文件(en / fr)中读取文本,具体取决于JSP中的用户区域设置,这样我将为所有区域设置使用一个模板,文本是动态的

注意:力度不是应用程序中使用的视图技术,我只在发送电子邮件时使用它的模板。

4 个答案:

答案 0 :(得分:2)

Spring MVC附带(非常)有用的velocimacros(参见Spring MVC documentation)。其中一个是#springMessageText。

在你的hello.vm文件中:

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

此宏将根据当前区域设置(使用Spring中的内置ResourceBundleMessageSource)读取消息源中的消息。

messages_fr_FR.properties

hi.message=Bonjour

messages_en_GB.propertie

hi.message=Hello

如果没有可用于当前语言环境的包,则默认消息“Hello Default!”使用。

默认情况下,Spring正在读取消息* .properties文件。但是您可以在servlet.xml配置中指定更多消息源(此处为messages * .properties和othermessages * .properties):

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

SpringMVC如何了解当前的区域设置?

嗯,这都是内置的SpringMVC。 ResourceBundleMessageSource根据Locale读取键。 我认为默认情况下配置了LocaleResolver(使用沿客户端请求发送的区域设置),但您可以register your own localeResolver

我们建议您检查所有可用的springmvc velocimacrosvelocity tools(非常有用!)。

答案 1 :(得分:2)

Velocity Tools'ResourceTool类是一个用于访问ResourceBundles和格式化消息的工具。对上一个问题的回答描述了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>

如果资源包中包含

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

您可以在模板中使用以下内容

$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.

使用完全编程配置可能最好显示;这样您就可以每次手动设置区域设置。

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:

greeting=Hello

输出

Hello Jarl

答案 2 :(得分:1)

这是因为您的编码,首先尝试手动更改页面编码(通常在工具中)。

我在这方面有点远,但不是更远.Spring自动将编码设置为iso-8859-1,我将它设置为utf-8,然而,我的希伯来字符串变为gibrish,也摧毁了有机会手动选择正确的编码,因为它们似乎都无法正确解码。

我非常感谢能够解决这个问题。

答案 3 :(得分:0)

我们不能在Web应用程序之外使用宏,就像我的情况一样,所以解决方案是使用messageSource

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()); 

并在vm中:

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

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