当前位置:   article > 正文

解决vue i18n 项目中 title 双英 切换问题_i18n.t is not a function

i18n.t is not a function

主要问题点在于 router 中无法用 this.$t('xxx.xx') 方法来进行翻译,会报错 this.$t is not a function 。而在main.js中可以使用,所以就做了一下处理:

main.js文件:

  1. const i18n = new Vue18n({
  2. locale: lan,
  3. messages: {
  4. zh: require("./assets/i18n/zh"),
  5. en: require("./assets/i18n/en")
  6. },
  7. silentTranslationWarn: true
  8. })
  9. router.beforeEach((to, from, next) => {
  10. if (to.meta.title) {
  11. document.title = `${i18n.t('meta.'+to.meta.title)} - ${i18n.t('meta.base')}`
  12. }
  13. next()
  14. })

navbar.vue中点击切换语言:

  1. changeLan(type) {
  2. this.$i18n.locale = type;
  3. document.title = `${i18n.t('meta.'+this.$route.meta.title)} - ${i18n.t('meta.base')}`
  4. }

router/index.js中(关键点是里面设置的title要和i18n配置中的相对应):

  1. export default new Router({
  2. mode: 'history',
  3. routes: [
  4. { path: '/XX', name: 'XX',meta: { title: 'A' },……},
  5. { path: '/XX', name: 'XX',meta: { title: 'B' }, …… },
  6. ]
  7. })

en.js/zh.js配置:

  1. module.exports = {
  2. meta:{base:'XXX',A:'XXX',B:'X',E:'XX'}
  3. };

这样下来点击切换页面title也同时改变,爽歪歪,哈哈

当然目前代码有点冗余,两处改变document.title的方法都一样,提公用下,assets/js中新建title.js:

  1. export function getPageTitle(i18n,key) {
  2. const hasKey = i18n.te(`meta.${key}`)
  3. const title = i18n.t(`meta.base`)
  4. if (hasKey) {
  5. const pageName = i18n.t(`meta.${key}`)
  6. return `${pageName} - ${title}`
  7. }
  8. return `${title}`
  9. }

这个方法是参考 vue-element-admin i18n分支里的方法,比较完善一些。

分别在main.js和navbar.vue中引入:

import { getPageTitle } from './assets/js/title';

import { getPageTitle } from '../../assets/js/title';

main.js中:

  1. const i18n = new Vue18n({
  2. locale: lan,
  3. messages: {
  4. zh: require("./assets/i18n/zh"),
  5. en: require("./assets/i18n/en")
  6. },
  7. silentTranslationWarn: true
  8. })
  9. router.beforeEach((to, from, next) => {
  10. if (to.meta.title) {
  11. document.title = getPageTitle(i18n,to.meta.title)
  12. }
  13. next()
  14. })

navbar.vue中:

  1. changeLan(type) {
  2. this.$i18n.locale = type;
  3. document.title = getPageTitle(this.$i18n,this.$route.meta.title)
  4. }

然后OK。

另附上Vue i18n 官方API:

$te

  • 参数:

    • {Path} key:必填
    • {Locale} locale:可选
  • 返回值:boolean

检查 key 是否存在。在 Vue 实例中,如果未指定组件语言环境信息,则使用全局语言环境信息。如果指定了 locale,则使用 locale 的语言环境。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/332195
推荐阅读
相关标签
  

闽ICP备14008679号