From ac2ca8b2cab5d3aade2fe3d1ba5ad21a56612be5 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 5 Apr 2026 12:49:29 +0100 Subject: [PATCH] chore(ui): regenerate control ui locale bundles --- ui/src/i18n/.i18n/de.meta.json | 439 ++++++++++++++++++ ui/src/i18n/.i18n/es.meta.json | 257 +++++++++++ ui/src/i18n/.i18n/fr.meta.json | 521 ++++++++++++++++++++++ ui/src/i18n/.i18n/glossary.de.json | 42 ++ ui/src/i18n/.i18n/glossary.es.json | 42 ++ ui/src/i18n/.i18n/glossary.fr.json | 42 ++ ui/src/i18n/.i18n/glossary.ja-JP.json | 42 ++ ui/src/i18n/.i18n/glossary.ko.json | 42 ++ ui/src/i18n/.i18n/glossary.pt-BR.json | 42 ++ ui/src/i18n/.i18n/glossary.zh-CN.json | 42 ++ ui/src/i18n/.i18n/glossary.zh-TW.json | 42 ++ ui/src/i18n/.i18n/ja-JP.meta.json | 521 ++++++++++++++++++++++ ui/src/i18n/.i18n/ko.meta.json | 521 ++++++++++++++++++++++ ui/src/i18n/.i18n/pt-BR.meta.json | 410 +++++++++++++++++ ui/src/i18n/.i18n/zh-CN.meta.json | 222 +++++++++ ui/src/i18n/.i18n/zh-TW.meta.json | 397 +++++++++++++++++ ui/src/i18n/locales/de.ts | 494 +++++++++++++++++++- ui/src/i18n/locales/es.ts | 283 +++++++++++- ui/src/i18n/locales/fr.ts | 618 ++++++++++++++++++++++++++ ui/src/i18n/locales/ja-JP.ts | 618 ++++++++++++++++++++++++++ ui/src/i18n/locales/ko.ts | 618 ++++++++++++++++++++++++++ ui/src/i18n/locales/pt-BR.ts | 441 ++++++++++++++++++ ui/src/i18n/locales/zh-CN.ts | 233 ++++++++++ ui/src/i18n/locales/zh-TW.ts | 441 ++++++++++++++++++ 24 files changed, 7366 insertions(+), 4 deletions(-) create mode 100644 ui/src/i18n/.i18n/de.meta.json create mode 100644 ui/src/i18n/.i18n/es.meta.json create mode 100644 ui/src/i18n/.i18n/fr.meta.json create mode 100644 ui/src/i18n/.i18n/glossary.de.json create mode 100644 ui/src/i18n/.i18n/glossary.es.json create mode 100644 ui/src/i18n/.i18n/glossary.fr.json create mode 100644 ui/src/i18n/.i18n/glossary.ja-JP.json create mode 100644 ui/src/i18n/.i18n/glossary.ko.json create mode 100644 ui/src/i18n/.i18n/glossary.pt-BR.json create mode 100644 ui/src/i18n/.i18n/glossary.zh-CN.json create mode 100644 ui/src/i18n/.i18n/glossary.zh-TW.json create mode 100644 ui/src/i18n/.i18n/ja-JP.meta.json create mode 100644 ui/src/i18n/.i18n/ko.meta.json create mode 100644 ui/src/i18n/.i18n/pt-BR.meta.json create mode 100644 ui/src/i18n/.i18n/zh-CN.meta.json create mode 100644 ui/src/i18n/.i18n/zh-TW.meta.json create mode 100644 ui/src/i18n/locales/fr.ts create mode 100644 ui/src/i18n/locales/ja-JP.ts create mode 100644 ui/src/i18n/locales/ko.ts diff --git a/ui/src/i18n/.i18n/de.meta.json b/ui/src/i18n/.i18n/de.meta.json new file mode 100644 index 00000000000..1615d2030cf --- /dev/null +++ b/ui/src/i18n/.i18n/de.meta.json @@ -0,0 +1,439 @@ +{ + "fallbackKeys": [ + "chat.toolCallsToggle", + "common.offline", + "common.ok", + "common.online", + "common.search", + "common.theme", + "common.version", + "cron.errors.agentMessageRequired", + "cron.errors.agentMessageRequiredShort", + "cron.errors.cronExprRequired", + "cron.errors.cronExprRequiredShort", + "cron.errors.everyAmountInvalid", + "cron.errors.invalidIntervalAmount", + "cron.errors.invalidRunTime", + "cron.errors.invalidStaggerAmount", + "cron.errors.nameRequired", + "cron.errors.nameRequiredShort", + "cron.errors.scheduleAtInvalid", + "cron.errors.staggerAmountInvalid", + "cron.errors.systemEventTextRequired", + "cron.errors.systemTextRequired", + "cron.errors.timeoutInvalid", + "cron.errors.webhookUrlInvalid", + "cron.errors.webhookUrlRequired", + "cron.form.addJob", + "cron.form.advanced", + "cron.form.advancedHelp", + "cron.form.agentHelp", + "cron.form.agentId", + "cron.form.agentPlaceholder", + "cron.form.agentTurn", + "cron.form.agentTurnHelp", + "cron.form.announceDefault", + "cron.form.assistantTaskPrompt", + "cron.form.at", + "cron.form.basics", + "cron.form.basicsSub", + "cron.form.bestEffortDelivery", + "cron.form.bestEffortHelp", + "cron.form.cancel", + "cron.form.cantAddYet", + "cron.form.channel", + "cron.form.channelHelp", + "cron.form.clearAgentHelp", + "cron.form.clearAgentOverride", + "cron.form.createSubtitle", + "cron.form.cronOption", + "cron.form.days", + "cron.form.deleteAfterRun", + "cron.form.deleteAfterRunHelp", + "cron.form.deliveryHelp", + "cron.form.deliverySection", + "cron.form.deliverySub", + "cron.form.description", + "cron.form.descriptionPlaceholder", + "cron.form.editJob", + "cron.form.every", + "cron.form.everyAmountPlaceholder", + "cron.form.exactTiming", + "cron.form.exactTimingHelp", + "cron.form.execution", + "cron.form.executionSub", + "cron.form.expression", + "cron.form.expressionPlaceholder", + "cron.form.fieldName", + "cron.form.fillRequired", + "cron.form.fixFields", + "cron.form.fixFieldsPlural", + "cron.form.hours", + "cron.form.isolated", + "cron.form.jitterHelp", + "cron.form.main", + "cron.form.mainTimelineMessage", + "cron.form.minutes", + "cron.form.model", + "cron.form.modelHelp", + "cron.form.modelPlaceholder", + "cron.form.namePlaceholder", + "cron.form.newJob", + "cron.form.nextHeartbeat", + "cron.form.noneInternal", + "cron.form.now", + "cron.form.payloadKind", + "cron.form.required", + "cron.form.requiredSr", + "cron.form.resultDelivery", + "cron.form.runAt", + "cron.form.saveChanges", + "cron.form.saving", + "cron.form.schedule", + "cron.form.scheduleSub", + "cron.form.seconds", + "cron.form.session", + "cron.form.sessionHelp", + "cron.form.staggerPlaceholder", + "cron.form.staggerUnit", + "cron.form.staggerWindow", + "cron.form.systemEvent", + "cron.form.systemEventHelp", + "cron.form.thinking", + "cron.form.thinkingHelp", + "cron.form.thinkingPlaceholder", + "cron.form.timeoutHelp", + "cron.form.timeoutPlaceholder", + "cron.form.timeoutSeconds", + "cron.form.timezoneHelp", + "cron.form.timezoneOptional", + "cron.form.timezonePlaceholder", + "cron.form.to", + "cron.form.toHelp", + "cron.form.toPlaceholder", + "cron.form.unit", + "cron.form.updateSubtitle", + "cron.form.wakeMode", + "cron.form.wakeModeHelp", + "cron.form.webhookHelp", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobDetail.agent", + "cron.jobDetail.delivery", + "cron.jobDetail.prompt", + "cron.jobDetail.system", + "cron.jobList.allJobs", + "cron.jobList.clone", + "cron.jobList.disable", + "cron.jobList.disabled", + "cron.jobList.edit", + "cron.jobList.enable", + "cron.jobList.enabled", + "cron.jobList.history", + "cron.jobList.remove", + "cron.jobList.run", + "cron.jobList.selectJob", + "cron.jobs.all", + "cron.jobs.ascending", + "cron.jobs.descending", + "cron.jobs.direction", + "cron.jobs.enabled", + "cron.jobs.lastRun", + "cron.jobs.loading", + "cron.jobs.loadMore", + "cron.jobs.name", + "cron.jobs.nextRun", + "cron.jobs.noMatching", + "cron.jobs.recentlyUpdated", + "cron.jobs.reset", + "cron.jobs.schedule", + "cron.jobs.searchJobs", + "cron.jobs.searchPlaceholder", + "cron.jobs.shownOf", + "cron.jobs.sort", + "cron.jobs.subtitle", + "cron.jobs.title", + "cron.jobState.last", + "cron.jobState.next", + "cron.jobState.status", + "cron.runEntry.due", + "cron.runEntry.next", + "cron.runEntry.noSummary", + "cron.runEntry.openRunChat", + "cron.runEntry.runAt", + "cron.runs.allDelivery", + "cron.runs.allJobs", + "cron.runs.allStatuses", + "cron.runs.clear", + "cron.runs.delivery", + "cron.runs.deliveryDelivered", + "cron.runs.deliveryNotDelivered", + "cron.runs.deliveryNotRequested", + "cron.runs.deliveryUnknown", + "cron.runs.loadMore", + "cron.runs.newestFirst", + "cron.runs.noMatching", + "cron.runs.oldestFirst", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.runs.runStatusSkipped", + "cron.runs.runStatusUnknown", + "cron.runs.scope", + "cron.runs.searchPlaceholder", + "cron.runs.searchRuns", + "cron.runs.selectedJob", + "cron.runs.selectJobHint", + "cron.runs.status", + "cron.runs.subtitleAll", + "cron.runs.subtitleJob", + "cron.runs.title", + "cron.summary.enabled", + "cron.summary.jobs", + "cron.summary.nextWake", + "cron.summary.no", + "cron.summary.refresh", + "cron.summary.refreshing", + "cron.summary.yes", + "languages.en", + "languages.fr", + "languages.jaJP", + "languages.ko", + "login.passwordPlaceholder", + "login.subtitle", + "nav.agent", + "nav.chat", + "nav.resize", + "overview.attention.title", + "overview.cards.cost", + "overview.cards.recentSessions", + "overview.cards.skills", + "overview.connection.docsHint", + "overview.connection.docsLink", + "overview.connection.step1", + "overview.connection.step2", + "overview.connection.step3", + "overview.connection.step4", + "overview.connection.title", + "overview.eventLog.title", + "overview.logTail.title", + "overview.palette.noResults", + "overview.palette.placeholder", + "overview.quickActions.automation", + "overview.quickActions.newSession", + "overview.quickActions.refreshAll", + "overview.quickActions.terminal", + "overview.snapshot.status", + "overview.snapshot.title", + "overview.stats.cron", + "subtitles.aiAgents", + "subtitles.appearance", + "subtitles.automation", + "subtitles.communications", + "subtitles.dreams", + "subtitles.infrastructure", + "tabs.aiAgents", + "tabs.appearance", + "tabs.automation", + "tabs.chat", + "tabs.communications", + "tabs.debug", + "tabs.dreams", + "tabs.infrastructure", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.694Z", + "locale": "de", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 82, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/es.meta.json b/ui/src/i18n/.i18n/es.meta.json new file mode 100644 index 00000000000..47eb750311b --- /dev/null +++ b/ui/src/i18n/.i18n/es.meta.json @@ -0,0 +1,257 @@ +{ + "fallbackKeys": [ + "chat.toolCallsToggle", + "common.docs", + "common.na", + "common.search", + "common.theme", + "cron.form.cronOption", + "cron.form.everyAmountPlaceholder", + "cron.form.expressionPlaceholder", + "cron.form.modelPlaceholder", + "cron.form.staggerPlaceholder", + "cron.form.timezonePlaceholder", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.summary.no", + "languages.fr", + "languages.jaJP", + "languages.ko", + "login.passwordPlaceholder", + "login.subtitle", + "nav.chat", + "nav.control", + "nav.resize", + "overview.attention.title", + "overview.cards.cost", + "overview.cards.recentSessions", + "overview.cards.skills", + "overview.connection.docsHint", + "overview.connection.docsLink", + "overview.connection.step1", + "overview.connection.step2", + "overview.connection.step3", + "overview.connection.step4", + "overview.connection.title", + "overview.eventLog.title", + "overview.logTail.title", + "overview.notes.tailscaleTitle", + "overview.palette.noResults", + "overview.palette.placeholder", + "overview.quickActions.automation", + "overview.quickActions.newSession", + "overview.quickActions.refreshAll", + "overview.quickActions.terminal", + "overview.stats.cron", + "subtitles.aiAgents", + "subtitles.appearance", + "subtitles.automation", + "subtitles.communications", + "subtitles.dreams", + "subtitles.infrastructure", + "tabs.aiAgents", + "tabs.appearance", + "tabs.automation", + "tabs.chat", + "tabs.communications", + "tabs.dreams", + "tabs.infrastructure", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.707Z", + "locale": "es", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 264, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/fr.meta.json b/ui/src/i18n/.i18n/fr.meta.json new file mode 100644 index 00000000000..fd122172e46 --- /dev/null +++ b/ui/src/i18n/.i18n/fr.meta.json @@ -0,0 +1,521 @@ +{ + "fallbackKeys": [ + "chat.disconnected", + "chat.focusToggle", + "chat.hideCronSessions", + "chat.onboardingDisabled", + "chat.refreshTitle", + "chat.showCronSessions", + "chat.showCronSessionsHidden", + "chat.thinkingToggle", + "chat.toolCallsToggle", + "common.connect", + "common.disabled", + "common.docs", + "common.enabled", + "common.health", + "common.na", + "common.offline", + "common.ok", + "common.online", + "common.refresh", + "common.resources", + "common.search", + "common.theme", + "common.version", + "cron.errors.agentMessageRequired", + "cron.errors.agentMessageRequiredShort", + "cron.errors.cronExprRequired", + "cron.errors.cronExprRequiredShort", + "cron.errors.everyAmountInvalid", + "cron.errors.invalidIntervalAmount", + "cron.errors.invalidRunTime", + "cron.errors.invalidStaggerAmount", + "cron.errors.nameRequired", + "cron.errors.nameRequiredShort", + "cron.errors.scheduleAtInvalid", + "cron.errors.staggerAmountInvalid", + "cron.errors.systemEventTextRequired", + "cron.errors.systemTextRequired", + "cron.errors.timeoutInvalid", + "cron.errors.webhookUrlInvalid", + "cron.errors.webhookUrlRequired", + "cron.form.addJob", + "cron.form.advanced", + "cron.form.advancedHelp", + "cron.form.agentHelp", + "cron.form.agentId", + "cron.form.agentPlaceholder", + "cron.form.agentTurn", + "cron.form.agentTurnHelp", + "cron.form.announceDefault", + "cron.form.assistantTaskPrompt", + "cron.form.at", + "cron.form.basics", + "cron.form.basicsSub", + "cron.form.bestEffortDelivery", + "cron.form.bestEffortHelp", + "cron.form.cancel", + "cron.form.cantAddYet", + "cron.form.channel", + "cron.form.channelHelp", + "cron.form.clearAgentHelp", + "cron.form.clearAgentOverride", + "cron.form.createSubtitle", + "cron.form.cronOption", + "cron.form.days", + "cron.form.deleteAfterRun", + "cron.form.deleteAfterRunHelp", + "cron.form.deliveryHelp", + "cron.form.deliverySection", + "cron.form.deliverySub", + "cron.form.description", + "cron.form.descriptionPlaceholder", + "cron.form.editJob", + "cron.form.every", + "cron.form.everyAmountPlaceholder", + "cron.form.exactTiming", + "cron.form.exactTimingHelp", + "cron.form.execution", + "cron.form.executionSub", + "cron.form.expression", + "cron.form.expressionPlaceholder", + "cron.form.fieldName", + "cron.form.fillRequired", + "cron.form.fixFields", + "cron.form.fixFieldsPlural", + "cron.form.hours", + "cron.form.isolated", + "cron.form.jitterHelp", + "cron.form.main", + "cron.form.mainTimelineMessage", + "cron.form.minutes", + "cron.form.model", + "cron.form.modelHelp", + "cron.form.modelPlaceholder", + "cron.form.namePlaceholder", + "cron.form.newJob", + "cron.form.nextHeartbeat", + "cron.form.noneInternal", + "cron.form.now", + "cron.form.payloadKind", + "cron.form.required", + "cron.form.requiredSr", + "cron.form.resultDelivery", + "cron.form.runAt", + "cron.form.saveChanges", + "cron.form.saving", + "cron.form.schedule", + "cron.form.scheduleSub", + "cron.form.seconds", + "cron.form.session", + "cron.form.sessionHelp", + "cron.form.staggerPlaceholder", + "cron.form.staggerUnit", + "cron.form.staggerWindow", + "cron.form.systemEvent", + "cron.form.systemEventHelp", + "cron.form.thinking", + "cron.form.thinkingHelp", + "cron.form.thinkingPlaceholder", + "cron.form.timeoutHelp", + "cron.form.timeoutPlaceholder", + "cron.form.timeoutSeconds", + "cron.form.timezoneHelp", + "cron.form.timezoneOptional", + "cron.form.timezonePlaceholder", + "cron.form.to", + "cron.form.toHelp", + "cron.form.toPlaceholder", + "cron.form.unit", + "cron.form.updateSubtitle", + "cron.form.wakeMode", + "cron.form.wakeModeHelp", + "cron.form.webhookHelp", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobDetail.agent", + "cron.jobDetail.delivery", + "cron.jobDetail.prompt", + "cron.jobDetail.system", + "cron.jobList.allJobs", + "cron.jobList.clone", + "cron.jobList.disable", + "cron.jobList.disabled", + "cron.jobList.edit", + "cron.jobList.enable", + "cron.jobList.enabled", + "cron.jobList.history", + "cron.jobList.remove", + "cron.jobList.run", + "cron.jobList.selectJob", + "cron.jobs.all", + "cron.jobs.ascending", + "cron.jobs.descending", + "cron.jobs.direction", + "cron.jobs.enabled", + "cron.jobs.lastRun", + "cron.jobs.loading", + "cron.jobs.loadMore", + "cron.jobs.name", + "cron.jobs.nextRun", + "cron.jobs.noMatching", + "cron.jobs.recentlyUpdated", + "cron.jobs.reset", + "cron.jobs.schedule", + "cron.jobs.searchJobs", + "cron.jobs.searchPlaceholder", + "cron.jobs.shownOf", + "cron.jobs.sort", + "cron.jobs.subtitle", + "cron.jobs.title", + "cron.jobState.last", + "cron.jobState.next", + "cron.jobState.status", + "cron.runEntry.due", + "cron.runEntry.next", + "cron.runEntry.noSummary", + "cron.runEntry.openRunChat", + "cron.runEntry.runAt", + "cron.runs.allDelivery", + "cron.runs.allJobs", + "cron.runs.allStatuses", + "cron.runs.clear", + "cron.runs.delivery", + "cron.runs.deliveryDelivered", + "cron.runs.deliveryNotDelivered", + "cron.runs.deliveryNotRequested", + "cron.runs.deliveryUnknown", + "cron.runs.loadMore", + "cron.runs.newestFirst", + "cron.runs.noMatching", + "cron.runs.oldestFirst", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.runs.runStatusSkipped", + "cron.runs.runStatusUnknown", + "cron.runs.scope", + "cron.runs.searchPlaceholder", + "cron.runs.searchRuns", + "cron.runs.selectedJob", + "cron.runs.selectJobHint", + "cron.runs.status", + "cron.runs.subtitleAll", + "cron.runs.subtitleJob", + "cron.runs.title", + "cron.summary.enabled", + "cron.summary.jobs", + "cron.summary.nextWake", + "cron.summary.no", + "cron.summary.refresh", + "cron.summary.refreshing", + "cron.summary.yes", + "languages.de", + "languages.en", + "languages.es", + "languages.fr", + "languages.jaJP", + "languages.ko", + "languages.ptBR", + "languages.zhCN", + "languages.zhTW", + "login.passwordPlaceholder", + "login.subtitle", + "nav.agent", + "nav.chat", + "nav.collapse", + "nav.control", + "nav.expand", + "nav.resize", + "nav.settings", + "overview.access.connectHint", + "overview.access.language", + "overview.access.password", + "overview.access.sessionKey", + "overview.access.subtitle", + "overview.access.title", + "overview.access.token", + "overview.access.trustedProxy", + "overview.access.wsUrl", + "overview.attention.title", + "overview.auth.failed", + "overview.auth.required", + "overview.cards.cost", + "overview.cards.recentSessions", + "overview.cards.skills", + "overview.connection.docsHint", + "overview.connection.docsLink", + "overview.connection.step1", + "overview.connection.step2", + "overview.connection.step3", + "overview.connection.step4", + "overview.connection.title", + "overview.eventLog.title", + "overview.insecure.hint", + "overview.insecure.stayHttp", + "overview.logTail.title", + "overview.notes.cronText", + "overview.notes.cronTitle", + "overview.notes.sessionText", + "overview.notes.sessionTitle", + "overview.notes.subtitle", + "overview.notes.tailscaleText", + "overview.notes.tailscaleTitle", + "overview.notes.title", + "overview.pairing.hint", + "overview.pairing.mobileHint", + "overview.palette.noResults", + "overview.palette.placeholder", + "overview.quickActions.automation", + "overview.quickActions.newSession", + "overview.quickActions.refreshAll", + "overview.quickActions.terminal", + "overview.snapshot.channelsHint", + "overview.snapshot.lastChannelsRefresh", + "overview.snapshot.status", + "overview.snapshot.subtitle", + "overview.snapshot.tickInterval", + "overview.snapshot.title", + "overview.snapshot.uptime", + "overview.stats.cron", + "overview.stats.cronNext", + "overview.stats.instances", + "overview.stats.instancesHint", + "overview.stats.sessions", + "overview.stats.sessionsHint", + "subtitles.agents", + "subtitles.aiAgents", + "subtitles.appearance", + "subtitles.automation", + "subtitles.channels", + "subtitles.chat", + "subtitles.communications", + "subtitles.config", + "subtitles.cron", + "subtitles.debug", + "subtitles.dreams", + "subtitles.infrastructure", + "subtitles.instances", + "subtitles.logs", + "subtitles.nodes", + "subtitles.overview", + "subtitles.sessions", + "subtitles.skills", + "subtitles.usage", + "tabs.agents", + "tabs.aiAgents", + "tabs.appearance", + "tabs.automation", + "tabs.channels", + "tabs.chat", + "tabs.communications", + "tabs.config", + "tabs.cron", + "tabs.debug", + "tabs.dreams", + "tabs.infrastructure", + "tabs.instances", + "tabs.logs", + "tabs.nodes", + "tabs.overview", + "tabs.sessions", + "tabs.skills", + "tabs.usage", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.742Z", + "locale": "fr", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 0, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/glossary.de.json b/ui/src/i18n/.i18n/glossary.de.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.de.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.es.json b/ui/src/i18n/.i18n/glossary.es.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.es.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.fr.json b/ui/src/i18n/.i18n/glossary.fr.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.fr.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.ja-JP.json b/ui/src/i18n/.i18n/glossary.ja-JP.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.ja-JP.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.ko.json b/ui/src/i18n/.i18n/glossary.ko.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.ko.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.pt-BR.json b/ui/src/i18n/.i18n/glossary.pt-BR.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.pt-BR.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.zh-CN.json b/ui/src/i18n/.i18n/glossary.zh-CN.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.zh-CN.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/glossary.zh-TW.json b/ui/src/i18n/.i18n/glossary.zh-TW.json new file mode 100644 index 00000000000..7fcdd773a12 --- /dev/null +++ b/ui/src/i18n/.i18n/glossary.zh-TW.json @@ -0,0 +1,42 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway" + }, + { + "source": "Control UI", + "target": "Control UI" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "WhatsApp", + "target": "WhatsApp" + }, + { + "source": "Telegram", + "target": "Telegram" + }, + { + "source": "Discord", + "target": "Discord" + }, + { + "source": "Signal", + "target": "Signal" + }, + { + "source": "iMessage", + "target": "iMessage" + } +] diff --git a/ui/src/i18n/.i18n/ja-JP.meta.json b/ui/src/i18n/.i18n/ja-JP.meta.json new file mode 100644 index 00000000000..b6e288bd46f --- /dev/null +++ b/ui/src/i18n/.i18n/ja-JP.meta.json @@ -0,0 +1,521 @@ +{ + "fallbackKeys": [ + "chat.disconnected", + "chat.focusToggle", + "chat.hideCronSessions", + "chat.onboardingDisabled", + "chat.refreshTitle", + "chat.showCronSessions", + "chat.showCronSessionsHidden", + "chat.thinkingToggle", + "chat.toolCallsToggle", + "common.connect", + "common.disabled", + "common.docs", + "common.enabled", + "common.health", + "common.na", + "common.offline", + "common.ok", + "common.online", + "common.refresh", + "common.resources", + "common.search", + "common.theme", + "common.version", + "cron.errors.agentMessageRequired", + "cron.errors.agentMessageRequiredShort", + "cron.errors.cronExprRequired", + "cron.errors.cronExprRequiredShort", + "cron.errors.everyAmountInvalid", + "cron.errors.invalidIntervalAmount", + "cron.errors.invalidRunTime", + "cron.errors.invalidStaggerAmount", + "cron.errors.nameRequired", + "cron.errors.nameRequiredShort", + "cron.errors.scheduleAtInvalid", + "cron.errors.staggerAmountInvalid", + "cron.errors.systemEventTextRequired", + "cron.errors.systemTextRequired", + "cron.errors.timeoutInvalid", + "cron.errors.webhookUrlInvalid", + "cron.errors.webhookUrlRequired", + "cron.form.addJob", + "cron.form.advanced", + "cron.form.advancedHelp", + "cron.form.agentHelp", + "cron.form.agentId", + "cron.form.agentPlaceholder", + "cron.form.agentTurn", + "cron.form.agentTurnHelp", + "cron.form.announceDefault", + "cron.form.assistantTaskPrompt", + "cron.form.at", + "cron.form.basics", + "cron.form.basicsSub", + "cron.form.bestEffortDelivery", + "cron.form.bestEffortHelp", + "cron.form.cancel", + "cron.form.cantAddYet", + "cron.form.channel", + "cron.form.channelHelp", + "cron.form.clearAgentHelp", + "cron.form.clearAgentOverride", + "cron.form.createSubtitle", + "cron.form.cronOption", + "cron.form.days", + "cron.form.deleteAfterRun", + "cron.form.deleteAfterRunHelp", + "cron.form.deliveryHelp", + "cron.form.deliverySection", + "cron.form.deliverySub", + "cron.form.description", + "cron.form.descriptionPlaceholder", + "cron.form.editJob", + "cron.form.every", + "cron.form.everyAmountPlaceholder", + "cron.form.exactTiming", + "cron.form.exactTimingHelp", + "cron.form.execution", + "cron.form.executionSub", + "cron.form.expression", + "cron.form.expressionPlaceholder", + "cron.form.fieldName", + "cron.form.fillRequired", + "cron.form.fixFields", + "cron.form.fixFieldsPlural", + "cron.form.hours", + "cron.form.isolated", + "cron.form.jitterHelp", + "cron.form.main", + "cron.form.mainTimelineMessage", + "cron.form.minutes", + "cron.form.model", + "cron.form.modelHelp", + "cron.form.modelPlaceholder", + "cron.form.namePlaceholder", + "cron.form.newJob", + "cron.form.nextHeartbeat", + "cron.form.noneInternal", + "cron.form.now", + "cron.form.payloadKind", + "cron.form.required", + "cron.form.requiredSr", + "cron.form.resultDelivery", + "cron.form.runAt", + "cron.form.saveChanges", + "cron.form.saving", + "cron.form.schedule", + "cron.form.scheduleSub", + "cron.form.seconds", + "cron.form.session", + "cron.form.sessionHelp", + "cron.form.staggerPlaceholder", + "cron.form.staggerUnit", + "cron.form.staggerWindow", + "cron.form.systemEvent", + "cron.form.systemEventHelp", + "cron.form.thinking", + "cron.form.thinkingHelp", + "cron.form.thinkingPlaceholder", + "cron.form.timeoutHelp", + "cron.form.timeoutPlaceholder", + "cron.form.timeoutSeconds", + "cron.form.timezoneHelp", + "cron.form.timezoneOptional", + "cron.form.timezonePlaceholder", + "cron.form.to", + "cron.form.toHelp", + "cron.form.toPlaceholder", + "cron.form.unit", + "cron.form.updateSubtitle", + "cron.form.wakeMode", + "cron.form.wakeModeHelp", + "cron.form.webhookHelp", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobDetail.agent", + "cron.jobDetail.delivery", + "cron.jobDetail.prompt", + "cron.jobDetail.system", + "cron.jobList.allJobs", + "cron.jobList.clone", + "cron.jobList.disable", + "cron.jobList.disabled", + "cron.jobList.edit", + "cron.jobList.enable", + "cron.jobList.enabled", + "cron.jobList.history", + "cron.jobList.remove", + "cron.jobList.run", + "cron.jobList.selectJob", + "cron.jobs.all", + "cron.jobs.ascending", + "cron.jobs.descending", + "cron.jobs.direction", + "cron.jobs.enabled", + "cron.jobs.lastRun", + "cron.jobs.loading", + "cron.jobs.loadMore", + "cron.jobs.name", + "cron.jobs.nextRun", + "cron.jobs.noMatching", + "cron.jobs.recentlyUpdated", + "cron.jobs.reset", + "cron.jobs.schedule", + "cron.jobs.searchJobs", + "cron.jobs.searchPlaceholder", + "cron.jobs.shownOf", + "cron.jobs.sort", + "cron.jobs.subtitle", + "cron.jobs.title", + "cron.jobState.last", + "cron.jobState.next", + "cron.jobState.status", + "cron.runEntry.due", + "cron.runEntry.next", + "cron.runEntry.noSummary", + "cron.runEntry.openRunChat", + "cron.runEntry.runAt", + "cron.runs.allDelivery", + "cron.runs.allJobs", + "cron.runs.allStatuses", + "cron.runs.clear", + "cron.runs.delivery", + "cron.runs.deliveryDelivered", + "cron.runs.deliveryNotDelivered", + "cron.runs.deliveryNotRequested", + "cron.runs.deliveryUnknown", + "cron.runs.loadMore", + "cron.runs.newestFirst", + "cron.runs.noMatching", + "cron.runs.oldestFirst", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.runs.runStatusSkipped", + "cron.runs.runStatusUnknown", + "cron.runs.scope", + "cron.runs.searchPlaceholder", + "cron.runs.searchRuns", + "cron.runs.selectedJob", + "cron.runs.selectJobHint", + "cron.runs.status", + "cron.runs.subtitleAll", + "cron.runs.subtitleJob", + "cron.runs.title", + "cron.summary.enabled", + "cron.summary.jobs", + "cron.summary.nextWake", + "cron.summary.no", + "cron.summary.refresh", + "cron.summary.refreshing", + "cron.summary.yes", + "languages.de", + "languages.en", + "languages.es", + "languages.fr", + "languages.jaJP", + "languages.ko", + "languages.ptBR", + "languages.zhCN", + "languages.zhTW", + "login.passwordPlaceholder", + "login.subtitle", + "nav.agent", + "nav.chat", + "nav.collapse", + "nav.control", + "nav.expand", + "nav.resize", + "nav.settings", + "overview.access.connectHint", + "overview.access.language", + "overview.access.password", + "overview.access.sessionKey", + "overview.access.subtitle", + "overview.access.title", + "overview.access.token", + "overview.access.trustedProxy", + "overview.access.wsUrl", + "overview.attention.title", + "overview.auth.failed", + "overview.auth.required", + "overview.cards.cost", + "overview.cards.recentSessions", + "overview.cards.skills", + "overview.connection.docsHint", + "overview.connection.docsLink", + "overview.connection.step1", + "overview.connection.step2", + "overview.connection.step3", + "overview.connection.step4", + "overview.connection.title", + "overview.eventLog.title", + "overview.insecure.hint", + "overview.insecure.stayHttp", + "overview.logTail.title", + "overview.notes.cronText", + "overview.notes.cronTitle", + "overview.notes.sessionText", + "overview.notes.sessionTitle", + "overview.notes.subtitle", + "overview.notes.tailscaleText", + "overview.notes.tailscaleTitle", + "overview.notes.title", + "overview.pairing.hint", + "overview.pairing.mobileHint", + "overview.palette.noResults", + "overview.palette.placeholder", + "overview.quickActions.automation", + "overview.quickActions.newSession", + "overview.quickActions.refreshAll", + "overview.quickActions.terminal", + "overview.snapshot.channelsHint", + "overview.snapshot.lastChannelsRefresh", + "overview.snapshot.status", + "overview.snapshot.subtitle", + "overview.snapshot.tickInterval", + "overview.snapshot.title", + "overview.snapshot.uptime", + "overview.stats.cron", + "overview.stats.cronNext", + "overview.stats.instances", + "overview.stats.instancesHint", + "overview.stats.sessions", + "overview.stats.sessionsHint", + "subtitles.agents", + "subtitles.aiAgents", + "subtitles.appearance", + "subtitles.automation", + "subtitles.channels", + "subtitles.chat", + "subtitles.communications", + "subtitles.config", + "subtitles.cron", + "subtitles.debug", + "subtitles.dreams", + "subtitles.infrastructure", + "subtitles.instances", + "subtitles.logs", + "subtitles.nodes", + "subtitles.overview", + "subtitles.sessions", + "subtitles.skills", + "subtitles.usage", + "tabs.agents", + "tabs.aiAgents", + "tabs.appearance", + "tabs.automation", + "tabs.channels", + "tabs.chat", + "tabs.communications", + "tabs.config", + "tabs.cron", + "tabs.debug", + "tabs.dreams", + "tabs.infrastructure", + "tabs.instances", + "tabs.logs", + "tabs.nodes", + "tabs.overview", + "tabs.sessions", + "tabs.skills", + "tabs.usage", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.722Z", + "locale": "ja-JP", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 0, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/ko.meta.json b/ui/src/i18n/.i18n/ko.meta.json new file mode 100644 index 00000000000..d328d6dbbf5 --- /dev/null +++ b/ui/src/i18n/.i18n/ko.meta.json @@ -0,0 +1,521 @@ +{ + "fallbackKeys": [ + "chat.disconnected", + "chat.focusToggle", + "chat.hideCronSessions", + "chat.onboardingDisabled", + "chat.refreshTitle", + "chat.showCronSessions", + "chat.showCronSessionsHidden", + "chat.thinkingToggle", + "chat.toolCallsToggle", + "common.connect", + "common.disabled", + "common.docs", + "common.enabled", + "common.health", + "common.na", + "common.offline", + "common.ok", + "common.online", + "common.refresh", + "common.resources", + "common.search", + "common.theme", + "common.version", + "cron.errors.agentMessageRequired", + "cron.errors.agentMessageRequiredShort", + "cron.errors.cronExprRequired", + "cron.errors.cronExprRequiredShort", + "cron.errors.everyAmountInvalid", + "cron.errors.invalidIntervalAmount", + "cron.errors.invalidRunTime", + "cron.errors.invalidStaggerAmount", + "cron.errors.nameRequired", + "cron.errors.nameRequiredShort", + "cron.errors.scheduleAtInvalid", + "cron.errors.staggerAmountInvalid", + "cron.errors.systemEventTextRequired", + "cron.errors.systemTextRequired", + "cron.errors.timeoutInvalid", + "cron.errors.webhookUrlInvalid", + "cron.errors.webhookUrlRequired", + "cron.form.addJob", + "cron.form.advanced", + "cron.form.advancedHelp", + "cron.form.agentHelp", + "cron.form.agentId", + "cron.form.agentPlaceholder", + "cron.form.agentTurn", + "cron.form.agentTurnHelp", + "cron.form.announceDefault", + "cron.form.assistantTaskPrompt", + "cron.form.at", + "cron.form.basics", + "cron.form.basicsSub", + "cron.form.bestEffortDelivery", + "cron.form.bestEffortHelp", + "cron.form.cancel", + "cron.form.cantAddYet", + "cron.form.channel", + "cron.form.channelHelp", + "cron.form.clearAgentHelp", + "cron.form.clearAgentOverride", + "cron.form.createSubtitle", + "cron.form.cronOption", + "cron.form.days", + "cron.form.deleteAfterRun", + "cron.form.deleteAfterRunHelp", + "cron.form.deliveryHelp", + "cron.form.deliverySection", + "cron.form.deliverySub", + "cron.form.description", + "cron.form.descriptionPlaceholder", + "cron.form.editJob", + "cron.form.every", + "cron.form.everyAmountPlaceholder", + "cron.form.exactTiming", + "cron.form.exactTimingHelp", + "cron.form.execution", + "cron.form.executionSub", + "cron.form.expression", + "cron.form.expressionPlaceholder", + "cron.form.fieldName", + "cron.form.fillRequired", + "cron.form.fixFields", + "cron.form.fixFieldsPlural", + "cron.form.hours", + "cron.form.isolated", + "cron.form.jitterHelp", + "cron.form.main", + "cron.form.mainTimelineMessage", + "cron.form.minutes", + "cron.form.model", + "cron.form.modelHelp", + "cron.form.modelPlaceholder", + "cron.form.namePlaceholder", + "cron.form.newJob", + "cron.form.nextHeartbeat", + "cron.form.noneInternal", + "cron.form.now", + "cron.form.payloadKind", + "cron.form.required", + "cron.form.requiredSr", + "cron.form.resultDelivery", + "cron.form.runAt", + "cron.form.saveChanges", + "cron.form.saving", + "cron.form.schedule", + "cron.form.scheduleSub", + "cron.form.seconds", + "cron.form.session", + "cron.form.sessionHelp", + "cron.form.staggerPlaceholder", + "cron.form.staggerUnit", + "cron.form.staggerWindow", + "cron.form.systemEvent", + "cron.form.systemEventHelp", + "cron.form.thinking", + "cron.form.thinkingHelp", + "cron.form.thinkingPlaceholder", + "cron.form.timeoutHelp", + "cron.form.timeoutPlaceholder", + "cron.form.timeoutSeconds", + "cron.form.timezoneHelp", + "cron.form.timezoneOptional", + "cron.form.timezonePlaceholder", + "cron.form.to", + "cron.form.toHelp", + "cron.form.toPlaceholder", + "cron.form.unit", + "cron.form.updateSubtitle", + "cron.form.wakeMode", + "cron.form.wakeModeHelp", + "cron.form.webhookHelp", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobDetail.agent", + "cron.jobDetail.delivery", + "cron.jobDetail.prompt", + "cron.jobDetail.system", + "cron.jobList.allJobs", + "cron.jobList.clone", + "cron.jobList.disable", + "cron.jobList.disabled", + "cron.jobList.edit", + "cron.jobList.enable", + "cron.jobList.enabled", + "cron.jobList.history", + "cron.jobList.remove", + "cron.jobList.run", + "cron.jobList.selectJob", + "cron.jobs.all", + "cron.jobs.ascending", + "cron.jobs.descending", + "cron.jobs.direction", + "cron.jobs.enabled", + "cron.jobs.lastRun", + "cron.jobs.loading", + "cron.jobs.loadMore", + "cron.jobs.name", + "cron.jobs.nextRun", + "cron.jobs.noMatching", + "cron.jobs.recentlyUpdated", + "cron.jobs.reset", + "cron.jobs.schedule", + "cron.jobs.searchJobs", + "cron.jobs.searchPlaceholder", + "cron.jobs.shownOf", + "cron.jobs.sort", + "cron.jobs.subtitle", + "cron.jobs.title", + "cron.jobState.last", + "cron.jobState.next", + "cron.jobState.status", + "cron.runEntry.due", + "cron.runEntry.next", + "cron.runEntry.noSummary", + "cron.runEntry.openRunChat", + "cron.runEntry.runAt", + "cron.runs.allDelivery", + "cron.runs.allJobs", + "cron.runs.allStatuses", + "cron.runs.clear", + "cron.runs.delivery", + "cron.runs.deliveryDelivered", + "cron.runs.deliveryNotDelivered", + "cron.runs.deliveryNotRequested", + "cron.runs.deliveryUnknown", + "cron.runs.loadMore", + "cron.runs.newestFirst", + "cron.runs.noMatching", + "cron.runs.oldestFirst", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.runs.runStatusSkipped", + "cron.runs.runStatusUnknown", + "cron.runs.scope", + "cron.runs.searchPlaceholder", + "cron.runs.searchRuns", + "cron.runs.selectedJob", + "cron.runs.selectJobHint", + "cron.runs.status", + "cron.runs.subtitleAll", + "cron.runs.subtitleJob", + "cron.runs.title", + "cron.summary.enabled", + "cron.summary.jobs", + "cron.summary.nextWake", + "cron.summary.no", + "cron.summary.refresh", + "cron.summary.refreshing", + "cron.summary.yes", + "languages.de", + "languages.en", + "languages.es", + "languages.fr", + "languages.jaJP", + "languages.ko", + "languages.ptBR", + "languages.zhCN", + "languages.zhTW", + "login.passwordPlaceholder", + "login.subtitle", + "nav.agent", + "nav.chat", + "nav.collapse", + "nav.control", + "nav.expand", + "nav.resize", + "nav.settings", + "overview.access.connectHint", + "overview.access.language", + "overview.access.password", + "overview.access.sessionKey", + "overview.access.subtitle", + "overview.access.title", + "overview.access.token", + "overview.access.trustedProxy", + "overview.access.wsUrl", + "overview.attention.title", + "overview.auth.failed", + "overview.auth.required", + "overview.cards.cost", + "overview.cards.recentSessions", + "overview.cards.skills", + "overview.connection.docsHint", + "overview.connection.docsLink", + "overview.connection.step1", + "overview.connection.step2", + "overview.connection.step3", + "overview.connection.step4", + "overview.connection.title", + "overview.eventLog.title", + "overview.insecure.hint", + "overview.insecure.stayHttp", + "overview.logTail.title", + "overview.notes.cronText", + "overview.notes.cronTitle", + "overview.notes.sessionText", + "overview.notes.sessionTitle", + "overview.notes.subtitle", + "overview.notes.tailscaleText", + "overview.notes.tailscaleTitle", + "overview.notes.title", + "overview.pairing.hint", + "overview.pairing.mobileHint", + "overview.palette.noResults", + "overview.palette.placeholder", + "overview.quickActions.automation", + "overview.quickActions.newSession", + "overview.quickActions.refreshAll", + "overview.quickActions.terminal", + "overview.snapshot.channelsHint", + "overview.snapshot.lastChannelsRefresh", + "overview.snapshot.status", + "overview.snapshot.subtitle", + "overview.snapshot.tickInterval", + "overview.snapshot.title", + "overview.snapshot.uptime", + "overview.stats.cron", + "overview.stats.cronNext", + "overview.stats.instances", + "overview.stats.instancesHint", + "overview.stats.sessions", + "overview.stats.sessionsHint", + "subtitles.agents", + "subtitles.aiAgents", + "subtitles.appearance", + "subtitles.automation", + "subtitles.channels", + "subtitles.chat", + "subtitles.communications", + "subtitles.config", + "subtitles.cron", + "subtitles.debug", + "subtitles.dreams", + "subtitles.infrastructure", + "subtitles.instances", + "subtitles.logs", + "subtitles.nodes", + "subtitles.overview", + "subtitles.sessions", + "subtitles.skills", + "subtitles.usage", + "tabs.agents", + "tabs.aiAgents", + "tabs.appearance", + "tabs.automation", + "tabs.channels", + "tabs.chat", + "tabs.communications", + "tabs.config", + "tabs.cron", + "tabs.debug", + "tabs.dreams", + "tabs.infrastructure", + "tabs.instances", + "tabs.logs", + "tabs.nodes", + "tabs.overview", + "tabs.sessions", + "tabs.skills", + "tabs.usage", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.733Z", + "locale": "ko", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 0, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/pt-BR.meta.json b/ui/src/i18n/.i18n/pt-BR.meta.json new file mode 100644 index 00000000000..7d87c766aa8 --- /dev/null +++ b/ui/src/i18n/.i18n/pt-BR.meta.json @@ -0,0 +1,410 @@ +{ + "fallbackKeys": [ + "chat.toolCallsToggle", + "common.docs", + "common.na", + "common.offline", + "common.ok", + "common.online", + "common.theme", + "cron.errors.agentMessageRequired", + "cron.errors.agentMessageRequiredShort", + "cron.errors.cronExprRequired", + "cron.errors.cronExprRequiredShort", + "cron.errors.everyAmountInvalid", + "cron.errors.invalidIntervalAmount", + "cron.errors.invalidRunTime", + "cron.errors.invalidStaggerAmount", + "cron.errors.nameRequired", + "cron.errors.nameRequiredShort", + "cron.errors.scheduleAtInvalid", + "cron.errors.staggerAmountInvalid", + "cron.errors.systemEventTextRequired", + "cron.errors.systemTextRequired", + "cron.errors.timeoutInvalid", + "cron.errors.webhookUrlInvalid", + "cron.errors.webhookUrlRequired", + "cron.form.addJob", + "cron.form.advanced", + "cron.form.advancedHelp", + "cron.form.agentHelp", + "cron.form.agentId", + "cron.form.agentPlaceholder", + "cron.form.agentTurn", + "cron.form.agentTurnHelp", + "cron.form.announceDefault", + "cron.form.assistantTaskPrompt", + "cron.form.at", + "cron.form.basics", + "cron.form.basicsSub", + "cron.form.bestEffortDelivery", + "cron.form.bestEffortHelp", + "cron.form.cancel", + "cron.form.cantAddYet", + "cron.form.channel", + "cron.form.channelHelp", + "cron.form.clearAgentHelp", + "cron.form.clearAgentOverride", + "cron.form.createSubtitle", + "cron.form.cronOption", + "cron.form.days", + "cron.form.deleteAfterRun", + "cron.form.deleteAfterRunHelp", + "cron.form.deliveryHelp", + "cron.form.deliverySection", + "cron.form.deliverySub", + "cron.form.description", + "cron.form.descriptionPlaceholder", + "cron.form.editJob", + "cron.form.every", + "cron.form.everyAmountPlaceholder", + "cron.form.exactTiming", + "cron.form.exactTimingHelp", + "cron.form.execution", + "cron.form.executionSub", + "cron.form.expression", + "cron.form.expressionPlaceholder", + "cron.form.fieldName", + "cron.form.fillRequired", + "cron.form.fixFields", + "cron.form.fixFieldsPlural", + "cron.form.hours", + "cron.form.isolated", + "cron.form.jitterHelp", + "cron.form.main", + "cron.form.mainTimelineMessage", + "cron.form.minutes", + "cron.form.model", + "cron.form.modelHelp", + "cron.form.modelPlaceholder", + "cron.form.namePlaceholder", + "cron.form.newJob", + "cron.form.nextHeartbeat", + "cron.form.noneInternal", + "cron.form.now", + "cron.form.payloadKind", + "cron.form.required", + "cron.form.requiredSr", + "cron.form.resultDelivery", + "cron.form.runAt", + "cron.form.saveChanges", + "cron.form.saving", + "cron.form.schedule", + "cron.form.scheduleSub", + "cron.form.seconds", + "cron.form.session", + "cron.form.sessionHelp", + "cron.form.staggerPlaceholder", + "cron.form.staggerUnit", + "cron.form.staggerWindow", + "cron.form.systemEvent", + "cron.form.systemEventHelp", + "cron.form.thinking", + "cron.form.thinkingHelp", + "cron.form.thinkingPlaceholder", + "cron.form.timeoutHelp", + "cron.form.timeoutPlaceholder", + "cron.form.timeoutSeconds", + "cron.form.timezoneHelp", + "cron.form.timezoneOptional", + "cron.form.timezonePlaceholder", + "cron.form.to", + "cron.form.toHelp", + "cron.form.toPlaceholder", + "cron.form.unit", + "cron.form.updateSubtitle", + "cron.form.wakeMode", + "cron.form.wakeModeHelp", + "cron.form.webhookHelp", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobDetail.agent", + "cron.jobDetail.delivery", + "cron.jobDetail.prompt", + "cron.jobDetail.system", + "cron.jobList.allJobs", + "cron.jobList.clone", + "cron.jobList.disable", + "cron.jobList.disabled", + "cron.jobList.edit", + "cron.jobList.enable", + "cron.jobList.enabled", + "cron.jobList.history", + "cron.jobList.remove", + "cron.jobList.run", + "cron.jobList.selectJob", + "cron.jobs.all", + "cron.jobs.ascending", + "cron.jobs.descending", + "cron.jobs.direction", + "cron.jobs.enabled", + "cron.jobs.lastRun", + "cron.jobs.loading", + "cron.jobs.loadMore", + "cron.jobs.name", + "cron.jobs.nextRun", + "cron.jobs.noMatching", + "cron.jobs.recentlyUpdated", + "cron.jobs.reset", + "cron.jobs.schedule", + "cron.jobs.searchJobs", + "cron.jobs.searchPlaceholder", + "cron.jobs.shownOf", + "cron.jobs.sort", + "cron.jobs.subtitle", + "cron.jobs.title", + "cron.jobState.last", + "cron.jobState.next", + "cron.jobState.status", + "cron.runEntry.due", + "cron.runEntry.next", + "cron.runEntry.noSummary", + "cron.runEntry.openRunChat", + "cron.runEntry.runAt", + "cron.runs.allDelivery", + "cron.runs.allJobs", + "cron.runs.allStatuses", + "cron.runs.clear", + "cron.runs.delivery", + "cron.runs.deliveryDelivered", + "cron.runs.deliveryNotDelivered", + "cron.runs.deliveryNotRequested", + "cron.runs.deliveryUnknown", + "cron.runs.loadMore", + "cron.runs.newestFirst", + "cron.runs.noMatching", + "cron.runs.oldestFirst", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.runs.runStatusSkipped", + "cron.runs.runStatusUnknown", + "cron.runs.scope", + "cron.runs.searchPlaceholder", + "cron.runs.searchRuns", + "cron.runs.selectedJob", + "cron.runs.selectJobHint", + "cron.runs.status", + "cron.runs.subtitleAll", + "cron.runs.subtitleJob", + "cron.runs.title", + "cron.summary.enabled", + "cron.summary.jobs", + "cron.summary.nextWake", + "cron.summary.no", + "cron.summary.refresh", + "cron.summary.refreshing", + "cron.summary.yes", + "languages.en", + "languages.fr", + "languages.jaJP", + "languages.ko", + "nav.chat", + "overview.notes.tailscaleTitle", + "overview.quickActions.terminal", + "overview.snapshot.status", + "overview.snapshot.title", + "overview.stats.cron", + "subtitles.dreams", + "tabs.chat", + "tabs.config", + "tabs.debug", + "tabs.dreams", + "tabs.logs", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.685Z", + "locale": "pt-BR", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 111, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/zh-CN.meta.json b/ui/src/i18n/.i18n/zh-CN.meta.json new file mode 100644 index 00000000000..2339c8160ed --- /dev/null +++ b/ui/src/i18n/.i18n/zh-CN.meta.json @@ -0,0 +1,222 @@ +{ + "fallbackKeys": [ + "chat.toolCallsToggle", + "common.theme", + "cron.form.cronOption", + "cron.form.everyAmountPlaceholder", + "cron.form.expressionPlaceholder", + "cron.form.modelPlaceholder", + "cron.form.staggerPlaceholder", + "cron.form.thinkingPlaceholder", + "cron.form.timezonePlaceholder", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobs.lastRun", + "cron.jobs.reset", + "cron.jobs.schedule", + "languages.en", + "languages.fr", + "languages.jaJP", + "languages.ko", + "overview.access.wsUrl", + "overview.notes.tailscaleTitle", + "subtitles.dreams", + "tabs.dreams", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.662Z", + "locale": "zh-CN", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 299, + "workflow": 1 +} diff --git a/ui/src/i18n/.i18n/zh-TW.meta.json b/ui/src/i18n/.i18n/zh-TW.meta.json new file mode 100644 index 00000000000..b728546ae82 --- /dev/null +++ b/ui/src/i18n/.i18n/zh-TW.meta.json @@ -0,0 +1,397 @@ +{ + "fallbackKeys": [ + "chat.toolCallsToggle", + "common.theme", + "cron.errors.agentMessageRequired", + "cron.errors.agentMessageRequiredShort", + "cron.errors.cronExprRequired", + "cron.errors.cronExprRequiredShort", + "cron.errors.everyAmountInvalid", + "cron.errors.invalidIntervalAmount", + "cron.errors.invalidRunTime", + "cron.errors.invalidStaggerAmount", + "cron.errors.nameRequired", + "cron.errors.nameRequiredShort", + "cron.errors.scheduleAtInvalid", + "cron.errors.staggerAmountInvalid", + "cron.errors.systemEventTextRequired", + "cron.errors.systemTextRequired", + "cron.errors.timeoutInvalid", + "cron.errors.webhookUrlInvalid", + "cron.errors.webhookUrlRequired", + "cron.form.addJob", + "cron.form.advanced", + "cron.form.advancedHelp", + "cron.form.agentHelp", + "cron.form.agentId", + "cron.form.agentPlaceholder", + "cron.form.agentTurn", + "cron.form.agentTurnHelp", + "cron.form.announceDefault", + "cron.form.assistantTaskPrompt", + "cron.form.at", + "cron.form.basics", + "cron.form.basicsSub", + "cron.form.bestEffortDelivery", + "cron.form.bestEffortHelp", + "cron.form.cancel", + "cron.form.cantAddYet", + "cron.form.channel", + "cron.form.channelHelp", + "cron.form.clearAgentHelp", + "cron.form.clearAgentOverride", + "cron.form.createSubtitle", + "cron.form.cronOption", + "cron.form.days", + "cron.form.deleteAfterRun", + "cron.form.deleteAfterRunHelp", + "cron.form.deliveryHelp", + "cron.form.deliverySection", + "cron.form.deliverySub", + "cron.form.description", + "cron.form.descriptionPlaceholder", + "cron.form.editJob", + "cron.form.every", + "cron.form.everyAmountPlaceholder", + "cron.form.exactTiming", + "cron.form.exactTimingHelp", + "cron.form.execution", + "cron.form.executionSub", + "cron.form.expression", + "cron.form.expressionPlaceholder", + "cron.form.fieldName", + "cron.form.fillRequired", + "cron.form.fixFields", + "cron.form.fixFieldsPlural", + "cron.form.hours", + "cron.form.isolated", + "cron.form.jitterHelp", + "cron.form.main", + "cron.form.mainTimelineMessage", + "cron.form.minutes", + "cron.form.model", + "cron.form.modelHelp", + "cron.form.modelPlaceholder", + "cron.form.namePlaceholder", + "cron.form.newJob", + "cron.form.nextHeartbeat", + "cron.form.noneInternal", + "cron.form.now", + "cron.form.payloadKind", + "cron.form.required", + "cron.form.requiredSr", + "cron.form.resultDelivery", + "cron.form.runAt", + "cron.form.saveChanges", + "cron.form.saving", + "cron.form.schedule", + "cron.form.scheduleSub", + "cron.form.seconds", + "cron.form.session", + "cron.form.sessionHelp", + "cron.form.staggerPlaceholder", + "cron.form.staggerUnit", + "cron.form.staggerWindow", + "cron.form.systemEvent", + "cron.form.systemEventHelp", + "cron.form.thinking", + "cron.form.thinkingHelp", + "cron.form.thinkingPlaceholder", + "cron.form.timeoutHelp", + "cron.form.timeoutPlaceholder", + "cron.form.timeoutSeconds", + "cron.form.timezoneHelp", + "cron.form.timezoneOptional", + "cron.form.timezonePlaceholder", + "cron.form.to", + "cron.form.toHelp", + "cron.form.toPlaceholder", + "cron.form.unit", + "cron.form.updateSubtitle", + "cron.form.wakeMode", + "cron.form.wakeModeHelp", + "cron.form.webhookHelp", + "cron.form.webhookPlaceholder", + "cron.form.webhookPost", + "cron.form.webhookUrl", + "cron.jobDetail.agent", + "cron.jobDetail.delivery", + "cron.jobDetail.prompt", + "cron.jobDetail.system", + "cron.jobList.allJobs", + "cron.jobList.clone", + "cron.jobList.disable", + "cron.jobList.disabled", + "cron.jobList.edit", + "cron.jobList.enable", + "cron.jobList.enabled", + "cron.jobList.history", + "cron.jobList.remove", + "cron.jobList.run", + "cron.jobList.selectJob", + "cron.jobs.all", + "cron.jobs.ascending", + "cron.jobs.descending", + "cron.jobs.direction", + "cron.jobs.enabled", + "cron.jobs.lastRun", + "cron.jobs.loading", + "cron.jobs.loadMore", + "cron.jobs.name", + "cron.jobs.nextRun", + "cron.jobs.noMatching", + "cron.jobs.recentlyUpdated", + "cron.jobs.reset", + "cron.jobs.schedule", + "cron.jobs.searchJobs", + "cron.jobs.searchPlaceholder", + "cron.jobs.shownOf", + "cron.jobs.sort", + "cron.jobs.subtitle", + "cron.jobs.title", + "cron.jobState.last", + "cron.jobState.next", + "cron.jobState.status", + "cron.runEntry.due", + "cron.runEntry.next", + "cron.runEntry.noSummary", + "cron.runEntry.openRunChat", + "cron.runEntry.runAt", + "cron.runs.allDelivery", + "cron.runs.allJobs", + "cron.runs.allStatuses", + "cron.runs.clear", + "cron.runs.delivery", + "cron.runs.deliveryDelivered", + "cron.runs.deliveryNotDelivered", + "cron.runs.deliveryNotRequested", + "cron.runs.deliveryUnknown", + "cron.runs.loadMore", + "cron.runs.newestFirst", + "cron.runs.noMatching", + "cron.runs.oldestFirst", + "cron.runs.runStatusError", + "cron.runs.runStatusOk", + "cron.runs.runStatusSkipped", + "cron.runs.runStatusUnknown", + "cron.runs.scope", + "cron.runs.searchPlaceholder", + "cron.runs.searchRuns", + "cron.runs.selectedJob", + "cron.runs.selectJobHint", + "cron.runs.status", + "cron.runs.subtitleAll", + "cron.runs.subtitleJob", + "cron.runs.title", + "cron.summary.enabled", + "cron.summary.jobs", + "cron.summary.nextWake", + "cron.summary.no", + "cron.summary.refresh", + "cron.summary.refreshing", + "cron.summary.yes", + "languages.en", + "languages.fr", + "languages.jaJP", + "languages.ko", + "overview.access.wsUrl", + "overview.notes.tailscaleTitle", + "subtitles.dreams", + "tabs.dreams", + "usage.breakdown.cacheRead", + "usage.breakdown.cacheWrite", + "usage.breakdown.costByType", + "usage.breakdown.input", + "usage.breakdown.output", + "usage.breakdown.tokensByType", + "usage.breakdown.total", + "usage.common.emptyValue", + "usage.common.unknown", + "usage.daily.byType", + "usage.daily.costTitle", + "usage.daily.title", + "usage.daily.tokensTitle", + "usage.daily.total", + "usage.details.assistantOutputTokens", + "usage.details.baseContextPerMessage", + "usage.details.close", + "usage.details.collapse", + "usage.details.collapseAll", + "usage.details.conversation", + "usage.details.cumulative", + "usage.details.duration", + "usage.details.expandAll", + "usage.details.files", + "usage.details.filtered", + "usage.details.hasTools", + "usage.details.modelMix", + "usage.details.noContextData", + "usage.details.noDataInRange", + "usage.details.noMessages", + "usage.details.noMessagesMatch", + "usage.details.noTimeline", + "usage.details.noUsageData", + "usage.details.of", + "usage.details.ofInput", + "usage.details.perTurn", + "usage.details.reset", + "usage.details.searchConversation", + "usage.details.skills", + "usage.details.system", + "usage.details.systemPromptBreakdown", + "usage.details.systemShort", + "usage.details.timelineFiltered", + "usage.details.tokensReadFromCache", + "usage.details.tokensWrittenToCache", + "usage.details.tool", + "usage.details.toolResult", + "usage.details.tools", + "usage.details.turnRange", + "usage.details.usageOverTime", + "usage.details.userToolInputTokens", + "usage.details.you", + "usage.empty.featureOverview", + "usage.empty.featureSessions", + "usage.empty.featureTimeline", + "usage.empty.hint", + "usage.empty.noData", + "usage.empty.subtitle", + "usage.empty.title", + "usage.export.dailyCsv", + "usage.export.json", + "usage.export.label", + "usage.export.sessionsCsv", + "usage.filters.agent", + "usage.filters.all", + "usage.filters.channel", + "usage.filters.clear", + "usage.filters.clearAll", + "usage.filters.days", + "usage.filters.daysCount", + "usage.filters.endDate", + "usage.filters.hours", + "usage.filters.hoursCount", + "usage.filters.model", + "usage.filters.pin", + "usage.filters.pinned", + "usage.filters.provider", + "usage.filters.remove", + "usage.filters.selectAll", + "usage.filters.session", + "usage.filters.sessionsCount", + "usage.filters.startDate", + "usage.filters.timeZone", + "usage.filters.timeZoneLocal", + "usage.filters.timeZoneUtc", + "usage.filters.title", + "usage.filters.to", + "usage.filters.tool", + "usage.filters.unpin", + "usage.loading.badge", + "usage.loading.title", + "usage.metrics.cost", + "usage.metrics.session", + "usage.metrics.sessions", + "usage.metrics.tokens", + "usage.mosaic.dayOfWeek", + "usage.mosaic.eightAm", + "usage.mosaic.eightPm", + "usage.mosaic.fourAm", + "usage.mosaic.fourPm", + "usage.mosaic.fri", + "usage.mosaic.legend", + "usage.mosaic.midnight", + "usage.mosaic.mon", + "usage.mosaic.noon", + "usage.mosaic.noTimelineData", + "usage.mosaic.sat", + "usage.mosaic.subtitle", + "usage.mosaic.subtitleEmpty", + "usage.mosaic.sun", + "usage.mosaic.thu", + "usage.mosaic.title", + "usage.mosaic.tue", + "usage.mosaic.wed", + "usage.overview.acrossMessages", + "usage.overview.assistant", + "usage.overview.avgCost", + "usage.overview.avgCostHint", + "usage.overview.avgCostHintMissing", + "usage.overview.avgSession", + "usage.overview.avgTokens", + "usage.overview.avgTokensHint", + "usage.overview.cached", + "usage.overview.cacheHint", + "usage.overview.cacheHitRate", + "usage.overview.calls", + "usage.overview.errorHint", + "usage.overview.errorRate", + "usage.overview.errors", + "usage.overview.errorsHint", + "usage.overview.messages", + "usage.overview.messagesAbbrev", + "usage.overview.messagesHint", + "usage.overview.noAgentData", + "usage.overview.noChannelData", + "usage.overview.noErrorData", + "usage.overview.noModelData", + "usage.overview.noProviderData", + "usage.overview.noToolCalls", + "usage.overview.peakErrorDays", + "usage.overview.peakErrorHours", + "usage.overview.perMinute", + "usage.overview.prompt", + "usage.overview.sessions", + "usage.overview.sessionsHint", + "usage.overview.sessionsInRange", + "usage.overview.throughput", + "usage.overview.throughputHint", + "usage.overview.title", + "usage.overview.tokensPerMinute", + "usage.overview.toolCalls", + "usage.overview.toolCallsHint", + "usage.overview.toolResults", + "usage.overview.toolsUsed", + "usage.overview.topAgents", + "usage.overview.topChannels", + "usage.overview.topModels", + "usage.overview.topProviders", + "usage.overview.topTools", + "usage.overview.user", + "usage.page.subtitle", + "usage.presets.last30d", + "usage.presets.last7d", + "usage.presets.today", + "usage.query.apply", + "usage.query.inRange", + "usage.query.matching", + "usage.query.placeholder", + "usage.query.tip", + "usage.sessions.all", + "usage.sessions.ascending", + "usage.sessions.avg", + "usage.sessions.clearSelection", + "usage.sessions.copy", + "usage.sessions.copyName", + "usage.sessions.descending", + "usage.sessions.limitReached", + "usage.sessions.more", + "usage.sessions.noneInRange", + "usage.sessions.noRecent", + "usage.sessions.recent", + "usage.sessions.recentShort", + "usage.sessions.selected", + "usage.sessions.shown", + "usage.sessions.sort", + "usage.sessions.title", + "usage.sessions.total" + ], + "generatedAt": "2026-04-05T11:44:58.675Z", + "locale": "zh-TW", + "model": "", + "provider": "", + "sourceHash": "e482fa23a5ebfb33fa807a476f14ddb196e51d099b046a19e9573d54acdcd931", + "totalKeys": 509, + "translatedKeys": 124, + "workflow": 1 +} diff --git a/ui/src/i18n/locales/de.ts b/ui/src/i18n/locales/de.ts index 7fd638766e7..2ffcaee8049 100644 --- a/ui/src/i18n/locales/de.ts +++ b/ui/src/i18n/locales/de.ts @@ -1,8 +1,8 @@ import type { TranslationMap } from "../lib/types.ts"; +// Generated by scripts/control-ui-i18n.ts. export const de: TranslationMap = { common: { - version: "Version", health: "Status", ok: "OK", online: "Online", @@ -12,8 +12,11 @@ export const de: TranslationMap = { enabled: "Aktiviert", disabled: "Deaktiviert", na: "k. A.", + version: "Version", docs: "Dokumentation", + theme: "Theme", resources: "Ressourcen", + search: "Search", }, nav: { chat: "Chat", @@ -22,6 +25,7 @@ export const de: TranslationMap = { settings: "Einstellungen", expand: "Seitenleiste ausklappen", collapse: "Seitenleiste einklappen", + resize: "Resize sidebar", }, tabs: { agents: "Agenten", @@ -35,8 +39,14 @@ export const de: TranslationMap = { nodes: "Geräte", chat: "Chat", config: "Konfiguration", + communications: "Communications", + appearance: "Appearance", + automation: "Automation", + infrastructure: "Infrastructure", + aiAgents: "AI & Agents", debug: "Debug", logs: "Protokolle", + dreams: "Dreams", }, subtitles: { agents: "Agent-Arbeitsbereiche, Tools und Identitäten verwalten.", @@ -50,8 +60,14 @@ export const de: TranslationMap = { nodes: "Gekoppelte Geräte, Fähigkeiten und Befehlsfreigabe.", chat: "Direkte Gateway-Chat-Sitzung für schnelle Eingriffe.", config: "~/.openclaw/openclaw.json sicher bearbeiten.", + communications: "Channels, messages, and audio settings.", + appearance: "Theme, UI, and setup wizard settings.", + automation: "Commands, hooks, cron, and plugins.", + infrastructure: "Gateway, web, browser, and media settings.", + aiAgents: "Agents, models, skills, tools, memory, session.", debug: "Gateway-Snapshots, Ereignisse und manuelle RPC-Aufrufe.", logs: "Live-Verfolgung der Gateway-Protokolldateien.", + dreams: "Memory consolidation while sleeping.", }, overview: { access: { @@ -59,7 +75,7 @@ export const de: TranslationMap = { subtitle: "Wo sich das Dashboard verbindet und wie es sich authentifiziert.", wsUrl: "WebSocket-URL", token: "Gateway-Token", - password: "Passwort (nicht gespeichert)", // pragma: allowlist secret + password: "Passwort (nicht gespeichert)", sessionKey: "Standard-Sitzungsschlüssel", language: "Sprache", connectHint: "Klicken Sie auf Verbinden, um Verbindungsänderungen anzuwenden.", @@ -109,11 +125,271 @@ export const de: TranslationMap = { hint: "Diese Seite ist HTTP, daher blockiert der Browser die Geräteidentifikation. Verwenden Sie HTTPS (Tailscale Serve) oder öffnen Sie {url} auf dem Gateway-Host.", stayHttp: "Wenn Sie bei HTTP bleiben müssen, setzen Sie {config} (nur Token).", }, + connection: { + title: "How to connect", + step1: "Start the gateway on your host machine:", + step2: "Get a tokenized dashboard URL:", + step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.", + step4: "Or generate a reusable token:", + docsHint: "For remote access, Tailscale Serve is recommended. ", + docsLink: "Read the docs →", + }, + cards: { + cost: "Cost", + skills: "Skills", + recentSessions: "Recent Sessions", + }, + attention: { + title: "Attention", + }, + eventLog: { + title: "Event Log", + }, + logTail: { + title: "Gateway Logs", + }, + quickActions: { + newSession: "New Session", + automation: "Automation", + refreshAll: "Refresh All", + terminal: "Terminal", + }, + palette: { + placeholder: "Type a command…", + noResults: "No results", + }, + }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, + login: { + subtitle: "Gateway Dashboard", + passwordPlaceholder: "optional", }, chat: { disconnected: "Verbindung zum Gateway getrennt.", refreshTitle: "Chat-Daten aktualisieren", thinkingToggle: "Ausgabe des Assistenten ein-/ausblenden", + toolCallsToggle: "Toggle tool calls and tool results", focusToggle: "Fokusmodus ein-/ausschalten (Seitenleiste + Kopfzeile ausblenden)", hideCronSessions: "Cron-Sitzungen ausblenden", showCronSessions: "Cron-Sitzungen anzeigen", @@ -127,5 +403,219 @@ export const de: TranslationMap = { ptBR: "Português (Brasilianisches Portugiesisch)", de: "Deutsch", es: "Spanisch (Español)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", + }, + cron: { + summary: { + enabled: "Enabled", + yes: "Yes", + no: "No", + jobs: "Jobs", + nextWake: "Next wake", + refreshing: "Refreshing...", + refresh: "Refresh", + }, + jobs: { + title: "Jobs", + subtitle: "All scheduled jobs stored in the gateway.", + shownOf: "{shown} shown of {total}", + searchJobs: "Search jobs", + searchPlaceholder: "Name, description, or agent", + enabled: "Enabled", + schedule: "Schedule", + lastRun: "Last run", + all: "All", + sort: "Sort", + nextRun: "Next run", + recentlyUpdated: "Recently updated", + name: "Name", + direction: "Direction", + ascending: "Ascending", + descending: "Descending", + reset: "Reset", + noMatching: "No matching jobs.", + loading: "Loading...", + loadMore: "Load more jobs", + }, + runs: { + title: "Run history", + subtitleAll: "Latest runs across all jobs.", + subtitleJob: "Latest runs for {title}.", + scope: "Scope", + allJobs: "All jobs", + selectedJob: "Selected job", + searchRuns: "Search runs", + searchPlaceholder: "Summary, error, or job", + newestFirst: "Newest first", + oldestFirst: "Oldest first", + status: "Status", + delivery: "Delivery", + clear: "Clear", + allStatuses: "All statuses", + allDelivery: "All delivery", + selectJobHint: "Select a job to inspect run history.", + noMatching: "No matching runs.", + loadMore: "Load more runs", + runStatusOk: "OK", + runStatusError: "Error", + runStatusSkipped: "Skipped", + runStatusUnknown: "Unknown", + deliveryDelivered: "Delivered", + deliveryNotDelivered: "Not delivered", + deliveryUnknown: "Unknown", + deliveryNotRequested: "Not requested", + }, + form: { + editJob: "Edit Job", + newJob: "New Job", + updateSubtitle: "Update the selected scheduled job.", + createSubtitle: "Create a scheduled wakeup or agent run.", + required: "Required", + requiredSr: "required", + basics: "Basics", + basicsSub: "Name it, choose the assistant, and set enabled state.", + fieldName: "Name", + description: "Description", + agentId: "Agent ID", + namePlaceholder: "Morning brief", + descriptionPlaceholder: "Optional context for this job", + agentPlaceholder: "main or ops", + agentHelp: "Start typing to pick a known agent, or enter a custom one.", + schedule: "Schedule", + scheduleSub: "Control when this job runs.", + every: "Every", + at: "At", + cronOption: "Cron", + runAt: "Run at", + unit: "Unit", + minutes: "Minutes", + hours: "Hours", + days: "Days", + expression: "Expression", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Timezone (optional)", + timezonePlaceholder: "America/Los_Angeles", + timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.", + jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.", + execution: "Execution", + executionSub: "Choose when to wake, and what this job should do.", + session: "Session", + main: "Main", + isolated: "Isolated", + sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.", + wakeMode: "Wake mode", + now: "Now", + nextHeartbeat: "Next heartbeat", + wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.", + payloadKind: "What should run?", + systemEvent: "Post message to main timeline", + agentTurn: "Run assistant task (isolated)", + systemEventHelp: + "Sends your text to the gateway main timeline (good for reminders/triggers).", + agentTurnHelp: "Starts an assistant run in its own session using your prompt.", + timeoutSeconds: "Timeout (seconds)", + timeoutPlaceholder: "Optional, e.g. 90", + timeoutHelp: + "Optional. Leave blank to use the gateway default timeout behavior for this run.", + mainTimelineMessage: "Main timeline message", + assistantTaskPrompt: "Assistant task prompt", + deliverySection: "Delivery", + deliverySub: "Choose where run summaries are sent.", + resultDelivery: "Result delivery", + announceDefault: "Announce summary (default)", + webhookPost: "Webhook POST", + noneInternal: "None (internal)", + deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.", + webhookUrl: "Webhook URL", + channel: "Channel", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Choose which connected channel receives the summary.", + webhookHelp: "Send run summaries to a webhook endpoint.", + to: "To", + toPlaceholder: "+1555... or chat id", + toHelp: "Optional recipient override (chat id, phone, or user id).", + advanced: "Advanced", + advancedHelp: + "Optional overrides for delivery guarantees, schedule jitter, and model controls.", + deleteAfterRun: "Delete after run", + deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.", + clearAgentOverride: "Clear agent override", + clearAgentHelp: "Force this job to use the gateway default assistant.", + exactTiming: "Exact timing (no stagger)", + exactTimingHelp: "Run on exact cron boundaries with no spread.", + staggerWindow: "Stagger window", + staggerUnit: "Stagger unit", + staggerPlaceholder: "30", + seconds: "Seconds", + model: "Model", + modelPlaceholder: "openai/gpt-5.2", + modelHelp: "Start typing to pick a known model, or enter a custom one.", + thinking: "Thinking", + thinkingPlaceholder: "low", + thinkingHelp: "Use a suggested level or enter a provider-specific value.", + bestEffortDelivery: "Best effort delivery", + bestEffortHelp: "Do not fail the job if delivery itself fails.", + cantAddYet: "Can't add job yet", + fillRequired: "Fill the required fields below to enable submit.", + fixFields: "Fix {count} field to continue.", + fixFieldsPlural: "Fix {count} fields to continue.", + saving: "Saving...", + saveChanges: "Save changes", + addJob: "Add job", + cancel: "Cancel", + }, + jobList: { + allJobs: "all jobs", + selectJob: "(select a job)", + enabled: "enabled", + disabled: "disabled", + edit: "Edit", + clone: "Clone", + disable: "Disable", + enable: "Enable", + run: "Run", + history: "History", + remove: "Remove", + }, + jobDetail: { + system: "System", + prompt: "Prompt", + delivery: "Delivery", + agent: "Agent", + }, + jobState: { + status: "Status", + next: "Next", + last: "Last", + }, + runEntry: { + noSummary: "No summary.", + runAt: "Run at", + openRunChat: "Open run chat", + next: "Next {rel}", + due: "Due {rel}", + }, + errors: { + nameRequired: "Name is required.", + scheduleAtInvalid: "Enter a valid date/time.", + everyAmountInvalid: "Interval must be greater than 0.", + cronExprRequired: "Cron expression is required.", + staggerAmountInvalid: "Stagger must be greater than 0.", + systemTextRequired: "System text is required.", + agentMessageRequired: "Agent message is required.", + timeoutInvalid: "If set, timeout must be greater than 0 seconds.", + webhookUrlRequired: "Webhook URL is required.", + webhookUrlInvalid: "Webhook URL must start with http:// or https://.", + invalidRunTime: "Invalid run time.", + invalidIntervalAmount: "Invalid interval amount.", + cronExprRequiredShort: "Cron expression required.", + invalidStaggerAmount: "Invalid stagger amount.", + systemEventTextRequired: "System event text required.", + agentMessageRequiredShort: "Agent message required.", + nameRequiredShort: "Name required.", + }, }, }; diff --git a/ui/src/i18n/locales/es.ts b/ui/src/i18n/locales/es.ts index 091cd2ca937..ef42e8e2d9a 100644 --- a/ui/src/i18n/locales/es.ts +++ b/ui/src/i18n/locales/es.ts @@ -1,8 +1,8 @@ import type { TranslationMap } from "../lib/types.ts"; +// Generated by scripts/control-ui-i18n.ts. export const es: TranslationMap = { common: { - version: "Versión", health: "Estado", ok: "Correcto", online: "En línea", @@ -12,8 +12,11 @@ export const es: TranslationMap = { enabled: "Habilitado", disabled: "Deshabilitado", na: "n/a", + version: "Versión", docs: "Docs", + theme: "Theme", resources: "Recursos", + search: "Search", }, nav: { chat: "Chat", @@ -22,6 +25,7 @@ export const es: TranslationMap = { settings: "Ajustes", expand: "Expandir barra lateral", collapse: "Contraer barra lateral", + resize: "Resize sidebar", }, tabs: { agents: "Agentes", @@ -35,8 +39,14 @@ export const es: TranslationMap = { nodes: "Nodos", chat: "Chat", config: "Configuración", + communications: "Communications", + appearance: "Appearance", + automation: "Automation", + infrastructure: "Infrastructure", + aiAgents: "AI & Agents", debug: "Depuración", logs: "Registros", + dreams: "Dreams", }, subtitles: { agents: "Gestionar espacios de trabajo, herramientas e identidades de agentes.", @@ -50,8 +60,14 @@ export const es: TranslationMap = { nodes: "Dispositivos emparejados, capacidades y exposición de comandos.", chat: "Sesión de chat directa con la puerta de enlace para intervenciones rápidas.", config: "Editar ~/.openclaw/openclaw.json de forma segura.", + communications: "Channels, messages, and audio settings.", + appearance: "Theme, UI, and setup wizard settings.", + automation: "Commands, hooks, cron, and plugins.", + infrastructure: "Gateway, web, browser, and media settings.", + aiAgents: "Agents, models, skills, tools, memory, session.", debug: "Instantáneas de la puerta de enlace, eventos y llamadas RPC manuales.", logs: "Seguimiento en vivo de los registros de la puerta de enlace.", + dreams: "Memory consolidation while sleeping.", }, overview: { access: { @@ -59,7 +75,7 @@ export const es: TranslationMap = { subtitle: "Dónde se conecta el panel y cómo se autentica.", wsUrl: "URL de WebSocket", token: "Token de la puerta de enlace", - password: "Contraseña (no se guarda)", // pragma: allowlist secret + password: "Contraseña (no se guarda)", sessionKey: "Clave de sesión predeterminada", language: "Idioma", connectHint: "Haz clic en Conectar para aplicar los cambios de conexión.", @@ -108,11 +124,271 @@ export const es: TranslationMap = { hint: "Esta página es HTTP, por lo que el navegador bloquea el acceso a la identidad del dispositivo. Usa HTTPS (Tailscale Serve) o abre {url} en el equipo host.", stayHttp: "Si debes permanecer en HTTP, utiliza {config} (solo token).", }, + connection: { + title: "How to connect", + step1: "Start the gateway on your host machine:", + step2: "Get a tokenized dashboard URL:", + step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.", + step4: "Or generate a reusable token:", + docsHint: "For remote access, Tailscale Serve is recommended. ", + docsLink: "Read the docs →", + }, + cards: { + cost: "Cost", + skills: "Skills", + recentSessions: "Recent Sessions", + }, + attention: { + title: "Attention", + }, + eventLog: { + title: "Event Log", + }, + logTail: { + title: "Gateway Logs", + }, + quickActions: { + newSession: "New Session", + automation: "Automation", + refreshAll: "Refresh All", + terminal: "Terminal", + }, + palette: { + placeholder: "Type a command…", + noResults: "No results", + }, + }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, + login: { + subtitle: "Gateway Dashboard", + passwordPlaceholder: "optional", }, chat: { disconnected: "Desconectado de la puerta de enlace.", refreshTitle: "Actualizar datos del chat", thinkingToggle: "Alternar salida de pensamiento/trabajo del asistente", + toolCallsToggle: "Toggle tool calls and tool results", focusToggle: "Alternar modo de enfoque (ocultar barra lateral + cabecera)", hideCronSessions: "Ocultar sesiones de cron", showCronSessions: "Mostrar sesiones de cron", @@ -126,6 +402,9 @@ export const es: TranslationMap = { ptBR: "Portugués brasileño (Português)", de: "Deutsch (Alemán)", es: "Español", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", }, cron: { summary: { diff --git a/ui/src/i18n/locales/fr.ts b/ui/src/i18n/locales/fr.ts new file mode 100644 index 00000000000..cd7bac090f7 --- /dev/null +++ b/ui/src/i18n/locales/fr.ts @@ -0,0 +1,618 @@ +import type { TranslationMap } from "../lib/types.ts"; + +// Generated by scripts/control-ui-i18n.ts. +export const fr: TranslationMap = { + common: { + health: "Health", + ok: "OK", + online: "Online", + offline: "Offline", + connect: "Connect", + refresh: "Refresh", + enabled: "Enabled", + disabled: "Disabled", + na: "n/a", + version: "Version", + docs: "Docs", + theme: "Theme", + resources: "Resources", + search: "Search", + }, + nav: { + chat: "Chat", + control: "Control", + agent: "Agent", + settings: "Settings", + expand: "Expand sidebar", + collapse: "Collapse sidebar", + resize: "Resize sidebar", + }, + tabs: { + agents: "Agents", + overview: "Overview", + channels: "Channels", + instances: "Instances", + sessions: "Sessions", + usage: "Usage", + cron: "Cron Jobs", + skills: "Skills", + nodes: "Nodes", + chat: "Chat", + config: "Config", + communications: "Communications", + appearance: "Appearance", + automation: "Automation", + infrastructure: "Infrastructure", + aiAgents: "AI & Agents", + debug: "Debug", + logs: "Logs", + dreams: "Dreams", + }, + subtitles: { + agents: "Workspaces, tools, identities.", + overview: "Status, entry points, health.", + channels: "Channels and settings.", + instances: "Connected clients and nodes.", + sessions: "Active sessions and defaults.", + usage: "API usage and costs.", + cron: "Wakeups and recurring runs.", + skills: "Skills and API keys.", + nodes: "Paired devices and commands.", + chat: "Gateway chat for quick interventions.", + config: "Edit openclaw.json.", + communications: "Channels, messages, and audio settings.", + appearance: "Theme, UI, and setup wizard settings.", + automation: "Commands, hooks, cron, and plugins.", + infrastructure: "Gateway, web, browser, and media settings.", + aiAgents: "Agents, models, skills, tools, memory, session.", + debug: "Snapshots, events, RPC.", + logs: "Live gateway logs.", + dreams: "Memory consolidation while sleeping.", + }, + overview: { + access: { + title: "Gateway Access", + subtitle: "Where the dashboard connects and how it authenticates.", + wsUrl: "WebSocket URL", + token: "Gateway Token", + password: "Password (not stored)", + sessionKey: "Default Session Key", + language: "Language", + connectHint: "Click Connect to apply connection changes.", + trustedProxy: "Authenticated via trusted proxy.", + }, + snapshot: { + title: "Snapshot", + subtitle: "Latest gateway handshake information.", + status: "Status", + uptime: "Uptime", + tickInterval: "Tick Interval", + lastChannelsRefresh: "Last Channels Refresh", + channelsHint: "Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.", + }, + stats: { + instances: "Instances", + instancesHint: "Presence beacons in the last 5 minutes.", + sessions: "Sessions", + sessionsHint: "Recent session keys tracked by the gateway.", + cron: "Cron", + cronNext: "Next wake {time}", + }, + notes: { + title: "Notes", + subtitle: "Quick reminders for remote control setups.", + tailscaleTitle: "Tailscale serve", + tailscaleText: "Prefer serve mode to keep the gateway on loopback with tailnet auth.", + sessionTitle: "Session hygiene", + sessionText: "Use /new or sessions.patch to reset context.", + cronTitle: "Cron reminders", + cronText: "Use isolated sessions for recurring runs.", + }, + auth: { + required: "This gateway requires auth. Add a token or password, then click Connect.", + failed: + "Auth failed. Re-copy a tokenized URL with {command}, or update the token, then click Connect.", + }, + pairing: { + hint: "This device needs pairing approval from the gateway host.", + mobileHint: + "On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.", + }, + insecure: { + hint: "This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open {url} on the gateway host.", + stayHttp: "If you must stay on HTTP, set {config} (token-only).", + }, + connection: { + title: "How to connect", + step1: "Start the gateway on your host machine:", + step2: "Get a tokenized dashboard URL:", + step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.", + step4: "Or generate a reusable token:", + docsHint: "For remote access, Tailscale Serve is recommended. ", + docsLink: "Read the docs →", + }, + cards: { + cost: "Cost", + skills: "Skills", + recentSessions: "Recent Sessions", + }, + attention: { + title: "Attention", + }, + eventLog: { + title: "Event Log", + }, + logTail: { + title: "Gateway Logs", + }, + quickActions: { + newSession: "New Session", + automation: "Automation", + refreshAll: "Refresh All", + terminal: "Terminal", + }, + palette: { + placeholder: "Type a command…", + noResults: "No results", + }, + }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, + login: { + subtitle: "Gateway Dashboard", + passwordPlaceholder: "optional", + }, + chat: { + disconnected: "Disconnected from gateway.", + refreshTitle: "Refresh chat data", + thinkingToggle: "Toggle assistant thinking/working output", + toolCallsToggle: "Toggle tool calls and tool results", + focusToggle: "Toggle focus mode (hide sidebar + page header)", + hideCronSessions: "Hide cron sessions", + showCronSessions: "Show cron sessions", + showCronSessionsHidden: "Show cron sessions ({count} hidden)", + onboardingDisabled: "Disabled during setup", + }, + languages: { + en: "English", + zhCN: "简体中文 (Simplified Chinese)", + zhTW: "繁體中文 (Traditional Chinese)", + ptBR: "Português (Brazilian Portuguese)", + de: "Deutsch (German)", + es: "Español (Spanish)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", + }, + cron: { + summary: { + enabled: "Enabled", + yes: "Yes", + no: "No", + jobs: "Jobs", + nextWake: "Next wake", + refreshing: "Refreshing...", + refresh: "Refresh", + }, + jobs: { + title: "Jobs", + subtitle: "All scheduled jobs stored in the gateway.", + shownOf: "{shown} shown of {total}", + searchJobs: "Search jobs", + searchPlaceholder: "Name, description, or agent", + enabled: "Enabled", + schedule: "Schedule", + lastRun: "Last run", + all: "All", + sort: "Sort", + nextRun: "Next run", + recentlyUpdated: "Recently updated", + name: "Name", + direction: "Direction", + ascending: "Ascending", + descending: "Descending", + reset: "Reset", + noMatching: "No matching jobs.", + loading: "Loading...", + loadMore: "Load more jobs", + }, + runs: { + title: "Run history", + subtitleAll: "Latest runs across all jobs.", + subtitleJob: "Latest runs for {title}.", + scope: "Scope", + allJobs: "All jobs", + selectedJob: "Selected job", + searchRuns: "Search runs", + searchPlaceholder: "Summary, error, or job", + newestFirst: "Newest first", + oldestFirst: "Oldest first", + status: "Status", + delivery: "Delivery", + clear: "Clear", + allStatuses: "All statuses", + allDelivery: "All delivery", + selectJobHint: "Select a job to inspect run history.", + noMatching: "No matching runs.", + loadMore: "Load more runs", + runStatusOk: "OK", + runStatusError: "Error", + runStatusSkipped: "Skipped", + runStatusUnknown: "Unknown", + deliveryDelivered: "Delivered", + deliveryNotDelivered: "Not delivered", + deliveryUnknown: "Unknown", + deliveryNotRequested: "Not requested", + }, + form: { + editJob: "Edit Job", + newJob: "New Job", + updateSubtitle: "Update the selected scheduled job.", + createSubtitle: "Create a scheduled wakeup or agent run.", + required: "Required", + requiredSr: "required", + basics: "Basics", + basicsSub: "Name it, choose the assistant, and set enabled state.", + fieldName: "Name", + description: "Description", + agentId: "Agent ID", + namePlaceholder: "Morning brief", + descriptionPlaceholder: "Optional context for this job", + agentPlaceholder: "main or ops", + agentHelp: "Start typing to pick a known agent, or enter a custom one.", + schedule: "Schedule", + scheduleSub: "Control when this job runs.", + every: "Every", + at: "At", + cronOption: "Cron", + runAt: "Run at", + unit: "Unit", + minutes: "Minutes", + hours: "Hours", + days: "Days", + expression: "Expression", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Timezone (optional)", + timezonePlaceholder: "America/Los_Angeles", + timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.", + jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.", + execution: "Execution", + executionSub: "Choose when to wake, and what this job should do.", + session: "Session", + main: "Main", + isolated: "Isolated", + sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.", + wakeMode: "Wake mode", + now: "Now", + nextHeartbeat: "Next heartbeat", + wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.", + payloadKind: "What should run?", + systemEvent: "Post message to main timeline", + agentTurn: "Run assistant task (isolated)", + systemEventHelp: + "Sends your text to the gateway main timeline (good for reminders/triggers).", + agentTurnHelp: "Starts an assistant run in its own session using your prompt.", + timeoutSeconds: "Timeout (seconds)", + timeoutPlaceholder: "Optional, e.g. 90", + timeoutHelp: + "Optional. Leave blank to use the gateway default timeout behavior for this run.", + mainTimelineMessage: "Main timeline message", + assistantTaskPrompt: "Assistant task prompt", + deliverySection: "Delivery", + deliverySub: "Choose where run summaries are sent.", + resultDelivery: "Result delivery", + announceDefault: "Announce summary (default)", + webhookPost: "Webhook POST", + noneInternal: "None (internal)", + deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.", + webhookUrl: "Webhook URL", + channel: "Channel", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Choose which connected channel receives the summary.", + webhookHelp: "Send run summaries to a webhook endpoint.", + to: "To", + toPlaceholder: "+1555... or chat id", + toHelp: "Optional recipient override (chat id, phone, or user id).", + advanced: "Advanced", + advancedHelp: + "Optional overrides for delivery guarantees, schedule jitter, and model controls.", + deleteAfterRun: "Delete after run", + deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.", + clearAgentOverride: "Clear agent override", + clearAgentHelp: "Force this job to use the gateway default assistant.", + exactTiming: "Exact timing (no stagger)", + exactTimingHelp: "Run on exact cron boundaries with no spread.", + staggerWindow: "Stagger window", + staggerUnit: "Stagger unit", + staggerPlaceholder: "30", + seconds: "Seconds", + model: "Model", + modelPlaceholder: "openai/gpt-5.2", + modelHelp: "Start typing to pick a known model, or enter a custom one.", + thinking: "Thinking", + thinkingPlaceholder: "low", + thinkingHelp: "Use a suggested level or enter a provider-specific value.", + bestEffortDelivery: "Best effort delivery", + bestEffortHelp: "Do not fail the job if delivery itself fails.", + cantAddYet: "Can't add job yet", + fillRequired: "Fill the required fields below to enable submit.", + fixFields: "Fix {count} field to continue.", + fixFieldsPlural: "Fix {count} fields to continue.", + saving: "Saving...", + saveChanges: "Save changes", + addJob: "Add job", + cancel: "Cancel", + }, + jobList: { + allJobs: "all jobs", + selectJob: "(select a job)", + enabled: "enabled", + disabled: "disabled", + edit: "Edit", + clone: "Clone", + disable: "Disable", + enable: "Enable", + run: "Run", + history: "History", + remove: "Remove", + }, + jobDetail: { + system: "System", + prompt: "Prompt", + delivery: "Delivery", + agent: "Agent", + }, + jobState: { + status: "Status", + next: "Next", + last: "Last", + }, + runEntry: { + noSummary: "No summary.", + runAt: "Run at", + openRunChat: "Open run chat", + next: "Next {rel}", + due: "Due {rel}", + }, + errors: { + nameRequired: "Name is required.", + scheduleAtInvalid: "Enter a valid date/time.", + everyAmountInvalid: "Interval must be greater than 0.", + cronExprRequired: "Cron expression is required.", + staggerAmountInvalid: "Stagger must be greater than 0.", + systemTextRequired: "System text is required.", + agentMessageRequired: "Agent message is required.", + timeoutInvalid: "If set, timeout must be greater than 0 seconds.", + webhookUrlRequired: "Webhook URL is required.", + webhookUrlInvalid: "Webhook URL must start with http:// or https://.", + invalidRunTime: "Invalid run time.", + invalidIntervalAmount: "Invalid interval amount.", + cronExprRequiredShort: "Cron expression required.", + invalidStaggerAmount: "Invalid stagger amount.", + systemEventTextRequired: "System event text required.", + agentMessageRequiredShort: "Agent message required.", + nameRequiredShort: "Name required.", + }, + }, +}; diff --git a/ui/src/i18n/locales/ja-JP.ts b/ui/src/i18n/locales/ja-JP.ts new file mode 100644 index 00000000000..2d1e35d2a2b --- /dev/null +++ b/ui/src/i18n/locales/ja-JP.ts @@ -0,0 +1,618 @@ +import type { TranslationMap } from "../lib/types.ts"; + +// Generated by scripts/control-ui-i18n.ts. +export const ja_JP: TranslationMap = { + common: { + health: "Health", + ok: "OK", + online: "Online", + offline: "Offline", + connect: "Connect", + refresh: "Refresh", + enabled: "Enabled", + disabled: "Disabled", + na: "n/a", + version: "Version", + docs: "Docs", + theme: "Theme", + resources: "Resources", + search: "Search", + }, + nav: { + chat: "Chat", + control: "Control", + agent: "Agent", + settings: "Settings", + expand: "Expand sidebar", + collapse: "Collapse sidebar", + resize: "Resize sidebar", + }, + tabs: { + agents: "Agents", + overview: "Overview", + channels: "Channels", + instances: "Instances", + sessions: "Sessions", + usage: "Usage", + cron: "Cron Jobs", + skills: "Skills", + nodes: "Nodes", + chat: "Chat", + config: "Config", + communications: "Communications", + appearance: "Appearance", + automation: "Automation", + infrastructure: "Infrastructure", + aiAgents: "AI & Agents", + debug: "Debug", + logs: "Logs", + dreams: "Dreams", + }, + subtitles: { + agents: "Workspaces, tools, identities.", + overview: "Status, entry points, health.", + channels: "Channels and settings.", + instances: "Connected clients and nodes.", + sessions: "Active sessions and defaults.", + usage: "API usage and costs.", + cron: "Wakeups and recurring runs.", + skills: "Skills and API keys.", + nodes: "Paired devices and commands.", + chat: "Gateway chat for quick interventions.", + config: "Edit openclaw.json.", + communications: "Channels, messages, and audio settings.", + appearance: "Theme, UI, and setup wizard settings.", + automation: "Commands, hooks, cron, and plugins.", + infrastructure: "Gateway, web, browser, and media settings.", + aiAgents: "Agents, models, skills, tools, memory, session.", + debug: "Snapshots, events, RPC.", + logs: "Live gateway logs.", + dreams: "Memory consolidation while sleeping.", + }, + overview: { + access: { + title: "Gateway Access", + subtitle: "Where the dashboard connects and how it authenticates.", + wsUrl: "WebSocket URL", + token: "Gateway Token", + password: "Password (not stored)", + sessionKey: "Default Session Key", + language: "Language", + connectHint: "Click Connect to apply connection changes.", + trustedProxy: "Authenticated via trusted proxy.", + }, + snapshot: { + title: "Snapshot", + subtitle: "Latest gateway handshake information.", + status: "Status", + uptime: "Uptime", + tickInterval: "Tick Interval", + lastChannelsRefresh: "Last Channels Refresh", + channelsHint: "Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.", + }, + stats: { + instances: "Instances", + instancesHint: "Presence beacons in the last 5 minutes.", + sessions: "Sessions", + sessionsHint: "Recent session keys tracked by the gateway.", + cron: "Cron", + cronNext: "Next wake {time}", + }, + notes: { + title: "Notes", + subtitle: "Quick reminders for remote control setups.", + tailscaleTitle: "Tailscale serve", + tailscaleText: "Prefer serve mode to keep the gateway on loopback with tailnet auth.", + sessionTitle: "Session hygiene", + sessionText: "Use /new or sessions.patch to reset context.", + cronTitle: "Cron reminders", + cronText: "Use isolated sessions for recurring runs.", + }, + auth: { + required: "This gateway requires auth. Add a token or password, then click Connect.", + failed: + "Auth failed. Re-copy a tokenized URL with {command}, or update the token, then click Connect.", + }, + pairing: { + hint: "This device needs pairing approval from the gateway host.", + mobileHint: + "On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.", + }, + insecure: { + hint: "This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open {url} on the gateway host.", + stayHttp: "If you must stay on HTTP, set {config} (token-only).", + }, + connection: { + title: "How to connect", + step1: "Start the gateway on your host machine:", + step2: "Get a tokenized dashboard URL:", + step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.", + step4: "Or generate a reusable token:", + docsHint: "For remote access, Tailscale Serve is recommended. ", + docsLink: "Read the docs →", + }, + cards: { + cost: "Cost", + skills: "Skills", + recentSessions: "Recent Sessions", + }, + attention: { + title: "Attention", + }, + eventLog: { + title: "Event Log", + }, + logTail: { + title: "Gateway Logs", + }, + quickActions: { + newSession: "New Session", + automation: "Automation", + refreshAll: "Refresh All", + terminal: "Terminal", + }, + palette: { + placeholder: "Type a command…", + noResults: "No results", + }, + }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, + login: { + subtitle: "Gateway Dashboard", + passwordPlaceholder: "optional", + }, + chat: { + disconnected: "Disconnected from gateway.", + refreshTitle: "Refresh chat data", + thinkingToggle: "Toggle assistant thinking/working output", + toolCallsToggle: "Toggle tool calls and tool results", + focusToggle: "Toggle focus mode (hide sidebar + page header)", + hideCronSessions: "Hide cron sessions", + showCronSessions: "Show cron sessions", + showCronSessionsHidden: "Show cron sessions ({count} hidden)", + onboardingDisabled: "Disabled during setup", + }, + languages: { + en: "English", + zhCN: "简体中文 (Simplified Chinese)", + zhTW: "繁體中文 (Traditional Chinese)", + ptBR: "Português (Brazilian Portuguese)", + de: "Deutsch (German)", + es: "Español (Spanish)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", + }, + cron: { + summary: { + enabled: "Enabled", + yes: "Yes", + no: "No", + jobs: "Jobs", + nextWake: "Next wake", + refreshing: "Refreshing...", + refresh: "Refresh", + }, + jobs: { + title: "Jobs", + subtitle: "All scheduled jobs stored in the gateway.", + shownOf: "{shown} shown of {total}", + searchJobs: "Search jobs", + searchPlaceholder: "Name, description, or agent", + enabled: "Enabled", + schedule: "Schedule", + lastRun: "Last run", + all: "All", + sort: "Sort", + nextRun: "Next run", + recentlyUpdated: "Recently updated", + name: "Name", + direction: "Direction", + ascending: "Ascending", + descending: "Descending", + reset: "Reset", + noMatching: "No matching jobs.", + loading: "Loading...", + loadMore: "Load more jobs", + }, + runs: { + title: "Run history", + subtitleAll: "Latest runs across all jobs.", + subtitleJob: "Latest runs for {title}.", + scope: "Scope", + allJobs: "All jobs", + selectedJob: "Selected job", + searchRuns: "Search runs", + searchPlaceholder: "Summary, error, or job", + newestFirst: "Newest first", + oldestFirst: "Oldest first", + status: "Status", + delivery: "Delivery", + clear: "Clear", + allStatuses: "All statuses", + allDelivery: "All delivery", + selectJobHint: "Select a job to inspect run history.", + noMatching: "No matching runs.", + loadMore: "Load more runs", + runStatusOk: "OK", + runStatusError: "Error", + runStatusSkipped: "Skipped", + runStatusUnknown: "Unknown", + deliveryDelivered: "Delivered", + deliveryNotDelivered: "Not delivered", + deliveryUnknown: "Unknown", + deliveryNotRequested: "Not requested", + }, + form: { + editJob: "Edit Job", + newJob: "New Job", + updateSubtitle: "Update the selected scheduled job.", + createSubtitle: "Create a scheduled wakeup or agent run.", + required: "Required", + requiredSr: "required", + basics: "Basics", + basicsSub: "Name it, choose the assistant, and set enabled state.", + fieldName: "Name", + description: "Description", + agentId: "Agent ID", + namePlaceholder: "Morning brief", + descriptionPlaceholder: "Optional context for this job", + agentPlaceholder: "main or ops", + agentHelp: "Start typing to pick a known agent, or enter a custom one.", + schedule: "Schedule", + scheduleSub: "Control when this job runs.", + every: "Every", + at: "At", + cronOption: "Cron", + runAt: "Run at", + unit: "Unit", + minutes: "Minutes", + hours: "Hours", + days: "Days", + expression: "Expression", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Timezone (optional)", + timezonePlaceholder: "America/Los_Angeles", + timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.", + jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.", + execution: "Execution", + executionSub: "Choose when to wake, and what this job should do.", + session: "Session", + main: "Main", + isolated: "Isolated", + sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.", + wakeMode: "Wake mode", + now: "Now", + nextHeartbeat: "Next heartbeat", + wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.", + payloadKind: "What should run?", + systemEvent: "Post message to main timeline", + agentTurn: "Run assistant task (isolated)", + systemEventHelp: + "Sends your text to the gateway main timeline (good for reminders/triggers).", + agentTurnHelp: "Starts an assistant run in its own session using your prompt.", + timeoutSeconds: "Timeout (seconds)", + timeoutPlaceholder: "Optional, e.g. 90", + timeoutHelp: + "Optional. Leave blank to use the gateway default timeout behavior for this run.", + mainTimelineMessage: "Main timeline message", + assistantTaskPrompt: "Assistant task prompt", + deliverySection: "Delivery", + deliverySub: "Choose where run summaries are sent.", + resultDelivery: "Result delivery", + announceDefault: "Announce summary (default)", + webhookPost: "Webhook POST", + noneInternal: "None (internal)", + deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.", + webhookUrl: "Webhook URL", + channel: "Channel", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Choose which connected channel receives the summary.", + webhookHelp: "Send run summaries to a webhook endpoint.", + to: "To", + toPlaceholder: "+1555... or chat id", + toHelp: "Optional recipient override (chat id, phone, or user id).", + advanced: "Advanced", + advancedHelp: + "Optional overrides for delivery guarantees, schedule jitter, and model controls.", + deleteAfterRun: "Delete after run", + deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.", + clearAgentOverride: "Clear agent override", + clearAgentHelp: "Force this job to use the gateway default assistant.", + exactTiming: "Exact timing (no stagger)", + exactTimingHelp: "Run on exact cron boundaries with no spread.", + staggerWindow: "Stagger window", + staggerUnit: "Stagger unit", + staggerPlaceholder: "30", + seconds: "Seconds", + model: "Model", + modelPlaceholder: "openai/gpt-5.2", + modelHelp: "Start typing to pick a known model, or enter a custom one.", + thinking: "Thinking", + thinkingPlaceholder: "low", + thinkingHelp: "Use a suggested level or enter a provider-specific value.", + bestEffortDelivery: "Best effort delivery", + bestEffortHelp: "Do not fail the job if delivery itself fails.", + cantAddYet: "Can't add job yet", + fillRequired: "Fill the required fields below to enable submit.", + fixFields: "Fix {count} field to continue.", + fixFieldsPlural: "Fix {count} fields to continue.", + saving: "Saving...", + saveChanges: "Save changes", + addJob: "Add job", + cancel: "Cancel", + }, + jobList: { + allJobs: "all jobs", + selectJob: "(select a job)", + enabled: "enabled", + disabled: "disabled", + edit: "Edit", + clone: "Clone", + disable: "Disable", + enable: "Enable", + run: "Run", + history: "History", + remove: "Remove", + }, + jobDetail: { + system: "System", + prompt: "Prompt", + delivery: "Delivery", + agent: "Agent", + }, + jobState: { + status: "Status", + next: "Next", + last: "Last", + }, + runEntry: { + noSummary: "No summary.", + runAt: "Run at", + openRunChat: "Open run chat", + next: "Next {rel}", + due: "Due {rel}", + }, + errors: { + nameRequired: "Name is required.", + scheduleAtInvalid: "Enter a valid date/time.", + everyAmountInvalid: "Interval must be greater than 0.", + cronExprRequired: "Cron expression is required.", + staggerAmountInvalid: "Stagger must be greater than 0.", + systemTextRequired: "System text is required.", + agentMessageRequired: "Agent message is required.", + timeoutInvalid: "If set, timeout must be greater than 0 seconds.", + webhookUrlRequired: "Webhook URL is required.", + webhookUrlInvalid: "Webhook URL must start with http:// or https://.", + invalidRunTime: "Invalid run time.", + invalidIntervalAmount: "Invalid interval amount.", + cronExprRequiredShort: "Cron expression required.", + invalidStaggerAmount: "Invalid stagger amount.", + systemEventTextRequired: "System event text required.", + agentMessageRequiredShort: "Agent message required.", + nameRequiredShort: "Name required.", + }, + }, +}; diff --git a/ui/src/i18n/locales/ko.ts b/ui/src/i18n/locales/ko.ts new file mode 100644 index 00000000000..24927d07630 --- /dev/null +++ b/ui/src/i18n/locales/ko.ts @@ -0,0 +1,618 @@ +import type { TranslationMap } from "../lib/types.ts"; + +// Generated by scripts/control-ui-i18n.ts. +export const ko: TranslationMap = { + common: { + health: "Health", + ok: "OK", + online: "Online", + offline: "Offline", + connect: "Connect", + refresh: "Refresh", + enabled: "Enabled", + disabled: "Disabled", + na: "n/a", + version: "Version", + docs: "Docs", + theme: "Theme", + resources: "Resources", + search: "Search", + }, + nav: { + chat: "Chat", + control: "Control", + agent: "Agent", + settings: "Settings", + expand: "Expand sidebar", + collapse: "Collapse sidebar", + resize: "Resize sidebar", + }, + tabs: { + agents: "Agents", + overview: "Overview", + channels: "Channels", + instances: "Instances", + sessions: "Sessions", + usage: "Usage", + cron: "Cron Jobs", + skills: "Skills", + nodes: "Nodes", + chat: "Chat", + config: "Config", + communications: "Communications", + appearance: "Appearance", + automation: "Automation", + infrastructure: "Infrastructure", + aiAgents: "AI & Agents", + debug: "Debug", + logs: "Logs", + dreams: "Dreams", + }, + subtitles: { + agents: "Workspaces, tools, identities.", + overview: "Status, entry points, health.", + channels: "Channels and settings.", + instances: "Connected clients and nodes.", + sessions: "Active sessions and defaults.", + usage: "API usage and costs.", + cron: "Wakeups and recurring runs.", + skills: "Skills and API keys.", + nodes: "Paired devices and commands.", + chat: "Gateway chat for quick interventions.", + config: "Edit openclaw.json.", + communications: "Channels, messages, and audio settings.", + appearance: "Theme, UI, and setup wizard settings.", + automation: "Commands, hooks, cron, and plugins.", + infrastructure: "Gateway, web, browser, and media settings.", + aiAgents: "Agents, models, skills, tools, memory, session.", + debug: "Snapshots, events, RPC.", + logs: "Live gateway logs.", + dreams: "Memory consolidation while sleeping.", + }, + overview: { + access: { + title: "Gateway Access", + subtitle: "Where the dashboard connects and how it authenticates.", + wsUrl: "WebSocket URL", + token: "Gateway Token", + password: "Password (not stored)", + sessionKey: "Default Session Key", + language: "Language", + connectHint: "Click Connect to apply connection changes.", + trustedProxy: "Authenticated via trusted proxy.", + }, + snapshot: { + title: "Snapshot", + subtitle: "Latest gateway handshake information.", + status: "Status", + uptime: "Uptime", + tickInterval: "Tick Interval", + lastChannelsRefresh: "Last Channels Refresh", + channelsHint: "Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.", + }, + stats: { + instances: "Instances", + instancesHint: "Presence beacons in the last 5 minutes.", + sessions: "Sessions", + sessionsHint: "Recent session keys tracked by the gateway.", + cron: "Cron", + cronNext: "Next wake {time}", + }, + notes: { + title: "Notes", + subtitle: "Quick reminders for remote control setups.", + tailscaleTitle: "Tailscale serve", + tailscaleText: "Prefer serve mode to keep the gateway on loopback with tailnet auth.", + sessionTitle: "Session hygiene", + sessionText: "Use /new or sessions.patch to reset context.", + cronTitle: "Cron reminders", + cronText: "Use isolated sessions for recurring runs.", + }, + auth: { + required: "This gateway requires auth. Add a token or password, then click Connect.", + failed: + "Auth failed. Re-copy a tokenized URL with {command}, or update the token, then click Connect.", + }, + pairing: { + hint: "This device needs pairing approval from the gateway host.", + mobileHint: + "On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.", + }, + insecure: { + hint: "This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open {url} on the gateway host.", + stayHttp: "If you must stay on HTTP, set {config} (token-only).", + }, + connection: { + title: "How to connect", + step1: "Start the gateway on your host machine:", + step2: "Get a tokenized dashboard URL:", + step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.", + step4: "Or generate a reusable token:", + docsHint: "For remote access, Tailscale Serve is recommended. ", + docsLink: "Read the docs →", + }, + cards: { + cost: "Cost", + skills: "Skills", + recentSessions: "Recent Sessions", + }, + attention: { + title: "Attention", + }, + eventLog: { + title: "Event Log", + }, + logTail: { + title: "Gateway Logs", + }, + quickActions: { + newSession: "New Session", + automation: "Automation", + refreshAll: "Refresh All", + terminal: "Terminal", + }, + palette: { + placeholder: "Type a command…", + noResults: "No results", + }, + }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, + login: { + subtitle: "Gateway Dashboard", + passwordPlaceholder: "optional", + }, + chat: { + disconnected: "Disconnected from gateway.", + refreshTitle: "Refresh chat data", + thinkingToggle: "Toggle assistant thinking/working output", + toolCallsToggle: "Toggle tool calls and tool results", + focusToggle: "Toggle focus mode (hide sidebar + page header)", + hideCronSessions: "Hide cron sessions", + showCronSessions: "Show cron sessions", + showCronSessionsHidden: "Show cron sessions ({count} hidden)", + onboardingDisabled: "Disabled during setup", + }, + languages: { + en: "English", + zhCN: "简体中文 (Simplified Chinese)", + zhTW: "繁體中文 (Traditional Chinese)", + ptBR: "Português (Brazilian Portuguese)", + de: "Deutsch (German)", + es: "Español (Spanish)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", + }, + cron: { + summary: { + enabled: "Enabled", + yes: "Yes", + no: "No", + jobs: "Jobs", + nextWake: "Next wake", + refreshing: "Refreshing...", + refresh: "Refresh", + }, + jobs: { + title: "Jobs", + subtitle: "All scheduled jobs stored in the gateway.", + shownOf: "{shown} shown of {total}", + searchJobs: "Search jobs", + searchPlaceholder: "Name, description, or agent", + enabled: "Enabled", + schedule: "Schedule", + lastRun: "Last run", + all: "All", + sort: "Sort", + nextRun: "Next run", + recentlyUpdated: "Recently updated", + name: "Name", + direction: "Direction", + ascending: "Ascending", + descending: "Descending", + reset: "Reset", + noMatching: "No matching jobs.", + loading: "Loading...", + loadMore: "Load more jobs", + }, + runs: { + title: "Run history", + subtitleAll: "Latest runs across all jobs.", + subtitleJob: "Latest runs for {title}.", + scope: "Scope", + allJobs: "All jobs", + selectedJob: "Selected job", + searchRuns: "Search runs", + searchPlaceholder: "Summary, error, or job", + newestFirst: "Newest first", + oldestFirst: "Oldest first", + status: "Status", + delivery: "Delivery", + clear: "Clear", + allStatuses: "All statuses", + allDelivery: "All delivery", + selectJobHint: "Select a job to inspect run history.", + noMatching: "No matching runs.", + loadMore: "Load more runs", + runStatusOk: "OK", + runStatusError: "Error", + runStatusSkipped: "Skipped", + runStatusUnknown: "Unknown", + deliveryDelivered: "Delivered", + deliveryNotDelivered: "Not delivered", + deliveryUnknown: "Unknown", + deliveryNotRequested: "Not requested", + }, + form: { + editJob: "Edit Job", + newJob: "New Job", + updateSubtitle: "Update the selected scheduled job.", + createSubtitle: "Create a scheduled wakeup or agent run.", + required: "Required", + requiredSr: "required", + basics: "Basics", + basicsSub: "Name it, choose the assistant, and set enabled state.", + fieldName: "Name", + description: "Description", + agentId: "Agent ID", + namePlaceholder: "Morning brief", + descriptionPlaceholder: "Optional context for this job", + agentPlaceholder: "main or ops", + agentHelp: "Start typing to pick a known agent, or enter a custom one.", + schedule: "Schedule", + scheduleSub: "Control when this job runs.", + every: "Every", + at: "At", + cronOption: "Cron", + runAt: "Run at", + unit: "Unit", + minutes: "Minutes", + hours: "Hours", + days: "Days", + expression: "Expression", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Timezone (optional)", + timezonePlaceholder: "America/Los_Angeles", + timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.", + jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.", + execution: "Execution", + executionSub: "Choose when to wake, and what this job should do.", + session: "Session", + main: "Main", + isolated: "Isolated", + sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.", + wakeMode: "Wake mode", + now: "Now", + nextHeartbeat: "Next heartbeat", + wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.", + payloadKind: "What should run?", + systemEvent: "Post message to main timeline", + agentTurn: "Run assistant task (isolated)", + systemEventHelp: + "Sends your text to the gateway main timeline (good for reminders/triggers).", + agentTurnHelp: "Starts an assistant run in its own session using your prompt.", + timeoutSeconds: "Timeout (seconds)", + timeoutPlaceholder: "Optional, e.g. 90", + timeoutHelp: + "Optional. Leave blank to use the gateway default timeout behavior for this run.", + mainTimelineMessage: "Main timeline message", + assistantTaskPrompt: "Assistant task prompt", + deliverySection: "Delivery", + deliverySub: "Choose where run summaries are sent.", + resultDelivery: "Result delivery", + announceDefault: "Announce summary (default)", + webhookPost: "Webhook POST", + noneInternal: "None (internal)", + deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.", + webhookUrl: "Webhook URL", + channel: "Channel", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Choose which connected channel receives the summary.", + webhookHelp: "Send run summaries to a webhook endpoint.", + to: "To", + toPlaceholder: "+1555... or chat id", + toHelp: "Optional recipient override (chat id, phone, or user id).", + advanced: "Advanced", + advancedHelp: + "Optional overrides for delivery guarantees, schedule jitter, and model controls.", + deleteAfterRun: "Delete after run", + deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.", + clearAgentOverride: "Clear agent override", + clearAgentHelp: "Force this job to use the gateway default assistant.", + exactTiming: "Exact timing (no stagger)", + exactTimingHelp: "Run on exact cron boundaries with no spread.", + staggerWindow: "Stagger window", + staggerUnit: "Stagger unit", + staggerPlaceholder: "30", + seconds: "Seconds", + model: "Model", + modelPlaceholder: "openai/gpt-5.2", + modelHelp: "Start typing to pick a known model, or enter a custom one.", + thinking: "Thinking", + thinkingPlaceholder: "low", + thinkingHelp: "Use a suggested level or enter a provider-specific value.", + bestEffortDelivery: "Best effort delivery", + bestEffortHelp: "Do not fail the job if delivery itself fails.", + cantAddYet: "Can't add job yet", + fillRequired: "Fill the required fields below to enable submit.", + fixFields: "Fix {count} field to continue.", + fixFieldsPlural: "Fix {count} fields to continue.", + saving: "Saving...", + saveChanges: "Save changes", + addJob: "Add job", + cancel: "Cancel", + }, + jobList: { + allJobs: "all jobs", + selectJob: "(select a job)", + enabled: "enabled", + disabled: "disabled", + edit: "Edit", + clone: "Clone", + disable: "Disable", + enable: "Enable", + run: "Run", + history: "History", + remove: "Remove", + }, + jobDetail: { + system: "System", + prompt: "Prompt", + delivery: "Delivery", + agent: "Agent", + }, + jobState: { + status: "Status", + next: "Next", + last: "Last", + }, + runEntry: { + noSummary: "No summary.", + runAt: "Run at", + openRunChat: "Open run chat", + next: "Next {rel}", + due: "Due {rel}", + }, + errors: { + nameRequired: "Name is required.", + scheduleAtInvalid: "Enter a valid date/time.", + everyAmountInvalid: "Interval must be greater than 0.", + cronExprRequired: "Cron expression is required.", + staggerAmountInvalid: "Stagger must be greater than 0.", + systemTextRequired: "System text is required.", + agentMessageRequired: "Agent message is required.", + timeoutInvalid: "If set, timeout must be greater than 0 seconds.", + webhookUrlRequired: "Webhook URL is required.", + webhookUrlInvalid: "Webhook URL must start with http:// or https://.", + invalidRunTime: "Invalid run time.", + invalidIntervalAmount: "Invalid interval amount.", + cronExprRequiredShort: "Cron expression required.", + invalidStaggerAmount: "Invalid stagger amount.", + systemEventTextRequired: "System event text required.", + agentMessageRequiredShort: "Agent message required.", + nameRequiredShort: "Name required.", + }, + }, +}; diff --git a/ui/src/i18n/locales/pt-BR.ts b/ui/src/i18n/locales/pt-BR.ts index cb9ba1ba283..da0e74082e5 100644 --- a/ui/src/i18n/locales/pt-BR.ts +++ b/ui/src/i18n/locales/pt-BR.ts @@ -1,5 +1,6 @@ import type { TranslationMap } from "../lib/types.ts"; +// Generated by scripts/control-ui-i18n.ts. export const pt_BR: TranslationMap = { common: { health: "Saúde", @@ -13,6 +14,7 @@ export const pt_BR: TranslationMap = { na: "n/a", version: "Versão", docs: "Docs", + theme: "Theme", resources: "Recursos", search: "Pesquisar", }, @@ -44,6 +46,7 @@ export const pt_BR: TranslationMap = { aiAgents: "IA e Agentes", debug: "Debug", logs: "Logs", + dreams: "Dreams", }, subtitles: { agents: "Espaços, ferramentas, identidades.", @@ -64,6 +67,7 @@ export const pt_BR: TranslationMap = { aiAgents: "Configurações de agentes, modelos, habilidades, ferramentas, memória e sessão.", debug: "Snapshots, eventos, RPC.", logs: "Logs ao vivo do gateway.", + dreams: "Memory consolidation while sleeping.", }, overview: { access: { @@ -154,6 +158,228 @@ export const pt_BR: TranslationMap = { noResults: "Sem resultados", }, }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, login: { subtitle: "Painel do Gateway", passwordPlaceholder: "opcional", @@ -162,6 +388,7 @@ export const pt_BR: TranslationMap = { disconnected: "Desconectado do gateway.", refreshTitle: "Atualizar dados do chat", thinkingToggle: "Alternar saída de pensamento/trabalho do assistente", + toolCallsToggle: "Toggle tool calls and tool results", focusToggle: "Alternar modo de foco (ocultar barra lateral + cabeçalho da página)", hideCronSessions: "Ocultar sessões de cron", showCronSessions: "Mostrar sessões de cron", @@ -175,5 +402,219 @@ export const pt_BR: TranslationMap = { ptBR: "Português (Português Brasileiro)", de: "Deutsch (Alemão)", es: "Español (Espanhol)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", + }, + cron: { + summary: { + enabled: "Enabled", + yes: "Yes", + no: "No", + jobs: "Jobs", + nextWake: "Next wake", + refreshing: "Refreshing...", + refresh: "Refresh", + }, + jobs: { + title: "Jobs", + subtitle: "All scheduled jobs stored in the gateway.", + shownOf: "{shown} shown of {total}", + searchJobs: "Search jobs", + searchPlaceholder: "Name, description, or agent", + enabled: "Enabled", + schedule: "Schedule", + lastRun: "Last run", + all: "All", + sort: "Sort", + nextRun: "Next run", + recentlyUpdated: "Recently updated", + name: "Name", + direction: "Direction", + ascending: "Ascending", + descending: "Descending", + reset: "Reset", + noMatching: "No matching jobs.", + loading: "Loading...", + loadMore: "Load more jobs", + }, + runs: { + title: "Run history", + subtitleAll: "Latest runs across all jobs.", + subtitleJob: "Latest runs for {title}.", + scope: "Scope", + allJobs: "All jobs", + selectedJob: "Selected job", + searchRuns: "Search runs", + searchPlaceholder: "Summary, error, or job", + newestFirst: "Newest first", + oldestFirst: "Oldest first", + status: "Status", + delivery: "Delivery", + clear: "Clear", + allStatuses: "All statuses", + allDelivery: "All delivery", + selectJobHint: "Select a job to inspect run history.", + noMatching: "No matching runs.", + loadMore: "Load more runs", + runStatusOk: "OK", + runStatusError: "Error", + runStatusSkipped: "Skipped", + runStatusUnknown: "Unknown", + deliveryDelivered: "Delivered", + deliveryNotDelivered: "Not delivered", + deliveryUnknown: "Unknown", + deliveryNotRequested: "Not requested", + }, + form: { + editJob: "Edit Job", + newJob: "New Job", + updateSubtitle: "Update the selected scheduled job.", + createSubtitle: "Create a scheduled wakeup or agent run.", + required: "Required", + requiredSr: "required", + basics: "Basics", + basicsSub: "Name it, choose the assistant, and set enabled state.", + fieldName: "Name", + description: "Description", + agentId: "Agent ID", + namePlaceholder: "Morning brief", + descriptionPlaceholder: "Optional context for this job", + agentPlaceholder: "main or ops", + agentHelp: "Start typing to pick a known agent, or enter a custom one.", + schedule: "Schedule", + scheduleSub: "Control when this job runs.", + every: "Every", + at: "At", + cronOption: "Cron", + runAt: "Run at", + unit: "Unit", + minutes: "Minutes", + hours: "Hours", + days: "Days", + expression: "Expression", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Timezone (optional)", + timezonePlaceholder: "America/Los_Angeles", + timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.", + jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.", + execution: "Execution", + executionSub: "Choose when to wake, and what this job should do.", + session: "Session", + main: "Main", + isolated: "Isolated", + sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.", + wakeMode: "Wake mode", + now: "Now", + nextHeartbeat: "Next heartbeat", + wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.", + payloadKind: "What should run?", + systemEvent: "Post message to main timeline", + agentTurn: "Run assistant task (isolated)", + systemEventHelp: + "Sends your text to the gateway main timeline (good for reminders/triggers).", + agentTurnHelp: "Starts an assistant run in its own session using your prompt.", + timeoutSeconds: "Timeout (seconds)", + timeoutPlaceholder: "Optional, e.g. 90", + timeoutHelp: + "Optional. Leave blank to use the gateway default timeout behavior for this run.", + mainTimelineMessage: "Main timeline message", + assistantTaskPrompt: "Assistant task prompt", + deliverySection: "Delivery", + deliverySub: "Choose where run summaries are sent.", + resultDelivery: "Result delivery", + announceDefault: "Announce summary (default)", + webhookPost: "Webhook POST", + noneInternal: "None (internal)", + deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.", + webhookUrl: "Webhook URL", + channel: "Channel", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Choose which connected channel receives the summary.", + webhookHelp: "Send run summaries to a webhook endpoint.", + to: "To", + toPlaceholder: "+1555... or chat id", + toHelp: "Optional recipient override (chat id, phone, or user id).", + advanced: "Advanced", + advancedHelp: + "Optional overrides for delivery guarantees, schedule jitter, and model controls.", + deleteAfterRun: "Delete after run", + deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.", + clearAgentOverride: "Clear agent override", + clearAgentHelp: "Force this job to use the gateway default assistant.", + exactTiming: "Exact timing (no stagger)", + exactTimingHelp: "Run on exact cron boundaries with no spread.", + staggerWindow: "Stagger window", + staggerUnit: "Stagger unit", + staggerPlaceholder: "30", + seconds: "Seconds", + model: "Model", + modelPlaceholder: "openai/gpt-5.2", + modelHelp: "Start typing to pick a known model, or enter a custom one.", + thinking: "Thinking", + thinkingPlaceholder: "low", + thinkingHelp: "Use a suggested level or enter a provider-specific value.", + bestEffortDelivery: "Best effort delivery", + bestEffortHelp: "Do not fail the job if delivery itself fails.", + cantAddYet: "Can't add job yet", + fillRequired: "Fill the required fields below to enable submit.", + fixFields: "Fix {count} field to continue.", + fixFieldsPlural: "Fix {count} fields to continue.", + saving: "Saving...", + saveChanges: "Save changes", + addJob: "Add job", + cancel: "Cancel", + }, + jobList: { + allJobs: "all jobs", + selectJob: "(select a job)", + enabled: "enabled", + disabled: "disabled", + edit: "Edit", + clone: "Clone", + disable: "Disable", + enable: "Enable", + run: "Run", + history: "History", + remove: "Remove", + }, + jobDetail: { + system: "System", + prompt: "Prompt", + delivery: "Delivery", + agent: "Agent", + }, + jobState: { + status: "Status", + next: "Next", + last: "Last", + }, + runEntry: { + noSummary: "No summary.", + runAt: "Run at", + openRunChat: "Open run chat", + next: "Next {rel}", + due: "Due {rel}", + }, + errors: { + nameRequired: "Name is required.", + scheduleAtInvalid: "Enter a valid date/time.", + everyAmountInvalid: "Interval must be greater than 0.", + cronExprRequired: "Cron expression is required.", + staggerAmountInvalid: "Stagger must be greater than 0.", + systemTextRequired: "System text is required.", + agentMessageRequired: "Agent message is required.", + timeoutInvalid: "If set, timeout must be greater than 0 seconds.", + webhookUrlRequired: "Webhook URL is required.", + webhookUrlInvalid: "Webhook URL must start with http:// or https://.", + invalidRunTime: "Invalid run time.", + invalidIntervalAmount: "Invalid interval amount.", + cronExprRequiredShort: "Cron expression required.", + invalidStaggerAmount: "Invalid stagger amount.", + systemEventTextRequired: "System event text required.", + agentMessageRequiredShort: "Agent message required.", + nameRequiredShort: "Name required.", + }, }, }; diff --git a/ui/src/i18n/locales/zh-CN.ts b/ui/src/i18n/locales/zh-CN.ts index b039be16f41..714ed8e0494 100644 --- a/ui/src/i18n/locales/zh-CN.ts +++ b/ui/src/i18n/locales/zh-CN.ts @@ -1,5 +1,6 @@ import type { TranslationMap } from "../lib/types.ts"; +// Generated by scripts/control-ui-i18n.ts. export const zh_CN: TranslationMap = { common: { health: "健康状况", @@ -13,6 +14,7 @@ export const zh_CN: TranslationMap = { na: "不适用", version: "版本", docs: "文档", + theme: "Theme", resources: "资源", search: "搜索", }, @@ -44,6 +46,7 @@ export const zh_CN: TranslationMap = { aiAgents: "AI 与代理", debug: "调试", logs: "日志", + dreams: "Dreams", }, subtitles: { agents: "工作区、工具、身份。", @@ -64,6 +67,7 @@ export const zh_CN: TranslationMap = { aiAgents: "代理、模型、技能、工具、记忆和会话设置。", debug: "快照、事件、RPC。", logs: "实时网关日志。", + dreams: "Memory consolidation while sleeping.", }, overview: { access: { @@ -151,6 +155,228 @@ export const zh_CN: TranslationMap = { noResults: "无结果", }, }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, login: { subtitle: "网关仪表盘", passwordPlaceholder: "可选", @@ -159,6 +385,7 @@ export const zh_CN: TranslationMap = { disconnected: "已断开与网关的连接。", refreshTitle: "刷新聊天数据", thinkingToggle: "切换助手思考/工作输出", + toolCallsToggle: "Toggle tool calls and tool results", focusToggle: "切换专注模式 (隐藏侧边栏 + 页面页眉)", hideCronSessions: "隐藏定时任务会话", showCronSessions: "显示定时任务会话", @@ -172,6 +399,9 @@ export const zh_CN: TranslationMap = { ptBR: "Português (巴西葡萄牙语)", de: "Deutsch (德语)", es: "Español (西班牙语)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", }, cron: { summary: { @@ -190,6 +420,8 @@ export const zh_CN: TranslationMap = { searchJobs: "搜索任务", searchPlaceholder: "名称、描述或代理", enabled: "启用状态", + schedule: "Schedule", + lastRun: "Last run", all: "全部", sort: "排序", nextRun: "下次运行", @@ -198,6 +430,7 @@ export const zh_CN: TranslationMap = { direction: "方向", ascending: "升序", descending: "降序", + reset: "Reset", noMatching: "没有匹配的任务。", loading: "加载中...", loadMore: "加载更多任务", diff --git a/ui/src/i18n/locales/zh-TW.ts b/ui/src/i18n/locales/zh-TW.ts index a6a616209e7..e3848da2f11 100644 --- a/ui/src/i18n/locales/zh-TW.ts +++ b/ui/src/i18n/locales/zh-TW.ts @@ -1,5 +1,6 @@ import type { TranslationMap } from "../lib/types.ts"; +// Generated by scripts/control-ui-i18n.ts. export const zh_TW: TranslationMap = { common: { health: "健康狀況", @@ -13,6 +14,7 @@ export const zh_TW: TranslationMap = { na: "不適用", version: "版本", docs: "文檔", + theme: "Theme", resources: "資源", search: "搜尋", }, @@ -44,6 +46,7 @@ export const zh_TW: TranslationMap = { aiAgents: "AI 與代理", debug: "調試", logs: "日誌", + dreams: "Dreams", }, subtitles: { agents: "工作區、工具、身份。", @@ -64,6 +67,7 @@ export const zh_TW: TranslationMap = { aiAgents: "代理、模型、技能、工具、記憶和會話設置。", debug: "快照、事件、RPC。", logs: "實時網關日誌。", + dreams: "Memory consolidation while sleeping.", }, overview: { access: { @@ -151,6 +155,228 @@ export const zh_TW: TranslationMap = { noResults: "無結果", }, }, + usage: { + page: { + subtitle: "See where tokens go, when sessions spike, and what drives cost.", + }, + common: { + emptyValue: "—", + unknown: "unknown", + }, + loading: { + title: "Usage Overview", + badge: "Loading", + }, + metrics: { + tokens: "Tokens", + cost: "Cost", + session: "session", + sessions: "sessions", + }, + presets: { + today: "Today", + last7d: "7d", + last30d: "30d", + }, + filters: { + title: "Filters", + to: "to", + startDate: "Start date", + endDate: "End date", + timeZone: "Time zone", + timeZoneLocal: "Local", + timeZoneUtc: "UTC", + pin: "Pin", + pinned: "Pinned", + unpin: "Unpin filters", + selectAll: "Select All", + clear: "Clear", + clearAll: "Clear All", + remove: "Remove filter", + all: "All", + days: "Days", + hours: "Hours", + session: "Session", + agent: "Agent", + channel: "Channel", + provider: "Provider", + model: "Model", + tool: "Tool", + daysCount: "{count} days", + hoursCount: "{count} hours", + sessionsCount: "{count} sessions", + }, + query: { + placeholder: + "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)", + apply: "Filter (client-side)", + matching: "{shown} of {total} sessions match", + inRange: "{total} sessions in range", + tip: "Tip: use filters or click bars to refine days.", + }, + export: { + label: "Export", + sessionsCsv: "Sessions CSV", + dailyCsv: "Daily CSV", + json: "JSON", + }, + empty: { + title: "Start with a date range", + subtitle: + "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.", + hint: "Select a date range and click Refresh to load usage.", + noData: "No data", + featureOverview: "Overview cards", + featureSessions: "Session ranking", + featureTimeline: "Timeline drilldown", + }, + daily: { + title: "Daily Usage", + total: "Total", + byType: "By Type", + tokensTitle: "Daily Token Usage", + costTitle: "Daily Cost", + }, + breakdown: { + output: "Output", + input: "Input", + cacheWrite: "Cache Write", + cacheRead: "Cache Read", + total: "Total", + tokensByType: "Tokens by Type", + costByType: "Cost by Type", + }, + overview: { + title: "Usage Overview", + messages: "Messages", + messagesHint: "Total user and assistant messages in range.", + messagesAbbrev: "msgs", + user: "user", + assistant: "assistant", + toolCalls: "Tool Calls", + toolCallsHint: "Total tool call count across sessions.", + toolsUsed: "tools used", + errors: "Errors", + errorsHint: "Total message and tool errors in range.", + toolResults: "tool results", + avgTokens: "Avg Tokens / Msg", + avgTokensHint: "Average tokens per message in this range.", + avgCost: "Avg Cost / Msg", + avgCostHint: "Average cost per message when providers report costs.", + avgCostHintMissing: + "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.", + acrossMessages: "Across {count} messages", + sessions: "Sessions", + sessionsHint: "Distinct sessions in the range.", + sessionsInRange: "of {count} in range", + throughput: "Throughput", + throughputHint: "Throughput shows tokens per minute over active time. Higher is better.", + tokensPerMinute: "tok/min", + perMinute: "/ min", + errorRate: "Error Rate", + errorHint: "Error rate = errors / total messages. Lower is better.", + avgSession: "avg session", + cacheHitRate: "Cache Hit Rate", + cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.", + cached: "cached", + prompt: "prompt", + calls: "calls", + topModels: "Top Models", + topProviders: "Top Providers", + topTools: "Top Tools", + topAgents: "Top Agents", + topChannels: "Top Channels", + peakErrorDays: "Peak Error Days", + peakErrorHours: "Peak Error Hours", + noModelData: "No model data", + noProviderData: "No provider data", + noToolCalls: "No tool calls", + noAgentData: "No agent data", + noChannelData: "No channel data", + noErrorData: "No error data", + }, + sessions: { + title: "Sessions", + shown: "{count} shown", + total: "{count} total", + avg: "avg", + all: "All", + recent: "Recently viewed", + recentShort: "Recent", + sort: "Sort", + ascending: "Ascending", + descending: "Descending", + clearSelection: "Clear Selection", + noRecent: "No recent sessions", + noneInRange: "No sessions in range", + more: "+{count} more", + selected: "Selected ({count})", + copy: "Copy", + copyName: "Copy session name", + limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.", + }, + details: { + noUsageData: "No usage data for this session.", + duration: "Duration", + modelMix: "Model Mix", + filtered: "(filtered)", + close: "Close session details", + noTimeline: "No timeline data", + noDataInRange: "No data in range", + usageOverTime: "Usage Over Time", + reset: "Reset", + perTurn: "Per Turn", + cumulative: "Cumulative", + turnRange: "Turns {start}–{end} of {total}", + assistantOutputTokens: "Assistant output tokens", + userToolInputTokens: "User + tool input tokens", + tokensWrittenToCache: "Tokens written to cache", + tokensReadFromCache: "Tokens read from cache", + noContextData: "No context data", + systemPromptBreakdown: "System Prompt Breakdown", + collapse: "Collapse", + collapseAll: "Collapse All", + expandAll: "Expand All", + baseContextPerMessage: "Base context per message", + system: "System", + systemShort: "Sys", + skills: "Skills", + tools: "Tools", + files: "Files", + ofInput: "of input", + of: "of", + timelineFiltered: "timeline filtered", + conversation: "Conversation", + noMessages: "No messages", + tool: "Tool", + toolResult: "Tool result", + hasTools: "Has tools", + searchConversation: "Search conversation", + you: "You", + noMessagesMatch: "No messages match the filters.", + }, + mosaic: { + title: "Activity by Time", + subtitleEmpty: "Estimates require session timestamps.", + subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.", + noTimelineData: "No timeline data yet.", + dayOfWeek: "Day of Week", + midnight: "Midnight", + fourAm: "4am", + eightAm: "8am", + noon: "Noon", + fourPm: "4pm", + eightPm: "8pm", + legend: "Low → High token density", + sun: "Sun", + mon: "Mon", + tue: "Tue", + wed: "Wed", + thu: "Thu", + fri: "Fri", + sat: "Sat", + }, + }, login: { subtitle: "閘道儀表板", passwordPlaceholder: "可選", @@ -159,6 +385,7 @@ export const zh_TW: TranslationMap = { disconnected: "已斷開與網關的連接。", refreshTitle: "刷新聊天數據", thinkingToggle: "切換助手思考/工作輸出", + toolCallsToggle: "Toggle tool calls and tool results", focusToggle: "切換專注模式 (隱藏側邊欄 + 頁面頁眉)", hideCronSessions: "隱藏定時任務會話", showCronSessions: "顯示定時任務會話", @@ -172,5 +399,219 @@ export const zh_TW: TranslationMap = { ptBR: "Português (巴西葡萄牙語)", de: "Deutsch (德語)", es: "Español (西班牙語)", + jaJP: "日本語 (Japanese)", + ko: "한국어 (Korean)", + fr: "Français (French)", + }, + cron: { + summary: { + enabled: "Enabled", + yes: "Yes", + no: "No", + jobs: "Jobs", + nextWake: "Next wake", + refreshing: "Refreshing...", + refresh: "Refresh", + }, + jobs: { + title: "Jobs", + subtitle: "All scheduled jobs stored in the gateway.", + shownOf: "{shown} shown of {total}", + searchJobs: "Search jobs", + searchPlaceholder: "Name, description, or agent", + enabled: "Enabled", + schedule: "Schedule", + lastRun: "Last run", + all: "All", + sort: "Sort", + nextRun: "Next run", + recentlyUpdated: "Recently updated", + name: "Name", + direction: "Direction", + ascending: "Ascending", + descending: "Descending", + reset: "Reset", + noMatching: "No matching jobs.", + loading: "Loading...", + loadMore: "Load more jobs", + }, + runs: { + title: "Run history", + subtitleAll: "Latest runs across all jobs.", + subtitleJob: "Latest runs for {title}.", + scope: "Scope", + allJobs: "All jobs", + selectedJob: "Selected job", + searchRuns: "Search runs", + searchPlaceholder: "Summary, error, or job", + newestFirst: "Newest first", + oldestFirst: "Oldest first", + status: "Status", + delivery: "Delivery", + clear: "Clear", + allStatuses: "All statuses", + allDelivery: "All delivery", + selectJobHint: "Select a job to inspect run history.", + noMatching: "No matching runs.", + loadMore: "Load more runs", + runStatusOk: "OK", + runStatusError: "Error", + runStatusSkipped: "Skipped", + runStatusUnknown: "Unknown", + deliveryDelivered: "Delivered", + deliveryNotDelivered: "Not delivered", + deliveryUnknown: "Unknown", + deliveryNotRequested: "Not requested", + }, + form: { + editJob: "Edit Job", + newJob: "New Job", + updateSubtitle: "Update the selected scheduled job.", + createSubtitle: "Create a scheduled wakeup or agent run.", + required: "Required", + requiredSr: "required", + basics: "Basics", + basicsSub: "Name it, choose the assistant, and set enabled state.", + fieldName: "Name", + description: "Description", + agentId: "Agent ID", + namePlaceholder: "Morning brief", + descriptionPlaceholder: "Optional context for this job", + agentPlaceholder: "main or ops", + agentHelp: "Start typing to pick a known agent, or enter a custom one.", + schedule: "Schedule", + scheduleSub: "Control when this job runs.", + every: "Every", + at: "At", + cronOption: "Cron", + runAt: "Run at", + unit: "Unit", + minutes: "Minutes", + hours: "Hours", + days: "Days", + expression: "Expression", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Timezone (optional)", + timezonePlaceholder: "America/Los_Angeles", + timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.", + jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.", + execution: "Execution", + executionSub: "Choose when to wake, and what this job should do.", + session: "Session", + main: "Main", + isolated: "Isolated", + sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.", + wakeMode: "Wake mode", + now: "Now", + nextHeartbeat: "Next heartbeat", + wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.", + payloadKind: "What should run?", + systemEvent: "Post message to main timeline", + agentTurn: "Run assistant task (isolated)", + systemEventHelp: + "Sends your text to the gateway main timeline (good for reminders/triggers).", + agentTurnHelp: "Starts an assistant run in its own session using your prompt.", + timeoutSeconds: "Timeout (seconds)", + timeoutPlaceholder: "Optional, e.g. 90", + timeoutHelp: + "Optional. Leave blank to use the gateway default timeout behavior for this run.", + mainTimelineMessage: "Main timeline message", + assistantTaskPrompt: "Assistant task prompt", + deliverySection: "Delivery", + deliverySub: "Choose where run summaries are sent.", + resultDelivery: "Result delivery", + announceDefault: "Announce summary (default)", + webhookPost: "Webhook POST", + noneInternal: "None (internal)", + deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.", + webhookUrl: "Webhook URL", + channel: "Channel", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Choose which connected channel receives the summary.", + webhookHelp: "Send run summaries to a webhook endpoint.", + to: "To", + toPlaceholder: "+1555... or chat id", + toHelp: "Optional recipient override (chat id, phone, or user id).", + advanced: "Advanced", + advancedHelp: + "Optional overrides for delivery guarantees, schedule jitter, and model controls.", + deleteAfterRun: "Delete after run", + deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.", + clearAgentOverride: "Clear agent override", + clearAgentHelp: "Force this job to use the gateway default assistant.", + exactTiming: "Exact timing (no stagger)", + exactTimingHelp: "Run on exact cron boundaries with no spread.", + staggerWindow: "Stagger window", + staggerUnit: "Stagger unit", + staggerPlaceholder: "30", + seconds: "Seconds", + model: "Model", + modelPlaceholder: "openai/gpt-5.2", + modelHelp: "Start typing to pick a known model, or enter a custom one.", + thinking: "Thinking", + thinkingPlaceholder: "low", + thinkingHelp: "Use a suggested level or enter a provider-specific value.", + bestEffortDelivery: "Best effort delivery", + bestEffortHelp: "Do not fail the job if delivery itself fails.", + cantAddYet: "Can't add job yet", + fillRequired: "Fill the required fields below to enable submit.", + fixFields: "Fix {count} field to continue.", + fixFieldsPlural: "Fix {count} fields to continue.", + saving: "Saving...", + saveChanges: "Save changes", + addJob: "Add job", + cancel: "Cancel", + }, + jobList: { + allJobs: "all jobs", + selectJob: "(select a job)", + enabled: "enabled", + disabled: "disabled", + edit: "Edit", + clone: "Clone", + disable: "Disable", + enable: "Enable", + run: "Run", + history: "History", + remove: "Remove", + }, + jobDetail: { + system: "System", + prompt: "Prompt", + delivery: "Delivery", + agent: "Agent", + }, + jobState: { + status: "Status", + next: "Next", + last: "Last", + }, + runEntry: { + noSummary: "No summary.", + runAt: "Run at", + openRunChat: "Open run chat", + next: "Next {rel}", + due: "Due {rel}", + }, + errors: { + nameRequired: "Name is required.", + scheduleAtInvalid: "Enter a valid date/time.", + everyAmountInvalid: "Interval must be greater than 0.", + cronExprRequired: "Cron expression is required.", + staggerAmountInvalid: "Stagger must be greater than 0.", + systemTextRequired: "System text is required.", + agentMessageRequired: "Agent message is required.", + timeoutInvalid: "If set, timeout must be greater than 0 seconds.", + webhookUrlRequired: "Webhook URL is required.", + webhookUrlInvalid: "Webhook URL must start with http:// or https://.", + invalidRunTime: "Invalid run time.", + invalidIntervalAmount: "Invalid interval amount.", + cronExprRequiredShort: "Cron expression required.", + invalidStaggerAmount: "Invalid stagger amount.", + systemEventTextRequired: "System event text required.", + agentMessageRequiredShort: "Agent message required.", + nameRequiredShort: "Name required.", + }, }, };