本地化字符串
By:zozoh<zozohtnt@gmail.com>

基本策略

Top

每个 Mvc 框架都有自己的本地化字符串的解决方案, Nutz.Mvc 的这个是相当简陋的。我只是个人觉得足够用了。下面我把它简单介绍一下:

使用字符串

Top

目录结构, 以maven为例

- src
	- main
		- resources
			- msgs
				- zh_CN
					user.properties
					role.properties
				- en_US
					user.properties
					role.properties

在主模块上声明

Top

比如:

...
@Localization("msgs/") // 注意是文件夹的名字
public class MainModule {
	...

在 JSP 里使用

Top

直接 Scriptlet

...
<h1><%=((Map<String,String>)request.getAttribute("msg")).get("my.msg.key")%></h1>
...

采用 JSTL

...
<h1>${msg['my.msg.key']}</h1>
...

我到底支持哪些语言

Top

请参看 org.nutz.mvc.Mvcs 的 JavaDoc,这里我列几个常用的方法:

Mvcs.getLocalizationKey() 获取当前会话的 Locale 名称
Mvcs.setLocalizationKey(String key) 为当前会话设置 Locale 的名称
Mvcs.getLocalizationKeySet() 获取整个应用可用的 Locale 名称集合

切换本地语言

Top
// 设置一个本地字符串
@At("/lang/change")
@Ok("redirect:/")
public void changeLocal( @Param("lang") String lang){
    Mvcs.setLocalizationKey(lang);
}

设置应用程序的默认语言

Top
...
@Localization(value="mymsg/", defaultLocalizationKey="zh_CN")
public class MainModule {
...

定制自己的本地化字符串方式

Top

你需要自己实现一个 MessageLoader 的接口,然后声明到 '@Localization' 中。比如你的实现类名字为 'MyMessageLoader',那么你应该这么声明:

...
@Localization( type=MyMessageLoader.class,
               value="msg" )
public class MainModule {
...

对于 MessageLoader 接口,就一个方法需要你来实现:

public interface MessageLoader {
    /**
     * 本函数将根据传入的 "refer" 参数,返回一个 Map <br>
     * Map 的键是语言的名称,比如 "en_US", "zh_CN" 等,<br>
     * 你会通过 Mvcs.setLocalizationKey 来直接使用这个键值
     * <p>
     * 与键对应的是一个消息字符串的 Map, 该 Map 的键就是消息键,值就是消息内容
     * 
     * @param refer
     *            参考值。来自 '@Localization.value'
     * @return 多国语言字符串的 Map
     */
    Map<String, Map<String, Object>> load(String refer);
}

你声明在 '@Localization' 中的 "value" 的值,会被传入这个接口,作为 refer 参数的值

让 Ioc 容器管理你的 MessageLoader

Top

通过beanName进行设置:

...
@Localization( type=MessageLoader.class,
               beanName="myMessages", 
               value="msg" )
public class MainModule {
...

提供了 "beanName" 属性,这样,Nutz.Mvc 将从 Ioc 容器中加载名字为 "myMessages" 的对象。当然它的类型实现了 "MessageLoader" 接口