Spring国际化实现

本文使用的环境:

Spring+SpringMvc+Mybatis+JSP

一、简介

本文主要介绍了Spring国际化的配置,以及java、jsp和js的使用。

所谓的国际化就是一个系统支持多种语言,可来回切换语言,本文以中英双语举例来实现国际化。

二、实现步骤

1、加载国际化的配置文件

在实现国际化之前,首先要加载相关的资源文件,即消息源,这个功能由Spring MVC提供的MessageSource接口完成,并且有四个非抽象的实现类:

  • StaticMessageSource:主要用于程序测试,它允许通过编程的方式提供国际化信息 ;
  • DelegatingMessageSource:消息源解析委派类(用户未指定时,SpringContext默认使用当前类),功能比较简单:将字符串和参数数组格式化为一个消息字符串 ;
  • ResourceBundleMessageSource:由JDK提供的Bundle实现,只能把文件放置在对应的类路径下,不具备热加载功能,只有重启系统才能重新加载;
  • ReloadavleResourceBundleMessageSource:可以把文件放置在任何地方,并且在不重启系统的前提下也能重新加载资源文件,这样就可以在程序运行期修改并重新加载资源文件;

2、配置国际化解析器

即解析当前使用什么语言,Spring MVC中提供了以下四个实现类:

  • AcceptHeaderLocaleResolver:spring默认的区域解析器,它通过校验http请求的accept-language头部来解析区域。这个头是由web浏览器根据底层操作系统的区域设置,这个区域无法改变用户的区域,所以只能根据操作系统设置而获取,一般不使用;
  • FixedLocaleResolver:使用固定的locale国际化,也是不可修改;
  • CookieLocaleResolver:根据cookie数据获取国际化数据,但是如果用户禁止或没有设置cookie,就会根据http头中的accept-language来获取;
  • SessionLocaleResolver:根据session进行国际化,即根据用户设置session的变量进行读取;

 

3、配置拦截器

为了修改语言,Spring MVC还提供了一个拦截器-LocaleChangeInterceptor,通过它可以获取参数,然后根据参数来改变语言;

三、配置实例

1、在Springmvc的配置文件中添加如下配置


    
    
    
        
        
        
        
        
        
        
		
        
        
        
        
    

    
	
    
    
    
        
        
        
        
		
		
    
	
    
    
        
            
            
                
            
        
    

2、在resources目录下新建一个文件夹叫msg如图(1),在msg目录下新建两个文件msg_en_US.properties和msg_zh_CN.properties,分别存中文和英文如图(2)和图(3)

Spring国际化实现_第1张图片

图(1)

Spring国际化实现_第2张图片

图(2)

Spring国际化实现_第3张图片

图(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)使用方法

页面:

Spring国际化实现_第4张图片

执行结果:

Spring国际化实现_第5张图片

Spring国际化实现_第6张图片

 

五、优化使用方法

由于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 entry : entrySet) {
			map.put((String) entry.getKey(), (String) entry.getValue());
		}
		return map;
	}

}

2、jsp工具类

Spring国际化实现_第7张图片

 

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');

 

你可能感兴趣的:(Spring)