Налаштування 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 підтримує спрощений синтаксис плюралізації через |:

  • 'no items | {n} item | {n} items' — 3 форми для англійської

Або повна 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 дні.