Vue.js предоставляет мощный механизм для организации логики приложения через Composition API. Одним из распространённых сценариев является работа с локализацией и переводами текста в приложении. В Composition API подход к переводам отличается гибкостью и модульностью по сравнению с Options API.
Локализация (i18n) в Vue.js предполагает хранение текстов на разных языках и их динамическую подстановку в интерфейсе. Ключевые моменты:
Пример структуры JSON для английского и русского языков:
// en.json
{
"welcome": "Welcome",
"logout": "Logout",
"profile": {
"greeting": "Hello, {name}!"
}
}
// ru.json
{
"welcome": "Добро пожаловать",
"logout": "Выйти",
"profile": {
"greeting": "Привет, {name}!"
}
}
Vue I18n предоставляет встроенные функции для работы с переводами через Composition API. Основные функции:
useI18n() — подключение системы локализации к
компоненту.t() — функция для получения перевода по ключу.locale — реактивная переменная текущего языка.availableLocales — массив доступных языков.Пример базовой конфигурации:
import { createApp } from 'vue';
import { createI18n } from 'vue-i18n';
import App from './App.vue';
import en from './locales/en.json';
import ru from './locales/ru.json';
const messages = { en, ru };
const i18n = createI18n({
legacy: false, // для Composition API
locale: 'ru',
fallbackLocale: 'en',
messages
});
const app = createApp(App);
app.use(i18n);
app.mount('#app');
В Composition API доступ к переводам осуществляется через
useI18n:
import { useI18n } from 'vue-i18n';
import { ref } from 'vue';
export default {
setup() {
const { t, locale } = useI18n();
const username = ref('Алексей');
const changeLanguage = (lang) => {
locale.value = lang;
};
return { t, locale, username, changeLanguage };
}
};
Использование в шаблоне:
<template>
<div>
<h1>{{ t('welcome') }}</h1>
<p>{{ t('profile.greeting', { name: username }) }}</p>
<button @click="changeLanguage('en')">EN</button>
<button @click="changeLanguage('ru')">RU</button>
</div>
</template>
Ключевые моменты:
t('profile.greeting', { name: username }) поддерживает
параметризацию текста.locale.value автоматически обновляет все переводы
в компоненте.ref используется для реактивных данных, подставляемых в
переводы.В крупных приложениях полезно разделять переводы по функциональным модулям:
/locales
/en
auth.json
dashboard.json
/ru
auth.json
dashboard.json
Для динамической подгрузки можно использовать
import:
async function loadLocaleMessages(locale) {
const messages = await import(`./locales/${locale}/auth.json`);
i18n.global.setLocaleMessage(locale, messages.default);
i18n.global.locale.value = locale;
}
Такой подход уменьшает размер начальной сборки и позволяет подгружать переводы по мере необходимости.
Vue I18n поддерживает локализацию чисел, валют и дат:
const { n, d } = useI18n({
numberFormats: {
en: { currency: { style: 'currency', currency: 'USD' } },
ru: { currency: { style: 'currency', currency: 'RUB' } }
},
datetimeFormats: {
en: { short: { year: 'numeric', month: 'short', day: 'numeric' } },
ru: { short: { year: 'numeric', month: 'long', day: 'numeric' } }
}
});
const amount = 12345.67;
const date = new Date();
В шаблоне:
<p>{{ n(amount, 'currency') }}</p>
<p>{{ d(date, 'short') }}</p>
Это позволяет адаптировать интерфейс под локальные стандарты отображения информации.
{name}, {count}).fallbackLocale для предотвращения
ошибок при отсутствии перевода.Composition API обеспечивает простую реактивную смену языка в приложении. Это позволяет создавать динамические интерфейсы, где пользователи могут переключать язык без перезагрузки страницы, а все компоненты автоматически обновляют свои переводы.
const { locale } = useI18n();
function toggleLanguage() {
locale.value = locale.value === 'ru' ? 'en' : 'ru';
}
Использование реактивной переменной locale гарантирует
синхронизацию перевода во всех компонентах, использующих
t().
createI18n.useI18n в компонентах для реактивных
переводов.locale.Такой подход обеспечивает масштабируемость и удобство поддержки локализации в сложных Vue-приложениях.