java加載國際化文件的幾種姿式

正文

一、前端

經過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相關資源。


掃碼關注,精彩內容第一時間推給你

image

相關文章
相關標籤/搜索