Conference site for Cloud Native Provence, with bilingual routing (fr / en) and translated page slugs.
Use make commands from the repository root.
make helpMain targets:
make setup- install project dependenciesmake start- start local dev server (application)make build- production buildmake test- run application tests with coveragemake lint- run linters/checksmake lint-fix- run fixersmake ci- lint + build + test pipeline
Tests run with Vitest from application/.
make testThis repository includes a Visual Studio Code Dev Container in .devcontainer/devcontainer.json.
Quick start:
- Open the repository in Visual Studio Code.
- Run
Dev Containers: Reopen in Container. - Inside the container:
make setup
make startThe dev container provides:
- Node.js 22
- Docker-in-Docker
- GitHub CLI
- Visual Studio Code extensions for Astro, ESLint, Prettier, Tailwind, Makefile, Copilot
The app is available on port 4321.
Routing is locale-first and centralized:
/redirects to/fr/frand/enare localized homepages/{lang}/{translated-slug}serves localized content pages/{lang}/blog/...serves localized blog list, posts, categories, and tags
Key files:
application/src/pages/index.astro- root redirectapplication/src/pages/[lang]/index.astro- localized homepageapplication/src/pages/[lang]/[page].astro- localized dynamic pagesapplication/src/i18n/routes.ts- slug mapping and path translation helpers
Translations are split by domain and locale (en.ts, fr.ts) using nested objects (no dot-string keys in data files).
- Shared UI domains live in
application/src/data/:navigation/(header + footer labels)meta/
- Page-specific content/labels live in
application/src/data/pages/<page>/{en,fr}.tsand should be consumed only by their related page(s) inapplication/src/pages/.
Runtime behavior:
- Supported languages and default locale are defined in
application/src/i18n/config.ts. - Shared translation dictionaries are composed in
application/src/i18n/utils.ts(sourceLocales). useTranslations(lang)returns a locale object merged with fallback values from the default language (fr) when a value is missing or empty.
When adding or changing translations:
- Put the value in the correct domain (or page file if page-local).
- Keep
navigationas the single source of truth for shared navigation/footer labels. - Keep
enandfrstructures aligned.
/
├── .devcontainer/
├── .github/
├── Makefile
├── Dockerfile
├── README.md
└── application/
├── astro.config.ts
├── package.json
├── public/
│ ├── _headers
│ ├── robots.txt
│ └── logos/
├── src/
│ ├── assets/
│ ├── components/
│ ├── content/
│ ├── data/
│ ├── i18n/
│ ├── layouts/
│ ├── pages/
│ │ ├── [lang]/
│ │ ├── about/
│ │ ├── brand-guidelines/
│ │ ├── contact/
│ │ ├── home/
│ │ ├── privacy/
│ │ ├── sponsoring/
│ │ ├── terms/
│ │ ├── 404.astro
│ │ ├── index.astro
│ │ └── rss.xml.ts
│ └── utils/
└── vendor/
- Site and app settings:
application/src/config.yaml - Astro configuration and integrations:
application/astro.config.ts - Static build output:
application/dist/
GitHub Actions CI runs from the application/ directory and builds the static site output in application/dist.