Nuxt и SSR
vue-i18n-kit безопасен для SSR. Состояние плагина хранится для каждого инстанса приложения Vue через provide/inject, а не как синглтон на уровне модуля, поэтому параллельные SSR-запросы не могут заражать друг друга.
Вызовы localStorage (используемые persistLocale) на сервере молча ничего не делают — try/catch обрабатывает отсутствие глобального объекта.
Настройка Nuxt
ts
// plugins/i18n.ts
import { defineNuxtPlugin } from '#app'
import { createVueI18nPlugin } from 'vue-i18n-kit'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(
createVueI18nPlugin({
defaultLocale: 'en',
fallbackLocale: 'en',
locales: {
en: {
messages: () => import('~/locales/en.json'),
meta: { display: 'English', flag: '🇬🇧' },
},
ru: {
messages: () => import('~/locales/ru.json'),
meta: { display: 'Русский', flag: '🇷🇺' },
},
},
}),
)
})Определение локали на стороне сервера
Чтобы выбрать локаль на основе заголовка Accept-Language:
ts
// plugins/i18n.ts
import { defineNuxtPlugin, useRequestHeaders } from '#app'
import { createVueI18nPlugin } from 'vue-i18n-kit'
const SUPPORTED = ['en', 'ru']
export default defineNuxtPlugin((nuxtApp) => {
const headers = useRequestHeaders(['accept-language'])
const accepted = headers['accept-language'] ?? ''
const detected = SUPPORTED.find((code) => accepted.toLowerCase().includes(code))
nuxtApp.vueApp.use(
createVueI18nPlugin({
defaultLocale: detected ?? 'en',
fallbackLocale: 'en',
locales: {
en: () => import('~/locales/en.json'),
ru: () => import('~/locales/ru.json'),
},
}),
)
})Заметки
persistLocale— работает только на клиенте; на сервере молча игнорируется.- Гидратация — сервер и клиент рендерят с одинаковой
defaultLocale. Если вы используетеpersistLocale, клиент восстановит сохранённую локаль пользователя после гидратации. - Vite-плагин и CLI — работают так же в проектах Nuxt. Добавьте
vueI18nMapPluginвnuxt.config.tsподvite.plugins. plugin.serviceв Nuxt — создавайте плагин внутриdefineNuxtPlugin(не на уровне модуля), чтобы каждый SSR-запрос получал свой собственный инстансservice.