前言#

Java对于国际化的定义中,将本地化粒度划分为两个维度:语言和国家(地区)。
例如,
zh_CN
中文-简体中文
zh_TW
中文-繁体中文
en_US
英语-美国
en_GB
英语-英国

同时,Java自带了ResourceBundle类,来读取和生成国际化消息。但基于ClassLoader的特殊性,Strato未使用Java自带的ResourceBundle机制来实现国际化。

国际化消息的配置#

Strato会在加载Bundle时,扫描每个Bundle下的META-INF/i18n/message_*.properties文件,并注册到内存消息表中。例如
#META-INF/i18n/message.properties
#默认的消息
hello.msg=Hello {0}!
#META-INF/i18n/message_zh.properties
#中文消息
hello.msg=您好 {0}!

国际化消息的获取#

定义好消息后,可通过com.strato.i18n.v1_0_0.Messages单实例来获取对应的消息,Messages类包含的主要方法有:
#获得默认语言的消息
String getMessage(String key,Object... args)

#获得指定语言的消息
String getMessage(Locale locale,String key,Object... args)

#获得系统支持的所有语言
Collection<String> getAvailableLocales()

#获得特定语言下注册的所有消息Key
Collection<String> getKeys(Locale locale)

#设置系统全局默认的语言
void setLocale(String localeName)

Web开发支持#

在Web开发中的国家化应用场景,主要包括切换、存储和获取消息3个部分。

切换语言#

Strato MVC自带了LocaleChangeInterceptor,用户可通过访问任意可达的url,并加上locale参数即可,例如:
@Controller
public class Controller{
	
	@RequestMapping("/nothing")
	public void doNothing(HttpServletResponse response){
		response.setStatus(200);
		response.flushBuffer();
	}
}

则可访问:http://localhost:8080/nothing?locale=zh 切换到中文。
实际使用时,采用XmlHttpRequest(ajax)方式预先切换,然后在回调时刷新当前页面,可获得较好的用户体验。

存储语言#

语言切换后,需要在某个应用范围内记住,便于下次获取。Strato定义了接口LocaleResolver来完成此项任务。
平台内置了如下LocaleResolver:
com.strato.mvc.i18n.v1_0_0.resolvers.DefaultResolver
取系统的全局Locale,不存储Locale
com.strato.mvc.i18n.v1_0_0.resolvers.CookieResolver
在Cookie中存储Locale
com.strato.mvc.i18n.v1_0_0.resolvers.SessionResolver
在Session中存储Locale

获取消息#

Strato MVC内置了I18NEnhancer,自动将Messages单利注入到了RequestContext中,在页面(如vm)中只需通过如下方式即可获取消息:
$i18n.getMessage("hello","Jack")

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-5) was last changed on 24-Aug-2017 18:32 by Jarez