Свойство Vuejs или метод «приветствие» не определен

Пытаюсь получить локали в своих компонентах, но получаю эту ошибку:

[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://v2.vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

Код

прокомментировал каждый файл для лучшего понимания.

app.js

Глобальное определение i18ntranslations и switch 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

Сохранить выбранный пользователем язык в localStorage

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

Любая идея, почему я получаю сообщение об ошибке и как ее исправить?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 628
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы отобразить локализованный перевод ключа 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/[email protected]/dist/vue.min.js"></script>
<script src = "https://unpkg.com/[email protected]/dist/vue-i18n.js"></script>

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

это устранит ошибку, но просто напечатает welcome вместо приветственного значения.

mafortis 14.12.2020 06:13

Ваше значение перевода для welcome в en равно <h1>welcome<h1>, так что это кажется ожидаемым.

tony19 14.12.2020 06:14

это ради упрощения вопроса, мое фактическое значение строки welcome намного длиннее, чем это

mafortis 14.12.2020 06:15

У меня нет этого конфига locale: 'ja', messages, в моем app.js он идет из отдельных файлов.

mafortis 14.12.2020 06:21

Я добавил демо. Не похоже, что вы правильно инициализируете vue-i18n. И ваш перевод на скриншоте не структурирован так же, как в вашем вопросе (т. Е. На вашем скриншоте показано, что welcome вложен в id), так что это еще одна проблема, которую необходимо решить.

tony19 14.12.2020 06:22

хорошо, позвольте мне объяснить: id, en - это определения языков, поэтому, если пользователь выберет English, welcome под en вернется.

mafortis 14.12.2020 06:24
kazupon.github.io/vue-i18n/guide/…
mafortis 14.12.2020 06:27
Ответ принят как подходящий

Решено

Я изменил свой код в 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
})

Другие вопросы по теме