Типизированные ключи и CLI
t('home:titel') компилируется и рендерит ключ как есть — TypeScript сам по себе не знает вашего каталога. Сгенерируйте union из тех же файлов, что читает рантайм, и будет знать.
Генерация типов #
npx svelte-dialect typegen --messages src/lib/messages --out src/lib/i18n-keys.d.tsЗапустите CLI по файлам сообщений и передайте результат в createDialect. Известные ключи теперь автодополняются, а любая обычная строка по-прежнему компилируется, так что ключи, существующие только в рантайме (например, из базы данных), продолжают работать. Обратная сторона: ключ с опечаткой тоже компилируется, его ловит svelte-dialect check (см. ниже).
import type { MessageKey } from './i18n-keys.js';
export const { t, loadTranslations } = createDialect<MessageKey>({ … });Строгие параметры #
Сгенерированный файл также экспортирует MessageParams. Передайте его вторым дженериком, и параметры, которые называет сообщение, становятся частью сигнатуры t — вызов без параметра или с опечаткой в имени теперь ошибка типов, а не тихий фолбэк-текст в рантайме.
import type { MessageKey, MessageParams } from './i18n-keys.js';
export const { t } = createDialect<MessageKey, MessageParams>({ … });
t('home:greeting', { name: 'Kat' }); // ✅
t('home:greeting'); // ✗ Expected 2 arguments, but got 1
t('home:greeting', { nmae: 'Kat' }); // ✗ 'nmae' does not exist
t('cms:hero'); // ✅ nothing is known about a runtime-only key, so anything goesОба дженерика аддитивны: не передавайте любой из них, и вызовы останутся ровно такими же нестрогими, как были.
Ключи из базы данных #
Типы — это снимок того, что увидела генерация. Для каталога, живущего в другом месте, экспортируйте дамп вида {locale: {namespace: {…}}} и передайте его в typegen --from-json, затем перегенерируйте типы всякий раз, когда дамп меняется.
npx svelte-dialect typegen --from-json dump.json --out src/lib/i18n-keys.d.tsCLI #
Три команды, настраиваемые полностью флагами, без конфиг-файла. --messages можно указывать повторно во всех трёх — на случай, когда собранные и ленивые деревья сообщений лежат раздельно. Все флаги и коды выхода собраны в справочнике CLI.
npx svelte-dialect typegen # the .d.ts above
npx svelte-dialect check # compare t('…') calls in code against the catalogs
npx svelte-dialect migrate # convert i18next / ICU MessageFormat JSON to MF2, in placecheck #
Сканирует исходники на литералы t('ns:key') и сообщает о ключах, отсутствующих хоть в одной локали (код выхода 1, годится для CI), а с флагом --unused — о ключах каталога, на которые никто не ссылается. Ключи, собранные из переменных, статическому сканированию не видны, так что отчёт честен в пределах того, что он способен увидеть.
migrate #
Переписывает интерполяции в стиле i18next {{name}}, схлопывает суффиксы множественного числа key_one/key_other в MF2 .match и разбирает распространённые конструкции ICU MessageFormat. Каждая полученная строка проверяется настоящим парсером MF2 перед записью; то, что не удалось преобразовать, остаётся нетронутым и сообщается отдельно. Сначала запустите с --dry-run, чтобы увидеть пары «до/после».