后台国际化问题
1.首先进行创建资源文件messages_en_US.properties、messages_zh_CN.properties,messages.properties语言配置文件。
2.初始化相关配置信息
指定message的basename,多个以逗号分隔,如果不加包名的话,默认从classpath路径开始,默认:messages
spring.messages.basename=i18n/messages
设定加载的资源文件缓存失效时间,-1的话为永不过期,默认为-1
spring.messages.cache-seconds= 3600
设定Message bundles的编码,默认: UTF-8
spring.messages.encoding=UTF-8
3.把语言的属性放在header信息中加上过滤器
如:头信息添加 Accept-Language
当调用接口返回参数是对日志进行过滤解析成对应语言
@Around("webLog()")
public Object arround(ProceedingJoinPoint pjp) {
Object o;
try {
o = pjp.proceed();
} catch (Throwable e) {
if(e instanceof BootException){
BootException bootException = (BootException) e;
o = new CommonReturnObject();
((CommonReturnObject) o).setCode(((BootException) e).getCode());
((CommonReturnObject) o).setDesc("");
}else {
e.printStackTrace();
o = new CommonReturnObject(ServerReturnCodeEnum.SYS_ERROR_10);
LOGGER.info(e.getMessage(),e.toString());
}
}
String messageFound = i18nController.getMessage(((CommonReturnObject)o).getCode());
((CommonReturnObject)o).setDesc(messageFound);
// System.out.println("方法的返回值 : " + JSONObject.toJSONString(o));
LOGGER.info("方法的返回值 :{}",JSONObject.toJSONString(o));
return o;
}
/**
* 设置当前的返回信息
*
* @param code
* @return
*/
public String getMessage(String code) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
if (messageSource == null) {
messageSource = initMessageSource();
}
String lauage = request.getHeader("Accept-Language");
// 默认没有就是请求地区的语言
Locale locale = null;
if (lauage == null) {
locale = request.getLocale();
} else if ("en-US".equals(lauage.split(",")[0])||"en".equals(lauage.split(",")[0])) {
locale = Locale.US;
} else if ("zh-CN".equals(lauage.split(",")[0])) {
locale = Locale.SIMPLIFIED_CHINESE;
} // 其余的不正确的默认就是本地的语言
else {
locale = request.getLocale();
}
String result = null;
try {
result = messageSource.getMessage(code, null, locale);
} catch (NoSuchMessageException e) {
LOGGER.error("Cannot find the error message of internationalization, return the original error message.");
}
if (result == null) {
return code;
}
return result;
}
4.对于数据库层数据国际化有以下几种思路:
1.数据库需要翻译的,建2个对应的表,一个表存中文,一个表存英文。
2.需要翻译的表,里面一个中文列,一个英文列。
3.实现两个一个中文服务器一个英文服务器
4,购买第三方翻译服务,对接口返回参数进行整体翻译(基本不建议用,机器翻译不准)
网友评论