`

国际化、本地化及Spring MVC 的设计

阅读更多

本文不讲述具体使用配置过程。。请先google了解需要配置的三个地方。。

 

一、概述:

 

各个框架对于国际化和本地化的支持方式都类似,从用户使用角度大致分为以下两步:

 

1、准备资源文件,比如:message.xml,message_zh_CN.xml,message_zh_TW.xml,当然properties 文件也是一样了,里面核心的内容是key1=value1,

2、在页面使用宏、标签等展示内容;比如:#springMessage("key");然后通过不同环境加载不同的文件获取不同value,实现本地化;

 

框架要做的事情:

 

1、判断应该使用哪一个资源文件,

2、提供宏,从对应的资源文件中获取对应的value;

 

先说怎么判断使用哪一个资源文件;判断的根本来源是什么?是客户,不同地区的客户使用不同的资源,或者客户主动要求使用哪一种资源(手动切换语言)。接下去客户怎么告诉我?

 

最简单的方式是每一次请求,客户都告诉我需要什么类型的语言,显然这是最简单的方式,也意味这是最不可取的方式;为什么呢?一是繁琐,二是一旦某一次忘了就不知所措了;

 

第二种:第一次来,你告诉我,以后除非你明确改变,我都用第一次的;明确改变以后使用改变后的;这里根据第一次适用的范围不同又分为两种,一是从浏览器打开到关闭作为一个生命周期,下一次打开作为新的第一次;二是第一次进入网站后,后面都算第二次,当然这个“永远”是相对的,比如cookie清理,永远就失效了。

 

第三种,第一次来,你也不用告诉我,我可以根据你的区域默认给你,如果不满意,你在替换;第一次怎么来默认?那就是 httpServletRequest.getLocale()这个方法了,看一下定义:

 

getLocale

Locale getLocale()
Returns the preferred Locale that the client will accept content in, based on the Accept-Language header. If the client request doesn't provide an Accept-Language header, this method returns the default locale for the server.
Returns:
the preferred Locale for the client

 

很明显这个是优先使用HTTP请求中的  Accept-Language这个头信息来设置的,chrome看一下内容如下:

Accept-Language:
zh-CN,zh;q=0.8
 

如果想进一步这个参数的意义,是怎么来的,怎么修改参考下面资源:

http://www.ietf.org/rfc/rfc1766.txt

http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/content-negotiation.html

http://blogs.msdn.com/b/ie/archive/2006/10/17/accept-language-header-for-internet-explorer-7.aspx

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_08tg.asp

 

能区分之后,怎么和文件关联,自然就是文件名了,zh_CN、zh_TW 这样的,为什么是这样的,其他的可不可以,请看下面:

 

二、从Locale类说起:

 

查看代码这个类做了很多事情,核心是依赖sun的BaseLocale类,我们只关注前面一长窜的常量定义:

 

 

 /** Useful constant for language.
     */
    static public final Locale ENGLISH = createConstant("en", "");

    /** Useful constant for language.
     */
    static public final Locale FRENCH = createConstant("fr", "");
    /** Useful constant for language.
     */
    static public final Locale CHINESE = createConstant("zh", "");

    /** Useful constant for language.
     */
    static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");

    /** Useful constant for language.
     */
    static public final Locale TRADITIONAL_CHINESE = createConstant("zh", "TW");

    /** Useful constant for country.
     */
    static public final Locale FRANCE = createConstant("fr", "FR");

    /** Useful constant for country.
     */
    static public final Locale CHINA = SIMPLIFIED_CHINESE;

    /** Useful constant for country.
     */
    static public final Locale PRC = SIMPLIFIED_CHINESE;

    /** Useful constant for country.
     */
    static public final Locale TAIWAN = TRADITIONAL_CHINESE;

 

 看到这里应该明白了,这里定义了主要的常用的语言和国家,而zh,CN,TW 也都能一一对应;

 

纵观上面,一言蔽之,就是在请求来的时候,通过参数也好、httpServletRequest.getLocale()也好获取当次请求的Locale,其后定位文件,获取对应的文案;不同的是Locale的值怎么存放的问题;

 

三、springMVC的实现:

 

先看一下核心类:


由于大部分请求都需要设置locale,很自然想到filter实现,在springmvc中是使用LocaleChangeInterceptor 类来实现的,该类只有一个方法

 

 

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws ServletException {

		String newLocale = request.getParameter(this.paramName);
		if (newLocale != null) {
			LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
			if (localeResolver == null) {
				throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
			}
			LocaleEditor localeEditor = new LocaleEditor();
			localeEditor.setAsText(newLocale);
			localeResolver.setLocale(request, response, (Locale) localeEditor.getValue());
		}
		// Proceed in any case.
		return true;
	}

 

 

逻辑也很简单从request中获取 locale 参数,设置到当前的LocaleResolver中。

 

在springmvc 一种提供四种LocaleResolver,分别是SessionLocaleResolver、CookieLocaleResolver、AcceptHeaderLocaleResolver、 FixedLocaleResolver ,都实现了LocaleResolver接口;

 

 

Locale resolveLocale(HttpServletRequest request);

void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale);

 

提供设置locale、和读取locale的方法,在set方法中根据策略不同设置到不同的位置,比如session,就放到session中,cookie就放到cookie中,但是AcceptHeaderLocaleResolver、FixedLocaleResolver  这两个类的set方法是直接跑出异常“Cannot change fixed locale - use a different locale resolution strategy”,如果使用他们,一定要重写该方法

 

读取的方法逻辑相对复杂一点,比如session策略,会先读取session,没有读取默认值、没有再从request中获取。cookie也类似,而AcceptHeaderLocaleResolver只从request中获取,FixedLocaleResolver 则只获取默认值。可以根据不同的应用场景使用不同的方案;

 

另外LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); 这句可能比较困惑,这里只是获取,那里放进去的呢?在DispatcherServlet 这个类的doService()方法中可以看到 request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver),同样localeResolver是在initLocaleResolver() 方法中设置的,这里如果用户没有配置,会设置默认值;

 

 涉及类图如下:


 

最后再来看页面的使用,以常用的模板语言velocity为例。事实上支持很多,ftl等,先看对应的类

 


以vm为例,在使用时,需要只需要使用spring.vm中提供的宏,以最简单的宏为例

 

#macro( springMessageText $code $text )$springMacroRequestContext.getMessage($code, $text)#end

 

springMacroRequestContext 这个变量在类 AbstractTemplateView 能找到放入content的地方  model.put(SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE, new RequestContext(request, model));也就是说实际上就是RequestContext类,看这个的getMessage方法:

 

 

public String getMessage(String code, Object[] args, String defaultMessage, boolean htmlEscape) {
		String msg = this.webApplicationContext.getMessage(code, args, defaultMessage, this.locale);
		return (htmlEscape ? HtmlUtils.htmlEscape(msg) : msg);
	}

 

可以看到实际上是使用webApplicationContext去获取资源了;而我们在具体使用的时候需要配置messagesource,如:

 

  1. <!-- 资源文件绑定器 -->           
  2. <bean id="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource">                   
  3. <property name="basename" value="message-info" />                 
  4. <property name="useCodeAsDefaultMessage" value="true" />         
  5. </bean>   

其中,message-info是你的properties文件的通用名。如:message-info.properties,message-info_zh_CN.properties等等。

我们知道webApplicationContext是实现了message相关接口的。至于这里面怎么去获取文件的。。待下会分解。。

 

 

本站支持 pay for your wishes

  • 大小: 24.3 KB
  • 大小: 37.8 KB
  • 大小: 50.3 KB
分享到:
评论

相关推荐

    Spring mvc 国际化

    Spring MVC的国际化(Internationalization)指的是将应用根据不同地域、语言习惯以及文化差异进行本地化的过程。这涉及了软件应用对多语言的支持,以便不同区域的用户能够以自己的母语使用软件。Spring MVC提供了...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    除此之外,Spring MVC还支持数据绑定、验证、本地化、主题、异常处理等功能。例如,使用@ModelAttribute注解可以将请求参数绑定到Controller方法的参数上,@Valid用于进行数据验证,Validator接口可以自定义验证逻辑...

    Spring MVC 4.2.3

    10. **国际化和本地化**:通过消息源和LocaleResolver,Spring MVC可以轻松实现应用的多语言支持。 在实际开发中,我们可以通过Maven或Gradle等构建工具将Spring MVC 4.2.3依赖引入项目。同时,使用IDE如IntelliJ ...

    spring mvc 国际化 demo

    在Spring MVC框架中,国际化(i18n)是一个重要的特性,它允许应用程序根据用户的语言和地区提供本地化的信息。这个“spring mvc 国际化 demo”是一个展示如何利用注解实现这一功能的实例。接下来,我们将深入探讨...

    spring MVC .docx

    15. **Internationalization (i18n) and Localization (l10n)**: Spring MVC提供对国际化和本地化的支持,允许根据不同地区展示不同的内容。 总的来说,Spring MVC为开发高效、灵活和可扩展的Web应用程序提供了强大...

    spring mvc 整合包

    12. **MessageSource**:处理国际化和本地化,提供多语言支持。 13. **异常处理**:通过@ControllerAdvice和@ExceptionHandler注解,可以全局处理异常,提供统一的错误页面。 14. **RESTful风格**:Spring MVC支持...

    Spring MVC学习框架

    12. **国际化与本地化**:Spring MVC 提供了支持多语言的功能,可以根据用户的 locale 选择相应的资源文件。 Spring MVC 是一个强大且灵活的框架,它与 Spring 框架的其他模块(如 Spring JDBC、Spring ORM、Spring...

    spring mvc

    14. **Internationalization (i18n) & Localization (l10n)**: Spring MVC 支持多语言和本地化,可以通过消息源(MessageSource)和locale resolver来实现。 15. **Async Support**: Spring MVC 提供异步处理支持,...

    Spring MVC Cookbook(PACKT,2016).pdf

    10. **国际化与本地化**:学习如何根据用户的语言和地区提供不同的内容,包括资源文件的配置和LocaleResolver的使用。 11. **Ajax集成**:与JavaScript库(如jQuery)集成,实现异步请求和更新页面部分内容。 12. ...

    spring mvc配置国际化

    在Spring MVC框架中,实现国际化是一项重要的功能,它允许应用程序为不同的地区和语言提供本地化的显示内容。本实例将向您展示如何轻松配置Spring MVC以支持国际化。首先,我们需要了解几个核心概念: 1. **资源...

    Spring MVCSpring MVC基础.ppt

    9. **国际化与本地化**:Spring MVC支持多语言环境,通过视图解析器和国际化资源文件,可以轻松实现内容的本地化。 10. **测试支持**:Spring MVC提供了MockMVC工具,方便进行单元测试和集成测试,确保应用的正确性...

    spring-mvc-官方中文文档

    15. **国际化和本地化**:Spring MVC 支持 i18n 和 l10n,通过 MessageSource 和 LocaleResolver 实现多语言支持。 通过阅读《Spring MVC 官方中文文档》,开发者可以全面了解并掌握 Spring MVC 的使用,从而更有效...

    spring mvc项目创建

    首先,你需要在本地计算机上安装 Java JDK 和 Apache Maven,这两个是构建 Spring MVC 项目的基础。Java JDK 提供了运行和编译 Java 代码的环境,而 Maven 是一个项目管理工具,用于自动化构建、依赖管理和项目信息...

    jQuery Spring MVC

    **jQuery Spring MVC 整合详解** 在Web开发领域,jQuery 和 Spring MVC 分别是JavaScript库与后端MVC框架的代表。将两者结合使用,可以构建出高效、响应式的前端界面,同时利用Spring MVC的强大功能处理后端业务...

    Spring MVC 实例

    Spring MVC 提供了灵活的处理机制,包括处理器映射、视图解析、数据绑定、本地化和主题支持,以及对 RESTful 风格的 URL 支持,使得开发人员可以轻松地创建功能丰富的、高性能的 Web 应用。 ### 1. MVC 架构模式 ...

    Spring MVC整合Mybatis

    Spring MVC是Spring框架的一部分,它是一个基于模型-视图-控制器(MVC)设计模式的Web应用框架。它负责处理HTTP请求,调用业务逻辑,然后将结果返回给客户端。Spring MVC通过DispatcherServlet作为前端控制器,...

    搭建Spring+Spring MVC+Hibernate开发框架

    此外,它还支持视图解析器、本地化、主题等功能,增强了Web应用的可维护性和国际化能力。 Hibernate是一个流行的Java ORM(对象关系映射)框架,它消除了Java应用程序与数据库之间的低级交互,提供了对象级别的持久...

    Spring MVC Locale 的使用 中文 英文 等语言 切换

    为了在视图层显示这些本地化信息,我们可以在JSP页面中使用Spring的`fmt`标签库: ```jsp ${pageContext.request.locale}" /&gt; ``` `fmt:setLocale`标签用于设置当前页面的`Locale`,`fmt:message`则用于获取并...

Global site tag (gtag.js) - Google Analytics