Dynamic Terminology & Labels System
Feature Detail
Description
Each organization uses different words for the same roles and concepts — what NHF calls a 'koordinator' may differ in label from the equivalent role at HLF or Barnekreftforeningen, and 'likeperson' itself has nuanced meaning per organization. This feature provides a runtime label system where all user-facing strings that vary by organization are resolved through a per-tenant terminology map rather than hardcoded copy. The system must cover role names, activity type labels, report field names, navigation tab labels, and any organization-specific jargon surfaced in the UI. Labels are fetched from Supabase on login and cached locally so the app works offline. Adding a new organization or updating its terminology requires only a database change, not a code deployment.
Analysis
Prevents the confusion and trust erosion that occurs when users see terminology from a different organization. It also reduces the per-organization customization work required when onboarding new partners, making the platform commercially scalable beyond the initial four organizations.
Implement as a Riverpod provider (e.g., `OrganizationLabelsNotifier`) that exposes a `label(key)` helper used throughout the widget tree. Store the terminology map as a JSONB column in an `organization_configs` Supabase table. Integrate with the existing 'Organization labels system' already referenced in the app architecture. Ensure all WCAG 2.2 AA accessible labels (aria equivalents in Flutter semantics) also resolve through this system.
Components (201)
Shared Components
These components are reused across multiple features
User Interface (59)
Service Layer (52)
Data Layer (33)
Infrastructure (54)
User Stories (18)
As a As a Peer Mentor (Likeperson)
I want the dynamic terminology system to be controlled by a feature flag so that it can be enabled progressively per organization during the rollout phase
So that my organization can adopt the custom terminology system at a pace that suits our onboarding readiness, without affecting organizations that are not yet configured
- Given the terminology feature flag is disabled for my organization, When peer mentors use the app, Then all labels fall back to the default static strings without any errors
- Given the terminology feature flag is enabled for my organization, When peer mentors use the app, Then all labels are resolved dynamically through the terminology pipeline
- Given the feature flag state changes on the backend, When the app next fetches flag configuration, Then the terminology system enables or disables without requiring an app restart
- +2 more
As a As a Coordinator
I want the dynamic terminology system to be controlled by a feature flag so that it can be enabled progressively per organization during the rollout phase
So that my organization can adopt the custom terminology system at a pace that suits our onboarding readiness, without affecting organizations that are not yet configured
- Given the terminology feature flag is disabled for my organization, When peer mentors use the app, Then all labels fall back to the default static strings without any errors
- Given the terminology feature flag is enabled for my organization, When peer mentors use the app, Then all labels are resolved dynamically through the terminology pipeline
- Given the feature flag state changes on the backend, When the app next fetches flag configuration, Then the terminology system enables or disables without requiring an app restart
- +2 more
As a As a Organization Administrator
I want the dynamic terminology system to be controlled by a feature flag so that it can be enabled progressively per organization during the rollout phase
So that my organization can adopt the custom terminology system at a pace that suits our onboarding readiness, without affecting organizations that are not yet configured
- Given the terminology feature flag is disabled for my organization, When peer mentors use the app, Then all labels fall back to the default static strings without any errors
- Given the terminology feature flag is enabled for my organization, When peer mentors use the app, Then all labels are resolved dynamically through the terminology pipeline
- Given the feature flag state changes on the backend, When the app next fetches flag configuration, Then the terminology system enables or disables without requiring an app restart
- +2 more
As a As a Peer Mentor (Likeperson)
I want the organization's terminology labels to remain fully available and consistent when peer mentors use the app in areas without internet connectivity
So that volunteer work in the field — such as home visits or remote locations — is never disrupted by missing or reverted labels that would confuse or concern users
- Given a peer mentor's device has no internet connection, When they open the app, Then all terminology labels render from the local cache with no errors or placeholders
- Given the app was previously used with connectivity and terminology was synced, When the peer mentor goes offline and registers an activity, Then all form labels, button text, and navigation items use the cached organization terminology
- Given the device regains connectivity, When the TerminologySyncService detects the connection, Then it automatically refreshes the terminology cache in the background without interrupting the user
- +2 more
As a As a Peer Mentor (Likeperson)
I want to preview how my organization's custom terminology appears across all app screens before it is published
So that I can verify that labels and terms correctly reflect our organization's language standards and avoid confusion among peer mentors and contacts before a live rollout
- Given I am logged in as a Coordinator, When I navigate to the terminology admin preview screen, Then I see a list of all label keys resolved with my organization's configured values
- Given I am on the terminology preview screen, When I select a specific screen or section (e.g., activity registration, contacts), Then all labels appear as they would for a peer mentor using that screen
- Given a label key is not yet configured for my organization, When I view the preview, Then a clear placeholder or fallback value is displayed and flagged for my attention
- +2 more
As a As a Peer Mentor (Likeperson)
I want all accessibility labels (semantics) used by screen readers to be resolved from the organization's dynamic terminology configuration, not hardcoded English strings
So that peer mentors and contacts who use assistive technology such as VoiceOver hear the same organization-specific language that sighted users read on screen, providing a consistent and dignified experience
- Given a peer mentor uses VoiceOver on iOS, When they navigate the activity registration wizard, Then the screen reader announces organization-specific terminology (e.g., 'Register peer mentor session' instead of 'Register activity') as configured for their organization
- Given a label key is updated in the organization's terminology configuration, When the sync completes and the user navigates the app with a screen reader, Then the updated semantic label is announced without requiring an app restart
- Given a terminology-aware widget is rendered, When Flutter's accessibility inspector examines it, Then the semantics node carries the resolved organization label, not the raw label key string
- +2 more
As a As a Coordinator
I want the organization's terminology labels to remain fully available and consistent when peer mentors use the app in areas without internet connectivity
So that volunteer work in the field — such as home visits or remote locations — is never disrupted by missing or reverted labels that would confuse or concern users
- Given a peer mentor's device has no internet connection, When they open the app, Then all terminology labels render from the local cache with no errors or placeholders
- Given the app was previously used with connectivity and terminology was synced, When the peer mentor goes offline and registers an activity, Then all form labels, button text, and navigation items use the cached organization terminology
- Given the device regains connectivity, When the TerminologySyncService detects the connection, Then it automatically refreshes the terminology cache in the background without interrupting the user
- +2 more
As a As a Coordinator
I want to preview how my organization's custom terminology appears across all app screens before it is published
So that I can verify that labels and terms correctly reflect our organization's language standards and avoid confusion among peer mentors and contacts before a live rollout
- Given I am logged in as a Coordinator, When I navigate to the terminology admin preview screen, Then I see a list of all label keys resolved with my organization's configured values
- Given I am on the terminology preview screen, When I select a specific screen or section (e.g., activity registration, contacts), Then all labels appear as they would for a peer mentor using that screen
- Given a label key is not yet configured for my organization, When I view the preview, Then a clear placeholder or fallback value is displayed and flagged for my attention
- +2 more
As a As a Coordinator
I want all accessibility labels (semantics) used by screen readers to be resolved from the organization's dynamic terminology configuration, not hardcoded English strings
So that peer mentors and contacts who use assistive technology such as VoiceOver hear the same organization-specific language that sighted users read on screen, providing a consistent and dignified experience
- Given a peer mentor uses VoiceOver on iOS, When they navigate the activity registration wizard, Then the screen reader announces organization-specific terminology (e.g., 'Register peer mentor session' instead of 'Register activity') as configured for their organization
- Given a label key is updated in the organization's terminology configuration, When the sync completes and the user navigates the app with a screen reader, Then the updated semantic label is announced without requiring an app restart
- Given a terminology-aware widget is rendered, When Flutter's accessibility inspector examines it, Then the semantics node carries the resolved organization label, not the raw label key string
- +2 more
As a As a Organization Administrator
I want the organization's terminology labels to remain fully available and consistent when peer mentors use the app in areas without internet connectivity
So that volunteer work in the field — such as home visits or remote locations — is never disrupted by missing or reverted labels that would confuse or concern users
- Given a peer mentor's device has no internet connection, When they open the app, Then all terminology labels render from the local cache with no errors or placeholders
- Given the app was previously used with connectivity and terminology was synced, When the peer mentor goes offline and registers an activity, Then all form labels, button text, and navigation items use the cached organization terminology
- Given the device regains connectivity, When the TerminologySyncService detects the connection, Then it automatically refreshes the terminology cache in the background without interrupting the user
- +2 more
As a As a Organization Administrator
I want to preview how my organization's custom terminology appears across all app screens before it is published
So that I can verify that labels and terms correctly reflect our organization's language standards and avoid confusion among peer mentors and contacts before a live rollout
- Given I am logged in as a Coordinator, When I navigate to the terminology admin preview screen, Then I see a list of all label keys resolved with my organization's configured values
- Given I am on the terminology preview screen, When I select a specific screen or section (e.g., activity registration, contacts), Then all labels appear as they would for a peer mentor using that screen
- Given a label key is not yet configured for my organization, When I view the preview, Then a clear placeholder or fallback value is displayed and flagged for my attention
- +2 more
As a As a Organization Administrator
I want all accessibility labels (semantics) used by screen readers to be resolved from the organization's dynamic terminology configuration, not hardcoded English strings
So that peer mentors and contacts who use assistive technology such as VoiceOver hear the same organization-specific language that sighted users read on screen, providing a consistent and dignified experience
- Given a peer mentor uses VoiceOver on iOS, When they navigate the activity registration wizard, Then the screen reader announces organization-specific terminology (e.g., 'Register peer mentor session' instead of 'Register activity') as configured for their organization
- Given a label key is updated in the organization's terminology configuration, When the sync completes and the user navigates the app with a screen reader, Then the updated semantic label is announced without requiring an app restart
- Given a terminology-aware widget is rendered, When Flutter's accessibility inspector examines it, Then the semantics node carries the resolved organization label, not the raw label key string
- +2 more
As a As a Peer Mentor (Likeperson)
I want the app to automatically fetch and cache the latest terminology configuration for my organization whenever connectivity is available
So that any updates made to organizational labels by an administrator are reflected promptly across all users' devices without requiring manual intervention or app updates
- Given I open the app with network connectivity, When the app initializes, Then the TerminologySyncService fetches the latest label configuration for my organization from Supabase
- Given a successful sync has completed, When the app is used offline afterward, Then the TerminologyCacheAdapter serves the previously fetched labels without any visible degradation
- Given the terminology configuration on the backend has changed since my last sync, When I open the app, Then the updated labels are fetched and the UI rebuilds to reflect the changes
- +2 more
As a As a Peer Mentor (Likeperson)
I want all text labels and terminology throughout the app to automatically reflect my organization's configured language without any manual intervention
So that peer mentors and contacts see consistent, familiar language on every screen they interact with, reinforcing organizational identity and reducing cognitive load
- Given I am a Coordinator in an organization with custom terminology, When I or a peer mentor opens any screen in the app, Then all label keys are resolved to organization-specific values without visible delay
- Given the terminology configuration has been updated on the backend, When the app next syncs, Then all screens immediately reflect the updated labels without requiring an app restart
- Given terminology is loaded from cache for offline use, When a peer mentor uses the app without connectivity, Then resolved labels remain consistent with the last synced configuration
- +2 more
As a As a Coordinator
I want the app to automatically fetch and cache the latest terminology configuration for my organization whenever connectivity is available
So that any updates made to organizational labels by an administrator are reflected promptly across all users' devices without requiring manual intervention or app updates
- Given I open the app with network connectivity, When the app initializes, Then the TerminologySyncService fetches the latest label configuration for my organization from Supabase
- Given a successful sync has completed, When the app is used offline afterward, Then the TerminologyCacheAdapter serves the previously fetched labels without any visible degradation
- Given the terminology configuration on the backend has changed since my last sync, When I open the app, Then the updated labels are fetched and the UI rebuilds to reflect the changes
- +2 more
As a As a Coordinator
I want all text labels and terminology throughout the app to automatically reflect my organization's configured language without any manual intervention
So that peer mentors and contacts see consistent, familiar language on every screen they interact with, reinforcing organizational identity and reducing cognitive load
- Given I am a Coordinator in an organization with custom terminology, When I or a peer mentor opens any screen in the app, Then all label keys are resolved to organization-specific values without visible delay
- Given the terminology configuration has been updated on the backend, When the app next syncs, Then all screens immediately reflect the updated labels without requiring an app restart
- Given terminology is loaded from cache for offline use, When a peer mentor uses the app without connectivity, Then resolved labels remain consistent with the last synced configuration
- +2 more
As a As a Organization Administrator
I want the app to automatically fetch and cache the latest terminology configuration for my organization whenever connectivity is available
So that any updates made to organizational labels by an administrator are reflected promptly across all users' devices without requiring manual intervention or app updates
- Given I open the app with network connectivity, When the app initializes, Then the TerminologySyncService fetches the latest label configuration for my organization from Supabase
- Given a successful sync has completed, When the app is used offline afterward, Then the TerminologyCacheAdapter serves the previously fetched labels without any visible degradation
- Given the terminology configuration on the backend has changed since my last sync, When I open the app, Then the updated labels are fetched and the UI rebuilds to reflect the changes
- +2 more
As a As a Organization Administrator
I want all text labels and terminology throughout the app to automatically reflect my organization's configured language without any manual intervention
So that peer mentors and contacts see consistent, familiar language on every screen they interact with, reinforcing organizational identity and reducing cognitive load
- Given I am a Coordinator in an organization with custom terminology, When I or a peer mentor opens any screen in the app, Then all label keys are resolved to organization-specific values without visible delay
- Given the terminology configuration has been updated on the backend, When the app next syncs, Then all screens immediately reflect the updated labels without requiring an app restart
- Given terminology is loaded from cache for offline use, When a peer mentor uses the app without connectivity, Then resolved labels remain consistent with the last synced configuration
- +2 more