需求描述
- 要求Agile的Web界面支持中英文切换
- 中英文切换最好和Agile用户的设置同步
解决方案
这里提供2种方案来实现.
- 每次当界面打开自动查询Agile用户的语言设置,实时切换。
- Web项目初始化时将Agile用户的语言设置存到缓存里面。当用户语言变更时,自己去刷新缓存或者每隔一段时间自动刷新缓存。
实现步骤
接下来的实现步骤是基于第一种解决方案的。但第一种解决方案要求请求参数中必须带有用户。所以要求菜单最好是挂在操作菜单中才行。
首先建一个类实现LocaleResolver接口。在接口方法中读取用户的语言设置并得到对应的Locale对象。代码参考如下:
public class AgileLocaleResolver implements LocaleResolver {
private static final Logger log = LoggerFactory.getLogger(AgileLocaleResolver.class);
@Autowired
private IUserUtils iUserUtils;
@Autowired
private AgileConfig agileConfig;
@Override
public Locale resolveLocale(HttpServletRequest request) {
//获取请求中的语言参数
Locale locale = null;
String uri = request.getRequestURI();
Boolean langSyn = agileConfig.getLangSyn();
//只有功能启用且Agile开头的链接
if (Boolean.TRUE.equals(langSyn) && uri.startsWith("/agile/")) {
//读取请求中是否已经明确指定了语言.
String language = request.getParameter("lang");
String agileuser = request.getParameter("agile.userName");
if (StringUtils.isBlank(language)) {
//如果没有传就从用户的首选项中读取
if (StringUtils.isNotBlank(agileuser)) {
String langStr = iUserUtils.getUserLanguage(null, agileuser);
locale = new Locale(langStr);
} else {
locale = new SessionLocaleResolver().resolveLocale(request);
}
} else {
//如果请求参数中传了就使用请求参数里面的.
locale = new Locale(language);
}
} else {
locale = new SessionLocaleResolver().resolveLocale(request);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
将这个类注册到系统,让他变成系统的默认语言解析类。
@Configuration
public class I18nConfig implements WebMvcConfigurer
{
@Bean
public LocaleResolver localeResolver()
{
AgileLocaleResolver slr = new AgileLocaleResolver();
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor()
{
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
// 参数名
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(localeChangeInterceptor());
}
}
接下来有任何请求过来时都会先经过这个类来解析Locale信息,以便显示国际化信息。