背景介绍:最近项目中在做用户操作日志的国际化,用户操作为啥需要日志,在做云平台的时候需要对用户操作资源的行为进行记录,比如创建一台主机,你需要记录起来,并且在日志模块展现给用户看,这样的日志模块可以方面用户查看操作是否成功,查看操作历史,还可以按时间查询最近的操作记录。那么现在有个需求是这套云平台既需要给中国用户使用,又需要给国外用户使用,那么系统使用的展示语言是需要动态切换的,你就需要根据用户的需求动态切换中英文。我们重点在日志这块,日志需要记录用户的操作名称(举例),但是中英文的操作名称是不一样的,这边就需要国际化。spring中国际化的实现相信大家应该都有了解,不了解就自行百度。国际化文件一般有多个,可能有日语,英语,德语,中文,这边暂且就定为两个国际化文件:中文和英文。中文国际化文件:
monitor.alarm=监控报警
create.host=创建主机
英文的国际化文件:
monitor.alarm=monitoring alarm
create.host=create a host
两个国际化文件其实的key-value的形式存储的。日志表中记录的是key值,例如create.host。然后在显示给用户看的时候先去数据库读取这个key值,根据Key到中文或者英文文件中去拿取对应的中英文value,然后将转换后的值传回前端做展示。这样在作展示的时候可以很好的切换,毕竟数据库中传的值是key。在需要做日志展示时,发个请求到后端,后端从数据库中拿出key值,一般在系统启动前回去加载中英文国际化文件,将键值对保存在map中,后端从数据库拿出key时可以直接从中文map或者英文map中取出对应的中英文,然后传回前端。
上面说了数据库中存的key值,那么前端做日志查询,在数据库中怎么匹配呢。比如,用户会查询“创建主机”的记录,那么前端传回来的值是“创建主机”,而数据库中存的是'create.host'。这完全匹配不上,这时就需要一个将“创建主机”转换为“create.host”的操作。我的解决方式是这样的:首先该项目是spring项目,我会先定义一个静态变量,赋值的时候如下:
import java.util.Map;
public class Constants {
public static Map<String, String> ENGLISH_KEY_MAP = PropertiesUtils.readPropertiesAndReturnMap("/messages/messages_en.properties", false);
public static Map<String, String> CHINESE_KEY_MAP = PropertiesUtils.readPropertiesAndReturnMap("/messages/messages_zh.properties", false);
public static Map<String, String> CONFIG_MAP = PropertiesUtils.readPropertiesAndReturnMap("config.properties", true);
}
将从国际化配置文件中读出来的键值对直接保存至常量中,静态变量在类加载的时候会去执行。我们这边读出来的是value-key,也就是说键值对存的的是“创建主机=》create.host”.这样前端传值“创建主机”,通过这个map就可以将前端传的值转换成key,然后做数据库查询。为了不修改原来的查询代码,我们这边使用了注解和spring aop。aop会拦截注解的方法,并获取方法中的传入的参数,使用@Before来处理参数,在aspect类中将前端传的中文值进行转换,这样就不会影响原来的后端查询了。