我正在研究一个支持多种语言的Web应用程序项目。

我正在使用Spring框架。通过在调度程序Servlet中添加以下bean,Spring可以选择支持多种语言。

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

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
                <property name="paramName" value="language" />
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>

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


仅当我在每个URL中传递language参数时,本地化才起作用。

是否可以根据客户端的浏览器语言设置区域设置?

最佳答案

网站以两种方式之一实现本地化。第一种方法涉及通过检查HTTP请求标头(特别是Accept-Language标头)并本地化用户语言环境的站点内容(如果支持)来自动检测用户语言环境。

Spring MVC默认使用这种方法。它使用HttpServletRequest.getLocale方法确定客户端语言环境,然后从消息源加载本地化的消息。请注意,getLocale方法返回单个Locale对象,而客户端传递的Accept-Language标头可以包含多种语言(例如,Accept-Language: en-US, en-GB, en)。在这种情况下,getLocale方法返回第一种匹配语言(在上面的示例中为Locale)的en-US

因此,如果您希望Spring MVC应用程序自动检测客户端语言环境并提供本地化的内容,只需在应用程序上下文中声明一个ResourceBundleMessageSource bean。无需其他配置。

请参见my sample application演示此方法。使用浏览器扩展程序(例如Postman for Chrome)来操纵Accept-Language标头的值。该示例支持英语,法语,德语和西班牙语,因此传递en-USfr-FRde-DEes-ES将分别显示这些语言中每种的本地化消息。



网站使用的第二种方法是始终先以默认语言显示内容,然后再允许用户更改区域设置(使用网站标题或页脚中的下拉列表或链接)。在这种情况下,用户可能会选择与其浏览器发送的Accept-Language标头不一致的语言环境。例如,Accept-Language标头可能包含fr-CH,而用户可以选择de-DE作为区域设置。

在这种情况下,需要LocaleChangeInterceptorSessionLocaleResolver来使用用户选择而不是请求标头。这些组件可以拦截用户的选择,并在会话期间将其临时保存,以正确定位站点内容。

关于spring - Spring Localization无需在查询字符串中传递语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41032674/

10-12 04:58