Files
gui/pkgs/ui
zeekay ce42338b5a shell: every string it draws goes through @hanzo/i18n
The shell renders on every Hanzo property, so a word it draws as bare
English stays English on every page of every locale, whatever the host
translated around it. Each visible string now passes `t()` from
@hanzo/i18n/react: the palettes, both headers, the menus, the footer,
the frame, the account menus, the meter, notifications, the visitor
chat and the launcher. Copy written as data (the registry, the
launcher's apps, the account rows) is marked with `phrase()` where it
is written and drawn through `t()`. A product's name standing alone is
not marked, and host data (palette commands, frame sections, names,
orgs) is drawn as given.

The palettes translate their rows before ranking them, so a reader
searches the words they see. A sentence with a value or a key cap in it
is one message with a placeholder; the meter's span is a sentence per
span. The send arrow mirrors under RTL.

@hanzo/i18n is a required peer (>=0.4.0) so the host's one provider
reaches the shell. With no provider `t` answers the English source: 32
server renders of the components are byte-identical before and after.
The one markup change is the open launcher's "⌘K to switch", now one
sentence around its key cap. i18n.test.mjs parses the source with oxc
and fails on copy that reaches the screen without t() or phrase().

Claude-Session: https://claude.ai/code/session_01BLLMyBFSvAfCt7ZGqYuiEz
2026-10-22 15:44:31 -07:00
..
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00
2026-10-22 13:02:19 -07:00