Для работы с многоязычными интерфейсами в приложениях Quasar используется библиотека Vue I18n. Она обеспечивает динамическую локализацию строк, чисел, дат и форматов валют. Для начала необходимо установить пакет:
npm install vue-i18n@9
После установки библиотеку подключают в основной файл приложения,
обычно это src/boot/i18n.js:
import { boot } from 'quasar/wrappers'
import { createI18n } from 'vue-i18n'
const messages = {
en: {
greeting: 'Hello',
farewell: 'Goodbye'
},
ru: {
greeting: 'Привет',
farewell: 'До свидания'
}
}
const i18n = createI18n({
locale: 'ru',
fallbackLocale: 'en',
messages
})
export default boot(({ app }) => {
app.use(i18n)
})
export { i18n }
Ключевые моменты настройки:
locale — язык по умолчанию.fallbackLocale — язык, используемый при отсутствии
перевода.messages — объект, содержащий переводы для всех
поддерживаемых языков.В шаблонах Vue компонента доступ к переводам осуществляется через
директиву v-t или функцию $t:
<template>
<div>
<p>{{ $t('greeting') }}</p>
<p v-t="'farewell'"></p>
</div>
</template>
В скриптах можно динамически менять язык или получать переводы:
import { i18n } from 'boot/i18n'
i18n.global.locale.value = 'en' // смена языка на английский
console.log(i18n.global.t('greeting')) // вывод: Hello
Для крупных проектов целесообразно хранить переводы в отдельных файлах:
src/i18n/
├─ en.json
└─ ru.json
en.json:
{
"greeting": "Hello",
"farewell": "Goodbye"
}
ru.json:
{
"greeting": "Привет",
"farewell": "До свидания"
}
Загрузка сообщений через import:
import en from 'src/i18n/en.json'
import ru from 'src/i18n/ru.json'
const messages = { en, ru }
Vue I18n поддерживает интернационализацию чисел и дат:
const number = 123456.78
i18n.global.locale.value = 'ru'
console.log(i18n.global.d(number, { style: 'currency', currency: 'RUB' })) // 123 456,78 ₽
i18n.global.locale.value = 'en'
console.log(i18n.global.d(number, { style: 'currency', currency: 'USD' })) // $123,456.78
Для даты:
const date = new Date()
console.log(i18n.global.d(date, { year: 'numeric', month: 'long', day: 'numeric' }))
Чтобы не грузить все переводы сразу, можно использовать асинхронный импорт:
async function setLocale(locale) {
if (!i18n.global.availableLocales.includes(locale)) {
const messages = await import(`src/i18n/${locale}.json`)
i18n.global.setLocaleMessage(locale, messages.default)
}
i18n.global.locale.value = locale
}
Это позволяет уменьшить размер основного бандла и загружать переводы только по необходимости.
Переводы могут содержать динамические значения:
{
"welcome": "Привет, {name}!"
}
Использование в компоненте:
<p>{{ $t('welcome', { name: 'Алексей' }) }}</p> <!-- Выведет: Привет, Алексей! -->
Vue I18n поддерживает разные формы слов в зависимости от числа:
{
"apple": "яблоко | яблока | яблок"
}
Использование:
<p>{{ $tc('apple', 1) }}</p> <!-- яблоко -->
<p>{{ $tc('apple', 3) }}</p> <!-- яблока -->
<p>{{ $tc('apple', 5) }}</p> <!-- яблок -->
Quasar позволяет локализовать свои компоненты через
Quasar.lang.set:
import { Quasar } from 'quasar'
import ruLang from 'quasar/lang/ru'
Quasar.lang.set(ruLang)
Можно синхронизировать язык компонентов Quasar с Vue I18n:
watch(() => i18n.global.locale.value, (newLocale) => {
import(`quasar/lang/${newLocale}`).then(module => Quasar.lang.set(module.default))
})
Это обеспечивает единый язык интерфейса для всех компонентов.
Таким образом, настройка Vue I18n в Quasar позволяет полноценно управлять локализацией текстов, чисел, дат и компонентов UI, обеспечивая гибкость и масштабируемость в больших приложениях.