深入vue-element-admin(一)--国际化(router中实现)

vue-element-admin实现语言切换国际化

从github下载的vue-element-admin源码是没有中文版的,那么第一步就来解决这个问题吧。

1.使用vue-i18n
import VueI18n from 'vue-i18n'
Vue.use(Cookies)
Vue.use(VueI18n)
const i18n = new VueI18n({
  locale: 'en', // 语言标识
  messages: {
    zh: require('./assets/lang/zh'),
    en: require('./assets/lang/en')
  }
})
//vue的实例

new Vue({
  el: '#app',
  i18n,
  router,
  store,
  render: h => h(App)
})
2.在src目录下创建lang文件夹,用来配置中英文配置文件

文件夹结构

lang

zh.js
en.js

module.exports = {
  login: {
    title: '登录',
    userName: '用户名',
    password: '密码',
    connect: '联系',
    loginBtn: '登录',
    language: '语言'
  },
  content: {
    main: '这里是内容'
  }
}
en.js
module.exports = {
  login: {
    title: 'login',
    userName: 'userName',
    password: 'password',
    connect: 'Or connect with',
    loginBtn: 'login',
    language: 'language'
  },
  content: {
    main: '这里是内容'
  }
}

3.语言切换的组件

因为vue-element-admin是基于element的,所以element的组件在该项目中也是适用的。效果如下:


图片.png
<div class="languageContent">
            <el-dropdown
              trigger="click"
              @command="handleCommand"
            >
              <span class="el-dropdown-link">
                {{$t('login.language')}}<i class="el-icon-arrow-down el-icon--right"></i>
              </span>
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item command="en">English</el-dropdown-item>
                <el-dropdown-item command="zh">中文</el-dropdown-item>
              </el-dropdown-menu>
            </el-dropdown>
          </div>

@command="handleCommand"是点击事件的钩子,通过该事件绑定对默认的语言进行切换

handleCommand(command) {
      this.$message("click on item " + command);
      this.$i18n.locale = command;
    }

似乎问题已经解决了~~~
但是,刷新或者关闭浏览器后,那么这种操作是不能保持的,所以,我们想记录下用户的偏好喜欢,在下一次使用时不用做重复操作了。
so~把状态存储到缓存或者cookie中去吧。
那么需要改动一些地方:
1.语言选择时,将状态存储cookie
2.加载页面时读取cookie内容

设置cookie:
Cookies.set("language", command, { expires: 7 });
cookie是引入的js-cookie npm安装/vue-element-admin其实是安装好的
expires:7是设置的cookie过期时间,不设置的话,浏览器关闭时,cookie失效,(亲测)
在main.js中读取--初始化时修改为:
const i18n = new VueI18n({
  locale: Cookies.get('language') || 'en', // 语言标识
  messages: {
    zh: require('./assets/lang/zh'),
    en: require('./assets/lang/en')
  }
})

大功告成~
似乎,element文档里,有其他配置好的语言包,后面如果用到再补充说明吧

二更~~~(router路由中实现)

前面解决了i18n在vue文件中的引用,然后在后面想在路由文件中实现,在文档中查询在js使用方式为:this.$t.('xxx.xx')'xxx.xx')
例如:router-table

{
    path: "inline-edit-table",
      component: () => import("@/views/table/inline-edit-table"),
      name: "InlineEditTable",
      meta: { title: this.$t.("route.inlineEditTable" )}
    },

但是,这样是错误的,提示$t是undefined
原因是:this的指针在router的配置文件中指向的不是vue(猜测的)
于是乎,有去github上找到分支版本研究,找到了解决方案。
在untils工具目录下新建一个i18n.js对路由配置的名称做一次中转:

// translate router.meta.title, be used in breadcrumb sidebar tagsview
export function generateTitle(title) {
  const hasKey = this.$te("route." + title);
  if (hasKey) {
    // $t :this method from vue-i18n, inject in @/lang/index.js
    const translatedTitle = this.$t("route." + title);

    return translatedTitle;
  }
  return title;
}

然后在导航vue文件中调用(SiderbarItem.vue)

<el-menu-item
    :index="resolvePath(onlyOneChild.path)"
      :class="{'submenu-title-noDropdown':!isNest}"
        >
<item
:icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)"
            :title="generateTitle(onlyOneChild.meta.title)"
          />
        </el-menu-item>

只是截取了部分代码,详细的请查询:
vue-element-admin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容