#typescript #nuxt.js #vue-i18n #nuxt-i18n
#машинописный текст #nuxt.js #vue-i18n #nuxt-i18n
Вопрос:
Я хочу создать переключатель языков в моем приложении nuxt с помощью плагина nuxt-i18n. Важным примечанием является то, что я использую TypeScript вместо JavaScript.
Как указано в документации (https://i18n.nuxtjs.org/lang-switcher ) Я внедрил следующий код в свой компонент Navbar:
TheNavbar.vue
<template>
<nav class="navbar">
<div class="container">
<div>
<NuxtLink
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">{{ locale.name }}
</NuxtLink>
</div>
</div>
</nav>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
name: "TheNavbar",
computed: {
availableLocales() {
return this.$i18n.locales.filter(i => i.code !== this.$i18n.locale);
}
}
})
В моем приложении это решение работает. Но консоль выводит две следующие ошибки:
ERROR ERROR in src/components/shared/TheNavbar.vue:25:14 18:49:05
TS2532: Object is possibly 'undefined'.
23 | computed: {
24 | async availableLocales() {
> 25 | return this.$i18n.locales.filter(i => i?.code !== this.$i18n.locale);
| ^^^^^^^^^^^^^^^^^^
26 | }
27 | }
28 | })
ERROR in src/components/shared/TheNavbar.vue:25:48
TS2339: Property 'code' does not exist on type 'string | LocaleObject'.
Property 'code' does not exist on type 'string'.
23 | computed: {
24 | async availableLocales() {
> 25 | return this.$i18n.locales.filter(i => i?.code !== this.$i18n.locale);
| ^^^^
26 | }
27 | }
28 | })
Моя конфигурация i18n в nuxt.config.js:
i18n: {
locales: [
{
code: 'de',
name: 'Deutsch',
},
{
code: 'en',
name: 'English'
}
],
defaultLocale: 'de',
vueI18n: {
fallbackLocale: 'de',
messages: {
de: {
welcome: 'Willkommen'
},
en: {
welcome: 'Welcome'
}
}
}
},
Ответ №1:
Чтобы избавиться от этих ошибок, добавьте !
оператор выражения после исправления в this.$i18n.locales
, потому что это не будет null
или undefined
, и сообщите typescript, что i
это может быть что угодно:
public get availableLocales(): any {
return this.$i18n.locales!.filter(i => (i as any).code !== this.$i18n.locale)
}
Редактировать: 9 апреля ’21
Если вы используете текущую версию Nuxt (v2.15.4), это рабочий код:
public get availableLocales(): any {
return ((this.$i18n.locales as (string | number)[])).filter((i: any) => i.code !== this.$i18n.locale)
}
Ответ №2:
Попробуйте это:
<NuxtLink
v-if="availableLocales"
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">{{ locale.name }}
</NuxtLink>