天天看点

spring 国际化

i18n(其 来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版 物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 在全球化的时代,国际化尤为重要,因为产品的潜在用户可能来自世界的各个角落。通常与i18n相关的还有L10n(“本地化”的简称)

spring 国际化-i18n

SpringMVC简单实现国际化/多语言

Spring MVC之LocaleResolver(解析用户区域)

1 用户请求通过某种标识进行携带(按HTTP请求头部解析区域)(按会话属性解析区域)(按Cookie解析区域),如果用户不存在这些标识,就是用默认的语言标识。

2 然后将Local语言的标识书写在Request请求中,未了方便没有Request的获取信息ThreadLocal localeContextHolder,保存与当前的请求线程相关的信息在ThreadLocal中。

3 然后根据获取Local变量从特定的文件中获取相应的信息。

spring 国际化

工具类-方便处理

配置拦截器拦截处理改变语言的信息

LocaleChangeInterceptor会根据当前的lang参数动态的设置http://localhost:8080/springmvc/hello.action?lang=en_US SpringMVC简单实现国际化/多语言根据这里的代码请求的。

我们在单点登录中包含了当前国际化的标识也可以自己创建拦截器进行相应的定制处理,动态的通过LocaleResolver 动态切换语言的类型。

Spring MVC之LocaleResolver(解析用户区域)这里的描述还是比较的不错的

spring 国际化

FrameworkServlet->processRequest spring处理流程

DispatcherServlet ->buildLocaleContext(从requst中获取到与多语言相关的信息)

CookieLocaleResolver–>resolveLocaleContext(获取多语言实现细节)

CookieLocaleResolver–>parseLocaleCookieIfNecessary从Cookie中查看是否有多语言的标识信息,如果没有看CookieLocaleResolver中是否设置默认的语言信息,如果没有设置就从request.getLocale();中获取当前的多语言信息。

FrameworkServlet(processRequest中调用当前方法)–>initContextHolders 将当前的LocaleContext与当前的请求线程相关联起来,方便后序请求的处理操作,请求结束后在将信息清空。LocaleContextHolder使用ThreadLocal进行处理的,具体看源码。

然后调用DispatcherServlet doService进行处理,处理相关的业务分发逻辑

之前在LocaleChangeInterceptor中修改当前Local信息并将Local写入cookie中去,就是使用了request获取到localeResolver,也就是刚刚上面所看到的信息进行了设置处理。LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);

RequestContextUtils

因此获取Local可以通过两种方式

LocaleContextHolder

多看源码,多学习处理流程,了解实现的细节问题