Skip to content

Composables

useLocale

Возвращает текущую локаль, функцию переключения, флаг загрузки и метаданные активной локали.

ts
import { useLocale } from 'vue-i18n-kit'

const { locale, setLocale, isLoading, localeMeta } = useLocale()
Возвращаемое значениеТипОписание
localeRef<string>Код текущей активной локали (реактивный).
setLocale(lang: string) => Promise<void>Переключиться на другую локаль. Ленивая загрузка JSON при необходимости, затем обновляет locale. Бросает исключение, если lang не зарегистрирован.
isLoadingRef<boolean>true, пока идёт загрузка JSON локали.
localeMetaComputedRef<Record<string, unknown> | undefined>Метаданные активной локали из её LocaleDefinition.meta. Обновляются реактивно при переключении локали.

Передайте generic-тип, чтобы получить типизированный localeMeta без ручного приведения типов:

ts
interface AppLocaleMeta {
  display: string
  flag: string
  author?: string
}

const { localeMeta } = useLocale<AppLocaleMeta>()
localeMeta.value?.display // string | undefined — полностью типизировано

Пример — переключатель локали:

vue
<script setup lang="ts">
import { useLocale, useAvailableLocales } from 'vue-i18n-kit'

const { locale, setLocale, isLoading, localeMeta } = useLocale()
const { availableLocales } = useAvailableLocales()

async function handleChange(code: string) {
  try {
    await setLocale(code)
  } catch (err) {
    console.error('Failed to load locale:', err)
  }
}
</script>

<template>
  <span>{{ localeMeta?.flag }} {{ localeMeta?.display ?? locale }}</span>

  <select :value="locale" @change="handleChange(($event.target as HTMLSelectElement).value)">
    <option v-for="loc in availableLocales" :key="loc.code" :value="loc.code">
      {{ loc.meta?.flag }} {{ loc.meta?.display ?? loc.code }}
    </option>
  </select>

  <span v-if="isLoading">Loading…</span>
</template>

useT

Основной composable для перевода. Возвращает два метода — t для простых строк и tm для ICU-плюрализованных строк. Оба реактивны к локали и обновляются автоматически при смене активной локали.

ts
import { useT } from 'vue-i18n-kit'

const { t, tm } = useT()

t(key, vars?)

Ищет ключ в файле активной локали и интерполирует именованные плейсхолдеры {placeholder}.

ts
t('buttons.submit') // → 'Submit'
t('greeting', { name: 'Alice' }) // → 'Hello, Alice!'
АргументТипОписание
keystringПуть через точку в файле локали ('buttons.submit', 'greeting').
varsobjectОпционально. Именованные значения, подставляемые в плейсхолдеры {placeholder}.

tm(key, vars)

Ищет ключ, значение которого является ICU-шаблоном множественного числа, затем выбирает правильную форму множественного числа с помощью Intl.PluralRules для активной локали.

ts
tm('items', { count: 1 }) // → '1 item'
tm('items', { count: 5 }) // → '5 items'
tm('balance', { points: 3 }) // → '3 рубля'
tm('balance', { points: 11 }) // → '11 рублей'

Синтаксис ICU-шаблона:

КонструкцияОписание
{varName, plural, …}Селектор формы множественного числа. varName должен быть ключом в vars; его числовое значение определяет CLDR-категорию.
one {…} few {…} many {…} other {…}Форма для каждой CLDR-категории. other обязательна — используется как запасной вариант.
# внутри формыЗаменяется числовым значением переменной.
{varName} вне pluralПростая интерполяция — заменяется на vars.varName.

Примеры:

ts
// Отображение + множественное число в одном шаблоне
tm('balance', { points: 21 })
// locale: "{points} {points, plural, one {рубль} few {рубля} many {рублей} other {рублей}}"
// → '21 рубль'

// Несколько переменных
tm('score', { user: 'Даня', score: 21 })
// locale: "{user} набрал {score} {score, plural, one {балл} few {балла} many {баллов} other {баллов}}"
// → 'Даня набрал 21 балл'

// Несколько конструкций plural в одной строке
tm('report', { files: 2, errors: 5 })
// → '2 файла (5 ошибок)'

CLDR-категории по языкам:

ЯзыкИспользуемые категории
Английский, турецкийone, other
Русский, польскийone, few, many, other
Арабскийzero, one, two, few, many, other
Японский, китайскийother (грамматической категории множественности нет)

Полные правила: CLDR Plural Rules

useAvailableLocales

Возвращает вычисляемый список всех локалей, зарегистрированных в конфигурации плагина. Каждый элемент — объект LocaleInfo, содержащий код локали и её метаданные.

ts
import { useAvailableLocales } from 'vue-i18n-kit'

const { availableLocales } = useAvailableLocales()
// availableLocales.value →
// [
//   { code: 'en', meta: { display: 'English', flag: '🇬🇧' } },
//   { code: 'ru', meta: { display: 'Русский', flag: '🇷🇺' } },
// ]
Возвращаемое значениеТипОписание
availableLocalesComputedRef<LocaleInfo[]>Все локали в порядке объявления. У каждого элемента есть code: string и meta: TMeta | undefined.

Передайте generic-тип, чтобы получить типизированный meta без приведения типов:

ts
interface AppLocaleMeta {
  display: string
  flag: string
}

const { availableLocales } = useAvailableLocales<AppLocaleMeta>()
availableLocales.value[0].meta?.display // string | undefined

useFormat

Предоставляет локале-зависимое форматирование через нативные API Intl. Все форматтеры автоматически используют текущую активную локаль и обновляются при её переключении.

ts
import { useFormat } from 'vue-i18n-kit'

const { formatDate, formatNumber, formatCurrency } = useFormat()

formatDate(value, options?)

ts
// value: Date | number (timestamp) | string (ISO)
// options: Intl.DateTimeFormatOptions

formatDate(new Date()) // '28.03.2026'  (ru)
formatDate(new Date(), { dateStyle: 'long' }) // '28 марта 2026 г.'  (ru)
formatDate(new Date(), { dateStyle: 'long' }) // 'March 28, 2026'  (en)
formatDate(new Date(), { hour: '2-digit', minute: '2-digit' }) // '19:45'

formatNumber(value, options?)

ts
formatNumber(1_234_567.89) // '1 234 567,89'  (ru)
formatNumber(1_234_567.89) // '1,234,567.89'  (en)
formatNumber(0.42, { style: 'percent' }) // '42 %'

formatCurrency(value, currency, options?)

ts
// currency: ISO 4217 код (USD, EUR, RUB, ...)

formatCurrency(1999.99, 'USD') // '$1,999.99'   (en)
formatCurrency(1999.99, 'EUR') // '1 999,99 €'  (ru)
formatCurrency(1999, 'USD', { minimumFractionDigits: 0 }) // '$1,999'

usePluralize

Для ICU-плюрализации используйте tm() из useT() — это основной API. usePluralize предоставляет одну дополнительную утилиту: pluralCategory, которая возвращает сырую CLDR-категорию для числового значения.

ts
import { usePluralize } from 'vue-i18n-kit'

const { pluralCategory } = usePluralize()

pluralCategory(count)

Возвращает строку сырой CLDR-категории множественного числа для count в активной локали. Полезно для применения CSS-классов или условного рендеринга.

ts
// Английская локаль
pluralCategory(1) // 'one'
pluralCategory(5) // 'other'

// Русская локаль
pluralCategory(1) // 'one'
pluralCategory(3) // 'few'
pluralCategory(5) // 'many'