# 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.