Step 3.5 moved page header copy into the new pages locale namespace, so headers now localize. navGroups.ts still hardcodes English labels for the same routes.
Result for an es user: the header reads "Registros" while the sidebar entry for that exact route reads "Logs". Before this change nothing on those pages localized, so the mixed-language screen is new — a regression in consistency even though it is strictly more localized than before.
The fix is niac's shape: useNavGroups() resolves its labels from the same pages.{i18nKey}.label keys the registry uses, so the rail and the header cannot disagree and there is one string per route. niac already does this (ui/src/navGroups.ts comments the shared source explicitly).
Deliberately out of scope for Step 3.5, which was header convergence only — converting navGroups is nav work and would have touched the sidebar tests too. Should land before or alongside Step 4.
Step 3.5 moved page header copy into the new
pageslocale namespace, so headers now localize.navGroups.tsstill hardcodes English labels for the same routes.Result for an
esuser: the header reads "Registros" while the sidebar entry for that exact route reads "Logs". Before this change nothing on those pages localized, so the mixed-language screen is new — a regression in consistency even though it is strictly more localized than before.The fix is niac's shape:
useNavGroups()resolves its labels from the samepages.{i18nKey}.labelkeys the registry uses, so the rail and the header cannot disagree and there is one string per route. niac already does this (ui/src/navGroups.tscomments the shared source explicitly).Deliberately out of scope for Step 3.5, which was header convergence only — converting navGroups is nav work and would have touched the sidebar tests too. Should land before or alongside Step 4.