前后端国际化多语言配置
前端(Vue ElementUI)
编写 i18n.js
- 在这个
js
中引入ElementUI
的多语言资源,引入本地的多语言资源
import VueI18n from 'vue-i18n'
import Vue from 'vue'
import locale from 'element-ui/lib/locale'
import enLocale from 'element-ui/lib/locale/lang/en'
import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
import myI18nEn from './i18n-en-US.json'
import myI18nZh from './i18n-zh-CN.json'
Vue.use(VueI18n)
const lang = 'zh'
const i18n = new VueI18n({
locale: lang,
messages: {
zh: Object.assign(zhLocale, myI18nZh),
en: Object.assign(enLocale, myI18nEn)
}
})
locale.i18n((key, value) => i18n.t(key, value))
export default i18n
- 新建
i18n-en-US.json
i18n-zh-CN.json
文件,就是两个JSON
文件 i18n-en-US.json
{
"test": "切换语言"
}
{
"test": "ChangeLanguage"
}
在main.js 中挂载 i18n
import Vue from 'vue'
import i18n from './utils/i18n/I18n.js'
new Vue({
router,
i18n,
render: h => h(App)
}).$mount('#app')
使用方式
<el-button size="mini" @click="changeLanguage">{{$t("test")}}</el-button>
<el-input :placeholder="$t('test')"></el-input>
切换全局的 i18n 语言
<el-button size="mini" @click="changeLanguage">{{$t("test")}}</el-button>
changeLanguage () {
this.$i18n.locale = this.$i18n.locale === 'en' ? 'zh' : 'en'
Cookies.set('language', this.$i18n.locale)
}
往后端的请求头中增加 language 参数
- 如下封装的发送请求的
js
,从Cookie
中拿到上面放进去的参数,当向后端请求的时候请求头部带上languange
参数
import axios from 'axios'
import QS from 'qs'
import Cookies from 'js-cookie'
axios.defaults.timeout = 180000
var flag = true
axios.interceptors.request.use(
config => {
let token = Cookies.get('token')
let language = Cookies.get('language') === undefined ? 'zh' : Cookies.get('language')
if (config.url.indexOf('/system/login') > 0 && config.url.indexOf('/system/loginlog') < 0) {
return config
}
if (config.method === 'post') {
if (token) {
console.log(config.headers)
config.headers = {
'Content-Type': flag ? 'application/json' : 'application/x-www-form-urlencoded',
Authorization: token,
'language': language
}
}
} else if (config.method === 'get') {
config.headers = {}
if (token) {
config.headers = {
'Content-Type': flag ? 'application/json' : 'application/x-www-form-urlencoded',
Authorization: token,
'language': language
}
}
}
return config
},
error => {
console.log(error)
}
)
function paramsToUrl (url, params) {
if (!params) return url
for (var key in params) {
if (params[key] && params[key] !== 'undefined') {
if (url.indexOf('?') !== -1) {
url += '&' + '' + key + '=' + params[key] || '' + ''
} else {
url += '?' + '' + key + '=' + params[key] || '' + ''
}
}
}
return url
}
export function requireData (url, params, type, item, paramsType) {
flag = true
if (paramsType) {
flag = paramsType
}
if (!url) return false
switch (item) {
case 'back':
url = axios.defaults.baseM1URL + url
break
case 'before':
url = axios.defaults.baseM2URL + url
break
case 'taskcenter':
url = axios.defaults.baseM3URL + url
break
case 'core':
url = axios.defaults.baseM4URL + url
break
}
if (type === 'get') {
url = paramsToUrl(url, params)
return new Promise((resolve, reject) => {
axios
.get(url, params)
.then(res => {
resolve(res.data)
})
.catch(err => {
reject(err)
})
})
} else if (type === 'post') {
const headerJSON = {
'Content-Type': 'application/json'
}
const headerFormData = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
return new Promise((resolve, reject) => {
axios.post(url, flag ? JSON.stringify(params) : QS.stringify(params), {
headers: flag ? headerJSON : headerFormData
}).then(res => {
resolve(res.data)
}).catch(err => {
reject(err.data)
})
})
}
}
发送请求查看头部已经有 language 的参数

查看 Elementui 原生的多语言也生效了

后端(SpringBoot MessageSource)
使用 Spring 国际化 MessageSource
Spring
默认集成了多语言直接使用就行了,注意配置文件要放在resource
下面不然需要配置
配置 MessageSource 可以不用配置 当多语言文件名称不是 messages开头时候必须配置
@Bean
public ResourceBundleMessageSource messageSource() {
Locale.setDefault(Locale.CHINESE);
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages");
source.setUseCodeAsDefaultMessage(true);
source.setDefaultEncoding("UTF-8");
logger.info(LogConstant.LOG_SUCCESS_PREFIX + "I18n配置完成");
return source;
}
自定义 LocaleResolver 从请求头中获取多语言参数配置到当前域中
@Configuration
public class I18nConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(I18nConfig.class);
@Bean
public ResourceBundleMessageSource messageSource() {
Locale.setDefault(Locale.CHINESE);
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages");
source.setUseCodeAsDefaultMessage(true);
source.setDefaultEncoding("UTF-8");
logger.info(LogConstant.LOG_SUCCESS_PREFIX + "I18n配置完成");
return source;
}
@Bean
public LocaleResolver localeResolver() {
return new MyLocalResolver();
}
}
class MyLocalResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
final String key = "language";
String language = request.getHeader(key);
Map<String, String> map = new HashMap<>(16);
map.put("en", Locale.ENGLISH.getLanguage());
map.put("zh", Locale.CHINESE.getLanguage());
return new Locale(map.getOrDefault(language, "en"));
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse httpServletResponse, Locale locale) {
}
}
注意点
@Bean
public LocaleResolver localeResolver() {}
使用
@Autowired
private MessageSource messageSource;
messageSource.getMessage("core.pageListError", null, LocaleContextHolder.getLocale()
完美完成
