我正在研究一个支持多种语言的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-US
,fr-FR
,de-DE
和es-ES
将分别显示这些语言中每种的本地化消息。
网站使用的第二种方法是始终先以默认语言显示内容,然后再允许用户更改区域设置(使用网站标题或页脚中的下拉列表或链接)。在这种情况下,用户可能会选择与其浏览器发送的Accept-Language
标头不一致的语言环境。例如,Accept-Language
标头可能包含fr-CH
,而用户可以选择de-DE
作为区域设置。
在这种情况下,需要LocaleChangeInterceptor
和SessionLocaleResolver
来使用用户选择而不是请求标头。这些组件可以拦截用户的选择,并在会话期间将其临时保存,以正确定位站点内容。
关于spring - Spring Localization无需在查询字符串中传递语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41032674/