日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

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

之前有做過手機端后臺的國際化,因為手機統一傳遞了language參數

所以只要設置LocaleChangeInterceptor就行了

/** * 配置國際化語言 */@Configurationpublic class LocaleConfig extends WebMvcConfigurerAdapter{ /** * 默認解析器 其中locale表示默認語言 */ @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;} } /** * 獲取多個參數取代的國際化翻譯值 * @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;} } /** * 指定語言獲取多參數取代的國際化翻譯值 * @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);} }}

但是后面又要做網頁的國際化,因為網頁沒有傳遞統一的語言參數,如果要一一添加的話太過麻煩,于是就要用到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,解析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; }}這樣就實現了使用cookie來設置語言

不過最后還是有所遺漏,因為我們的分布式項目中用到了很多http的內部調用,用不上cookie,也沒有language參數。

但是大部分的內部調用都有傳遞公司id,可以通過公司獲得公司對應的語言。

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

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

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

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

發現調用的是一個LocaleContext類的方法。

然后查詢哪些地方調用了LocaleResolver.resolveLocale

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

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

發現第一個方法里面返回了一個匿名函數LocaleContext,其getLocale就是直接調用localeResolver.resolveLocale方法。

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

public class MyLocaleResolver implements LocaleResolver {@Override public Locale resolveLocale(HttpServletRequest httpServletRequest) {//得到cookie,解析localeLocale locale = Locale.getDefault();{//通過參數解析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國際化后臺多種語言設置的方式

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

發現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)方法了

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产资源在线观看入口av| 国产视频欧美| 日本一区二区中文字幕| 伊人久久亚洲影院| 免费成人av在线播放| 亚洲精品激情| 国产高清日韩| 岛国av在线播放| 久久久精品久久久久久96| 国产私拍福利精品视频二区| 免费视频最近日韩| 国产精品一区二区三区av麻 | 国产一区二区三区亚洲| 久久久久中文| 日韩一区二区三区免费视频| 欧美激情aⅴ一区二区三区| 成年男女免费视频网站不卡| 日韩午夜精品| 国产一区二区三区国产精品| 国产精品普通话对白| 日本久久一区| 亚洲一区黄色| 欧美亚洲免费| 日韩不卡在线| 日韩亚洲在线| 成人影视亚洲图片在线| 99在线精品视频在线观看| 欧美一级一区| 欧美日韩国产亚洲一区| 国产日韩一区二区三区在线| 欧美肉体xxxx裸体137大胆| 亚洲欧美日韩一区在线观看| 偷拍欧美精品| 久久久精品区| 日韩av一区二| 国产毛片久久| 香蕉视频亚洲一级| 国产精品久久久久久久久久妞妞 | 欧美国产亚洲精品| 美女毛片一区二区三区四区| 国产精品2023| 亚洲狼人精品一区二区三区| 国产99久久| 久久久久免费| 国产精品99精品一区二区三区∴| 中文字幕视频精品一区二区三区 | 免费观看亚洲天堂| 日韩精品一区二区三区中文| 欧美日韩少妇| 欧美亚洲日本精品| 欧美激情91| 国产精品红桃| 欧美1区二区| 精品国产不卡| 高清av一区| 欧美成人a交片免费看| 久草免费在线视频| 四虎国产精品免费观看| 91麻豆国产自产在线观看亚洲| 国产精品xvideos88| 欧美国产先锋| 日韩av福利| 亚洲少妇诱惑| 亚洲精品中文字幕99999| 好吊日精品视频 | 欧美日韩视频免费观看| 久久影院午夜精品| 久久婷婷一区| 中文一区在线| 日本不卡视频一二三区| 国产日本久久| 久久久久久一区二区| 欧美日韩亚洲在线观看| 蜜臀久久99精品久久久久久9| 日本不卡的三区四区五区| 国产亚洲精品精品国产亚洲综合 | 亚洲欧美久久久| 日韩中出av| 国产精品99视频| 亚洲一区观看| 国产成人在线中文字幕| 国产精品97| 欧美日韩一区二区三区不卡视频 | 国产一区二区三区久久| 欧美性感美女一区二区| 蜜桃视频一区二区三区在线观看| 日韩高清不卡一区| 精品女同一区二区三区在线观看| 久久久国产精品一区二区中文| 免费观看在线色综合| 国内揄拍国内精品久久| 中文亚洲欧美| 成人午夜在线| 欧美中文一区| 99国产精品久久久久久久成人热| 97久久亚洲| 一区二区自拍| av资源新版天堂在线| 另类国产ts人妖高潮视频| 精品国产欧美| 日韩av网站在线观看| 亚洲国内精品| 国产精品中文字幕亚洲欧美 | 国产精品国产一区| 亚洲精品视频一二三区| 久久久亚洲一区| 美女在线视频一区| 日韩精品亚洲专区| 香蕉成人久久| 午夜国产欧美理论在线播放| 狠狠久久伊人| 国产精品对白| 国产亚洲高清在线观看| 中文字幕日韩高清在线| 2023国产精品久久久精品双| 美女久久99| 国产色噜噜噜91在线精品| 亚洲青青久久| 日本成人在线不卡视频| 免费观看在线综合色| 性色一区二区| 国产偷自视频区视频一区二区| 久久精品免费一区二区三区| 日韩欧美精品| 国产一区二区三区日韩精品| 国产免费av国片精品草莓男男 | 美女毛片一区二区三区四区最新中文字幕亚洲 | 荡女精品导航| 精品中文字幕一区二区三区| 欧美韩一区二区| 久久中文字幕一区二区三区| 欧美国产不卡| 欧美精品日日操| 亚洲午夜黄色| 中文字幕日韩亚洲| 午夜久久av| 国产精品1区| 精品丝袜在线| 日韩影院在线观看| 国产精品扒开腿做爽爽爽软件| 国产精品九九| 久久婷婷av| 日韩精品导航| 日韩大片在线| 久久夜色精品| 国产精品久久久一区二区| 日韩精品dvd| 一区二区日韩免费看| 国模大尺度视频一区二区| 亚洲欧美综合| 国产精品久久| 国产精品婷婷| 蜜桃传媒麻豆第一区在线观看 | 老色鬼精品视频在线观看播放| 黑人精品一区| 一区二区国产精品| 首页国产精品| 在线精品一区二区| 欧美日韩视频网站| 日本午夜精品久久久久| 日韩电影免费网址| 亚洲精品人人| 色一区二区三区| 91成人精品在线| 黄色欧美日韩| av中文字幕在线观看第一页| 中文字幕一区日韩精品| 九色porny丨国产首页在线| 欧美一区91| 国产字幕视频一区二区| 国产精品1区| 一本大道色婷婷在线| 91精品福利观看| 免费人成在线不卡| 欧美日韩激情在线一区二区三区| 欧美aaaaaa午夜精品| 日韩精品中文字幕吗一区二区| 激情综合网址| 久久精品在线| 日韩精品dvd| 国产99在线| 精品亚洲成人| 美女精品视频在线| 国产精品高潮呻吟久久久久| 亚洲一区av| 久久国产精品久久w女人spa| 国产专区一区| 国产高清一区二区| 亚洲国产不卡| 伊人成人网在线看| 99国产精品久久久久久久| 国产一区亚洲| 国产亚洲毛片| 丝袜诱惑制服诱惑色一区在线观看| 宅男在线一区| 亚洲一区二区三区免费在线观看| 1000部精品久久久久久久久| 久久精品国产68国产精品亚洲| 三级小说欧洲区亚洲区| 神马午夜在线视频|