前端开发中-国际化i18n的实现

53 阅读1分钟

前言

国际化(Internationalization, 简称i18n) 指使产品适应不同语言和地区的流程

为了开发的网页能够给不同国家和地区的用户 适配他们的语言和习惯而设计。

通过研究antd pro of vue项目的i18n 开发规范

基于vue2 + vue-i18n + moment + vuex 相关的技术栈...

我可以得出如下的设计思路:

让我来为你详细解释整体运行流程,稍微再为你解释细节:

vue-i18n 是一个实现i18n 的库,在vue中通过

import VueI18n from 'vue-i18n'
Vue.use(VueI18n)

以插件形式注入使用。

整体来看,为了实现i18n,在目录src/locales/index.js 注册该插件(如上代码),接着在

new Vue({
  i18n,
  render: h => h(App),
}).$mount('#app')

vue实例中注入。就像使用vue Router那样!

再建立这样的目录结构,为了页面各个部分都能在设置某一语言下 而显示对应语言内容,我们通过vuex 全局状态管理 保存语言属性(lang)以及设置语言的方法(setLang) 实现 跨组件的通信以方便:在切换时 所有组件的语言保持统一

在设计模块时,可以按照一定的规范:比如要实现网页能够切换中文英文

要能够显示英文内容则为:

很显然:实现i18n的逻辑就是,设置同样的键,但是在你切换 或者你访问页面时,页面根据你当前设备和地区的偏好语言自动设置

i18n.locale('lang',lang)

当设置lang为中文(zn-CN)时 将使用中文的语言映射对象,与此同时,设置lang为英文(en-US) 将使用英文的语言映射对象

而且我们看到: 映射对象中键的设计是有规范的: 使用 模块.功能.子功能 的层级结构

例如:menu.dashboard.analysis

便于管理和避免命名冲突

为了 实现模块化开发,将页面的不同部分分为不同模块,但在index.js 统一导入并导出 这方便了维护不同部分的内容。 详细的实现如下:

import enUS from './lang/en-US'
import znCN from './lang/zh-CN'
Vue.use(VueI18n)

export const defaultLang = 'en-US'

// 实例化i18n 进行基础设置
const messages = {
    'en-US': {
        ...enUS
    },
    'zh-CN': {
        ...znCN
    }
}

想要适配其他语言,就再维护一套 该语言的 模块即可。

也就是你只需要新增

  • [locale] 目录
  • 目录下其他模块的语言映射对象

[locale].js 用于统一导入并导出

接着在src/locale/index.js 里导入即可

在组件中如何使用?

使用$t() 函数,该函数在注册i18n插件时 自动合并在vue实例下,所以全局可用

你只需要传入 对应的键 插件会根据当前语言 选择使用对应的语言显示!

并且,为了优化 我们在动态加载语言的时候 使用魔法注释/* webpackChunkName: lang-[request] */ 以分成多个chunk包,以便语言包的按需加载

总结

Vue-i18n 的插件 极大方便了为了实现国际化的vue项目的需求。

通过模块化的开发方式可以很方便的维护各个部分的语言显示预设。

这是我从开源项目中学到的一个重要一点! 如果你有问题 可以随时与我联系

Respect !