为了实现国际化,我根据一篇文章写了测试代码。
参考: 深入分析JavaWeb – 国际化(i18n)
首先,我先说一下我一开始错误的示范。
整个项目的架构是这样的:
1. 控制器
BundleTest.java
@Controller
public class BundleTest {
@RequestMapping(value="/globalTest",method=RequestMethod.GET)
public String globalTest(){
return "global/bundle_global";
}
}
2. 资源文件
myproperties.properties是默认的资源文件,当找不到其他资源文件的时候,就会选择这个。
代码如下:
username=\u67F4\u82F1\u4FCA
password=123456
submit=\u63d0\u4ea4
myproperties_en_US.properties
username=Personal
password=123456
submit=submit
另外两个也类似,我就不贴出来了。
这个资源文件的命名之所以不是 myproperties_en.properties,而是 myproperties_en_US.properties,
public static void main(String[] args) {
//资源包基名(包名+myproperties)
String basename = "com.mocha.global.resource.myproperties";
//设置语言环境
Locale cn = Locale.CHINA;//中文zh_CN
Locale us = Locale.US;//英文en_US
Locale hk = Locale.TRADITIONAL_CHINESE;//繁体zh_TW
System.out.println("cn:"+cn.toString()+"|us:"+us+"|hk:"+hk);
//根据基名和语言环境加载对应的语言资源文件
ResourceBundle myResourcesCN = ResourceBundle.getBundle(basename,cn);//加载myproperties_zh_CN.properties
ResourceBundle myResourcesUS = ResourceBundle.getBundle(basename,us);//加载myproperties_en_US.properties
ResourceBundle myResourcesHK = ResourceBundle.getBundle(basename,hk);//加载myproperties_zh_TW.properties
//加载资源文件后, 程序就可以调用ResourceBundle实例对象的 getString方法获取指定的资源信息名称所对应的值。
//String value = myResources.getString(“key");
String usernameCN = myResourcesCN.getString("username");
String passwordCN = myResourcesCN.getString("password");
String usernameUS = myResourcesUS.getString("username");
String passwordUS = myResourcesUS.getString("password");
String usernameHK = myResourcesHK.getString("username");
String passwordHK = myResourcesHK.getString("password");
System.out.println(usernameCN+"--"+passwordCN);
System.out.println(usernameUS+"--"+passwordUS);
System.out.println(usernameHK+"--"+passwordHK);
}
我用main方法测试的时候: Locale cn = Locale.CHINA;//中文,这里打印cn值为zh_CN。
当 ResourceBundle myResourcesCN = ResourceBundle.getBundle(basename,cn);
这里会自动加载myproperties_zh_CN.properties。
本地测试是能成功拿到配置文件的。资源文件路径com.mocha.global.resource.myproperties,这里只写到文件名,不用加后缀就可以了。
运行main出来的结果:
3. 请求的页面
重头戏来了,到jsp页面上的时候,死活拿不到资源文件,我查了网上各种对应的问题,尝试了很多次都没有解决的这个问题。
bundle_global.jsp的代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import="java.util.Locale"%>
<%@page import="java.util.ResourceBundle"%>
<!DOCTYPE HTML>
<html>
<head>
<title>国际化测试</title>
</head>
<%
//加载i18n资源文件,request.getLocale()获取访问用户所在的国家地区
//ResourceBundle myResourcesBundle = ResourceBundle.getBundle("myproperties",request.getLocale());
ResourceBundle myResourcesBundle = ResourceBundle.getBundle("com.mocha.global.resource.myproperties",request.getLocale());
%>
<body>
<form action="" method="post">
<%=myResourcesBundle.getString("username")%>:<input type="text" name="username"/><br/>
<%=myResourcesBundle.getString("password")%>:<input type="password" name="password"/><br/>
<input type="submit" value="<%=myResourcesBundle.getString("submit")%>">
</form>
</body>
</html>
从浏览器访问控制器跳转到页面,页面报了错:
控制台报了无法找到资源的错误。
4、解决问题
我将配置文件全部挪到了resources目录,目录结构如下:
jsp上文件路径改成了
<%
//加载i18n资源文件,request.getLocale()获取访问用户所在的国家地区
ResourceBundle myResourcesBundle = ResourceBundle.getBundle("myproperties",request.getLocale());
%>
在这个maven项目install安装之后,它的配置文件就放到了classes文件夹下,这个我们可以从target文件夹下看到这个结构,
项目再安装重新启动,就能访问到资源文件里的内容了。
修改浏览器的语言
将想要测试的语言拖到第一位,再请求页面就能进行测试。这里我把每个测试语言的request.getLocale()的值都标红了。
这里我需要改一下我的资源文件的名字,因为刚才是本地测试之后定下来的名字,但是应该以浏览器拿到的值为准。
修改之后的资源文件名字:
再进行测试。
顺利请求到了资源文件。这次记录就到这里,希望能帮到同样为这个问题纠结的童鞋。
如果有什么问题,请及时指正,感谢!