Как создать кнопку для смены языка с помощью Vue-i18n

У меня есть панель навигации, которую нужно переключать между языками с помощью двух разных кнопок. Я использовал Vue-CLI и Vue-I18N для синтаксиса шаблонов, но не могу менять языки между ними. Решения в документации мне не очень помогли. Мои Header.vue, main.js и App.vue ниже. Я жду ваших ответов. Спасибо.

Заголовок.vue

<template>
    <div>
        <b-navbar
            toggleable="lg"
            type="light"
            variant="light"
        >
            <b-navbar-brand href="#">{{ $t('johnDoe') }}</b-navbar-brand>

            <b-navbar-toggle target="nav-collapse"></b-navbar-toggle>

            <b-collapse
                id="nav-collapse"
                is-nav
            >
                <b-navbar-nav>
                    <b-nav-item href="#">{{ $t('home') }}</b-nav-item>
                    <b-nav-item href="#">{{ $t('about') }}</b-nav-item>
                    <b-nav-item href="#">{{ $t('projects') }}</b-nav-item>
                    <b-nav-item href="#">{{ $t('education') }}</b-nav-item>
                    <b-nav-item href="#">{{ $t('contact') }}</b-nav-item>
                </b-navbar-nav>

                <!-- Right aligned nav items -->
                <b-navbar-nav class="ml-auto">
                    <b-nav-form>
                        <b-button
                            size="sm"
                            class="my-2 my-sm-0 btn-info"
                            type="submit"
                            @click="i18n.locale = 'en'"
                        >{{ $t('english') }}</b-button> &nbsp;
                        <b-button
                            size="sm"
                            class="my-2 my-sm-0"
                            type="submit"
                            @click="i18n.locale = 'tr'"
                        >{{ $t('turkish') }}</b-button>
                    </b-nav-form>
                </b-navbar-nav>
            </b-collapse>
        </b-navbar>
    </div>
</template>

<script>
export default {
  name: 'HelloI18n'
}
</script>

<i18n>
{
  "en": {
    "johnDoe": "John Doe",
    "home": "Home",
    "about": "About Me",
    "projects": "Projects",
    "education": "Education",
    "contact": "Contact",
    "english": "English",
    "turkish": "Turkish"
  },
  "tr": {
    "johnDoe": "John Doe",
    "home": "Anasayfa",
    "about": "Hakkımda",
    "projects": "Projelerim",
    "education": "Eğitim",
    "contact": "İletişim",
    "english": "İngilizce",
    "turkish": "Türkçe"
  }
}
</i18n>

<style scoped>
</style>

App.vue

<template>
  <div id="app">
    <Header></Header>
  </div>
</template>

<script>
import Header from "./components/Header.vue";

export default {
  name: "app",
  components: {
    Header,
  }
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
</style>

main.js

import '@babel/polyfill'
import 'mutationobserver-shim'
import Vue from "vue";
import './plugins/bootstrap-vue'
import App from "./App.vue";
import i18n from './i18n'

Vue.config.productionTip = false;

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


person Kaan G    schedule 23.07.2019    source источник


Ответы (1)


У вас опечатка в событии кнопки @click. i18n доступен из шаблона с «$i18n» и без «i18n», поэтому код вашей кнопки должен быть:

<b-button
  size="sm"
  class="my-2 my-sm-0 btn-info"
  type="submit"
  @click="$i18n.locale = 'en'"
>{{ $t('english') }}</b-button>
person Nacho Moço    schedule 24.07.2019