一、前端
經過util包中的ResourceBundle加載:java
首先國際化資源文件放在了classpath下的i18n目錄下:python
mymessage_en_US.properties:web
com.website.operation=\u67e5\u8be2\u64cd\u4f5c\u65e5\u5fd7 com.website.write=\u5199\u65e5\u5fd7 com.website.writeLog=\u5199 {0} \u65e5\u5fd7
mymessage_en_US.properties:面試
com.website.operation=queryOperationLog com.website.write=recordLog com.website.writeLog=record {0} Log
利用ResourceBundle加載國際化文件,這裏列出四個方法,分別是利用默認Locale、zh_CN、en_US以及帶佔位符的處理方式。這裏須要注意的是BaseName爲classpath下的目錄+/+國際化文件名前綴,即i18n/mymessagespring
package com.website.controller.utils; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; /** * @program: website * @description: 獲取國際化配置文件 * @author: smallsoup * @create: 2018-07-27 22:32 **/ public class ResourceUtils { public static String getEnglishValueByKey(String key){ Locale locale = new Locale("en", "US"); //使用指定的英文Locale ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage", locale); return mySource.getString(key); } public static String getChineseValueByKey(String key){ Locale locale = new Locale("zh", "CN"); //使用指定的中文Locale ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage", locale); return mySource.getString(key); } public static String getDeafultValueByKey(String key){ //使用默認的Locale ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage"); return mySource.getString(key); } public static String getValueAndPlaceholder(String key){ //使用默認的Locale ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage"); String beforeValue = mySource.getString(key); //填充國家化文件中的佔位符 String afterValue = MessageFormat.format(beforeValue, "安全"); return afterValue; } }
在controller裏面調用ResourceUtils裏的方法:編程
@RequestMapping(value = "/projectadd") public String projectAdd(){ LOGGER.warn("projectAdd getChineseValueByKey is {}", ResourceUtils.getChineseValueByKey("com.website.operation")); LOGGER.warn("projectAdd getDeafultValueByKey is {}", ResourceUtils.getDeafultValueByKey("com.website.operation")); LOGGER.warn("projectAdd getEnglishValueByKey is {}", ResourceUtils.getEnglishValueByKey("com.website.operation")); LOGGER.warn("projectAdd getValueAndPlaceholder is {}", ResourceUtils.getValueAndPlaceholder("com.website.writeLog")); return "project/projectadd"; }
啓動tomcat打印日誌:segmentfault
二、緩存
利用spring的ResourceBundleMessageSourcetomcat
ResourceBundleMessageSource是基於JDK ResourceBundle的MessageSource接口實現類。它會將訪問過的ResourceBundle緩存起來,以便於下次直接從緩存中獲取進行使用。
和上面不一樣的是ResourceUtils的實現,實現以下:
package com.website.controller.utils; import org.springframework.context.support.ResourceBundleMessageSource; import java.util.Locale; /** * @program: website * @description: 獲取國際化配置文件 * @author: smallsoup * @create: 2018-07-27 22:32 **/ public class ResourceUtils { private static ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); static { //指定國家化資源文件路徑 messageSource.setBasename("i18n/mymessage"); //指定將用來加載對應資源文件時使用的編碼,默認爲空,表示將使用默認的編碼進行獲取。 messageSource.setDefaultEncoding("UTF-8"); } public static String getChineseValueByKey(String key){ return messageSource.getMessage(key, null, Locale.CHINA); } public static String getDeafultValueByKey(String key){ return messageSource.getMessage(key, null, null); } public static String getEnglishValueByKey(String key){ return messageSource.getMessage(key, null, Locale.US); } public static String getValueAndPlaceholder(String key){ return messageSource.getMessage(key, new Object[]{"安全"}, null); } }
三、
利用spring的ReloadableResourceBundleMessageSource
ReloadableResourceBundleMessageSource也是MessageSource的一種實現,其用法配置等和ResourceBundleMessageSource基本一致。所不一樣的是ReloadableResourceBundleMessageSource內部是使用PropertiesPersister來加載對應的文件,這包括properties文件和xml文件,而後使用java.util.Properties來保存對應的數據。
package com.website.controller.utils; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import java.util.Locale; /** * @program: website * @description: 獲取國際化配置文件 * @author: smallsoup * @create: 2018-07-27 22:32 **/ public class ResourceUtils { private static ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); static { //指定國家化資源文件路徑 messageSource.setBasename("i18n/mymessage"); //指定將用來加載對應資源文件時使用的編碼,默認爲空,表示將使用默認的編碼進行獲取。 messageSource.setDefaultEncoding("UTF-8"); //是否容許併發刷新 messageSource.setConcurrentRefresh(true); //ReloadableResourceBundleMessageSource也是支持緩存對應的資源文件的,默認的緩存時間爲永久,即獲取了一次資源文件後就將其緩存起來,之後不再從新去獲取該文件。這個能夠經過setCacheSeconds()方法來指定對應的緩存時間,單位爲秒 messageSource.setCacheSeconds(1200); } public static String getChineseValueByKey(String key){ return messageSource.getMessage(key, null, Locale.CHINA); } public static String getDeafultValueByKey(String key){ return messageSource.getMessage(key, null, null); } public static String getEnglishValueByKey(String key){ return messageSource.getMessage(key, null, Locale.US); } public static String getValueAndPlaceholder(String key){ return messageSource.getMessage(key, new Object[]{"安全"}, null); } }
這三種方式最後結果是同樣的。
參考:
國際化MessageSource
http://elim.iteye.com/blog/23...
本公衆號免費提供csdn下載服務,海量IT學習資源,若是你準備入IT坑,勵志成爲優秀的程序猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時咱們組建了一個技術交流羣,裏面有不少大佬,會不定時分享技術文章,若是你想來一塊兒學習提升,能夠公衆號後臺回覆【2】,免費邀請加技術交流羣互相學習提升,會不按期分享編程IT相關資源。
掃碼關注,精彩內容第一時間推給你