From 3e27c5b074a8dbf223719c13506e1ec1e30e3c39 Mon Sep 17 00:00:00 2001 From: Ma Date: Mon, 30 Mar 2026 12:42:01 +0800 Subject: [PATCH] fix(studio): unify visible copy across core views --- packages/studio/src/components/Sidebar.tsx | 4 ++-- packages/studio/src/hooks/use-i18n.ts | 25 +++++++++++++++++++++ packages/studio/src/pages/Analytics.tsx | 4 ++-- packages/studio/src/pages/BookDetail.tsx | 12 +++++----- packages/studio/src/pages/ChapterReader.tsx | 4 ++-- packages/studio/src/pages/ConfigView.tsx | 10 ++++----- packages/studio/src/pages/DaemonControl.tsx | 2 +- packages/studio/src/pages/Dashboard.tsx | 4 ++-- packages/studio/src/pages/LogViewer.tsx | 10 ++++----- packages/studio/src/pages/TruthFiles.tsx | 12 +++++----- 10 files changed, 56 insertions(+), 31 deletions(-) diff --git a/packages/studio/src/components/Sidebar.tsx b/packages/studio/src/components/Sidebar.tsx index cd7a472..b87294e 100644 --- a/packages/studio/src/components/Sidebar.tsx +++ b/packages/studio/src/components/Sidebar.tsx @@ -108,7 +108,7 @@ export function Sidebar({ nav, activePage, t, sse }: { onClick={nav.toConfig} /> (`/books/${bookId}/analytics`); - if (loading) return
Loading...
; - if (error) return
Error: {error}
; + if (loading) return
{t("common.loading")}
; + if (error) return
{t("common.error")}: {error}
; if (!data) return null; const statuses = Object.entries(data.statusDistribution); diff --git a/packages/studio/src/pages/BookDetail.tsx b/packages/studio/src/pages/BookDetail.tsx index ba165d8..e352ad1 100644 --- a/packages/studio/src/pages/BookDetail.tsx +++ b/packages/studio/src/pages/BookDetail.tsx @@ -89,8 +89,8 @@ export function BookDetail({ bookId, nav, theme, t, sse }: { bookId: string; nav refetch(); }; - if (loading) return
Loading...
; - if (error) return
Error: {error}
; + if (loading) return
{t("common.loading")}
; + if (error) return
{t("common.error")}: {error}
; if (!data) return null; const { book, chapters } = data; @@ -110,8 +110,8 @@ export function BookDetail({ bookId, nav, theme, t, sse }: { bookId: string; nav

{book.title}

{book.genre} - {chapters.length} chapters - {totalWords.toLocaleString()} words + {chapters.length} {t("dash.chapters")} + {totalWords.toLocaleString()} {t("book.words")} {book.language === "en" && EN} {book.fanficMode && fanfic:{book.fanficMode}}
@@ -144,7 +144,7 @@ export function BookDetail({ bookId, nav, theme, t, sse }: { bookId: string; nav onClick={() => (nav as { toTruth?: (id: string) => void }).toTruth?.(bookId)} className={`px-4 py-2 text-sm ${c.btnSecondary} rounded-md transition-colors`} > - Truth Files + {t("book.truthFiles")} )} @@ -121,10 +121,10 @@ export function ConfigView({ nav, theme, t }: { nav: Nav; theme: Theme; t: TFunc {editing && (
)} diff --git a/packages/studio/src/pages/DaemonControl.tsx b/packages/studio/src/pages/DaemonControl.tsx index bcd4c6b..464b635 100644 --- a/packages/studio/src/pages/DaemonControl.tsx +++ b/packages/studio/src/pages/DaemonControl.tsx @@ -88,7 +88,7 @@ export function DaemonControl({ nav, theme, t, sse }: { nav: Nav; theme: Theme; {/* Daemon event log */}
- Event Log + {t("daemon.eventLog")}
{daemonEvents.length > 0 ? ( diff --git a/packages/studio/src/pages/Dashboard.tsx b/packages/studio/src/pages/Dashboard.tsx index f14bcc2..e32e92c 100644 --- a/packages/studio/src/pages/Dashboard.tsx +++ b/packages/studio/src/pages/Dashboard.tsx @@ -36,8 +36,8 @@ export function Dashboard({ nav, sse, theme, t }: { nav: Nav; sse: { messages: R void refetch(); }, [refetch, sse.messages]); - if (loading) return
Loading...
; - if (error) return
Error: {error}
; + if (loading) return
{t("common.loading")}
; + if (error) return
{t("common.error")}: {error}
; /* ── Empty state — vertically centered in the available viewport ── */ if (!data?.books.length) { diff --git a/packages/studio/src/pages/LogViewer.tsx b/packages/studio/src/pages/LogViewer.tsx index 6a2cfe6..f7f887a 100644 --- a/packages/studio/src/pages/LogViewer.tsx +++ b/packages/studio/src/pages/LogViewer.tsx @@ -30,16 +30,16 @@ export function LogViewer({ nav, theme, t }: { nav: Nav; theme: Theme; t: TFunct
/ - Logs + {t("logs.title")}
-

Logs

+

{t("logs.title")}

@@ -68,14 +68,14 @@ export function LogViewer({ nav, theme, t }: { nav: Nav; theme: Theme; t: TFunct
) : (
- No log entries. Logs appear after running write/draft/daemon operations. + {t("logs.empty")}
)}

- Showing last 100 entries from inkos.log + {t("logs.showingRecent")}

); diff --git a/packages/studio/src/pages/TruthFiles.tsx b/packages/studio/src/pages/TruthFiles.tsx index 0b8d9c3..8290391 100644 --- a/packages/studio/src/pages/TruthFiles.tsx +++ b/packages/studio/src/pages/TruthFiles.tsx @@ -30,10 +30,10 @@ export function TruthFiles({ bookId, nav, theme, t }: { bookId: string; nav: Nav / / - Truth Files + {t("truth.title")} -

Truth Files

+

{t("truth.title")}

{/* File list */} @@ -49,11 +49,11 @@ export function TruthFiles({ bookId, nav, theme, t }: { bookId: string; nav: Nav }`} >
{f.name}
-
{f.size.toLocaleString()} chars
+
{f.size.toLocaleString()} {t("truth.chars")}
))} {(!data?.files || data.files.length === 0) && ( -
No truth files
+
{t("truth.empty")}
)}
@@ -62,9 +62,9 @@ export function TruthFiles({ bookId, nav, theme, t }: { bookId: string; nav: Nav {selected && fileData?.content ? (
{fileData.content}
) : selected && fileData?.content === null ? ( -
File not found
+
{t("truth.notFound")}
) : ( -
Select a file to view
+
{t("truth.selectFile")}
)}