Уебсайт — Интернационализация (i18n)
Уебсайтът на Dictaro поддържа 25 езика чрез вградената i18n система на Astro 5 с динамични [...lang] routes и JSON translation файлове.
Архитектура
Поддържани езици
| Код | Език (English) | Език (Native) |
|---|---|---|
en | English | English |
bg | Bulgarian | Български |
hr | Croatian | Hrvatski |
cs | Czech | Cestina |
da | Danish | Dansk |
nl | Dutch | Nederlands |
et | Estonian | Eesti |
fi | Finnish | Suomi |
fr | French | Francais |
de | German | Deutsch |
el | Greek | Ellinika |
hu | Hungarian | Magyar |
it | Italian | Italiano |
lv | Latvian | Latviesu |
lt | Lithuanian | Lietuviu |
mt | Maltese | Malti |
pl | Polish | Polski |
pt | Portuguese | Portugues |
ro | Romanian | Romana |
ru | Russian | Russkiy |
sk | Slovak | Slovencina |
sl | Slovenian | Slovenscina |
es | Spanish | Espanol |
sv | Swedish | Svenska |
uk | Ukrainian | Ukrainska |
URL Routing
Astro използва [...lang] catch-all route с getStaticPaths():
- Английски (default locale): URL без prefix —
/,/pricing,/download - Всички останали: URL с locale prefix —
/bg/,/bg/pricing,/de/download - Конфигурация:
prefixDefaultLocale: falseвastro.config.mjs
getStaticPaths() генерация
Всяка страница дефинира getStaticPaths(), която връща:
{ params: { lang: undefined } }— за английски (без prefix){ params: { lang: "bg" } },{ params: { lang: "hr" } }, ... — за останалите 24 езика
Translation система
Файлова структура
src/i18n/translations/
├── en/
│ ├── common.json # Навигация, footer, CTA бутони
│ ├── home.json # Начална страница секции
│ ├── download.json # Download страница
│ ├── pricing.json # Pricing страница
│ ├── terms.json # Terms of Service
│ └── meta.json # SEO title/description
├── bg/
│ ├── common.json
│ ├── home.json
│ ├── download.json
│ ├── pricing.json
│ ├── terms.json
│ └── meta.json
├── ... (23 други езика, всеки с до 6 namespace файла)
Namespaces
| Namespace | Описание | Използва се от |
|---|---|---|
common | Навигация, footer, CTA бутони | Nav, Footer, Hero, Pricing |
home | Hero, Features, Demo, UseCases, Trust, Stats, SocialProof | index.astro |
download | Download секция | download.astro, Download компонент |
pricing | Pricing тарифи и текстове | pricing.astro, Pricing компонент |
terms | Terms of Service | terms.astro |
meta | SEO заглавия и описания | BaseLayout |
Зареждане на преводите
translations.ts използва Vite glob import за eager зареждане на всички JSON файлове:
const translationModules = import.meta.glob("./translations/**/*.json", { eager: true });
Функцията getTranslation(locale, namespace) връща merged обект:
- Първо зарежда fallback (английски) преводи
- След това overlay преводите за текущия език
- Липсващи ключове автоматично fallback-ват към английски
Помощни функции
| Функция | Описание |
|---|---|
useTranslations(locale, namespace) | Връща Record<string, string> за даден език и namespace |
getLocalizedPath(path, locale) | Генерира локализиран URL (/pricing → /bg/pricing) |
getCurrentLocale(url) | Извлича текущия език от URL path |
Language Switcher компонент
LanguageSwitcher.astro предоставя dropdown за смяна на езика:
Компонентът:
- Показва текущия език с native name и globe иконка
- Dropdown с всички 25 езика (native + English имена)
- Запомня избора в
localStorageкатоpreferred-locale - Преизчислява URL: премахва текущия locale prefix и добавя новия
- Нормализира double slashes и trailing slashes
SEO за всеки език
- Всяка страница има локализирани
<title>и<meta description>отmeta.jsonnamespace @astrojs/sitemapгенерираsitemap.xmlс URLs за всички езици- Canonical URLs от
astro.config.mjs→site: "https://dictaro.ai"
Добавяне на нов език
- Добави нов запис в
website/src/i18n/locales.ts:{ code: "ja", english: "Japanese", native: "日本語" } - Добави
"ja"в масиваlocalesвwebsite/astro.config.mjs - Създай
website/src/i18n/translations/ja/с необходимите JSON файлове - Rebuild и deploy — новият език автоматично получава routes