我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于springboot i18n国际化后台多种语言设置的方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于springboot i18n国际化后台多种语言设置的方式

之前有做过手机端后台的国际化,因为手机统一传递了language参数

所以只要设置LocaleChangeInterceptor就行了



@Configuration
public class LocaleConfig extends WebMvcConfigurerAdapter{
 
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.CHINA);
        return localeResolver;
    }
    //springboot1.5
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
     LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
      localeInterceptor.setParamName("language");
      registry.addInterceptor(localeInterceptor);
    }
}

对于某些特殊的后台运行代码,比如定时器,我则使用getByLanguage方法



@Component
public class MessageUtils{ 
    private static MessageSource messageSource;    
    static SysErrorLogDao sysErrorLogDao; 
	@Resource
	public void setSysErrorLogDao(SysErrorLogDao sysErrorLogDao) {
		MessageUtils.sysErrorLogDao = sysErrorLogDao;
	}
	private static Logger logger = LoggerFactory.getLogger(MessageUtils.class);
    public MessageUtils(MessageSource messageSource) {
    	MessageUtils.messageSource = messageSource;
    }
 
    
    public static String get(String msgKey, String defaultMsg) {
        try {
            return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
        } catch (Exception e) {
        	logger.error(e.getMessage(), e);
        	String message = StringUtils.getExceptionStackTraceMessage(e);
			if(message != null && message.length() > 1000) {
				message = message.substring(0, 999);
			}
			SysErrorLogModel errorLog = new SysErrorLogModel();
			errorLog.setContent(msgKey);
			errorLog.setType("messageUtils");
			errorLog.setCreateDate(new Date());
			errorLog.setClassName(MessageUtils.class.getName());
			errorLog.setMessage(message);
			sysErrorLogDao.save(errorLog);
            return defaultMsg;
        }
    }
    
    public static String get(String msgKey, String defaultMsg, Object... arg) {
        try {
        	msgKey = messageSource.getMessage(msgKey, arg, LocaleContextHolder.getLocale());
            return msgKey;
        } catch (Exception e) {
        	logger.error(e.getMessage(), e);
        	String message = StringUtils.getExceptionStackTraceMessage(e);
			if(message != null && message.length() > 1000) {
				message = message.substring(0, 999);
			}
			SysErrorLogModel errorLog = new SysErrorLogModel();
			errorLog.setContent(msgKey);
			errorLog.setType("messageUtils");
			errorLog.setCreateDate(new Date());
			errorLog.setClassName(MessageUtils.class.getName());
			errorLog.setMessage(message);
			sysErrorLogDao.save(errorLog);
            return MessageFormat.format(defaultMsg, arg);
        }
    }
    
    public static String getByLanguage(String msgKey, String defaultMsg, String language) {
    	try {
    		Locale locale = new Locale(language);
        	msgKey = messageSource.getMessage(msgKey, null, locale);
            return msgKey;
        } catch (Exception e) {
        	logger.error(e.getMessage(), e);
        	String message = StringUtils.getExceptionStackTraceMessage(e);
			if(message != null && message.length() > 1000) {
				message = message.substring(0, 999);
			}
			SysErrorLogModel errorLog = new SysErrorLogModel();
			errorLog.setContent(msgKey);
			errorLog.setType("messageUtils");
			errorLog.setCreateDate(new Date());
			errorLog.setClassName(MessageUtils.class.getName());
			errorLog.setMessage(message);
			sysErrorLogDao.save(errorLog);
            return defaultMsg;
        }
    }
    
    public static String getByLanguage(String msgKey, String defaultMsg, String language, Object... arg) {
    	try {
    		Locale locale = new Locale(language);
        	msgKey = messageSource.getMessage(msgKey, arg, locale);
            return msgKey;
        } catch (Exception e) {
        	logger.error(e.getMessage(), e);
        	String message = StringUtils.getExceptionStackTraceMessage(e);
			if(message != null && message.length() > 1000) {
				message = message.substring(0, 999);
			}
			SysErrorLogModel errorLog = new SysErrorLogModel();
			errorLog.setContent(msgKey);
			errorLog.setType("messageUtils");
			errorLog.setCreateDate(new Date());
			errorLog.setClassName(MessageUtils.class.getName());
			errorLog.setMessage(message);
			sysErrorLogDao.save(errorLog);
            return MessageFormat.format(defaultMsg, arg);
        }
    }
}

