springmvc web国际化i18n解决资源文件路径问题

为了实现国际化,我根据一篇文章写了测试代码。
参考: 深入分析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()的值都标红了。

这里我需要改一下我的资源文件的名字,因为刚才是本地测试之后定下来的名字,但是应该以浏览器拿到的值为准。
修改之后的资源文件名字:
这里写图片描述

再进行测试。
这里写图片描述

这里写图片描述

顺利请求到了资源文件。这次记录就到这里,希望能帮到同样为这个问题纠结的童鞋。
如果有什么问题,请及时指正,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值