Skip to content

fix(i18n): translate assignee picker strings - #5170

Open
viktormarinho wants to merge 2 commits into
mainfrom
loop/i18n/mryzhyv3
Open

fix(i18n): translate assignee picker strings#5170
viktormarinho wants to merge 2 commits into
mainfrom
loop/i18n/mryzhyv3

Conversation

@viktormarinho

@viktormarinho viktormarinho commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixed hardcoded user-facing strings in the assignee picker component that should have been localized.

Invariant Violated

No hardcoded user-facing strings — JSX placeholders, labels, and empty states must go through t().

Evidence (Before)

apps/web/src/layouts/task-board/assignee-picker.tsx:
- Line 24: placeholder="Assign to…"
- Line 26: >No members found.<
- Line 37: value="Unassigned"
- Line 42: >Unassigned<
- Line 45: heading="Members"

Fix Applied

Updated component to use i18n via useT():

  • placeholder="Assign to…"t("taskBoard.taskDialog.assignToPlaceholder")
  • >No members found.t("taskBoard.taskDialog.noMembersFound")
  • value="Unassigned"t("taskBoard.taskDialog.unassignedLabel")
  • heading="Members"t("taskBoard.taskDialog.membersGroupHeading")

All translation keys were already present in both en and pt-br dictionaries with proper translations.

Evidence (After)

Verification with hardcoded string heuristic checks:

$ rg 'placeholder="Assign to…"' apps/web/src/layouts/task-board/assignee-picker.tsx
# No matches (was: present on line 24)

$ rg '>No members found\.' apps/web/src/layouts/task-board/assignee-picker.tsx
# No matches (was: present on line 26)

$ rg 'heading="Members"' apps/web/src/layouts/task-board/assignee-picker.tsx
# No matches (was: present on line 45)

Infrastructure

Set up i18n domain directory (domains/i18n/) with:

  • DOMAIN.md — domain invariants and enforcement rules
  • quality.md — pt-br translation quality guidelines
  • triage.md — hardcoded-string triage ledger (empty; first run)
  • quality-baseline — baseline commit SHA for subjective quality audits

Summary by cubic

Localized the assignee picker by replacing hardcoded text with t(), and added i18n domain guardrails. Also applied Biome formatting.

  • Bug Fixes

    • Switched to useT() in assignee-picker.tsx.
    • Placeholder → t("taskBoard.taskDialog.assignToPlaceholder")
    • Empty state → t("taskBoard.taskDialog.noMembersFound")
    • "Unassigned" label/value → t("taskBoard.taskDialog.unassignedLabel")
    • "Members" heading → t("taskBoard.taskDialog.membersGroupHeading")
  • Infrastructure

    • Added domains/i18n/ with DOMAIN.md, quality.md, triage.md, and quality-baseline to enforce “no hardcoded strings,” pt-br parity, and quality rules.
    • Applied Biome formatting.

Written for commit c233758. Summary will update on new commits.

Review in cubic

Fixed hardcoded user-facing strings in assignee-picker.tsx:
- placeholder "Assign to…" → taskBoard.taskDialog.assignToPlaceholder
- empty state "No members found." → taskBoard.taskDialog.noMembersFound
- button label "Unassigned" → taskBoard.taskDialog.unassignedLabel
- group heading "Members" → taskBoard.taskDialog.membersGroupHeading

All translation keys were already present in both en and pt-br dictionaries.

Set up i18n domain infrastructure (domains/i18n/) with DOMAIN.md, quality.md,
triage.md, and quality-baseline per the domain reconciliation protocol.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@viktormarinho viktormarinho added the loop:i18n Domain reconciliation: i18n label Jul 24, 2026
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

loop:i18n Domain reconciliation: i18n

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant