Archive all 6 deployed changes following OpenSpec workflow: - add-minimal-hugo-site → hugo-site spec - add-multilingual-support → internationalization spec - migrate-site-content → content-migration + image-assets specs - add-custom-bootstrap-styling → styling spec - add-cv-page → content-management spec - simple-deployment → deployment spec All changes moved to archive/ with 2025-10-30 date prefix. Created 7 capability specs reflecting deployed functionality. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
121 lines
5.7 KiB
Markdown
121 lines
5.7 KiB
Markdown
# internationalization Specification
|
|
|
|
## Purpose
|
|
TBD - created by archiving change add-multilingual-support. Update Purpose after archive.
|
|
## Requirements
|
|
### Requirement: Multilingual Content Support
|
|
The site SHALL support multiple languages with German (de) as the default language and English (en) as a secondary language.
|
|
|
|
#### Scenario: German content is accessible at /de/ path
|
|
- **WHEN** a visitor navigates to `/de/` or any `/de/*` path
|
|
- **THEN** the page displays in German language
|
|
- **AND** all navigation, content, and UI elements are in German
|
|
|
|
#### Scenario: English content is accessible at /en/ path
|
|
- **WHEN** a visitor navigates to `/en/` or any `/en/*` path
|
|
- **THEN** the page displays in English language
|
|
- **AND** all navigation, content, and UI elements are in English
|
|
|
|
#### Scenario: All pages have translations
|
|
- **WHEN** content exists in one language
|
|
- **THEN** a corresponding translation SHALL exist in the other language
|
|
- **AND** the content structure mirrors across languages (e.g., `/de/cv` ↔ `/en/cv`)
|
|
|
|
### Requirement: Language Switcher
|
|
The site navigation SHALL include a language switcher that allows users to change languages while maintaining page context.
|
|
|
|
#### Scenario: Language switcher is visible in navigation
|
|
- **WHEN** a visitor views any page
|
|
- **THEN** the navigation displays language options (DE, EN)
|
|
- **AND** the current active language is visually indicated
|
|
- **AND** the inactive language is shown as a clickable link
|
|
|
|
#### Scenario: Language switching maintains page context
|
|
- **WHEN** a visitor is on `/de/cv` and clicks the English language link
|
|
- **THEN** the page navigates to `/en/cv` (the English version of the same page)
|
|
- **AND** the page content changes to English
|
|
|
|
#### Scenario: Language switching from home page
|
|
- **WHEN** a visitor is on `/de/` and clicks the English language link
|
|
- **THEN** the page navigates to `/en/`
|
|
- **AND** the home page content changes to English
|
|
|
|
#### Scenario: Language switcher handles missing translations
|
|
- **WHEN** a visitor is on a page without a translation
|
|
- **THEN** the language link points to the home page of the target language
|
|
- **AND** the user is not left on a broken or non-existent page
|
|
|
|
### Requirement: Language Persistence
|
|
The site SHALL maintain the user's language preference through URL-based routing without requiring cookies or JavaScript.
|
|
|
|
#### Scenario: Language preference persists across navigation
|
|
- **WHEN** a visitor navigates to `/de/cv` and then clicks a navigation link
|
|
- **THEN** all subsequent pages remain in German (e.g., clicking "Home" goes to `/de/`)
|
|
- **AND** the language preference is maintained through the URL structure
|
|
|
|
#### Scenario: Direct URL access respects language
|
|
- **WHEN** a visitor directly accesses `/en/cv` via URL or bookmark
|
|
- **THEN** the page displays in English
|
|
- **AND** all navigation links point to English pages
|
|
|
|
### Requirement: Browser Language Detection
|
|
The site configuration SHALL support automatic language selection based on browser language preferences for first-time visitors.
|
|
|
|
#### Scenario: Server redirect based on Accept-Language header
|
|
- **WHEN** a visitor accesses the root URL `/` for the first time
|
|
- **THEN** the server MAY redirect to `/de/` or `/en/` based on the browser's `Accept-Language` header
|
|
- **AND** German is used as the fallback if no language preference is detected
|
|
|
|
#### Scenario: URL-based access bypasses language detection
|
|
- **WHEN** a visitor directly accesses `/de/` or `/en/`
|
|
- **THEN** the specified language is used regardless of browser settings
|
|
- **AND** no redirect occurs
|
|
|
|
### Requirement: Content Translation
|
|
All site content SHALL be translated between German and English languages.
|
|
|
|
#### Scenario: Home page content is translated
|
|
- **WHEN** viewing the home page in German (`/de/`)
|
|
- **THEN** all text including introduction, project descriptions, and UI labels are in German
|
|
- **WHEN** viewing the home page in English (`/en/`)
|
|
- **THEN** all text including introduction, project descriptions, and UI labels are in English
|
|
|
|
#### Scenario: CV page content is translated
|
|
- **WHEN** viewing the CV page in German (`/de/cv`)
|
|
- **THEN** all text including headings, instructions, and contact information are in German
|
|
- **WHEN** viewing the CV page in English (`/en/cv`)
|
|
- **THEN** all text including headings, instructions, and contact information are in English
|
|
|
|
#### Scenario: Navigation menu is translated
|
|
- **WHEN** viewing any page in German
|
|
- **THEN** navigation menu items are in German (e.g., "Lebenslauf" for CV)
|
|
- **WHEN** viewing any page in English
|
|
- **THEN** navigation menu items are in English (e.g., "Curriculum Vitae" for CV)
|
|
|
|
#### Scenario: Footer content is translated
|
|
- **WHEN** viewing any page in German
|
|
- **THEN** footer content including address and contact information labels are in German
|
|
- **WHEN** viewing any page in English
|
|
- **THEN** footer content including address and contact information labels are in English
|
|
|
|
### Requirement: SEO and Accessibility
|
|
The site SHALL implement proper multilingual SEO practices and accessibility features.
|
|
|
|
#### Scenario: HTML lang attribute is set correctly
|
|
- **WHEN** viewing a German page
|
|
- **THEN** the HTML element has `lang="de"` attribute
|
|
- **WHEN** viewing an English page
|
|
- **THEN** the HTML element has `lang="en"` attribute
|
|
|
|
#### Scenario: Alternative language links are provided
|
|
- **WHEN** viewing any page
|
|
- **THEN** the HTML head includes `<link rel="alternate" hreflang="de" ...>` and `<link rel="alternate" hreflang="en" ...>` tags
|
|
- **AND** these tags point to the corresponding page in each language
|
|
|
|
#### Scenario: Page titles reflect language
|
|
- **WHEN** viewing a page in German
|
|
- **THEN** the page title is in German
|
|
- **WHEN** viewing a page in English
|
|
- **THEN** the page title is in English
|
|
|