需求:
在接口服務(wù)中鱼响,根據(jù)不同的語(yǔ)言標(biāo)識(shí)傳參玷室,返回不同的語(yǔ)言提示語(yǔ)嗽交。
設(shè)計(jì)前提
由于這項(xiàng)工作是在接口設(shè)計(jì)完之后展開的醋拧,所以只能在現(xiàn)有的接口開發(fā)上進(jìn)行完善慷嗜。
接口調(diào)用的主要形式有GET以及POST下不同形式的傳參,如Content-Type為application/json或application/x-www-form-urlencoded丹壕。返回參數(shù)為固定設(shè)計(jì)好的構(gòu)造類庆械。
public class JsonResult<T> {
private String flag;
private EErrorCode errorCode;
private String message;
private T data;
(此處省略多種參數(shù)構(gòu)造函數(shù)及封裝方法)
}
設(shè)計(jì)思路
利用jdk本身的工具類Locale,以及spring對(duì)語(yǔ)言配置的初始化菌赖,構(gòu)建國(guó)際化讀取信息的工具類缭乘。
-
在resources底下創(chuàng)建多語(yǔ)言配置文件,如messages.properties琉用,本項(xiàng)目中默認(rèn)的配置文件為中文堕绩,只需要?jiǎng)?chuàng)建英文的配置文件來(lái)做切換。
- 在spring的配置文件中指定路徑
spring
messages
basename: i18n/messages
- 構(gòu)建國(guó)際化工具類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import java.util.Locale;
/**
* 國(guó)際化工具類
*
* @author eazonshaw
*/
@Component
public class BusLocaleUtil {
private static MessageSource messageSource;
@Autowired
public void init(MessageSource messageSource){
BusLocaleUtil.messageSource = messageSource;
}
/**
* 獲取國(guó)際化字符串
* @param key 對(duì)應(yīng)配置文件的key
* @param lang 語(yǔ)言標(biāo)識(shí)邑时,默認(rèn)為中文(CH)奴紧,可選英文(EN)
* @param params 占位符參數(shù),其中日期為Java.Util.Date類型
* @return 國(guó)際化字符串
*/
public static String getMessage(String key, String lang, Object[] params) {
Locale locale;
if(lang!=null && lang.equals("EN")) locale = Locale.US;
else locale = Locale.CHINA;
return messageSource.getMessage(key, params, "", locale);
}
}
- 在配置文件中定義kv值
messages.properties
ADDORDER.STORE.NOENOUGH = 您所選的{0, date, long}的{1, choice, 0#房間|1#車輛|2#翻譯|3#禮儀|4#景點(diǎn)}門票庫(kù)存不足刁愿,請(qǐng)重新選擇绰寞!
messages_en_US.properties
ADDORDER.STORE.NOENOUGH = Your {1, choice, 0#hotel|1#limousine|2#translator|3#etiquette|4#tour} reservation for {0, date, long} is not available.Please reserve another time!
- 接口調(diào)用時(shí)使用
Object[] params = {new Date(),1};
return BusLocaleUtil.getMessage("ADDORDER.STORE.NOENOUGH",lang,params);
接口返回結(jié)果
lang="CH":您所選的2019年5月21日的車輛門票庫(kù)存不足,請(qǐng)重新選擇铣口!
lang="EN":Your limousine reservation for May 21, 2019 is not available.Please reserve another time!
后續(xù)完善
網(wǎng)上提供的方法大多是在spring中配置bean滤钱,重新定義Locale的加載類,但是大多數(shù)切換都只適用于GET請(qǐng)求脑题。
在設(shè)計(jì)時(shí)有想過(guò)在國(guó)際化調(diào)用時(shí)件缸,根據(jù)request里的參數(shù),自動(dòng)切換語(yǔ)言環(huán)境叔遂。但由于spring中他炊,在controller里用@RequestBody里接收的參數(shù)只能接收一次争剿,再次接收只能接收到空值。如果需要實(shí)現(xiàn)再次獲取request里的值痊末,需要添加接收前的攔截處理蚕苇。
重點(diǎn)難點(diǎn)
國(guó)際化配置文件的value值的占位符的靈活運(yùn)用。
//TODO 待補(bǔ)充