# i18n для статических сайтов — 5 локалей > Локализация со слеш-роутами без CMS: словари, динамические пути [locale], hreflang и синхронизация пяти языков. > > 2026-04-18 — y7.hk ## Архитектура ``` /en/blog/hello ← локаль по умолчанию, всё равно с префиксом (чище, чем особый случай) /ru/blog/hello /zh/blog/hello /ja/blog/hello /de/blog/hello ``` Три движущиеся части: 1. **Словари** — один JSON на локаль, одинаковая форма, типизированная как `Record`, чтобы TypeScript вопил, когда ключ разъехался. 2. **Динамические роуты** — `src/pages/[locale]/...` с `getStaticPaths()`, возвращающей все локали. 3. **Контентный fallback** — пиши посты один раз в `en/` и рендери их под каждой локалью, пока не появятся переводы. ## Типовой трюк, который тебя спасает ```ts export type Locale = "en" | "ru" | "zh" | "ja" | "de"; const dictionaries: Record = { en, ru, zh, ja, de }; ``` `typeof en` — это схема. Добавь ключ в `en.json`, и билд упадёт, пока остальные четыре словаря не догонят. ## Не забудь про head `` для каждой локали плюс `x-default`, canonical на каждую страницу и пути, выведенные из `Astro.url`. Поисковики вознаграждают скучную сантехнику.