vue提供了前端国际化,但菜单栏通过后端控制,个人写个后端菜单国际化的控制(可扩展)
主要思路:后端启动时初始化将数据库中所有的菜单初始到容器里,前端发请求带上语言类型请求头,更据语言类型返回菜单数据
新增一张表sys_lang
/*==============================================================*/
/* Table: sys_lang */
/*==============================================================*/
create table sys_lang
(
lang_id bigint not null auto_increment comment '主键',
lang_key varchar(50) comment '语言key',
lang_value varchar(150) comment '语言value',
lang_type tinyint default 1 comment '语言类型(1 中文 2 英文)',
primary key (lang_id)
);alter table sys_lang comment '系统语言表';
import java.util.HashMap;
import java.util.Map;import org.apache.commons.lang3.StringUtils;
/**
* @description 国际化菜单数据容器
* @autor linxh
* @date 2019年12月4日
*/
public class L18nMenuContainer {
/**
* 中文容器
*/
private static Map<String, String> L18N_ZH_MENU_MAP = new HashMap<String, String>(16);
/**
* 英文容器
*/
private static Map<String, String> L18N_EN_MENU_MAP = new HashMap<String, String>(16);
/**
* 获取
* @param key
* @return
*/
protected static String get(String key) {
if (StringUtils.isBlank(key)) {
throw new NullPointerException("menu key is null");
}
return getContainerByHeader().get(key);
}
/**
* 清空
*/
protected static void clearAll() {
if (!L18N_EN_MENU_MAP.isEmpty()) {
L18N_EN_MENU_MAP.clear();
}
if (!L18N_ZH_MENU_MAP.isEmpty()) {
L18N_ZH_MENU_MAP.clear();
}
}
/**
* 获取容器
* @return
*/
protected static Map<String, String> getContainerByHeader() {
String header = L18nHeader.getHeader();
if (Constant.EN_US.equals(header)) {
return L18N_EN_MENU_MAP;
} else if (Constant.ZH_CN.equals(header)){
return L18N_ZH_MENU_MAP;
}
throw new RuntimeException("get l18n header error");
}
/**
* 获取容器
* @return
*/
protected static Map<String, String> getContainerByType(int type) {
if (type == L18nEnum.EN_US.getOrdial()) {
return L18N_EN_MENU_MAP;
} else if (type == L18nEnum.ZH_CN.getOrdial()){
return L18N_ZH_MENU_MAP;
}
throw new RuntimeException("get lang type error");
}
}
import java.util.List;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import lombok.extern.slf4j.Slf4j;
/**
* @description 菜单国际化
* @autor linxh
* @date 2019年12月3日
*/
@Component
@Slf4j
public class L18nMenu {
@Autowired
private SysLangService langService;
/**
* 重试次数
*/
private static final int RETRY_COUNT = 3;
/**
* 初始化
*/
@PostConstruct
public void init() {
int updCount = 0;
while (updCount < RETRY_COUNT) {
if (this.insertAll()) {
return;
}
updCount++;
}
if (log.isErrorEnabled()) {
log.error("lang init faild");
}
throw new RuntimeException("lang init faild");
}
/**
* 插入所有数据
*/
public boolean insertAll() {
try {
List<SysLang> menuLangList = langService.selectAll();
for (SysLang sysLang : menuLangList) {
addOrUpd(sysLang.getLangKey(), sysLang.getLangValue(), sysLang.getLangType());
}
} catch (Exception e) {
return false;
}
return true;
}
/**
* 定时更新
*/
public void execute() {
L18nMenuContainer.clearAll();
int updCount = 0;
while (updCount < RETRY_COUNT) {
if (this.insertAll()) {
return;
}
updCount++;
}
if (log.isErrorEnabled()) {
log.error("lang update faild");
}
throw new RuntimeException("lang update faild");
}
/**
* 添加或修改
* @param key
* @param val
*/
public void addOrUpd(String key, String val, int type) {
if (StringUtils.isBlank(key) || StringUtils.isBlank(val)) {
throw new NullPointerException("menu key or value is null");
}
L18nMenuContainer.getContainerByType(type).put(key, val);
}
/**
* 获取值
* @param key
* @return
*/
public String getVal(String key) {
return L18nMenuContainer.get(key);
}
}
/**
* @description 语言类型枚举
* @autor linxh
* @date 2019年12月4日
*/
public enum L18nEnum {
ZH_CN(1,"中文"),
EN_US(2,"英文");
/**
* 类型值
*/
private int ordial;
/**
* 类型描述
*/
private String l18nDesc;
private L18nEnum(int ordial, String l18nDesc) {
this.ordial = ordial;
this.l18nDesc = l18nDesc;
}
public final int getOrdial(){
return this.ordial;
}
}
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;/**
* @description 国际化请求头
* @autor linxh
* @date 2019年12月3日
*/
public class L18nHeader {
private final static String L18N_VAL= "i18n";
public static String getHeader() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if(null != requestAttributes) {
HttpServletRequest request = requestAttributes.getRequest();
String headerVal = request.getHeader(L18N_VAL);
return headerVal;
}
return "";
}
}