【问题标题】:Internationalization issues国际化问题
【发布时间】:2016-12-26 07:36:26
【问题描述】:

大家好,我正在使用 spring mcv 进行国际化。但我无法执行语言更改。请帮忙。这是我的 servlet.xml

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <!-- <property name="defaultEncoding" value="UTF-8" /> -->
</bean>


<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="language" />
</bean>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
    <property name="interceptors">
       <list>
        <ref bean="localeChangeInterceptor" />
       </list>
    </property>
</bean>

这是我的文件目录结构:

这是语言选择菜单:

<span style="float: right"> 
				<a href="?language=en">en</a> |
				<a href="?language=ge">ge</a> |
				<a href="?language=it">it</a>
			</span>

请帮我解决语言选择问题 为什么它对我不起作用?请提供建议。

新编辑的 Servlet.xml

-->

<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="language" />
</bean>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en" />
</bean>

<bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <ref bean="localeChangeInterceptor" />
    </property>
</bean>

【问题讨论】:

    标签: java spring spring-mvc internationalization


    【解决方案1】:

    几件事,

    请使用ReloadableResourceBundleMessageSource 而不是ResourceBundleMessageSource

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource "> 
       <property name="basename" value="/WEB-INF/messages"></property>
    </bean>
    

    那么你必须将你的资源包文件从当前的 src/main/resources 移动到你的 WEB-INF。

    还可以根据您的要求添加相关捆绑包,例如,

    messages_en、messages_gt、messages_it 在您的 WEB-INF 中。

    编辑:

    我也怀疑你需要关注,

    <bean id="handlerMapping"
            class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
            <property name="interceptors">
                <ref bean="localeChangeInterceptor" />
            </property>
        </bean>
    

    而不是,

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
        <property name="interceptors">
           <list>
            <ref bean="localeChangeInterceptor" />
           </list>
        </property>
    </bean>
    

    这是因为在更改语言时您没有调用任何控制器映射。因此,它不会被拦截器拦截,您的语言也不会改变。

    【讨论】:

    • 给我 - HTTP 状态 500 - 请求处理失败;嵌套异常是错误
    • 如果您在 src/main/resources 中添加属性文件或在 WEB-INF 中添加它没有任何区别。如果我将“it”设为默认值,那么它将与“en”相同。但它现在没有迭代我只想解决这个问题。
    • @DhruvGurjar 您能否更新您的问题并根据建议显示您所做的一切。它应该可以正常工作。
    • 我更改了您对“ReloadableResourceBundleMessageSource”的建议,但如果我将属性移动到 WEB-INF 或者如果它位于 src/java/resource 中,则两者都可以正常工作。但是基于语言参数它不起作用它仍在考虑默认的“en”属性。但不是意大利语或德语。
    • 首先告诉我您是否按照建议迁移到 WEB-INF 并尝试过?你有多少个消息文件?我希望你有 4 个。一个 messages.properties、messages_en.properties 和 2 个。
    【解决方案2】:

    注册SessionLocaleResolver

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
            <property name="defaultLocale" value="en" />
        </bean>
    

    注册“LocaleChangeInterceptor”拦截器,并调用它 到需要支持这些语言的处理程序映射

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="language" />
        </bean>
    
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
            <property name="interceptors">
                <list>
                    <ref bean="localeChangeInterceptor" />
                </list>
            </property>
        </bean>
    

    而且(这就是你所缺少的)

    <!-- Register the messages_.properties -->
        <bean id="messageSource"
                  class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="messages" /><!-- value="messages" as the prefix is messages_.properties -->
        </bean>
    

    此外,它不会神奇地翻译页面上的任何文本,您仍然需要引用 .properties 文件中的文本,因为它们是要翻译的:

    例如:

    messages_en.properties 包含:

    messages.text = My name
    

    messages_ge.properties 包含

    messages.text = Ich heise
    

    然后你在目标页面上输出这个文本

    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
     ...
     ...
      <h3> your message : <spring:message code="messages.text" text="default text" /> </h3>
    

    【讨论】:

    • 感谢您的回答,但它对我不起作用。还有我注册了消息源属性,但是有问题所以它没有显示在代码中。我尝试了很多网站来做到这一点,但仍然无法正常工作,为什么?