This library is a simple wrapper for i18next, simplifying its use in Vue 3.
There is also a Vue 2 version of this package.
In the documentation, you can find information on how to upgrade from @panter/vue-i18next
, from i18next-vue
3.x or earlier versions.
npm install i18next-vue
import Vue from "vue";
import i18next from "i18next";
import I18NextVue from "i18next-vue";
import App from "./App.vue";
/*const i18nInitialized = */i18next.init({ ... });
createApp(App).use(I18NextVue, { i18next }).mount('#app');
// to wait for loading the translations first, do this instead:
// i18nInitialized.then(() => createApp(App).use(I18NextVue, { i18next }).mount('#app'));
Use the $t
translation function, which works like (and uses) the versatile t
function from i18next.
There is a full tutorial for setting up i18next-vue. You can check out the live demo version version of it, too.
To learn about more options, check out the full documentation.
Given the i18next translations
i18next.init({
// ...
resources: {
en: {
// language
translation: {
// the default namespace
insurance: "Insurance",
},
},
de: {
// language
translation: {
// the default namespace
insurance: "Versicherung",
},
},
},
});
You can use
<template>
<h1>A test in {{ $i18next.language }}</h1>
<p>{{ $t("insurance") }}</p>
</template>
$t()
works both in Options API and Composition API components.
Using the useTranslation()
composition function you can access the i18next instance and t()
in the setup
part, and e.g. get a t()
functions for a specific namespace.
<script setup>
import { computed } from "vue";
import { useTranslation } from "i18next-vue";
const { i18next, t } = useTranslation();
const term = computed(() => t("insurance"));
</script>
<template>
<h1>A test in {{ i18next.language }}</h1>
<p>inline: {{ t("insurance") }}</p>
<p>inline with $t: {{ $t("insurance") }}</p>
<p>computed: {{ term }}</p>
</template>
i18next-vue provides a <i18next>
translation component, so you can use markup (including Vue components) in translations.
In this example {faq-link}
will be replaced by the faq-link
slot, i.e. by the router link. You can move {faq-link}
around in the translation, so it makes sense for the target language.
i18next.init({
// ...
resources: {
en: {
translation: {
"message": "Open the {faq-link} page."
"faq": "Frequently Asked Questions"
}
},
fr: {
// ...
}
}
})
<template>
<i18next :translation="$t('message')">
<template #faq-link>
<router-link :to="FAQ_ROUTE">
{{ $t("faq") }}
</router-link>
</template>
</i18next>
</template>
Custom slot values may be useful when the default braces ({
and }
) are wrongly treated by the
Locize service or don't satisfy other needs.
Use custom values for recognizing start and end of the insertion points of the <i18next>
/TranslationComponent
inside the localization term:
// main.js
i18next.init({
// ...
resources: {
en: {
translation: {
"message": "Open the <slot>faq-link</slot> page."
"faq": "FAQ"
}
},
de: {
// ...
}
}
})
app.use(I18NextVue, {
i18next,
slotStart: '<slot>',
slotEnd: '</slot>',
});
<!-- Component.vue -->
<template>
<i18next :translation="$t('message')">
<template #faq-link>
<router-link :to="FAQ_ROUTE">
{{ $t("faq") }}
</router-link>
</template>
</i18next>
</template>
- Node.js >= v20