Vuejs 属性 或方法“welcome”未定义

Vuejs Property or method “welcome” is not defined

试图在我的组件中获取语言环境,但出现此错误:

[Vue warn]: Property or method "welcome" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

代码

commented each file for better understanding.

app.js

全局定义 i18n translationsswitch languages drop-down

//.....
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
import i18n from './components/Layouts/localesData' // translations
Vue.component('locale-dropdown', require('./components/Layouts/locales').default); // switch langs drop-down


const app = new Vue({
    el: '#app',
    router,
    store,
    i18n,
    render: h => h(App)
});

localesData.js

翻译

   export default {
        en: {
            welcome: `<h1>welcome<h1>`,
        },
        id: {
            welcome: `<h1>selamat datang<h1>`,
        }
    }

locales.js

定义支持的局部变量并在下拉列表中显示它们

<template>
  <div class="dropdown">
    <button
      class="btn dropdown-toggle"
      type="button"
      id="dropdownMenuButton"
      data-toggle="dropdown"
      aria-haspopup="true"
      aria-expanded="false"
    >
      {{ $i18n.locale | capitalize }}
    </button>
    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
      <a
        v-for="(locale, index) in locales"
        :key="index"
        class="dropdown-item"
        href="#"
        @click.prevent="setLocale(locale)"
      >
        {{ locale | capitalize }}
      </a>
    </div>
  </div>
</template><script>
export default {
  data() {
    return {
      locales: ["en", "id"],
    };
  },
  filters: {
    capitalize: function (value) {
      if (!value) return "";
      value = value.toString();
      return value.toUpperCase();
    },
  },
  methods: {
    setLocale(language) {
      this.$store
        .dispatch("changeLocale", language)
        .then(() => {
          this.$i18n.locale = language;
        })
        .catch((error) => {});
    },
  },
};
</script>

store.js

在本地存储中存储用户选择的语言

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)
import locale from "./locale";

const store = new Vuex.Store({
    modules: {
        locale
    },
   //....
})

// here is "import locale from "./locale";" in store.js file //
const CHANGE_LOCALE = "CHANGE_LOCALE";

export default {
    state: {
        locale: localStorage.getItem('locale') || 'en'
    },
    mutations: {
        [CHANGE_LOCALE](state, language) {
            state.locale = language;
        },
    },
    actions: {
        changeLocale({ commit }, language) {
            return new Promise((resolve, reject) => {
                localStorage.setItem('locale', language);
                commit(CHANGE_LOCALE);
                resolve('Success');
            });
        }
    },
    getters: {

    }
}

welcome component

显示翻译

{{ $t(welcome) }} // return error

知道我为什么会出错以及如何解决吗?

要显示键 welcome 的本地化翻译,您的模板应将 welcome 指定为 字符串文字 (即 'welcome' ).否则,它会被视为一个 属性 名称,它需要存在于您的组件数据中。

<div>{{ $t('welcome') }}</div>

const messages = {
  en: {
    welcome: 'hello world'
  },
  ja: {
    welcome: 'こんにちは、世界'
  }
}

const i18n = new VueI18n({
  locale: 'ja',
  messages,
})

new Vue({ i18n }).$mount('#app')
<script src="https://unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<script src="https://unpkg.com/vue-i18n@8.22.2/dist/vue-i18n.js"></script>

<div id="app">
  <p>{{ $t('welcome') }}</p>
</div>

已解决

我已经像这样更改了 app.js 中的代码,它解决了问题:

// changed the name from "i18n" to "localesData"
import localesData from './components/Layouts/localesData'

// instead defined "i18n" here
const i18n = new VueI18n({
    locale: 'en',
    messages: localesData, // and defined it as "messages" here
})