Skip to content

feat(app): extract the chat slice into i18n, en+ru (CLEAN-39) - #34

Merged
maksymhryzodub-prog merged 1 commit into
feat/CLEAN-38-i18n-agent-slicefrom
feat/CLEAN-39-i18n-chat-slice
Aug 19, 2026
Merged

feat(app): extract the chat slice into i18n, en+ru (CLEAN-39)#34
maksymhryzodub-prog merged 1 commit into
feat/CLEAN-38-i18n-agent-slicefrom
feat/CLEAN-39-i18n-chat-slice

Conversation

@maksymhryzodub-prog

Copy link
Copy Markdown
Contributor

Implements CLEAN-39 (subtask of CLEAN-33): https://dreamvention.atlassian.net/browse/CLEAN-39

Fourth in the stackmain#30#31#33this.

The history list, session detail, card and transcript bubble had no i18n block at all. Adds one and moves every string out, including several the scan could not see: the Sync/Syncing toggle, Show/Hide on a summary marker, the 👍/👎 aria-labels, and the "Conversation" title fallback built in script.

Notable

relative_time.* moved to common instead of being duplicated. Both the agent card and the chat card render "5m ago", and the copy is generic. Key paths are unchanged — vue-i18n merges slices into one global scope — so the agent components needed no edit at all, and the sync script adopted the already-translated keys into their new home rather than paying to re-translate them. That is the adopt rule doing exactly what it was written for.

Two plural sets ride the pluralRules.ru added in CLEAN-38:

нет сообщений | {count} сообщение | {count} сообщения | {count} сообщений

Timestamps follow the chosen locale. fmt() now passes locale into toLocaleString, read from useI18n — the locale itself, never copy, which is the one thing that composable is still for in this codebase.

Verification

  • nuxt typecheck and nuxt build clean.
  • i18n:check green across 6 slice/locale pairs.
  • Re-scan finds nothing hardcoded left in the slice. Remaining across app: template (4 strings) — CLEAN-40, the last one.

🤖 Generated with Claude Code

The history list, session detail, card and transcript bubble had no i18n
block at all. Adds one and moves every string out — including the ones
the scan could not see: the Sync/Syncing toggle, Show/Hide on a summary
marker, the 👍/👎 aria-labels, and the "Conversation" title fallback.

Two plural sets ("{count} message(s)", the free-slot counter's sibling)
go through the plural rules added in CLEAN-38, so ru gets its four
branches: нет сообщений | {count} сообщение | {count} сообщения |
{count} сообщений.

relative_time.* moves from the agent slice to common rather than being
duplicated: both slices render "5m ago" and the copy is generic. Key
paths are unchanged — vue-i18n merges slices into one global scope — so
the agent components needed no edit, and the sync script adopted the
already-translated keys into their new home instead of re-translating.

Timestamps now format against the active locale: fmt() reads `locale`
from useI18n, which is the one thing that composable is still for here —
the locale itself, never copy.

Verified: nuxt typecheck and nuxt build clean, i18n:check green over 6
slice/locale pairs, re-scan finds nothing hardcoded left in the slice.
Remaining across app: template (4 strings, CLEAN-40).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@maksymhryzodub-prog
maksymhryzodub-prog force-pushed the feat/CLEAN-39-i18n-chat-slice branch from 53104df to b491d78 Compare August 19, 2026 21:07
@maksymhryzodub-prog
maksymhryzodub-prog merged commit 0bd7495 into main Aug 19, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant