This repository has been archived on 2026-08-11. You can view files and clone it, but cannot push or open issues or pull requests.
Gishen-B2B/docs/features/i18n.md
kirukib 3778801ef5 Ship Gishen B2B institutional portal with polished layout and mock-backed flows.
Deliver role-aware shell (sidebar, breadcrumbs, quick search, tables, detail/create layouts), locale-ready pages, shared backend/feature docs, and Vercel project config so HR, finance, and members can demo against typed mocks.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 21:18:23 +03:00

114 lines
2.5 KiB
Markdown

# Feature: i18n (internationalization)
English and Amharic at launch with user locale preference persisted across sessions.
**Workspace:** `/Users/kirukib/Desktop/Yaltopia Project/Gishen-B2B`
## Surfaces
| Location | Control |
|----------|---------|
| `/login` | Language switcher beside role selector |
| Portal topbar / profile menu | Language switcher |
| All portal pages | Translated UI chrome |
Entered data (names, addresses, free text) stays as typed — not machine-translated.
## Locales
| Code | Language | Launch |
|------|----------|--------|
| `en` | English | ✓ |
| `am` | Amharic | ✓ |
Registry extensible for future locales (e.g. `om`, `ti`).
## Implementation (frontend)
Mirror Fortune Admin i18n pattern:
```
src/i18n/registry.ts — locale metadata
src/i18n/LocaleContext.tsx — client provider
src/messages/en.json — English strings
src/messages/am.json — Amharic strings
```
Library: **next-intl** with App Router integration.
Adding a locale = registry row + messages file + optional font adjustments.
## User preference
| Field | Storage |
|-------|---------|
| `user.locale` | Shared backend user record |
| Cookie / localStorage | Client cache for next-intl |
### Endpoint
- `PATCH /v1/auth/me/locale` — see [`auth.md`](../backend/endpoints/auth.md)
### Request
```json
{ "locale": "am" }
```
### Session response includes
```json
{ "locale": "am" }
```
## Entity
- [`SessionUser.locale`](../backend/entities/session-user.md)
## Coverage requirements
All UI strings translated:
- Navigation labels
- Page titles and descriptions
- Buttons, form labels, placeholders
- Table headers and empty states
- Error and toast messages
- Demo role selector labels
- Date/number formatting per locale
## Validation
| Rule | Code |
|------|------|
| `locale` must be registered (`en`, `am`) | `VALIDATION_FAILED` |
## Default locale
- Org default: `organisation.locale_default`
- User override: `user.locale`
- Fallback chain: user → org → `en`
## Clinical withhold
N/A — i18n affects presentation only.
## UI component
Compact language switcher in topbar:
```
[ EN | አማ ]
```
Persist on change via `PATCH /v1/auth/me/locale` + client cookie update.
## Related
- [auth-roles.md](auth-roles.md) — login surface
- [org-departments.md](org-departments.md) — org default locale
## Backend note (shared API)
When production auth ships, `user.locale` must sync across B2B, Ecom, and Mob for consistent customer experience.