# Phase 10: i18n (Internationalization)

**Status:** ⏳ Todo
**Progress:** 0/8 tasks (0%)
**Started:** -
**Completed:** -
**Assigned to:** -

---

## Overview

Implement internationalization (i18n) with @nuxtjs/i18n: support German (default) and English, translate all UI strings, and create language switcher.

**Goal:** App is fully bilingual (German + English) with proper routing and formatting.

---

## Dependencies

- ✅ Phase 1-9: Most UI components should be created by now

---

## Tasks

### Setup

- [ ] Install @nuxtjs/i18n

  ```bash
  pnpm add @nuxtjs/i18n
  ```

- [ ] Configure i18n module
  - File: `nuxt.config.ts`
  ```typescript
  export default defineNuxtConfig({
    modules: ['@nuxtjs/i18n'],
    i18n: {
      locales: [
        { code: 'de', iso: 'de-DE', name: 'Deutsch', file: 'de-DE.json' },
        { code: 'en', iso: 'en-US', name: 'English', file: 'en-US.json' },
      ],
      defaultLocale: 'de',
      strategy: 'prefix_except_default',
      langDir: 'locales',
      lazy: true,
      detectBrowserLanguage: {
        useCookie: true,
        cookieKey: 'i18n_redirected',
        redirectOn: 'root',
      },
    },
  })
  ```

### Translation Files

- [ ] Create locale files (de-DE.json, en-US.json)
  - Create: `locales/de-DE.json` (German)
  - Create: `locales/en-US.json` (English)
  - Structure:

  ```json
  {
    "common": {
      "header": { "home": "Startseite", "products": "Produkte", ... },
      "footer": { ... },
      "buttons": { "submit": "Absenden", "cancel": "Abbrechen", ... }
    },
    "auth": {
      "login": { "title": "Anmelden", "email": "E-Mail", ... },
      "register": { ... }
    },
    "products": { ... },
    "cart": { ... },
    "checkout": { ... },
    "errors": { ... }
  }
  ```

- [ ] Translate all UI strings
  - Go through all components and pages
  - Replace hardcoded German strings with `$t('key')` or `t('key')`
  - Add translations to both de-DE.json and en-US.json
  - Components to translate:
    - Header, Footer
    - Auth forms (Login, Register)
    - Product list, Product detail
    - Cart, CartItem, CartSummary
    - Checkout form
    - PayPal button texts
    - Error messages
    - Success messages
    - Validation messages (VeeValidate)

### UI Components

- [ ] Create language switcher component
  - File: `components/Common/LanguageSwitcher.vue`
  - Dropdown or toggle: 🇩🇪 Deutsch | 🇬🇧 English
  - Uses: `$i18n.locale` and `$switchLocalePath()`
  - Place in header
  - Styling: shadcn-nuxt DropdownMenu or simple buttons

### Testing

- [ ] Test route localization
  - Visit /produkte (German)
  - Switch to English → should redirect to /en/products
  - Test all main routes:
    - / → /en/ (homepage)
    - /produkte → /en/products
    - /warenkorb → /en/cart
    - /kasse → /en/checkout
  - Verify route parameters preserved (/produkte/[id] → /en/products/[id])

- [ ] Test currency/date formatting
  - Use Intl.NumberFormat for currency (EUR)
  - Use Intl.DateTimeFormat for dates
  - Example in component:

  ```typescript
  const { locale } = useI18n()
  const formatPrice = (price: number) => {
    return new Intl.NumberFormat(locale.value, {
      style: 'currency',
      currency: 'EUR',
    }).format(price)
  }
  ```

  - Test: German → "19,99 €", English → "€19.99"

- [ ] Document i18n structure
  - Document translation file structure
  - Document how to add new translations
  - Document naming conventions for translation keys
  - Document how language switcher works
  - Document how to format currency/dates per locale

---

## Acceptance Criteria

- [x] @nuxtjs/i18n is installed and configured
- [x] Locale files exist for German and English
- [x] All UI strings are translated (no hardcoded German text)
- [x] Language switcher component is functional
- [x] Can switch between German and English
- [x] Routes change with language (/produkte ↔ /en/products)
- [x] Currency formatting respects locale
- [x] Date formatting respects locale
- [x] i18n structure is documented

---

## Notes

- **Default Language:** German (de)
- **Route Strategy:** prefix_except_default (German has no prefix, English has /en/)
- **SEO:** Automatic hreflang tags for SEO
- **Lazy Loading:** Translation files loaded on demand
- **Browser Detection:** Redirects to browser language on first visit (if supported)

---

## Blockers

- None currently

---

## Related Documentation

- [docs/PRD.md: Bilingual Support](../docs/PRD.md#bilingual-support)
- [docs/TECH_STACK.md: i18n](../docs/TECH_STACK.md#9-internationalization-i18n)
- [CLAUDE.md: Important Constraints](../CLAUDE.md#important-constraints)
- [@nuxtjs/i18n Docs](https://i18n.nuxtjs.org/)
