最近的一个项目用到了国际化,实际是在利用浏览器语言,或者页面中的中英文切换,将页面的文字在其他语言和中文进行切换,因此在这里记录实现该功能的步骤。
涉及的技术:
SpringBoot:v1.5.13.RELEASE
Freemarker:2.0
Springcloud:Dalston.SR3
Extjs:6.2
1.新建国际化文件
在根目录resources下新建i18n文件夹,
新增三个文件,分别对应默认、英文和中文配置文件,配置文件格式如下:
messages.properties,默认配置文件
#-- main.ftl i18n setting --
main_welcome=Welcome to home page
messages_en_US.properties,英文配置文件
#-- main.ftl i18n setting --
main_welcome=Welcome to home page
messages_zh_CN.properties,中文配置文件
#-- main.ftl i18n setting --
main_welcome=欢迎来到首页
2.国际化配置
在springboot中,国际化配置文件的默认文件夹是messages,需要指定国际化文件的位置,在application.properties中配置
spring.messages.basename=static/i18n/messages
3.页面获取国际化配置
<html>
<head>
<#import "spring.ftl" as spring>
<script type="text/javascript" src="${ctx}/static/js/jquery.i18n.properties.js?sys_version=${sys_version}"></script>
<script type="text/javascript">
var ctx = "${ctx}/";
try {
$.i18n.properties({
path: '${ctx}' + '/static/i18n/',
name: 'messages',
language: '${_lang}',
mode: "both"
});
} catch (e) {
console.error(e);
}
</script>
</head>
<body>
<div>
<@spring.message code="main_welcome"/>
</div>
</body>
</html>
在ftl文件中,需引入jquery.i18n.properties.js,用<#import "spring.ftl" as spring>引入国际化配置,
页面需国际化的字段用<@spring.message code="main_welcome"/>代替
实现的结果如下:
切换为英文时:
切换为中文时
4.切换语言
function change_language(thisobj){
location.href="${ctx}/main?_lang="+thisobj.value;
}
以上为切换语言的JS事件,做个切换按钮,onchange时触发
5.切换国际化的实现
String newLocale = request.getParameter("_lang");
if (!StringUtils.isEmpty(newLocale)) {
LocaleResolver localeResolver = SpringUtil.getBean(LocaleResolver.class);
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not a bean in Spring Context!");
}
try {
LocaleEditor localeEditor = new LocaleEditor();
localeEditor.setAsText(newLocale);
localeResolver.setLocale(request, response, (Locale)localeEditor.getValue());
logger.debug("Change Language Success!");
} catch (IllegalStateException e) {
e.printStackTrace();
logger.warn("Change Language fail!");
}
} else {
//通过cookies判断当前用户的语言
Cookie[] cookies = request.getCookies();
Cookie langCookie = null;
for (Cookie cookie : cookies) {
if (CookieLocaleResolver.DEFAULT_COOKIE_NAME.equals(cookie.getName())) {
langCookie = cookie;
}
}
if (langCookie != null) {
newLocale = langCookie.getValue();
} else {
newLocale = "en_US";
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, newLocale);
response.addCookie(cookie);
}
}
request.setAttribute("_lang", newLocale);
6.设置默认语言
@Configuration
public class MainConfig extends WebMvcConfigurationSupport {
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver clr = new CookieLocaleResolver();
//设置默认语言
clr.setDefaultLocale(Locale.US);
return clr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("_lang");
return lci;
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/main");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addViewControllers(registry);
}
}
7.Extjs调用i18n方法
未完待续。。。