
i18n Vue: полная настройка интернационализации с vue-i18n
От установки до рабочей среды: настройте vue-i18n с Composition API, обработайте формы множественного числа по правилам CLDR, используйте интерполяцию компонентов и добавьте умные цепочки резервных локалей.
Установить vue-i18n
vue-i18n — официальный плагин интернационализации Vue.js. Он предоставляет реактивные переводы, множественное число в стиле ICU, интерполяцию компонентов, форматирование даты и времени и чисел, а также поддерживает Options API и Composition API.
npm install vue-i18n@9Настроить vue-i18n
Создайте экземпляр i18n с помощью createI18n() и зарегистрируйте его как плагин Vue. Определите сообщения локалей, задайте стандартную и резервную локали. vue-i18n поддерживает режимы legacy (Options API) и composition (Composition API).
// src/i18n.ts
import { createI18n } from 'vue-i18n'
import en from './locales/en.json'
import de from './locales/de.json'
const i18n = createI18n({
legacy: false, // Use Composition API mode
locale: 'en', // Default locale
fallbackLocale: 'en', // Fallback locale
messages: { en, de },
})
export default i18n// src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import i18n from './i18n'
const app = createApp(App)
app.use(i18n)
app.mount('#app')Использовать переводы в шаблонах
vue-i18n предоставляет функцию $t() в шаблонах (Options API) и функцию t() из useI18n() (Composition API). Обе принимают ключ перевода и необязательные именованные или списковые параметры для интерполяции.
// src/locales/en.json
{
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"greeting": "Hello, {name}!",
"cart": {
"itemCount": "no items | one item | {count} items"
}
}
// src/locales/de.json
{
"nav": {
"home": "Startseite",
"about": "Über uns",
"settings": "Einstellungen"
},
"greeting": "Hallo, {name}!",
"cart": {
"itemCount": "keine Artikel | ein Artikel | {count} Artikel"
}
}Обработать формы множественного числа
vue-i18n поддерживает формы множественного числа через варианты с вертикальной чертой и функцию $tc() в режиме legacy либо t() с параметром count в Composition API. Определите формы в сообщениях локали с помощью разделителя: 'no items | one item | {count} items'.
<template>
<div>
<!-- Simple translation -->
<h1>{{ $t('nav.home') }}</h1>
<!-- With variables -->
<p>{{ $t('greeting', { name: userName }) }}</p>
<!-- In attributes -->
<input :placeholder="$t('nav.settings')" />
<!-- Composition API -->
<p>{{ greeting }}</p>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const userName = 'Alice'
const greeting = t('greeting', { name: userName })
</script>Добавить цепочки резервных локалей
Встроенный fallbackLocale в vue-i18n поддерживает только плоский список резервных локалей, а не отдельные цепочки. Пользователь pt-BR при отсутствии ключа переходит на английский вместо pt-PT. vue-i18n-locale-chain добавляет настраиваемые цепочки глубокого объединения, чтобы региональные пользователи всегда видели ближайший доступный перевод.
<template>
<div>
<!-- Pipe-separated plurals -->
<p>{{ $t('cart.itemCount', count) }}</p>
<!-- Named plurals (recommended for complex languages) -->
<p>{{ $t('orders', { n: orderCount }) }}</p>
</div>
</template>
<!-- In your locale file: -->
<!-- "orders": "{n} order | {n} orders" -->Автоматизировать перевод
После настройки vue-i18n переведите файлы локалей JSON с помощью ИИ. Попросите ИИ-помощника перевести исходный файл из IDE или интегрируйте перевод в конвейер CI/CD для полностью автоматизированной локализации.
<template>
<select v-model="locale">
<option v-for="lang in availableLocales" :key="lang" :value="lang">
{{ lang }}
</option>
</select>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { locale, availableLocales } = useI18n()
</script>// src/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
legacy: false,
locale: 'en',
fallbackLocale: 'en',
messages: {},
})
export async function loadLocale(locale: string) {
const messages = await import(`./locales/${locale}.json`)
i18n.global.setLocaleMessage(locale, messages.default)
i18n.global.locale.value = locale
}
export default i18nКонфигурация цепочки резервных локалей
Настройте отдельные резервные цепочки для локалей, чтобы региональные пользователи видели ближайший доступный перевод вместо немедленного перехода на английский. vue-i18n поддерживает объектный fallbackLocale для определения цепочек каждой локали.
// src/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
legacy: false,
locale: 'pt-BR',
fallbackLocale: {
'pt-BR': ['pt', 'en'],
'zh-Hant-TW': ['zh-Hant', 'zh', 'en'],
'es-419': ['es', 'en'],
default: ['en'],
},
messages: {
en: { /* ... */ },
pt: { /* ... */ },
'pt-BR': { /* ... */ },
},
})Распространённые ошибки
Смешение режимов Legacy и Composition API
Использование v-html для переведённых строк
Региональные пользователи видят английский вместо родительской локали
Попробовать i18n Agent
Перетащите сюда файл перевода
JSON, YAML, PO, XML, CSV, Markdown, Properties
или нажмите, чтобы выбрать
Целевые языки