From 971542b7f6dc50ceb231fc3fdd7dc8dcfede5f47 Mon Sep 17 00:00:00 2001 From: "openclaw-clownfish[bot]" <280122609+openclaw-clownfish[bot]@users.noreply.github.com> Date: Sun, 14 Jun 2026 09:23:00 +0800 Subject: [PATCH] UI: localize Logs tab labels (#92820) Repair #61080 by routing Logs tab user-facing labels through Control UI locale keys while keeping export filename suffixes stable. Validation: - pnpm ui:i18n:check - pnpm check:changed - ui/src/ui/views/logs.test.ts - Codex /review - GitHub PR checks Source PR credit: continues @rubensfox20's work from https://github.com/openclaw/openclaw/pull/61080. Co-authored-by: rubensfox20 <111531429+rubensfox20@users.noreply.github.com> --- ui/src/i18n/.i18n/ar.meta.json | 17 +++- ui/src/i18n/.i18n/de.meta.json | 17 +++- ui/src/i18n/.i18n/es.meta.json | 17 +++- ui/src/i18n/.i18n/fa.meta.json | 17 +++- ui/src/i18n/.i18n/fr.meta.json | 17 +++- ui/src/i18n/.i18n/id.meta.json | 17 +++- ui/src/i18n/.i18n/it.meta.json | 17 +++- ui/src/i18n/.i18n/ja-JP.meta.json | 17 +++- ui/src/i18n/.i18n/ko.meta.json | 17 +++- ui/src/i18n/.i18n/nl.meta.json | 17 +++- ui/src/i18n/.i18n/pl.meta.json | 17 +++- ui/src/i18n/.i18n/pt-BR.meta.json | 17 +++- ui/src/i18n/.i18n/raw-copy-baseline.json | 49 ----------- ui/src/i18n/.i18n/th.meta.json | 17 +++- ui/src/i18n/.i18n/tr.meta.json | 17 +++- ui/src/i18n/.i18n/uk.meta.json | 17 +++- ui/src/i18n/.i18n/vi.meta.json | 17 +++- ui/src/i18n/.i18n/zh-CN.meta.json | 17 +++- ui/src/i18n/.i18n/zh-TW.meta.json | 17 +++- ui/src/i18n/locales/ar.ts | 15 ++++ ui/src/i18n/locales/de.ts | 15 ++++ ui/src/i18n/locales/en.ts | 15 ++++ ui/src/i18n/locales/es.ts | 15 ++++ ui/src/i18n/locales/fa.ts | 15 ++++ ui/src/i18n/locales/fr.ts | 15 ++++ ui/src/i18n/locales/id.ts | 15 ++++ ui/src/i18n/locales/it.ts | 15 ++++ ui/src/i18n/locales/ja-JP.ts | 15 ++++ ui/src/i18n/locales/ko.ts | 15 ++++ ui/src/i18n/locales/nl.ts | 15 ++++ ui/src/i18n/locales/pl.ts | 15 ++++ ui/src/i18n/locales/pt-BR.ts | 15 ++++ ui/src/i18n/locales/th.ts | 15 ++++ ui/src/i18n/locales/tr.ts | 15 ++++ ui/src/i18n/locales/uk.ts | 15 ++++ ui/src/i18n/locales/vi.ts | 15 ++++ ui/src/i18n/locales/zh-CN.ts | 15 ++++ ui/src/i18n/locales/zh-TW.ts | 15 ++++ ui/src/ui/views/logs.test.ts | 106 +++++++++++++++++++++++ ui/src/ui/views/logs.ts | 30 ++++--- 40 files changed, 659 insertions(+), 117 deletions(-) create mode 100644 ui/src/ui/views/logs.test.ts diff --git a/ui/src/i18n/.i18n/ar.meta.json b/ui/src/i18n/.i18n/ar.meta.json index 0df5c2445230..d0a273d01a00 100644 --- a/ui/src/i18n/.i18n/ar.meta.json +++ b/ui/src/i18n/.i18n/ar.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.611Z", + "generatedAt": "2026-06-14T00:56:11.191Z", "locale": "ar", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/de.meta.json b/ui/src/i18n/.i18n/de.meta.json index def5703549ae..e38ce080620f 100644 --- a/ui/src/i18n/.i18n/de.meta.json +++ b/ui/src/i18n/.i18n/de.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.187Z", + "generatedAt": "2026-06-14T00:56:10.731Z", "locale": "de", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/es.meta.json b/ui/src/i18n/.i18n/es.meta.json index 8ce945aeddf1..2366afc45f05 100644 --- a/ui/src/i18n/.i18n/es.meta.json +++ b/ui/src/i18n/.i18n/es.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.275Z", + "generatedAt": "2026-06-14T00:56:10.822Z", "locale": "es", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/fa.meta.json b/ui/src/i18n/.i18n/fa.meta.json index dcebf4f570bd..957d4c29c2ec 100644 --- a/ui/src/i18n/.i18n/fa.meta.json +++ b/ui/src/i18n/.i18n/fa.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:39.387Z", + "generatedAt": "2026-06-14T00:56:12.036Z", "locale": "fa", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/fr.meta.json b/ui/src/i18n/.i18n/fr.meta.json index 3c6b5ffa6292..4d8914081cc9 100644 --- a/ui/src/i18n/.i18n/fr.meta.json +++ b/ui/src/i18n/.i18n/fr.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.527Z", + "generatedAt": "2026-06-14T00:56:11.096Z", "locale": "fr", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/id.meta.json b/ui/src/i18n/.i18n/id.meta.json index 169a6f14f9bb..b2945e727529 100644 --- a/ui/src/i18n/.i18n/id.meta.json +++ b/ui/src/i18n/.i18n/id.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.953Z", + "generatedAt": "2026-06-14T00:56:11.562Z", "locale": "id", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/it.meta.json b/ui/src/i18n/.i18n/it.meta.json index 3e14cf097924..f444ed10cf9f 100644 --- a/ui/src/i18n/.i18n/it.meta.json +++ b/ui/src/i18n/.i18n/it.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.697Z", + "generatedAt": "2026-06-14T00:56:11.279Z", "locale": "it", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/ja-JP.meta.json b/ui/src/i18n/.i18n/ja-JP.meta.json index c33fc37cda7d..f8617c096cbc 100644 --- a/ui/src/i18n/.i18n/ja-JP.meta.json +++ b/ui/src/i18n/.i18n/ja-JP.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.361Z", + "generatedAt": "2026-06-14T00:56:10.912Z", "locale": "ja-JP", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/ko.meta.json b/ui/src/i18n/.i18n/ko.meta.json index 19fe4b8c6766..6453517b9746 100644 --- a/ui/src/i18n/.i18n/ko.meta.json +++ b/ui/src/i18n/.i18n/ko.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.446Z", + "generatedAt": "2026-06-14T00:56:11.005Z", "locale": "ko", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/nl.meta.json b/ui/src/i18n/.i18n/nl.meta.json index c3721ad430fc..b7dd48f2eb98 100644 --- a/ui/src/i18n/.i18n/nl.meta.json +++ b/ui/src/i18n/.i18n/nl.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:39.305Z", + "generatedAt": "2026-06-14T00:56:11.940Z", "locale": "nl", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/pl.meta.json b/ui/src/i18n/.i18n/pl.meta.json index 004082162368..e0cb8b8e2e56 100644 --- a/ui/src/i18n/.i18n/pl.meta.json +++ b/ui/src/i18n/.i18n/pl.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:39.039Z", + "generatedAt": "2026-06-14T00:56:11.653Z", "locale": "pl", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/pt-BR.meta.json b/ui/src/i18n/.i18n/pt-BR.meta.json index 9927e504d13f..f66c44f143e5 100644 --- a/ui/src/i18n/.i18n/pt-BR.meta.json +++ b/ui/src/i18n/.i18n/pt-BR.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.104Z", + "generatedAt": "2026-06-14T00:56:10.631Z", "locale": "pt-BR", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/raw-copy-baseline.json b/ui/src/i18n/.i18n/raw-copy-baseline.json index 083b30edb82b..909ea9da8563 100644 --- a/ui/src/i18n/.i18n/raw-copy-baseline.json +++ b/ui/src/i18n/.i18n/raw-copy-baseline.json @@ -3984,55 +3984,6 @@ "path": "ui/src/ui/views/login-gate.ts", "text": "OpenClaw" }, - { - "count": 1, - "kind": "html-attribute", - "name": "placeholder", - "path": "ui/src/ui/views/logs.ts", - "text": "Search logs" - }, - { - "count": 1, - "kind": "html-text", - "name": "text", - "path": "ui/src/ui/views/logs.ts", - "text": "Auto-follow" - }, - { - "count": 1, - "kind": "html-text", - "name": "text", - "path": "ui/src/ui/views/logs.ts", - "text": "Filter" - }, - { - "count": 1, - "kind": "html-text", - "name": "text", - "path": "ui/src/ui/views/logs.ts", - "text": "Gateway file logs (JSONL)." - }, - { - "count": 1, - "kind": "html-text", - "name": "text", - "path": "ui/src/ui/views/logs.ts", - "text": "Log output truncated; showing latest chunk." - }, - { - "count": 1, - "kind": "html-text", - "name": "text", - "path": "ui/src/ui/views/logs.ts", - "text": "Logs" - }, - { - "count": 1, - "kind": "html-text", - "name": "text", - "path": "ui/src/ui/views/logs.ts", - "text": "No log entries." - }, { "count": 1, "kind": "html-attribute", diff --git a/ui/src/i18n/.i18n/th.meta.json b/ui/src/i18n/.i18n/th.meta.json index 49caff32519d..831c075261a8 100644 --- a/ui/src/i18n/.i18n/th.meta.json +++ b/ui/src/i18n/.i18n/th.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:39.135Z", + "generatedAt": "2026-06-14T00:56:11.747Z", "locale": "th", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/tr.meta.json b/ui/src/i18n/.i18n/tr.meta.json index 86335bcf14a0..15662bdadbfa 100644 --- a/ui/src/i18n/.i18n/tr.meta.json +++ b/ui/src/i18n/.i18n/tr.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.778Z", + "generatedAt": "2026-06-14T00:56:11.372Z", "locale": "tr", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/uk.meta.json b/ui/src/i18n/.i18n/uk.meta.json index ee30c036462c..2b1cc80d9bbc 100644 --- a/ui/src/i18n/.i18n/uk.meta.json +++ b/ui/src/i18n/.i18n/uk.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.861Z", + "generatedAt": "2026-06-14T00:56:11.468Z", "locale": "uk", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/vi.meta.json b/ui/src/i18n/.i18n/vi.meta.json index 1df5af4db5e6..c1b4beed51e3 100644 --- a/ui/src/i18n/.i18n/vi.meta.json +++ b/ui/src/i18n/.i18n/vi.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:39.223Z", + "generatedAt": "2026-06-14T00:56:11.843Z", "locale": "vi", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/zh-CN.meta.json b/ui/src/i18n/.i18n/zh-CN.meta.json index 4a57f8d46eb3..680f43f3fb82 100644 --- a/ui/src/i18n/.i18n/zh-CN.meta.json +++ b/ui/src/i18n/.i18n/zh-CN.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:37.909Z", + "generatedAt": "2026-06-14T00:56:10.441Z", "locale": "zh-CN", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/.i18n/zh-TW.meta.json b/ui/src/i18n/.i18n/zh-TW.meta.json index da62df6d6870..381185978127 100644 --- a/ui/src/i18n/.i18n/zh-TW.meta.json +++ b/ui/src/i18n/.i18n/zh-TW.meta.json @@ -11,6 +11,17 @@ "chat.workspaceFiles.workspace", "cron.jobDetail.command", "cron.jobDetail.cwd", + "logsView.autoFollow", + "logsView.empty", + "logsView.exportButton", + "logsView.exportLabels.filtered", + "logsView.exportLabels.visible", + "logsView.file", + "logsView.filter", + "logsView.searchPlaceholder", + "logsView.subtitle", + "logsView.title", + "logsView.truncated", "skillWorkshop.header.useCurrentChat", "skillWorkshop.header.useCurrentChatAria", "skillWorkshop.header.useCurrentChatTooltip", @@ -43,12 +54,12 @@ "workboard.unknownStatus", "workboard.viewDetails" ], - "generatedAt": "2026-06-13T21:58:38.020Z", + "generatedAt": "2026-06-14T00:56:10.535Z", "locale": "zh-TW", "model": "claude-opus-4-8", "provider": "anthropic", - "sourceHash": "642a382824b6637e6eea0d3fbccd04b135194675db6bb9a0a1bacbf6424bd870", - "totalKeys": 1345, + "sourceHash": "d0b2c5f7e87d471ad2373c4ea8875db08c9bab459b4c4c5573e5eff03ee5be12", + "totalKeys": 1356, "translatedKeys": 1303, "workflow": 1 } diff --git a/ui/src/i18n/locales/ar.ts b/ui/src/i18n/locales/ar.ts index d75a4b8d5a53..64deb7aa9f16 100644 --- a/ui/src/i18n/locales/ar.ts +++ b/ui/src/i18n/locales/ar.ts @@ -493,6 +493,21 @@ export const ar: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "لوحة العمل معطّلة. فعّل", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/de.ts b/ui/src/i18n/locales/de.ts index 3510c0ecfdd9..9d59ca1b5f4a 100644 --- a/ui/src/i18n/locales/de.ts +++ b/ui/src/i18n/locales/de.ts @@ -498,6 +498,21 @@ export const de: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard ist deaktiviert. Aktivieren Sie", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/en.ts b/ui/src/i18n/locales/en.ts index 5fe11353d177..1084cd77fe70 100644 --- a/ui/src/i18n/locales/en.ts +++ b/ui/src/i18n/locales/en.ts @@ -492,6 +492,21 @@ export const en: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard is disabled. Enable", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/es.ts b/ui/src/i18n/locales/es.ts index a24becd7935e..b44e5a365272 100644 --- a/ui/src/i18n/locales/es.ts +++ b/ui/src/i18n/locales/es.ts @@ -495,6 +495,21 @@ export const es: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard está desactivado. Activa", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/fa.ts b/ui/src/i18n/locales/fa.ts index 3fbd76babff3..35e1310ad078 100644 --- a/ui/src/i18n/locales/fa.ts +++ b/ui/src/i18n/locales/fa.ts @@ -495,6 +495,21 @@ export const fa: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard غیرفعال است. فعال کنید", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/fr.ts b/ui/src/i18n/locales/fr.ts index 4e5fab4f8ecf..9e810a851442 100644 --- a/ui/src/i18n/locales/fr.ts +++ b/ui/src/i18n/locales/fr.ts @@ -497,6 +497,21 @@ export const fr: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Le tableau de travail est désactivé. Activez", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/id.ts b/ui/src/i18n/locales/id.ts index 0595e71c67f0..61e99175ddf2 100644 --- a/ui/src/i18n/locales/id.ts +++ b/ui/src/i18n/locales/id.ts @@ -494,6 +494,21 @@ export const id: TranslationMap = { minutes: "{minutes}m {seconds}dtk", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard dinonaktifkan. Aktifkan", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/it.ts b/ui/src/i18n/locales/it.ts index 2fc99ceb0793..d863dd6ff205 100644 --- a/ui/src/i18n/locales/it.ts +++ b/ui/src/i18n/locales/it.ts @@ -496,6 +496,21 @@ export const it: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard è disabilitata. Abilita", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/ja-JP.ts b/ui/src/i18n/locales/ja-JP.ts index 8e1b4c967202..9a488e592430 100644 --- a/ui/src/i18n/locales/ja-JP.ts +++ b/ui/src/i18n/locales/ja-JP.ts @@ -497,6 +497,21 @@ export const ja_JP: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard は無効になっています。有効にするには", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/ko.ts b/ui/src/i18n/locales/ko.ts index 2d90f9b6b8c3..ca78a4c298df 100644 --- a/ui/src/i18n/locales/ko.ts +++ b/ui/src/i18n/locales/ko.ts @@ -493,6 +493,21 @@ export const ko: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard가 비활성화되어 있습니다. 활성화하려면", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/nl.ts b/ui/src/i18n/locales/nl.ts index 03403f55c285..8a3896850a2d 100644 --- a/ui/src/i18n/locales/nl.ts +++ b/ui/src/i18n/locales/nl.ts @@ -496,6 +496,21 @@ export const nl: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard is uitgeschakeld. Schakel", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/pl.ts b/ui/src/i18n/locales/pl.ts index 0a7820dbb29a..fdd2086bd93a 100644 --- a/ui/src/i18n/locales/pl.ts +++ b/ui/src/i18n/locales/pl.ts @@ -495,6 +495,21 @@ export const pl: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard jest wyłączony. Włącz", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/pt-BR.ts b/ui/src/i18n/locales/pt-BR.ts index 94563973ea41..d5bef57253c3 100644 --- a/ui/src/i18n/locales/pt-BR.ts +++ b/ui/src/i18n/locales/pt-BR.ts @@ -494,6 +494,21 @@ export const pt_BR: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "O Workboard está desativado. Ative", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/th.ts b/ui/src/i18n/locales/th.ts index 0e93924f95dc..189e8cdf49ba 100644 --- a/ui/src/i18n/locales/th.ts +++ b/ui/src/i18n/locales/th.ts @@ -492,6 +492,21 @@ export const th: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard ถูกปิดใช้งาน เปิดใช้งาน", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/tr.ts b/ui/src/i18n/locales/tr.ts index b09db890317f..aceeff4f55f6 100644 --- a/ui/src/i18n/locales/tr.ts +++ b/ui/src/i18n/locales/tr.ts @@ -497,6 +497,21 @@ export const tr: TranslationMap = { minutes: "{minutes} dk {seconds} sn", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard devre dışı. Etkinleştirin", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/uk.ts b/ui/src/i18n/locales/uk.ts index 85d5984f31b9..0177ee6f522f 100644 --- a/ui/src/i18n/locales/uk.ts +++ b/ui/src/i18n/locales/uk.ts @@ -496,6 +496,21 @@ export const uk: TranslationMap = { minutes: "{minutes}хв {seconds}с", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard вимкнено. Увімкніть", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/vi.ts b/ui/src/i18n/locales/vi.ts index afef489b085d..2da31c0c54e0 100644 --- a/ui/src/i18n/locales/vi.ts +++ b/ui/src/i18n/locales/vi.ts @@ -495,6 +495,21 @@ export const vi: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard đã bị tắt. Bật", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/zh-CN.ts b/ui/src/i18n/locales/zh-CN.ts index 44fb903a760c..8a675e7f5934 100644 --- a/ui/src/i18n/locales/zh-CN.ts +++ b/ui/src/i18n/locales/zh-CN.ts @@ -491,6 +491,21 @@ export const zh_CN: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard 已禁用。启用", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/i18n/locales/zh-TW.ts b/ui/src/i18n/locales/zh-TW.ts index dbd3ec1675d7..31deb0923bcc 100644 --- a/ui/src/i18n/locales/zh-TW.ts +++ b/ui/src/i18n/locales/zh-TW.ts @@ -491,6 +491,21 @@ export const zh_TW: TranslationMap = { minutes: "{minutes}m {seconds}s", }, }, + logsView: { + title: "Logs", + subtitle: "Gateway file logs (JSONL).", + exportButton: "Export {label}", + exportLabels: { + filtered: "filtered", + visible: "visible", + }, + filter: "Filter", + searchPlaceholder: "Search logs", + autoFollow: "Auto-follow", + file: "File: {file}", + truncated: "Log output truncated; showing latest chunk.", + empty: "No log entries.", + }, workboard: { disabledHelpStart: "Workboard 已停用。啟用", enableConfigKey: "plugins.entries.workboard.enabled = true", diff --git a/ui/src/ui/views/logs.test.ts b/ui/src/ui/views/logs.test.ts new file mode 100644 index 000000000000..74f1be3dffed --- /dev/null +++ b/ui/src/ui/views/logs.test.ts @@ -0,0 +1,106 @@ +/* @vitest-environment jsdom */ + +import { render } from "lit"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { i18n } from "../../i18n/index.ts"; +import { pt_BR } from "../../i18n/locales/pt-BR.ts"; +import type { LogLevel } from "../types.ts"; +import { renderLogs, type LogsProps } from "./logs.ts"; + +function createLevelFilters(overrides: Partial> = {}) { + return { + trace: true, + debug: true, + info: true, + warn: true, + error: true, + fatal: true, + ...overrides, + }; +} + +function createProps(overrides: Partial = {}): LogsProps { + return { + loading: false, + error: null, + file: null, + entries: [ + { + raw: '{"level":"info","message":"matched line"}', + time: "2026-06-14T12:00:00Z", + level: "info", + subsystem: "gateway", + message: "matched line", + }, + ], + filterText: "", + levelFilters: createLevelFilters(), + autoFollow: true, + truncated: false, + onFilterTextChange: vi.fn(), + onLevelToggle: vi.fn(), + onToggleAutoFollow: vi.fn(), + onRefresh: vi.fn(), + onExport: vi.fn(), + onScroll: vi.fn(), + ...overrides, + }; +} + +function buttonByText(container: Element, text: string): HTMLButtonElement { + const button = Array.from(container.querySelectorAll("button")).find( + (candidate) => candidate.textContent?.replace(/\s+/g, " ").trim() === text, + ); + if (!(button instanceof HTMLButtonElement)) { + throw new Error(`Expected ${text} button`); + } + return button; +} + +async function useTestPortugueseLogsLabels() { + i18n.registerTranslation("pt-BR", { + logsView: { + title: "Registros", + subtitle: "Registros do Gateway em JSONL.", + exportButton: "Exportar {label}", + exportLabels: { + filtered: "filtrado", + visible: "visivel", + }, + filter: "Filtro", + searchPlaceholder: "Pesquisar registros", + autoFollow: "Acompanhar automaticamente", + file: "Arquivo: {file}", + truncated: "Saida truncada.", + empty: "Nenhuma entrada.", + }, + }); + await i18n.setLocale("pt-BR"); +} + +afterEach(async () => { + i18n.registerTranslation("pt-BR", pt_BR); + await i18n.setLocale("en"); +}); + +describe("renderLogs", () => { + it.each([ + { buttonText: "Exportar visivel", expectedLabel: "visible", filterText: "" }, + { buttonText: "Exportar filtrado", expectedLabel: "filtered", filterText: "matched" }, + ])( + "keeps the $expectedLabel export filename suffix stable when labels are localized", + async ({ buttonText, expectedLabel, filterText }) => { + await useTestPortugueseLogsLabels(); + const onExport = vi.fn(); + const container = document.createElement("div"); + + render(renderLogs(createProps({ filterText, onExport })), container); + buttonByText(container, buttonText).click(); + + expect(onExport).toHaveBeenCalledWith( + ['{"level":"info","message":"matched line"}'], + expectedLabel, + ); + }, + ); +}); diff --git a/ui/src/ui/views/logs.ts b/ui/src/ui/views/logs.ts index 345362bbb576..5a966212a694 100644 --- a/ui/src/ui/views/logs.ts +++ b/ui/src/ui/views/logs.ts @@ -5,6 +5,7 @@ import { normalizeLowercaseStringOrEmpty } from "../string-coerce.ts"; import type { LogEntry, LogLevel } from "../types.ts"; const LEVELS: LogLevel[] = ["trace", "debug", "info", "warn", "error", "fatal"]; +type ExportFileLabel = "filtered" | "visible"; export type LogsProps = { loading: boolean; @@ -53,14 +54,15 @@ export function renderLogs(props: LogsProps) { } return matchesFilter(entry, needle); }); - const exportLabel = needle || levelFiltered ? "filtered" : "visible"; + const exportFileLabel: ExportFileLabel = needle || levelFiltered ? "filtered" : "visible"; + const exportDisplayLabel = t(`logsView.exportLabels.${exportFileLabel}`); return html`
-
Logs
-
Gateway file logs (JSONL).
+
${t("logsView.title")}
+
${t("logsView.subtitle")}