Files
qumo-website/openspec/specs/content-i18n/spec.md

3.6 KiB

Purpose

Defines the content localisation system for the Qumo website, including the JSON content files structure and the i18n.ts helper that provides locale-appropriate content to pages and components.

Requirements

Requirement: Locale content JSON files contain global meta fields

src/content/en.json and src/content/nl.json SHALL each contain a top-level "meta" key with the following fields:

  • siteName: string — the site name (e.g., "Qumo")
  • defaultTitle: string — default page title (used as fallback)
  • defaultDescription: string — default meta description (used as fallback)
  • defaultOgImage: string — default OG image path; may be empty string initially

Scenario: en.json has correct meta structure

  • WHEN src/content/en.json is parsed as JSON
  • THEN it SHALL have a meta object with string values for siteName, defaultTitle, defaultDescription, and defaultOgImage

Scenario: nl.json has correct meta structure

  • WHEN src/content/nl.json is parsed as JSON
  • THEN it SHALL have the same meta object shape as en.json, with Dutch-language values for defaultTitle and defaultDescription

Requirement: i18n helper returns correct content for locale

src/content/i18n.ts SHALL export a function getContent(locale: string) that returns the parsed content object for the given locale. It SHALL return the EN content object for any unrecognized locale string.

Scenario: Returns EN content for "en" locale

  • WHEN getContent("en") is called
  • THEN the function SHALL return the parsed contents of src/content/en.json

Scenario: Returns NL content for "nl" locale

  • WHEN getContent("nl") is called
  • THEN the function SHALL return the parsed contents of src/content/nl.json

Scenario: Falls back to EN for unknown locale

  • WHEN getContent("fr") or any unrecognized locale string is called
  • THEN the function SHALL return the parsed contents of src/content/en.json

Requirement: Locale content JSON files contain nav strings

src/content/en.json and src/content/nl.json SHALL each contain a top-level "nav" key with the following structure:

  • links: array of objects with label: string and href: string for each nav link
  • cta: string — label for the Connect CTA button
  • ctaHref: string — href for the Connect CTA button
  • langSwitch: object with en: string and nl: string labels for the language switcher

Scenario: en.json nav section has correct structure

  • WHEN src/content/en.json is parsed as JSON
  • THEN it SHALL have a nav object containing links (array of 3 items with label and href), cta string, ctaHref string, and langSwitch object with en and nl keys

Scenario: nl.json nav section has Dutch labels

  • WHEN src/content/nl.json is parsed as JSON
  • THEN nav.links SHALL contain Dutch labels ("Diensten", "AI Launchpad", "Over Ons"), nav.cta SHALL be "Verbind", and nav.ctaHref SHALL be "/nl/contact"

Scenario: Build succeeds with nav strings added

  • WHEN npm run build is executed after adding nav keys to both JSON files
  • THEN the build SHALL complete without TypeScript errors

Requirement: Content files use static imports (no runtime fetch)

The i18n.ts helper SHALL use static ES module imports (import enContent from './en.json') rather than dynamic fetch or fs.readFile. This ensures type safety and tree-shaking at build time.

Scenario: Build succeeds with static imports

  • WHEN npm run build is executed in the website/ directory
  • THEN the build SHALL complete without errors, with locale content bundled statically