Files
xahau-web/README.md
Bharath 4848d37cde docs: update README, DEVELOPMENT, and ADDING-A-LOCALE to reflect i18n consolidation
- README: rewrite Localization + Updating Content sections; add Cookie
  Consent; expand Project Structure (plugins/, schemas/, utils/)
- DEVELOPMENT: drop per-locale component map rows; add i18n Translation
  Tables section; drop stale about.json/features.json schemas; add
  Cookie Consent, plugins/schemas/utils, and pre-commit sections
- ADDING-A-LOCALE: replace per-locale-component flow with
  single-component + translation-table flow; add locales.ts step; move
  TM disclaimer to ecosystem.json; drop XahauAboutPtBR.astro step
- Fix lefthook.yml filename (no leading dot)
2026-04-27 15:30:29 +00:00

5.6 KiB

Xahau Website

Open in StackBlitz Open with CodeSandbox

Built with Astro, Tailwind CSS, and React. Editorial pages use a hand-coded component system; documentation lives under src/content/docs/ and is powered by Starlight.


Commands

Command Action
npm install Install dependencies
npm run dev Start local dev server at localhost:4321
npm run build Build production site to ./dist/
npm run preview Preview production build locally
npm run check Auto-fix formatting with Biome
npm run ci Biome lint check (CI — no auto-fix)

Pre-commit Hooks

The project uses Lefthook to run pre-commit hooks. The hooks are defined in the lefthook.yml file.

To install the hooks, use the following command (npm install is required):

npx lefthook install

To run the hooks manually, use the following command:

npx lefthook run pre-commit

Project Structure

/
├── public/                   Static assets (fonts, favicons)
├── src/
│   ├── assets/               SVGs, images, gem PNGs
│   ├── components/           Astro & React components (incl. CookieConsent.astro)
│   ├── content/docs/         Starlight documentation (Markdown/MDX)
│   ├── data/                 JSON data files (home, connect, ecosystem, roadmap)
│   ├── i18n/                 Per-page translation tables + locales.ts
│   ├── layouts/              Page-level layout wrappers
│   ├── pages/                URL routes (en = root, es/, ja/)
│   ├── plugins/              Remark/MDX plugins (e.g. global references)
│   ├── schemas/              Zod schemas + JSON schemas for typed data
│   ├── styles/               Global CSS and Tailwind theme tokens
│   ├── utils/                Shared helpers (e.g. localizedHref)
│   └── CookieConsentConfig.ts  vanilla-cookieconsent configuration
├── biome.jsonc               Linter/formatter config (Biome 2.4)
└── astro.config.mjs          Astro config (i18n, integrations)

Localization

The site supports three locales: English (root /), Spanish (/es/), and Japanese (/ja/). All three are fully enabled in production.

Each editorial page is a single component that reads its copy from a per-page translation table in src/i18n/ (e.g. aboutTranslations.ts, featuresTranslations.ts, contestTranslations.ts, indexTranslations.ts, fraudReportTranslations.ts). The component picks the active locale via Astro.currentLocale and looks up strings against the table — there are no per-locale component variants.

Locale identifiers are centralized in src/i18n/locales.ts (locales, defaultLocale, Locale type). Each route is a thin .astro wrapper under src/pages/, src/pages/es/, and src/pages/ja/ that imports the shared component.

To add a new language, follow the steps in ADDING-A-LOCALE.md.


Updating Content

Content lives in two places, depending on the page:

JSON data files (src/data/) drive list-shaped pages — home stats, events, ecosystem entries, roadmap items. Edit the JSON to change what's rendered; no component changes needed.

File Controls
src/data/home.json Statistics tiles on the home page
src/data/connect.json Events list on the Connect page
src/data/roadmap.json Roadmap items and quarter window
src/data/ecosystem.json Ecosystem project list

i18n translation tables (src/i18n/*Translations.ts) drive hand-crafted editorial pages — About, Features, Contest, the home hero/feature copy, and the Fraud Report form. Each table is keyed by locale (en / es / ja); add or update strings under the right locale and the matching component picks them up.

File Controls
src/i18n/aboutTranslations.ts All copy on the About page
src/i18n/featuresTranslations.ts All copy on the Features page
src/i18n/contestTranslations.ts All copy on the Contest page
src/i18n/indexTranslations.ts Home hero + feature blurbs
src/i18n/fraudReportTranslations.ts Fraud Report form labels

See DEVELOPMENT.md for the full schema of each file.

A few historical src/data/about.json / features.json files still exist; the live About and Features components no longer read from them — translations are the source of truth.


The site uses vanilla-cookieconsent for GDPR-compliant cookie banners. The component lives in src/components/CookieConsent.astro and the category/translation config is in src/CookieConsentConfig.ts.


Further Reading