Настройка i18n-фреймворка (vue-i18n) для Vue-приложения

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка i18n-фреймворка (vue-i18n) для Vue-приложения
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Настройка i18n-фреймворка (vue-i18n) для Vue-приложения

Vue I18n — официальный i18n-пакет Vue.js. Версия 9.x работает с Vue 3 Composition API и поддерживает как Options API, так и <script setup>. Имеет встроенную поддержку ICU Message Format, ленивой загрузки переводов и SSR через Nuxt i18n.

Установка

npm install vue-i18n@9

Настройка плагина

// src/i18n/index.ts
import { createI18n } from 'vue-i18n'
import ru from './locales/ru.json'
import en from './locales/en.json'

export type MessageSchema = typeof ru

const i18n = createI18n<[MessageSchema], 'ru' | 'en'>({
  legacy: false,          // Использовать Composition API
  locale: 'ru',
  fallbackLocale: 'en',
  messages: { ru, en },
  datetimeFormats: {
    ru: {
      short: { day: 'numeric', month: 'short', year: 'numeric' },
      long:  { day: 'numeric', month: 'long',  year: 'numeric', weekday: 'long' },
    },
    en: {
      short: { month: 'short',  day: 'numeric', year: 'numeric' },
      long:  { month: 'long',   day: 'numeric', year: 'numeric', weekday: 'long' },
    },
  },
  numberFormats: {
    ru: {
      currency: { style: 'currency', currency: 'RUB', maximumFractionDigits: 0 },
      decimal:  { style: 'decimal', minimumFractionDigits: 2 },
    },
    en: {
      currency: { style: 'currency', currency: 'USD' },
      decimal:  { style: 'decimal', minimumFractionDigits: 2 },
    },
  },
})

export default i18n
// src/main.ts
import { createApp } from 'vue'
import i18n from './i18n'
import App from './App.vue'

createApp(App).use(i18n).mount('#app')

Файлы переводов

// src/i18n/locales/ru.json
{
  "nav": {
    "catalog": "Каталог",
    "cart": "Корзина | Корзина ({n} товар) | Корзина ({n} товаров)",
    "account": "Личный кабинет"
  },
  "product": {
    "addToCart": "В корзину",
    "inStock": "В наличии",
    "outOfStock": "Нет в наличии",
    "price": "Цена"
  },
  "form": {
    "required": "Поле обязательно",
    "email": "Введите корректный email",
    "submit": "Отправить"
  }
}

Vue I18n поддерживает упрощённый синтаксис плюрализации через |:

  • 'нет товаров | {n} товар | {n} товара | {n} товаров' — 4 формы для русского (0, 1, 2–4, 5+)

Или полный ICU через режим messageResolver.

Использование в компонентах

<script setup lang="ts">
import { useI18n } from 'vue-i18n'

const { t, n, d, locale, availableLocales } = useI18n()

const props = defineProps<{
  product: {
    title: string
    price: number
    inStock: boolean
    createdAt: Date
  }
  cartCount: number
}>()
</script>

<template>
  <article>
    <h2>{{ product.title }}</h2>

    <!-- Форматирование числа как валюты -->
    <p>{{ n(product.price, 'currency') }}</p>

    <!-- Наличие -->
    <span>{{ product.inStock ? t('product.inStock') : t('product.outOfStock') }}</span>

    <!-- Дата -->
    <time>{{ d(product.createdAt, 'short') }}</time>

    <!-- Плюрализация в nav -->
    <span>{{ t('nav.cart', cartCount, { n: cartCount }) }}</span>

    <button>{{ t('product.addToCart') }}</button>
  </article>
</template>

Ленивая загрузка переводов

// src/i18n/index.ts — только базовые сообщения при старте
const i18n = createI18n({
  legacy: false,
  locale: 'ru',
  fallbackLocale: 'ru',
  messages: { ru },  // только ru при инициализации
})

// Загрузка дополнительных локалей
const loadedLocales = new Set(['ru'])

export async function loadLocale(locale: string): Promise<void> {
  if (loadedLocales.has(locale)) return

  const messages = await import(`./locales/${locale}.json`)
  i18n.global.setLocaleMessage(locale, messages.default)
  loadedLocales.add(locale)
}
// src/router/index.ts
router.beforeEach(async (to) => {
  const locale = to.params.locale as string || 'ru'
  await loadLocale(locale)
  i18n.global.locale.value = locale as 'ru' | 'en' | 'de'
})

Nuxt I18n (SSR)

npm install @nuxtjs/i18n
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/i18n'],
  i18n: {
    locales: [
      { code: 'ru', language: 'ru-RU', file: 'ru.json', name: 'Русский' },
      { code: 'en', language: 'en-US', file: 'en.json', name: 'English' },
      { code: 'de', language: 'de-DE', file: 'de.json', name: 'Deutsch' },
    ],
    defaultLocale: 'ru',
    lazy: true,
    langDir: 'locales/',
    strategy: 'prefix_except_default',
    detectBrowserLanguage: {
      useCookie: true,
      cookieKey: 'locale',
      redirectOn: 'root',
    },
  },
})
<!-- pages/catalog/[slug].vue -->
<script setup lang="ts">
const { t, locale } = useI18n()
const localePath = useLocalePath()
const switchLocalePath = useSwitchLocalePath()
</script>

<template>
  <nav>
    <!-- Локализованная ссылка -->
    <NuxtLink :to="localePath('/catalog')">{{ t('nav.catalog') }}</NuxtLink>

    <!-- Переключатель языка -->
    <NuxtLink v-for="lang in ['ru', 'en', 'de']" :key="lang"
      :to="switchLocalePath(lang)">
      {{ lang.toUpperCase() }}
    </NuxtLink>
  </nav>
</template>

TypeScript: типизированные ключи

// Автодополнение ключей переводов
import { useI18n } from 'vue-i18n'
import type { MessageSchema } from '@/i18n'

const { t } = useI18n<{ message: MessageSchema }>()

t('nav.catalog')     // OK
t('nav.nonexistent') // TypeScript Error

Сроки

Базовая настройка vue-i18n с 2 языками — 1 день. Nuxt i18n с ленивой загрузкой, локализованными маршрутами и SEO-тегами — 2–3 дня.