电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

基于springboot i18n國際化后臺多種語言設(shè)置的方式

瀏覽:67日期:2023-03-02 13:22:55

之前有做過手機端后臺的國際化,因為手機統(tǒng)一傳遞了language參數(shù)

所以只要設(shè)置LocaleChangeInterceptor就行了

/** * 配置國際化語言 */@Configurationpublic class LocaleConfig extends WebMvcConfigurerAdapter{ /** * 默認解析器 其中l(wèi)ocale表示默認語言 */ @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方法

/** * 國際化工具類 */@Componentpublic class MessageUtils{ private static MessageSource messageSource;static SysErrorLogDao sysErrorLogDao; @Resourcepublic void setSysErrorLogDao(SysErrorLogDao sysErrorLogDao) {MessageUtils.sysErrorLogDao = sysErrorLogDao;}private static Logger logger = LoggerFactory.getLogger(MessageUtils.class); public MessageUtils(MessageSource messageSource) { MessageUtils.messageSource = messageSource; } /** * 獲取單個國際化翻譯值 * @param msgKey * @param defaultMsg * @return */ 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;} } /** * 獲取多個參數(shù)取代的國際化翻譯值 * @param msgKey * @param defaultMsg * @param arg * @return */ 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);} } /** * 指定語言獲得單個國際化翻譯值 * @param msgKey * @param defaultMsg * @param language * @return */ 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;} } /** * 指定語言獲取多參數(shù)取代的國際化翻譯值 * @param msgKey * @param defaultMsg * @param language * @param arg * @return */ 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);} }}

但是后面又要做網(wǎng)頁的國際化,因為網(wǎng)頁沒有傳遞統(tǒng)一的語言參數(shù),如果要一一添加的話太過麻煩,于是就要用到cookie來保存?zhèn)鬟f語言

這個時候就要實現(xiàn)自己的解析器了

public class MyLocaleResolver implements LocaleResolver {@Override public Locale resolveLocale(HttpServletRequest httpServletRequest) {Locale locale = Locale.getDefault();{//通過參數(shù)解析locale,language參數(shù)優(yōu)先String temp = httpServletRequest.getParameter('language');if (!StringUtils.isEmpty(temp)) {locale = new Locale(temp);return locale;}}//得到cookie,解析localeCookie[] 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) { }}

@Configurationpublic class LocaleConfig extends WebMvcConfigurerAdapter{ @Bean public LocaleResolver localeResolver() {MyLocaleResolver localeResolver = new MyLocaleResolver();return localeResolver; }}這樣就實現(xiàn)了使用cookie來設(shè)置語言

不過最后還是有所遺漏,因為我們的分布式項目中用到了很多http的內(nèi)部調(diào)用,用不上cookie,也沒有l(wèi)anguage參數(shù)。

但是大部分的內(nèi)部調(diào)用都有傳遞公司id,可以通過公司獲得公司對應(yīng)的語言。

可以在攔截器里面直接加入對companyId的解析但是我考慮有沒有通用的實現(xiàn)方法,就是在任何地方,甚至的運行到一半中途設(shè)置語言的辦法。

初步想法是拿到線程中的Locale進行設(shè)置

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

基于springboot i18n國際化后臺多種語言設(shè)置的方式

發(fā)現(xiàn)調(diào)用的是一個LocaleContext類的方法。

然后查詢哪些地方調(diào)用了LocaleResolver.resolveLocale

基于springboot i18n國際化后臺多種語言設(shè)置的方式

基于springboot i18n國際化后臺多種語言設(shè)置的方式

發(fā)現(xiàn)第一個方法里面返回了一個匿名函數(shù)LocaleContext,其getLocale就是直接調(diào)用localeResolver.resolveLocale方法。

于是我合理的猜想框架里不是通過攔截器設(shè)置一個locale,而是每次調(diào)用LocaleContextHolder.getLocale()都會執(zhí)行l(wèi)ocaleResolver.resolveLocale(request)方法,所以我們只要設(shè)置request屬性就行了

public class MyLocaleResolver implements LocaleResolver {@Override public Locale resolveLocale(HttpServletRequest httpServletRequest) {//得到cookie,解析localeLocale locale = Locale.getDefault();{//通過參數(shù)解析localeString 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

基于springboot i18n國際化后臺多種語言設(shè)置的方式

這樣我們就實現(xiàn)了在任何地點,甚至中途變換語言了

發(fā)現(xiàn)LocaleContextHolder.getLocale()在實體類中也可以調(diào)用。因此可以后臺保存json格式,在get方法中根據(jù)語言返回相應(yīng)的值。

我本來想直接改造原來的字段,但是發(fā)現(xiàn)緩存會直接讀取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就是空的。這時候需要強制設(shè)置語言LocaleContextHolder.setLocale(Locale locale),當然一般的方法也可以用這個來設(shè)置語言,不過這樣的話就不會再調(diào)用localeResolver.resolveLocale(request)方法了

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 免费B2B信息推广发布平台 - 推发网| 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 物和码官网,物和码,免费一物一码数字化营销SaaS平台 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 家乐事净水器官网-净水器厂家「官方」 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 云南成考网_云南成人高考报名网| 创绿家招商加盟网-除甲醛加盟-甲醛治理加盟-室内除甲醛加盟-创绿家招商官网 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 北京环球北美考试院【官方网站】|北京托福培训班|北京托福培训 | 天津力值检测-天津管道检测-天津天诚工程检测技术有限公司 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 |