i18n
↑ 5.3 Quasar · ← Предыдущая · → Следующая
Зачем это на собесе
Локализация — типичное требование: vue-i18n, плюрали, форматы, ленивая загрузка.
Объяснение
Два уровня: языковой пакет Quasar (тексты его компонентов) и vue-i18n (тексты приложения).
// boot/i18n.ts
import { createI18n } from "vue-i18n";
import messages from "src/i18n";
export const i18n = createI18n({ locale: "ru", fallbackLocale: "en", legacy: false, messages,
datetimeFormats: { ru: { short: { dateStyle: "medium" } } }, numberFormats: { ru: { currency: { style: "currency", currency: "RUB" } } } });
export default boot(({ app }) => app.use(i18n));
// src/i18n/ru/index.ts
export default { orders: { title: "Заказы", count: "нет заказов | {n} заказ | {n} заказа | {n} заказов" }, errors: { required: "Обязательное поле" } };<script setup>
const { t, n, d, locale } = useI18n();
</script>
<template>
<h1>{{ t("orders.title") }}</h1>
<p>{{ t("orders.count", { n: 5 }, 5) }}</p> <!-- плюрализация: выбор формы по числу -->
<p>{{ n(1234.5, "currency") }} · {{ d(new Date(), "short") }}</p>
<i18n-t keypath="terms" tag="p"><template #link><a href="/terms">условия</a></template></i18n-t> <!-- компонент с разметкой -->
</template>Переключение языка:
import quasarLang from "quasar/lang/ru"; const $q = useQuasar();
async function setLang(l: string) {
const pack = await import(`../../node_modules/quasar/lang/${l}.js`); // пакет Quasar (ленивая загрузка)
$q.lang.set(pack.default); i18n.global.locale.value = l; document.documentElement.lang = l;
localStorage.setItem("lang", l);
}Практики:
- Ключи структурированы по функциональности (
orders.title), а не по тексту. - Плюральные формы русского языка (1/2–4/5+) —
|с 4 вариантами. - Формат даты, чисел, валюты —
Intlчерезd()/n(). - Ленивая загрузка языков (
import()), fallback-язык. - Тексты валидации — тоже в i18n (правила возвращают ключи).
- Сообщения с переменными — параметры, а не конкатенация строк.
- Проверка отсутствующих ключей в CI (
vue-i18n-extract), типизация ключей. - Серверные ошибки — коды → локализованные сообщения на клиенте.
RTL, направление текста, длина строк: учитывайте в макете (немецкий длиннее).
Нюансы и подводные камни
- Конкатенация строк ломает грамматику разных языков.
- Импорт всех языков в основной бандл раздувает его.
- Забытый языковой пакет Quasar — нелокализованные дни недели и подписи компонентов.
- Числа/даты «руками» вместо
Intl— ошибки форматов. - Ключи в шаблонах не находятся статическим анализом при динамической подстановке.
Практика
- Подключите vue-i18n, реализуйте плюрализацию для русского.
- Реализуйте ленивое переключение языка с сохранением выбора.
- Добавьте проверку неиспользуемых/отсутствующих ключей в CI.
Вопросы с ответами
Как реализовать множественные числа в vue-i18n?
Формы через
|и передача числа третьим аргументомt(key, params, count).
Зачем языковой пакет Quasar?
Локализует встроенные тексты компонентов Quasar (календарь, пагинация, подписи).