i18n: catalog remaining Studio and creative UI copy - #109
Conversation
Move leftover visible UI copy into EN+ES catalogs (characters, comics, studio, scene3d, shell, plus remaining storyLab notices, seriesLab forms, director recovery/dashboard, wizard/settings/dialogs). Register the new namespaces and retarget tests to English source strings.
PR Review — Loreframe StudioRisk: medium Automated review from Findings
Changed files
CONTRIBUTING checklist
Posted by the repo PR review workflow. Re-runs on each push to the PR. |
Code health
Markdown, JSON catalogs and tests are out of this table. Only Most complex functions
Trend vs baseline
Warnings
Ratchet passed. |
…g-ui-copy # Conflicts: # ui/src/features/video-editor/VideoEditorPanel.tsx # ui/tests/i18nFoundation.test.tsx
…g-ui-copy # Conflicts: # ui/src/features/series/SeriesSetupPanel.tsx
|
cursor review |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
Autofix Details
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Language switch remounts authenticated app
- Stabilized checkAccess with a tRef so language changes no longer recreate the callback, retrigger the effect, or remount the authenticated tree.
Or push these changes by commenting:
@cursor push 6aa3bac930
Preview (6aa3bac930)
diff --git a/ui/src/components/LanAuthGate.tsx b/ui/src/components/LanAuthGate.tsx
--- a/ui/src/components/LanAuthGate.tsx
+++ b/ui/src/components/LanAuthGate.tsx
@@ -1,4 +1,4 @@
-import { type FormEvent, type ReactNode, useCallback, useEffect, useState } from 'react'
+import { type FormEvent, type ReactNode, useCallback, useEffect, useRef, useState } from 'react'
import { KeyRound, LoaderCircle, ShieldCheck } from 'lucide-react'
import { useUiTranslation } from '../i18n'
@@ -13,6 +13,8 @@
export function LanAuthGate({ children }: { children: ReactNode }) {
const { t } = useUiTranslation('shell')
const { t: tCommon } = useUiTranslation('common')
+ const tRef = useRef(t)
+ tRef.current = t
const [state, setState] = useState<GateState>('checking')
const [token, setToken] = useState('')
const [error, setError] = useState('')
@@ -26,14 +28,14 @@
credentials: 'same-origin',
cache: 'no-store',
})
- if (!response.ok) throw new Error(t('lan.statusFailed', { status: response.status }))
+ if (!response.ok) throw new Error(tRef.current('lan.statusFailed', { status: response.status }))
const status = await response.json() as LanAuthStatus
setState(!status.required || status.authenticated ? 'ready' : 'locked')
} catch {
- setError(t('lan.unreachable'))
+ setError(tRef.current('lan.unreachable'))
setState('unreachable')
}
- }, [t])
+ }, [])
useEffect(() => {
void checkAccess()You can send follow-ups to the cloud agent here.
|
cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 1347c23. Configure here.

Summary
Validation
Recovered from the interrupted experiment/ui-information-architecture worktree without modifying or rebasing main.
Note
Low Risk
UI copy and test assertions only; behavior and API payloads are unchanged, with catalog parity enforced by existing i18n checks and updated regression tests.
Overview
Expands internationalization by adding five namespaces (
studio,shell,scene3d,characters,comics), registering them incheck-i18n-catalogs.mjs, and documenting them inINTERNATIONALIZATION.md.Replaces hardcoded English across Director workflows (
DirectorDashboard), app shell (intro, LAN gate, download/execution banners), Settings model browser, and many Studio sidebar / edit-mode surfaces withuseUiTranslationand semantict('…')keys. Edit sub-mode toggles switch from inlinelabelstrings tolabelKeyreferences into the catalogs.Updates source-level Python tests so they assert components call the expected translation keys and that
en/*.jsonstill carries the former user-visible strings (e.g.studio.json,seriesLab.json,settings.json), keeping regressions tied to copy without embedding literals in TSX.Reviewed by Cursor Bugbot for commit 1347c23. Configure here.