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

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

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

瀏覽:126日期: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嫩草影院| 久久精品国内一区二区三区| 日本不卡一二三区黄网| 一本一道久久a久久| 老牛国产精品一区的观看方式| 亚洲第一区色| 精品欧美激情在线观看| 日韩视频一区| 视频在线观看一区二区三区| 久久午夜影视| 亚洲综合小说| 免费观看久久久4p| 91福利精品在线观看| 国产乱码精品一区二区三区亚洲人 | 欧美福利在线| 免费观看不卡av| 国产亚洲精品自拍| 亚洲精品在线二区| 欧美成人aaa| 激情亚洲影院在线观看| 国产精品91一区二区三区| 国产视频一区在线观看一区免费| 美女精品网站| 日本va欧美va精品| 久久国产精品色av免费看| 日韩精品中文字幕第1页| 免费人成精品欧美精品| 老司机久久99久久精品播放免费| 国产精品久一| av高清不卡| 久久久久久久欧美精品| 激情婷婷综合| 日韩av中文在线观看| 久久伊人亚洲| 婷婷成人综合| 日韩精品一卡二卡三卡四卡无卡| 欧美一级久久| jizzjizz中国精品麻豆| 欧洲激情综合| 少妇高潮一区二区三区99| 欧美激情日韩| av一区二区高清| 青青国产精品| av高清不卡| 免费在线观看成人| 美腿丝袜在线亚洲一区| 亚洲一本视频| 欧美日一区二区在线观看| а√天堂8资源中文在线| 亚洲欧美日韩国产| 久久av免费| 好看的av在线不卡观看| 日韩高清电影一区| 91精品xxx在线观看| 亚洲精品在线a| 日本午夜大片a在线观看| 视频一区日韩精品| 成人免费网站www网站高清| 免费在线观看不卡| 福利在线一区| 亚洲无线观看| 欧美xxxx中国| 亚洲青青久久| 日韩不卡在线| 国产免费播放一区二区| 亚洲欧美一区在线| 国产精品久久久久77777丨| 亚洲黄页一区| 激情中国色综合| 日韩精品亚洲专区| 激情六月综合| 国产欧美日韩在线一区二区| 欧美成人高清| 国产精品亚洲综合色区韩国| 久久中文亚洲字幕| 欧美激情视频一区二区三区免费 | 国产激情一区| 香蕉成人久久| 久久精品国内一区二区三区水蜜桃| 欧美日韩在线精品一区二区三区激情综合| 99视频精品视频高清免费| 欧美韩一区二区| 亚洲精品三级| 伊人久久亚洲美女图片| 日韩中文影院| 国产欧美高清| 亚洲精品在线a| 亚洲在线电影| 1024精品一区二区三区| 国产在视频一区二区三区吞精| 中文字幕av亚洲精品一部二部 | 日韩中文字幕亚洲一区二区va在线 | 亚洲成人国产| 久久免费影院| 日韩手机在线| 欧美女激情福利| 免费在线小视频| 精品资源在线| 国产精品久av福利在线观看| 亚洲精品在线国产| 综合五月婷婷| 欧美专区一区二区三区| 欧美成人久久| 视频一区中文| 婷婷中文字幕一区| 久久中文字幕二区| 日韩免费在线| 日韩欧美在线中字| 欧美一级鲁丝片| 精品视频国内| 国产精品日韩精品在线播放| 日韩一区二区三区精品| 综合亚洲自拍| 一本一道久久a久久| 老司机久久99久久精品播放免费| 在线日韩中文| 激情欧美亚洲| 欧美大黑bbbbbbbbb在线| 亚洲高清不卡| 九色精品91| 亚洲美洲欧洲综合国产一区| 成人av二区| 中文一区在线| 亚洲一区成人| 中文字幕亚洲精品乱码| 视频一区欧美精品| 亚洲精品人人| 青青草视频一区| 久久精品99久久久| 久久99蜜桃| 另类专区亚洲| 久久精品亚洲人成影院| 欧美+日本+国产+在线a∨观看| 欧美一级精品| 亚洲一区二区三区高清不卡| 久久高清免费观看| 亚洲综合五月| 久久激情av| 国产一区二区三区四区五区传媒| 另类专区亚洲| 日韩免费在线| 日韩视频一区| 日韩高清国产一区在线| 久久免费精品| 精品成人免费一区二区在线播放| 婷婷综合在线| 亚洲香蕉久久| 国产精品夜夜夜| 高清av不卡| 亚洲免费观看| 91麻豆精品| 麻豆视频在线观看免费网站黄| 久久久久久黄| 免费欧美在线视频| 久久wwww| 视频二区不卡| 免费日本视频一区| 老色鬼精品视频在线观看播放| 日韩欧美精品综合| 久久亚洲图片| 麻豆中文一区二区| 国产一区久久| 日本va欧美va精品| 久久毛片亚洲| 亚洲九九精品| 国产成人免费视频网站视频社区| 欧美亚洲国产一区| 日韩精品免费视频一区二区三区 | 激情综合自拍| 久久狠狠久久| 久久久久91| 欧美午夜网站| 国产精品字幕| 亚洲免费专区| 成人片免费看| 亚洲精品无播放器在线播放| 亚洲一区资源| 亚洲日本在线观看视频| 久久精品国产99国产| 免费久久精品| 国产精品一区二区美女视频免费看| 99久久99久久精品国产片果冰| 中文无码久久精品| 国产一区二区三区久久久久久久久| 91高清一区| 日韩av一级片| 一区二区三区视频免费观看| 国产美女撒尿一区二区| 欧美sss在线视频| 日韩精品欧美大片| 久久精品国产99久久| 国产欧美一区二区三区国产幕精品| 91精品国产福利在线观看麻豆| 日韩激情网站| 欧美日韩一区二区综合| 国产精品久久久久9999高清| 亚洲神马久久| 亚洲黄色免费av| 欧美日韩精品一区二区三区视频 |