近期在重构个人开源项目 iMap,想着要是能作成一个国际化的项目就行了,因而我在个人后端服务以及前端都引入了 i18njavascript
我用的是阿里系的 Egg.js Node 框架来提供后台服务,因为框架的开源插件中已经含有 egg-i18n,本着不重复造轮子的心态,因而直接上手。前端
首先打开 config/config.default.js
来设定 i18n 的配置项:vue
exports.i18n = { // 默认中文 defaultLocale: 'zh-CN', // // URL 参数,默认 'local' 改成 'lang' queryField: 'lang', // cookie 名称 cookieField: 'lang', // cookie 时长 cookieMaxAge: '1y', };
其中,他们的彼此之间的权重是 query > cookie > headers
java
配置好 config
文件以后,须要在 config
文件夹中新增一个 local
文件夹,里面放上项目的语言包,若是只有中英文,那么能够是这样的ios
. ├── config.default.js ├── config.local.js ├── config.prod.js ├── config.unittest.js ├── locale │ ├── en-US.js │ └── zh-CN.js └── plugin.js
固然也可使用 json
文件,详情见 egg-i18n 文档git
我为了偷懒,直接使用了英文格式做为 key
,像这样github
// en-US module.exports = { // error_handler 'Not Found': 'Not Found', 'Authentication Error': 'Authentication Error', 'Server Error': 'Server Error', ... };
// zh-CN module.exports = { // error_handler 'Not Found': '错误 URL', 'Authentication Error': '权限错误', 'Server Error': '服务器错误', ... };
在项目中,例如咱们须要返回 Not Found
只须要使用 ctx.__('Not Found')
就能够了,框架会自动根据当前请求语言来返回对应的预设语言包ajax
后端都集成了 i18n ,做为老本行的前端固然也要配置,先看看效果vuex
本项目使用了 vue ,因此拿 vue 来进行举例json
首先引入 vue-i18n
// main.js import Vue from 'vue' import VueI18n from 'vue-i18n' const i18n = new VueI18n({ // 默认中文 locale: 'zh-CN', messages: { // 语言包路径 'zh-CN': require('@/common/lang/zh'), 'en-US': require('@/common/lang/en') } }) new Vue({ components: { App }, // 这里别漏了 i18n, template: '<App/>' }).$mount('#app')
再在 common
文件夹中新建 lang
文件夹以及对应的语言包
# /src/common . └── lang ├── en.js └── zh.js
语言包内容示例
// en-US export const m = { login: { input_email: 'Please input email address', input_password: 'Please input password (4 - 25)', submit: 'Signin', github: 'Signin with ', reset: 'Lost your password ?', register: 'Signup now' },
// zh-CN export const m = { login: { input_email: '请输入邮箱', input_password: '请输入密码(4 - 25位)', submit: '登陆', github: 'GitHub ', reset: '忘记密码 ?', register: '当即注册' }, }
这样咱们就引入语言包成功,接下来是切换语言示例,在组件 methods
中使用 switchLang
方法
switchLang() { if (this.localLang === 'zh-CN') { this.localLang = 'en-US' } else { this.localLang = 'zh-CN' } // 切换语言 this.$i18n.locale = this.localLang // 使用 vuex 存入全局变量 this.setLang(this.localLang) },
在 template
中,使用 $t('m.你的key')
就能够实现国际化了
可是如今还有一个问题,咱们如何在 script
标签中使用 i18n 呢?
利用 this.$i18n.messages[this.$i18n.locale].m.你的key
就能够作到
在咱们先后端都分别配置完成后,咱们须要前端是中文的时候,对应的后端返回的数据也是中文格式,在这里,咱们利用 headers
中的 'Accept-Language'
来进行先后端的语言配对
axios
示例:
axios.post(obj.url, obj.data, { headers: { 'Accept-Language': window.$lang } })
这个 window.$lang
又是什么呢...
为了保证 ajax
配置文件的纯净简洁(实际上是我懒)。为了避免须要引入 i18n ,我在 vuex
中,将 this.$i18n.local
赋值给了 window
全局变量 $lang
// mutations const mutations = { // 设置 lang [types.SET_LANG] (state, data) { state.local = data window.$lang = data } }
这样咱们就能够很轻易的获取到当前语言,从而传给后端返回对应语言的数据
固然,为了数据的持久化存储,建议前端将当前语言配置存储在 localstorage
或者是 cookie
里面,不然刷新页面将会遭到重置