Scope: packages/app/
Date: 2026-01-20
This report documents the remaining user-facing strings in packages/app/src that are still hardcoded (not routed through useLanguage().t(...) / translation keys), plus i18n-adjacent issues like locale-sensitive formatting.
useLanguage().t("...") with dictionaries in packages/app/src/i18n/en.ts and packages/app/src/i18n/zh.ts.packages/app/src/pages/home.tsx, packages/app/src/pages/layout.tsx, packages/app/src/pages/session.tsx, packages/app/src/components/prompt-input.tsx, packages/app/src/components/dialog-connect-provider.tsx, packages/app/src/components/session/session-header.tsx, packages/app/src/pages/error.tsx, packages/app/src/components/session/session-new-view.tsx, packages/app/src/components/session-context-usage.tsx, packages/app/src/components/session/session-context-tab.tsx, packages/app/src/components/session-lsp-indicator.tsx, packages/app/src/components/session/session-sortable-tab.tsx, packages/app/src/components/titlebar.tsx, packages/app/src/components/dialog-select-model.tsx, packages/app/src/context/notification.tsx, packages/app/src/context/global-sync.tsx, packages/app/src/context/file.tsx, packages/app/src/context/local.tsx, packages/app/src/utils/prompt.ts, packages/app/src/context/terminal.tsx, packages/app/src/components/session/session-sortable-terminal-tab.tsx (plus new keys added in both dictionaries).en.ts and zh.ts currently contain the same key set (373 keys each; no missing or extra keys).packages/app/src (excluding packages/app/src/i18n/* and tests).>Some text<)title="...", placeholder="...", label="...", description="...", Tooltip value="...")console.*) (typically does not need translation)MCP, LSP, URLs) (may remain untranslated by choice).File: packages/app/src/pages/error.tsx
Completed (2026-01-20):
error.page.* keys (title, description, buttons, report text, version label).error.chain.* keys.File: packages/app/src/components/prompt-input.tsx
Completed (2026-01-20):
PLACEHOLDERS list with prompt.example.* keys.prompt.toast.* and reused common.requestFailed for fallback error text.prompt.popover.*, prompt.dropzone.label).ESC keycap itself untranslated (key label).File: packages/app/src/components/dialog-connect-provider.tsx
Completed (2026-01-20):
provider.connect.* keys (titles, statuses, validations, instructions, OpenCode Zen onboarding).common.submit and used it for both API + OAuth submit buttons.provider.connect.toast.connected.*.File: packages/app/src/components/session/session-header.tsx
Completed (2026-01-20):
session.header.search.placeholder.session.share.* keys (popover title/description, button states, copy tooltip).command.review.toggle, command.terminal.toggle, command.session.share).File: packages/app/src/components/session/session-new-view.tsx
Completed (2026-01-20):
command.session.new for the heading.session.new.worktree.* (main branch, main branch w/ branch name, create worktree).session.new.lastModified and used language.locale() for Luxon relative time.File: packages/app/src/components/session-context-usage.tsx
Completed (2026-01-20):
context.usage.* keys.language.locale()).File: packages/app/src/components/session/session-context-tab.tsx
Completed (2026-01-20):
language.locale()).language.locale() for number/date formatting.File: packages/app/src/components/session-lsp-indicator.tsx
Completed (2026-01-20):
lsp.* keys (kept the acronym itself).File: packages/app/src/components/session/session-sortable-tab.tsx
Completed (2026-01-20):
common.closeTab for the close tooltip.File: packages/app/src/components/titlebar.tsx
Completed (2026-01-20):
command.sidebar.toggle for the tooltip title.File: packages/app/src/components/dialog-select-model.tsx
Completed (2026-01-20):
File: packages/app/src/components/dialog-select-server.tsx
Completed (2026-01-20):
dialog.server.add.placeholder (value unchanged).File: packages/app/src/context/notification.tsx
Completed (2026-01-20):
notification.session.* keys.File: packages/app/src/context/global-sync.tsx
Completed (2026-01-20):
toast.session.listFailed.title.error.globalSync.connectFailed.Files:
packages/app/src/context/file.tsxpackages/app/src/context/local.tsxCompleted (2026-01-20):
toast.file.loadFailed.title and reused it in both contexts.File: packages/app/src/context/terminal.tsx
Completed (2026-01-20):
titleNumber and localized via terminal.title.*.titleNumber by parsing the stored title string.File: packages/app/src/utils/prompt.ts
Completed (2026-01-20):
common.attachment and plumbed it into extractPromptFromParts(...) as opts.attachmentName.File: packages/app/src/entry.tsx
Completed (2026-01-20):
error.dev.rootNotFound.navigator.languages to match the app’s default detection.No remaining work in packages/app/ as of 2026-01-20.
To keep the dictionaries navigable, prefer grouping by surface:
error.page.*, error.chain.*prompt.* (including examples, tooltips, empty states, toasts)provider.connect.* (auth flow UI + validation + success)session.share.* (publish/unpublish/copy link)context.usage.* (Tokens/Usage/Cost + call to action)lsp.* (and potentially mcp.* if expanded)notification.session.*toast.file.*, toast.session.*Also reuse existing command keys for tooltip titles whenever possible (e.g. command.sidebar.toggle, command.review.toggle, command.terminal.toggle).
Pages:
Components:
Context:
Utils: