使用spring:message从特定的bundle / messageSource加载i18n消息

时间:2015-07-17 18:21:27

标签: spring spring-mvc

来自Apache Struts,我正在寻找一种方法来指定在使用spring:message标签时从哪个bundle获取消息:

WebConfig.java(messageSources定义)

@Bean
public ResourceBundleMessageSource messageSource() {

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

    String[] baseNames = {
            "resources.messages.layout.LayoutResources",
            "resources.messages.layout.MenuResources",
            "resources.messages.option.AppConfigResources",
            "resources.messages.global.GlobalResources",
            "resources.messages.contact.ContactResources",
            "resources.messages.currentsession.CurrentSessionResources",
            "resources.messages.welcome.WelcomeResources",
            "resources.messages.user.UserResources",
            "resources.messages.role.RoleResources",
            "resources.messages.profile.ProfileResources"
    };

    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
    messageSource.setBasenames(baseNames);

    return messageSource;
}

我在Struts中的习惯

<bean:message bundle="userResources" key="label.firstName" />

我现在在Spring使用的内容

<spring:message code="label.firstName" />

这样可行,但如果出于任何原因在一个巨大的应用程序中,密钥被复制,Spring将默默地从基本名称定义中选择第一个。

要重现我在Struts中所拥有的内容,我执行了以下操作:

自定义JSP标记

<!DOCTYPE html>
<%@ tag pageEncoding="UTF-8" %>

<%@ attribute name="bundle" required="false" type="java.lang.String" rtexprvalue="false" %>
<%@ attribute name="key" required="true" type="java.lang.String" rtexprvalue="true" %>
<%@ attribute name="locale" required="false" type="java.lang.String" rtexprvalue="false" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:choose>
    <c:when test="${empty bundle}">
        <c:set var="bundleToUse" value="resources.messages.global.GlobalResources" />
    </c:when>

    <c:otherwise>
        <c:set var="bundleToUse" value="resources.messages.${bundle}" />
    </c:otherwise>
</c:choose>

<c:choose>
    <c:when test="${empty locale}">
        <c:set var="localeToUse" value="${pageContext.request.locale.language}" />
    </c:when>

    <c:otherwise>
        <c:set var="localeToUse" value="${locale}" />
    </c:otherwise>
</c:choose>

<fmt:setBundle var="bundleObjectToUse" basename="${bundleToUse}" />
<fmt:setLocale value="${localeToUse}" />
<fmt:message key="${key}" bundle="${bundleObjectToUse}" />

典型用法

使用特定的捆绑和区域设置

<t:message bundle="user.UserResources" key="error.userSearch.required" locale="fr">

使用特定的捆绑和默认区域设置

<t:message bundle="option.AppConfigResources" key="label.smtpServerHostname.note">

仅使用密钥,回退到GlobalResources

<t:message key="filterSearch">

我真的想要建立更接近Spring的东西。

谢谢

0 个答案:

没有答案