• nuxt.js使用vuei18n实现多语言,SSR 广东靓仔


    欢迎关注前端早茶,与广东靓仔携手共同进阶

    前端早茶专注前端,一起结伴同行,紧跟业界发展步伐~

    一、实现步骤

    1、安装vue-i18n并且创建store.js(vuex状态管理)文件

    2、创建一个(middleware)中间件,用来管理不同的语言

    3、创建不同语言的json文件作为语言包(例如: ~locales/en.json)

    4、在pages文件夹下创建文件,并进行翻译

    二、详细步骤

    1、安装vue-i18n

    1
    npm install vue-i18n --save

    2、在nuxt应用程序中引入vue-i18n

    新建文件  ~plugins/i18n.js,内容如下:

    import Vue from 'vue';
    import VueI18n from 'vue-i18n';
    Vue.use(VueI18n);
    export default ({ app, store }) => {
      // Set i18n instance on app
      // This way we can use it in middleware and pages asyncData/fetch
      app.i18n = new VueI18n({
        locale: store.state.locale,
        fallbackLocale: 'en',
        messages: {
          'en': require('~/locales/en.json'),
          'fr': require('~/locales/fr.json')
        }
      });
      app.i18n.path = (link) => {
        if (app.i18n.locale === app.i18n.fallbackLocale) {
          return `/${link}`;
        }
        return `/${app.i18n.locale}/${link}`;
      }
    }

    3、使用vuex保存当前语言状态

    新建文件~store/index.js,内容如下:

    export const state = () => ({
      locales: [‘en’, ‘fr’],
      locale: ‘en’
    })
    export const mutations = {
      SET_LANG(state, locale) {
        if (state.locales.indexOf(locale) !== -1) {
          state.locale = locale
        }
      }
    }

    4、在middleware下新建i18n.js用来控制语言切换

    /*
     * 1. sets i18n.locale and state.locale if possible
     * 2. redirects if not with locale
     */
    export default function ({
      isHMR, app, store, route, params, error, redirect
    }) {
      if (isHMR) { // ignore if called from hot module replacement
        return;
      } // if url does not have language, redirect to english
      else if (!params.lang) {
        return redirect('/en'+route.fullPath);
      }
      // based on directory structure _lang/xxxx, en/about has params.lang as "en"
      const locale = params.lang || 'en';
      store.commit('SET_LANG', locale); // set store
      app.i18n.locale = store.state.locale;
    }

    5、修改nuxt.config.js文件配置如下:

    module.exports = {
      loading: { color: '#3B8070' },
      build: {               // customize webpack build
        vendor: ['vue-i18n'] // webpack vue-i18n.bundle.js
      },
      router: {              // customize nuxt.js router (vue-router).
        middleware: 'i18n'   // middleware all pages of the application
      },
      plugins: ['~/plugins/i18n.js'], // webpack plugin
      generate: {
        routes: ['/', '/about', '/fr', '/fr/about']
      }
    }

    6、创建本地语言包

    例如:(~locales/en.js) 

    {
      "links": {
        "home": "Home",
        ...
      },
      "home": {
        "title": "Welcome",
        "introduction": "This is an introduction in English."
      },
      "about": {
        "title": "About",
        "introduction": "..."
      }
    }

    (~locales/fr.js)

    {
      "links": {
        "home": "Accueil",
        ...
      },
      "home": {
        "title": "Bienvenue",
        "introduction": "Ceci est un texte d'introduction en Français."
      },
      "about": {
        "title": "À propos",
        "introduction": "..."
      }
    }

    7、创建页面,并添加翻译

    ~pages/_lang/index.vue

    ~pages/_lang/about.vue

    <template>
      <div class="Content">
        <div class="container">
          <h1 class="Content__Title">{{ $t('about.title') }}</h1>
          <p>{{ $t('about.introduction') }}</p>
        </div>
      </div>
    </template>
    <script>
    export default {
      head() {
        return { title: this.$t('about.title') }
      }
    }
    </script>  

    欢迎关注前端早茶,与广东靓仔携手共同进阶

    前端早茶专注前端,一起结伴同行,紧跟业界发展步伐~

  • 相关阅读:
    Exception in thread "main" java.lang.IllegalArgumentException:解决方法
    Warning: $HADOOP_HOME is deprecated.解决方法
    Android :TextView使用SpannableString设置复合文本
    一、harbor部署之centos7的基本配置
    木马基础知识要点
    【原创】红客闯关游戏部分题解
    【原创】利用Office宏实现powershell payload远控
    【原创】字典攻击教务处(BurpSuite使用)
    【原创】逆向练习(CrackMe)
    显式游标和隐式游标二者的区别
  • 原文地址:https://www.cnblogs.com/cczlovexw/p/16092229.html
Copyright © 2020-2023  润新知