共计 4553 个字符,预计需要花费 12 分钟才能阅读完成。
1、配置国际化参数
默认解析器:LocaleResolver 用于设置当前会话的默认的国际化语言。
默认拦截器:LocaleChangeInterceptor 指定切换国际化语言的参数名。例如?lang=zh_CN 表示读取国际化文件 messages_zh_CN.properties。
/** | |
* 配置国际化语言 | |
*/ | |
public class LocaleConfig { | |
/** | |
* 默认解析器 其中 locale 表示默认语言 | |
*/ | |
public LocaleResolver localeResolver() {SessionLocaleResolver localeResolver = new SessionLocaleResolver(); | |
localeResolver.setDefaultLocale(Locale.US); | |
return localeResolver; | |
} | |
/** | |
* 默认拦截器 其中 lang 表示切换语言的参数名 | |
*/ | |
public WebMvcConfigurer localeInterceptor() {return new WebMvcConfigurer() { | |
public void addInterceptors(InterceptorRegistry registry) {LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor(); | |
localeInterceptor.setParamName("lang"); | |
registry.addInterceptor(localeInterceptor); | |
} | |
}; | |
} | |
} |
2、添加国际化文件
首先在配置文件 application.yml 填写国际化文件的相对路径,表示读取 classpath:/static/i18n/messages_language_country.properties。例如:
spring: | |
messages: | |
basename: static/i18n/messages #相对路径 开头请勿添加斜杠 |
然后在 classpath:/static/i18n 目录中添加如下国际化文件:默认文件:messages.properties。
美式英语:messages_en_US.properties
# 这里填写英语翻译。user.title=User Login | |
user.welcome=Welcome | |
user.username=Username | |
user.password=Password | |
user.login=Sign In |
中文简体:messages_zh_CN.properties
# 这里填写中文翻译 | |
user.title= 用户登陆 | |
user.welcome= 欢迎 | |
user.username= 登陆用户 | |
user.password= 登陆密码 | |
user.login= 登陆 |
中文繁体:messages_zh_TW.properties
# 这里填写繁体翻译 | |
user.title= 用戶登陸 | |
user.welcome= 歡迎 | |
user.username= 登陸用戶 | |
user.password= 登陸密碼 | |
user.login= 登陸 |
3、代码国际化
通过工具类的静态方法 MessageUtils.get(“user.title”) 快速获取当前国际化的翻译值。
/** | |
* 国际化工具类 | |
*/ | |
@Component | |
public class MessageUtils{ | |
private static MessageSource messageSource; | |
public MessageUtils(MessageSource messageSource) {FastLocale.messageSource = messageSource;} | |
/** | |
* 获取单个国际化翻译值 | |
*/ | |
public static String get(String msgKey) { | |
try {return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale()); | |
} catch (Exception e) {return msgKey;} | |
} |
首先在 pom 文件引入 Thymeleaf 和 Web 依赖,然后在页面中只需通过 th:xx=”#{x.label}” 即可获取对应的国际化翻译值。
<dependency> | |
<groupid>org.springframework.boot</groupid> | |
<artifactid>spring-boot-starter-web</artifactid> | |
</dependency> | |
<dependency> | |
<groupid>org.springframework.boot</groupid> | |
<artifactid>spring-boot-starter-thymeleaf</artifactid> | |
</dependency> |
例如:
<title th:text="#{user.title}"> 用户登陆 </title>
首先在 pom 文件引入 jQuery、jquery-properties-i18n 等依赖,然后在初始化后即可通过 JS 函数获取对应国际化文件的内容。
<dependency><!--webjars 版本定位器 用于省略版本号 --> | |
<groupid>org.webjars</groupid> | |
<artifactid>webjars-locator-core</artifactid> | |
</dependency> | |
<dependency><!--jQuery 前端依赖 --> | |
<groupid>org.webjars</groupid> | |
<artifactid>jquery</artifactid> | |
<version>3.3.1</version> | |
</dependency> | |
<dependency><!--jQuery 国际化插件 --> | |
<groupid>org.webjars.bower</groupid> | |
<artifactid>jquery-i18n-properties</artifactid> | |
<version>1.2.7</version> | |
</dependency> |
例如:为了提高可用性 这里提供了获取当前国际化语言和获取国际化翻译的方法。
<html xmlns:th="http://www.thymeleaf.org"> | |
<head> | |
<title th:text="#{user.title}"> 用户登陆 </title> | |
<script th:src="https://www.linuxprobe.com/@{/webjars/jquery/jquery.min.js}"></script> | |
<script th:src="https://www.linuxprobe.com/@{/webjars/jquery-i18n-properties/jquery.i18n.properties.min.js}"></script> | |
<script th:inline="javascript"> | |
// 获取应用路径 | |
var ROOT = [[${#servletContext.contextPath}]]; | |
// 获取默认语言 | |
var LANG_COUNTRY = [[${#locale.language+'_'+#locale.country}]]; | |
// 初始化 i18n 插件 | |
$.i18n.properties({ | |
path: ROOT + '/i18n/',// 这里表示访问路径 | |
name: 'messages',// 文件名开头 | |
language: LANG_COUNTRY,// 文件名语言 例如 en_US | |
mode: 'both'// 默认值 | |
}); | |
// 初始化 i18n 函数 | |
function i18n(msgKey) { | |
try {return $.i18n.prop(msgKey); | |
} catch (e) {return msgKey;} | |
} | |
// 获取国际化翻译值 | |
console.log(i18n('user.title')); | |
console.log(i18n('User Login')); | |
</script> | |
</head> | |
<body> | |
<div class="logo_box"> | |
<select id="locale"> | |
<option value="zh_CN"> 中文简体 </option> | |
<option value="zh_TW"> 中文繁体 </option> | |
<option value="en_US">English</option> | |
</select> | |
<h3 th:text="#{user.welcome}"> 欢迎登陆 </h3> | |
<form> | |
<div class="input_outer"> | |
<span class="u_user"></span> | |
<input id="username" name="username" class="text" type="text" th:placeholder="#{user.username}"> | |
</div> | |
<div class="input_outer"> | |
<span class="us_uer"></span> | |
<input id="password" name="password" class="text" type="password" th:placeholder="#{user.password}"> | |
</div> | |
<div class="mb2"> | |
<a class="act-but submit" th:text="#{user.login}"> 登录 </a> | |
</div> | |
</form> | |
</div> | |
<script th:inline="javascript"> | |
// 选中语言 | |
$("#locale").find('option[value="' + LANG_COUNTRY + '"]').attr('selected', true); | |
// 切换语言 | |
$("#locale").change(function () {$.get(ROOT + '/?lang=' + $("#locale").val(), function () {location.reload(); | |
}); | |
}); | |
</script> | |
</body> | |
</html> |
关于 i18n 插件的更多配置项请查阅 jquery-properties-i18n 官方文档。
很多新人配置好之后不懂得如何切换国际化语言,其实很简单,由于在前面已经配置了拦截器 LocaleChangeInterceptor,此时我们只需在任意请求中附上语言参数 lang 即可,当然也通过 AJAX 来快速切换。
例如:
默认英语:http://http://127.0.0.1:8080?lang=en_US
中文简体:http://http://127.0.0.1:8080?lang=zh_CN
中文繁体:http://http://127.0.0.1:8080?lang=zh_TW
