feat: localize membership tier display
All checks were successful
deploy-socialize / image (push) Successful in 1m11s
deploy-socialize / deploy (push) Successful in 19s

This commit is contained in:
2026-05-07 20:43:08 -04:00
parent 6d92119c9c
commit 7a8a0a44bf
17 changed files with 2937 additions and 72 deletions

View File

@@ -0,0 +1,41 @@
# Task: Localized organization membership tier display
## Feature Spec
`docs/FEATURES/organizations.md`
## Goal
Move membership tier display names and descriptions into localized database rows so API consumers receive tier copy in the requested language with English fallback.
## Scope
- Add membership tier translation persistence for `en` and `fr`.
- Remove tier `Name` and `Description` from the base tier model.
- Select tier translation from `Accept-Language`, fallback to English.
- Send the active frontend locale as `Accept-Language` on API requests.
- Regenerate EF migration, OpenAPI, and frontend schema.
- Audit similar database-backed display strings that are currently unlocalized.
## Validation
```bash
dotnet ef migrations add LocalizeOrganizationMembershipTiers --project backend/src/Socialize.Api/Socialize.Api.csproj --startup-project backend/src/Socialize.Api/Socialize.Api.csproj
dotnet test backend/Socialize.slnx
cd frontend && npm run build
./scripts/update-openapi.sh
```
## Done When
- [x] Tier display names and descriptions are stored per culture.
- [x] Tier APIs return localized `name` and `description`.
- [x] English is used when the requested locale is missing.
- [x] Frontend API requests include the current locale.
- [x] Similar unlocalized persisted display strings are identified.
## Localization Audit
- Calendar catalog seed rows still store curated `Title` and `Description` as single-language strings. This looks similar to membership tiers because the copy is product-owned catalog metadata, not user-authored content.
- Backend-generated notification/activity messages are persisted as English sentences. They are event history, but they are still user-visible generated copy.
- Most other `Name`, `Title`, and `Description` fields found in modules are user-authored domain content, imported calendar event data, identifiers, roles, statuses, or test data and should not be translated by the platform.