Vue I18n — это официальная библиотека интернационализации для Vue.js, предназначенная для управления локалями и переводами в приложениях. Она обеспечивает динамическую подстановку переводов, поддержку чисел, валют, дат и времени в соответствии с региональными стандартами. Основной задачей Vue I18n является упрощение процесса мультиязычной разработки и поддержка масштабируемых приложений.
Для интеграции Vue I18n в проект используется пакет
vue-i18n. В проектах на Vue 3 рекомендуется использовать
версию 9+ библиотеки.
npm install vue-i18n@next
Создание экземпляра I18n в приложении:
import { createApp } from 'vue';
import { createI18n } from 'vue-i18n';
import App from './App.vue';
const messages = {
en: { message: { hello: 'Hello World' } },
ru: { message: { hello: 'Привет мир' } }
};
const i18n = createI18n({
locale: 'ru',
fallbackLocale: 'en',
messages
});
const app = createApp(App);
app.use(i18n);
app.mount('#app');
Ключевые моменты:
locale — текущий язык приложения.fallbackLocale — язык по умолчанию при отсутствии
перевода.messages — объект с переводами, сгруппированными по
языкам.Для доступа к переводам внутри Vue-компонентов используется
глобальная функция $t.
<template>
<div>
<p>{{ $t('message.hello') }}</p>
</div>
</template>
Особенности:
$t('ключ') возвращает соответствующий перевод в текущей
локали.Vue I18n позволяет изменять язык приложения в реальном времени без перезагрузки страницы:
methods: {
changeLanguage(lang) {
this.$i18n.locale = lang;
}
}
Переводы могут содержать динамические параметры:
const messages = {
en: { greeting: 'Hello {name}!' },
ru: { greeting: 'Привет, {name}!' }
};
Использование в компоненте:
<p>{{ $t('greeting', { name: 'Алексей' }) }}</p>
Преимущества интерполяции:
Vue I18n предоставляет встроенные функции для локализованного отображения чисел, процентов и валют:
const i18n = createI18n({
locale: 'ru',
numberFormats: {
ru: {
currency: {
style: 'currency',
currency: 'RUB'
}
}
}
});
Использование:
<p>{{ $n(123456.78, 'currency') }}</p>
Особенности форматирования:
$n() — функция для чисел и валют.$d() — функция для форматирования дат.Для корректного отображения дат используется объект
datetimeFormats:
const i18n = createI18n({
locale: 'ru',
datetimeFormats: {
ru: {
short: {
year: 'numeric', month: 'short', day: 'numeric'
}
}
}
});
Использование:
<p>{{ $d(new Date(), 'short') }}</p>
Vue I18n поддерживает различные формы числительных:
const messages = {
en: { car: 'No cars | One car | {count} cars' },
ru: { car: 'Нет машин | {count} машина | {count} машины | {count} машин' }
};
Вывод:
<p>{{ $tc('car', 5, { count: 5 }) }}</p>
Особенности:
$tc() — функция для обработки множественного
числа.Для крупных приложений перевод можно загружать динамически:
async function loadLocaleMessages(locale) {
const messages = await import(`./locales/${locale}.json`);
i18n.global.setLocaleMessage(locale, messages.default);
i18n.global.locale = locale;
}
Преимущества:
Для мультиязычных маршрутов можно синхронизировать локаль с URL:
const routes = [
{ path: '/:locale/home', component: Home }
];
router.beforeEach((to, from, next) => {
const locale = to.params.locale;
if (i18n.global.locale !== locale) {
i18n.global.locale = locale;
}
next();
});
Особенности:
При отсутствии перевода Vue I18n автоматически использует
fallbackLocale. Можно настроить кастомную обработку:
const i18n = createI18n({
locale: 'ru',
fallbackLocale: 'en',
missing: (locale, key) => `Перевод для ${key} отсутствует`
});
Преимущества:
Vue I18n легко интегрируется с UI-компонентами, такими как Vuetify или Element Plus, через вычисляемые свойства или пропсы:
<v-btn>{{ $t('button.submit') }}</v-btn>
auth,
dashboard, profile.camelCase или
snake_case).Основные изменения:
createI18n() вместо
new VueI18n().$t, $tc,
$n, $d доступны через
i18n.global.useI18n():import { useI18n } from 'vue-i18n';
export default {
setup() {
const { t } = useI18n();
return { t };
}
}
Преимущества Composition API: