Covers EffectsList (title, "New Preset", section headers, preset
cards) and EffectsDetail (header buttons for Save / Save as Custom /
Delete, name/description fields, preview section, Save as Custom
dialog, all toasts).
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Covers the "..." action menu on both the History table (Play, Export
Audio, Export Package, Apply Effects, Regenerate, Delete) and on
individual story chat items (Play from here, Remove from Story).
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Covers the title + "New Story" button, empty states, story row
metadata (item count, updated time), the create/edit/delete dialogs,
and all toast notifications. Also handles StoryContent: "Select a
story" placeholder, search popover, "Export Audio" button, and the
"Generating N audios" pending indicator.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
- ProfileCard: "No description", "designed" badge, aria-labels, and
delete dialog.
- HistoryTable: delete / clear-failed / import / effects dialogs.
- formatDate: switch date-fns `formatDistance` locale based on
`i18n.language` so "5 minutes ago" becomes "5 分钟前" under zh-CN.
HistoryTable now subscribes via useTranslation so the table
re-renders when language flips.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Installs i18next + react-i18next + language detector and wires up a
language selector in the General settings page. Extracts strings from
the highest-visibility surfaces: all settings tabs, model management,
sidebar nav, main editor, and the floating generate box. Remaining
strings (profile forms, history, stories/effects/voices/audio tabs)
can land in follow-up PRs.
Closes#411.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>