本文使用的环境:
Spring+SpringMvc+Mybatis+JSP
一、简介
本文主要介绍了Spring国际化的配置,以及java、jsp和js的使用。
所谓的国际化就是一个系统支持多种语言,可来回切换语言,本文以中英双语举例来实现国际化。
二、实现步骤
1、加载国际化的配置文件
在实现国际化之前,首先要加载相关的资源文件,即消息源,这个功能由Spring MVC提供的MessageSource接口完成,并且有四个非抽象的实现类:
2、配置国际化解析器
即解析当前使用什么语言,Spring MVC中提供了以下四个实现类:
3、配置拦截器
为了修改语言,Spring MVC还提供了一个拦截器-LocaleChangeInterceptor,通过它可以获取参数,然后根据参数来改变语言;
三、配置实例
1、在Springmvc的配置文件中添加如下配置
2、在resources目录下新建一个文件夹叫msg如图(1),在msg目录下新建两个文件msg_en_US.properties和msg_zh_CN.properties,分别存中文和英文如图(2)和图(3)
图(1)
图(2)
图(3)
所有的配置到此完成,下面开始使用。
四、使用方法
1、java的获取方法
RequestContext requestContext = new RequestContext(R.getRequest());
String message=requestContext.getMessage("刷新");
2、jsp获取方法
可使用
(1)页面中引入Spring标签,
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
(2)使用方法
页面:
执行结果:
五、优化使用方法
由于java和jsp的调用写法有点长,所以我写了一个工具类,工java、jsp和js来使用。
1、java工具类
package com.sicheng.common.utils;
import com.sicheng.common.web.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.support.RequestContext;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* 翻译工具类(获取国际化配置文件的值)
* @author fanxiuixu
* @version 2019-11-20
*/
public class FYUtils {
private static Logger logger = LoggerFactory.getLogger(FYUtils.class);
/**
* 根据键和参数获取国际化值
* @param key 键
* @param params 参数,可变参数
* @return
*/
public static String fyParams(String key, String... params){
String message=key;
try {
RequestContext requestContext = new RequestContext(R.getRequest());
message=requestContext.getMessage("刷新");
message = requestContext.getMessage(key,params);
} catch (Exception e) {
message=key;
logger.error("获取国际化值发生错误",e);
}
return message;
}
/**
* 根据键获取国际化值
* @param key 键
* @return
*/
public static String fy(String key){
return fyParams(key);
}
/**
* 根据键获取国际化值
* @param key 键
* @param param 参数
* @return
*/
public static String fyParam(String key,String param){
return fyParams(key,param);
}
/**
* 获取resources文件夹下的porperties文件中的内容
* @param name properties文件名称
* @return
*/
public static Map getFYProperties(String name) {
Map map = new HashMap<>();
InputStream in = null;
Properties p = new Properties();
try {
in = FYUtils.class.getClassLoader().getResourceAsStream(name);
p.load(new InputStreamReader(in, StandardCharsets.UTF_8));//properties文件,不用unicode编码的实现方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Set> entrySet = p.entrySet();
for (Map.Entry
2、jsp工具类
3、js工具类
(1)、写一个接口,读取后台的配置文件
@Controller
@RequestMapping(value = "${frontPath}/fy")
public class FYController extends BaseController {
private static Logger logger = LoggerFactory.getLogger(FYController.class);
/**
* 获取国际化properties文件内容
* @return
*/
@ResponseBody
@RequestMapping(value = "poperties")
public Map poperties() {
Map cnMap = FYUtils.getFYProperties("msg/msg_zh_CN.properties");
Map enMap = FYUtils.getFYProperties("msg/msg_en_US.properties");
Map dataMap=new HashMap<>();
dataMap.put("cnMap",cnMap);
dataMap.put("enMap",enMap);
return dataMap;
}
}
(2)、写一个js方法,用来获取值
(function(){
//fy命名空间,起隔离作用,防止同名变量冲突
//fy是国际化翻译的简写
if(!window.fy) {window.fy={};}
//根据当前环境获取中文值或英文值
fy.getMsg=function (key, ...rest) {
if(localStorage.getItem("adminFycnMap")==null || localStorage.getItem("adminFyenMap")==null){
$.ajax({
type:"GET",
url:ctxa+"/fy/poperties.do",
data:{},
async:false,
//请求成功
success : function(data) {
localStorage.setItem("adminFycnMap",JSON.stringify(data.cnMap));
localStorage.setItem("adminFyenMap",JSON.stringify(data.enMap));
}
});
}
//先从cookike中获取值
var language=fdp.cookie('fylanguage');
if(typeof(language)=="undefined" || language == null){
language=navigator.language;
}
//中文
var fycnStr=localStorage.getItem('adminFycnMap');
var fycnMap=JSON.parse(fycnStr);
//英文
var fyenStr=localStorage.getItem("adminFyenMap");
var fyenMap=JSON.parse(fyenStr);
var str="";
if('zh_CN'==language || "zh-CN"==language){
str=fycnMap[key];
}else{
str=fyenMap[key];
}
if(""==str){
return key;
}
let arr = rest;
arr.forEach((item => {
console.log(item)
str = str.replace(/(\{\w\})/, item)
}))
return str;
}
})();
4、使用方法
1、java调用方法:
//没有参数
String fy1=FYUtils.fyParams("查询");
//一个参数
String fy2=FYUtils.fyParams("关闭","参数");
//多个参数
String fy3=FYUtils.fyParams("保存","参数1","参数2","参数3");
2、jsp调用方法
${fns:fy('查询')}
${fns:fyParam('关闭','参数1')}
${fns:fyParams('保存','参数1','参数2','参数3')}
3、js调用方法
//没有参数
var name=fy.getMsg('查询');
//一个参数
var str = fy.getMsg('关闭', '参数1');
//多个参数
var str = fy.getMsg('保存', '参数1','参数2', '参数3');