但是后面又要做网页的国际化,因为网页没有传递统一的语言参数,如果要一一添加的话太过麻烦,于是就要用到cookie来保存传递语言

这个时候就要实现自己的解析器了


public class MyLocaleResolver implements LocaleResolver {
	@Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        Locale locale = Locale.getDefault();
        {
        	//通过参数解析locale,language参数优先
        	String temp = httpServletRequest.getParameter("language");
        	if (!StringUtils.isEmpty(temp)) {
        		locale = new Locale(temp);
        		return locale;
        	}
        }
        //得到cookie,解析locale
        Cookie[] cookies = httpServletRequest.getCookies();
        if(cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("userLanguage")) {
                    String temp = cookie.getValue();
                    if (!StringUtils.isEmpty(temp)) {
                        locale = new Locale(temp);
                    }
                    continue;
                }
            }
        }
        return locale;
    }
 
    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    }
}

@Configuration
public class LocaleConfig extends WebMvcConfigurerAdapter{
    @Bean
    public LocaleResolver localeResolver() {
        MyLocaleResolver localeResolver = new MyLocaleResolver();
        return localeResolver;
    }
}

这样就实现了使用cookie来设置语言

不过最后还是有所遗漏,因为我们的分布式项目中用到了很多http的内部调用,用不上cookie,也没有language参数。

但是大部分的内部调用都有传递公司id,可以通过公司获得公司对应的语言。

可以在拦截器里面直接加入对companyId的解析但是我考虑有没有通用的实现方法,就是在任何地方,甚至的运行到一半中途设置语言的办法。

初步想法是拿到线程中的Locale进行设置

然后我看了下源码LocaleContextHolder.getLocale()

发现调用的是一个LocaleContext类的方法。

然后查询哪些地方调用了LocaleResolver.resolveLocale

发现第一个方法里面返回了一个匿名函数LocaleContext,其getLocale就是直接调用localeResolver.resolveLocale方法。

于是我合理的猜想框架里不是通过拦截器设置一个locale,而是每次调用LocaleContextHolder.getLocale()都会执行localeResolver.resolveLocale(request)方法,所以我们只要设置request属性就行了


public class MyLocaleResolver implements LocaleResolver {
	@Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        //得到cookie,解析locale
        Locale locale = Locale.getDefault();
        {
        	//通过参数解析locale
        	String temp = httpServletRequest.getParameter("language");
        	if (!StringUtils.isEmpty(temp)) {
        		locale = new Locale(temp);
        		return locale;
        	}
        }
        {
        	String temp = (String) httpServletRequest.getAttribute("language");
        	if (!StringUtils.isEmpty(temp)) {
        		locale = new Locale(temp);
        		return locale;
        	}
        }
        Cookie[] cookies = httpServletRequest.getCookies();
        if(cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("userLanguage")) {
                    String temp = cookie.getValue();
                    if (!StringUtils.isEmpty(temp)) {
                        locale = new Locale(temp);
                    }
                    continue;
                }
            }
        }
        return locale;
    }
 
    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    }
}

    @RequestMapping("/test")                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    public String test(HttpServletRequest request) {
    	String result = "";
		request.setAttribute("language", "ch");
		result += MessageUtils.get("test", "测试");
		request.setAttribute("language", "en");
		result += MessageUtils.get("test", "测试");
        return result;
    }

messages_ch.properties


test=测试

messages_en.properties


test=test

这样我们就实现了在任何地点,甚至中途变换语言了

发现LocaleContextHolder.getLocale()在实体类中也可以调用。因此可以后台保存json格式,在get方法中根据语言返回相应的值。

我本来想直接改造原来的字段,但是发现缓存会直接读取get中的值,下次读取就不是json了,所以只好麻烦点增加一个字段了


	public String getFullNameByLanguage() {
		String language = LocaleContextHolder.getLocale().getLanguage();
		Map<String, String> map;
		try {
			map = JsonUtil.string2Obj(fullName);
			return map.get(language);
		} catch (IOException e) {
			return fullName;
		}
	}

当使用@Async异步方法时,LocaleContext就是空的。这时候需要强制设置语言LocaleContextHolder.setLocale(Locale locale),当然一般的方法也可以用这个来设置语言,不过这样的话就不会再调用localeResolver.resolveLocale(request)方法了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于springboot i18n国际化后台多种语言设置的方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录