开发者问题收集

在 Vue 组件中访问 i18n.locales 并动态更改其值时出现问题

2022-05-04
3186

我有一款小型 vue 应用,我想在其中实现 vue-i18n 插件,以使我的应用支持多种语言。我已从 vue cli 安装了 vue-i18n 插件。我有两个语言环境,并且一切都按预期工作 - 每当我手动将语言环境从.env 文件更改为所需语言时,应用程序中的语言也会更改。但是,每当我尝试使用前端的按钮更改它时,我都无法这样做。

这是我在 i18n.js 文件中的内容:

import { createI18n } from 'vue-i18n'

function loadLocaleMessages() {
  const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.json$/i)
  const messages = {}
  locales.keys().forEach(key => {
    const matched = key.match(/([A-Za-z0-9-_]+)\./i)
    if (matched && matched.length > 1) {
      const locale = matched[1]
      messages[locale] = locales(key)
    }
  })
  return messages
}

export default createI18n({
  legacy: false,
  locale: process.env.VUE_APP_I18N_LOCALE || 'en',
  fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en',
  messages: loadLocaleMessages()
})

这是在 .env 文件中:

VUE_APP_I18N_LOCALE=en
VUE_APP_I18N_FALLBACK_LOCALE=en

这是我看到的教程中的代码,他们通过 this.$i18n.locale 访问语言环境,但这对我来说不起作用,这是我尝试实现它的方式:

<template>
  <div class="hello">
    <h1>Hello World</h1>
    <h2>{{ t("hello") }}</h2>
    <h2>{{ t("message") }}</h2>
    <button @click="SetLocale('en')">EN</button>
    <button @click="SetLocale('nl')">NL</button>
  </div>
</template>

<script>
import { useI18n } from "vue-i18n";
export default {
  name: "HelloWorld",
  setup() {
    const { t } = useI18n({
      inheritLocale: true,
      useScope: "local",
    });

    // Something todo ..

    return { t };
  },
  methods: {
    SetLocale(locale) {
      console.log(locale);
      this.$i18n.locale = locale;
    },
  },
};
</script>

<i18n>
{
  "en": {
    "hello": "Hello i18n in English! (from component)"
  },
  "nl": {
    "hello": "Hello i18n in Dutch! (from component)"
  }
}
</i18n>

我收到的错误是:

[Vue warn]: Unhandled error during execution of native event handler

Uncaught TypeError: Cannot set properties of undefined (setting 'locale')

我尝试过其他一些解决方案,例如 i18n.localethis.$root.$i18n.locale 但它们似乎也不起作用。

此外,当我尝试访问 <h2>{{ t("message") }}</h2> 时,其中 message 来自 locales 文件夹中的 JSON 文件,我收到以下警告:

[intlify] Not found 'message' key in 'nl' locale messages.

[intlify] Fall back to translate 'message' key with 'en' locale

[intlify] Not found 'message' key in 'en' locale messages.

[intlify] Fall back to translate 'message' key with 'nl' locale

我的问题是,我在哪里做错了什么,有没有办法摆脱当我尝试从 locales 文件夹访问 JSON 文件时出现的警告>

2个回答

问题出在这行代码上:

SetLocale(locale) { this.$i18n.locale = locale; },

this.$i18n.locale = locale; 替换为 i18n.global.locale.value = locale;

santhosh kumar
2022-07-13

对于版本 8

在您的 i18n.js 文件中添加此功能

export function setI18nLanguage(lang) {
  i18n.locale = lang
  document.querySelector('html').setAttribute('lang', lang)
  return lang
}

然后如果您使用 vuex 则在商店中

changeLang(state, payload) {
  state.lang = payload.lang
  setI18nLanguage(state.lang)
},

在您的组件中更改语言

<select
  class="form-control"
  id="language"
  v-model="selectedLang"
  @change="changeLang"
>
  <option
    v-for="(option, index) in langOptionsDD"
    :key="index"
    :value="option.value"
    :selected="selectedLang"
  >
    {{ option.text }}
  </option>
</select>


  data() {
    return {
      langOptionsDD: [
        {
          value: "en",
          text: "English",
        },
        {
          value: "ar",
          text: "Arabic",
        },
      ],
      selectedLang: this.$store.state.lang,
    };
  },
  methods: {
    changeLang() {
      if (this.selectedLang) {
        this.$store.commit("changeLang", {
          lang: this.selectedLang,
        });
      }

      console.log(this.$store.state.lang);
    },
  },
Omar Hegazi
2022-11-17