gpt4 book ai didi

spring - 在 JSF 中使用多个资源包

转载 作者:行者123 更新时间:2023-12-02 02:25:21 24 4
gpt4 key购买 nike

我正在尝试从 JSF 页面访问多个资源包。我有两个资源包:

  • general_messages.properties
  • module_message.properties

我想在 JSF 文件中访问这两个资源包。我可以做到这一点的一种方法是为每个 bundle 定义特定属性:

<f:loadBundle basename="com.sample.general_messages" var="general"/>
<f:loadBundle basename="com.sample.module_message" var="module"/>

有没有办法可以使用相同的变量名访问这两个资源包。像这样的东西:

<f:loadBundle basename="com.sample.general_messages, com.sample.module_message" var="general"/>

或者访问多个资源包的任何其他最佳方式?

最佳答案

您使用 Spring 标记了您的问题,因此我建议您使用 Spring MessageSource。 Spring MessageSource 甚至可以分层聚合许多属性文件。与旧的 java ResourceBundle 相比,它为您提供了许多优势。

您可以在 spring-config.xml 中定义 spring MessageSource,如下所示:

<!--
Application messages configuration.
-->
<bean id="messageSource" name="resourceBundle"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
p:fallbackToSystemLocale="false"
p:cacheSeconds="0">
<property name="basenames">
<list>
<value>/messages/Messages</value>
<!-- <value>${application.messages}</value>-->
</list>
</property>
</bean>

您可以像这样定义扩展ResourceBundleClass(需要一些清理和重构):

public class SpringResourceBundle extends ResourceBundle
{

private MessageSource messages;
private FacesContext fc;
private Locale locale = null;

public SpringResourceBundle()
{
fc = FacesContext.getCurrentInstance();
WebApplicationContext webAppCtx = (WebApplicationContext) fc.getExternalContext().getApplicationMap().get(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
messages = (MessageSource) webAppCtx.getBean("messageSource");
}

@Override
public Locale getLocale()
{
Locale loc = fc.getELContext().getLocale();
if (fc.getExternalContext() != null) {
loc = fc.getExternalContext().getRequestLocale();
}
try {
UIViewRoot viewRoot = fc.getViewRoot();
if (viewRoot != null) {
loc = viewRoot.getLocale();
}
if (loc == null) {
loc = fc.getApplication().getDefaultLocale();
}

} catch (Throwable th) {
System.out.println(th.getMessage());
loc = locale;
}
locale = loc;
return loc;
}

@Override
protected Object handleGetObject(String key)
{
try {
return messages.getMessage(key, null, getLocale());
} catch (NoSuchMessageException e) {
return "???" + key + "???";
}
}

@Override
public Enumeration<String> getKeys()
{
return Collections.enumeration(Collections.EMPTY_LIST);
}
}

最后在faces-config.xml中使用上面的类声明您的资源包。像这样的事情:

<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>cs</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>en</supported-locale>
</locale-config>
<message-bundle>your.package.SpringResourceBundle</message-bundle>
</application>

这里是 JSF 中的 Spring MessageSource。希望大家能够理解。

关于spring - 在 JSF 中使用多个资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6786618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com