feat(i18n): align docs and ui locales

This commit is contained in:
Vincent Koc
2026-04-29 10:20:09 -07:00
parent c85ff84334
commit 297f4c6e60
56 changed files with 9366 additions and 61 deletions

View File

@@ -49,7 +49,7 @@ jobs:
run: |
set -euo pipefail
all_locales_json='["zh-CN","zh-TW","pt-BR","de","es","ja-JP","ko","fr","tr","uk","id","pl","th"]'
all_locales_json='["zh-CN","zh-TW","pt-BR","de","es","ja-JP","ko","fr","ar","it","tr","uk","id","pl","th","vi","nl","fa"]'
if [ "$EVENT_NAME" != "push" ]; then
echo "has_locales=true" >> "$GITHUB_OUTPUT"

View File

@@ -20,6 +20,7 @@ jobs:
set -euo pipefail
for event_type in \
translate-zh-cn-release \
translate-zh-tw-release \
translate-ja-jp-release \
translate-es-release \
translate-pt-br-release \
@@ -28,6 +29,9 @@ jobs:
translate-fr-release \
translate-ar-release \
translate-it-release \
translate-vi-release \
translate-nl-release \
translate-fa-release \
translate-tr-release \
translate-uk-release \
translate-id-release \

View File

@@ -11,7 +11,7 @@ Generated locale trees and live translation memory now live in the publish repo:
- English docs are authored in `openclaw/openclaw`.
- The source docs tree lives under `docs/`.
- The source repo no longer keeps committed generated locale trees such as `docs/zh-CN/**`, `docs/ja-JP/**`, `docs/es/**`, `docs/pt-BR/**`, `docs/ko/**`, `docs/de/**`, `docs/fr/**`, `docs/ar/**`, `docs/it/**`, `docs/tr/**`, `docs/uk/**`, `docs/id/**`, or `docs/pl/**`.
- The source repo no longer keeps committed generated locale trees such as `docs/zh-CN/**`, `docs/zh-TW/**`, `docs/ja-JP/**`, `docs/es/**`, `docs/pt-BR/**`, `docs/ko/**`, `docs/de/**`, `docs/fr/**`, `docs/ar/**`, `docs/it/**`, `docs/vi/**`, `docs/nl/**`, `docs/fa/**`, `docs/tr/**`, `docs/uk/**`, `docs/id/**`, `docs/pl/**`, or `docs/th/**`.
## End-to-end flow
@@ -20,8 +20,8 @@ Generated locale trees and live translation memory now live in the publish repo:
3. `openclaw/openclaw/.github/workflows/docs-sync-publish.yml` mirrors the docs tree into `openclaw/docs`.
4. The sync script rewrites the publish `docs/docs.json` so the generated locale picker blocks exist there even though they are no longer committed in the source repo.
5. `openclaw/docs/.github/workflows/translate-zh-cn.yml` refreshes `docs/zh-CN/**` once a day, on demand, and after source-repo release dispatches.
6. `openclaw/docs/.github/workflows/translate-ja-jp.yml` does the same for `docs/ja-JP/**`.
7. `openclaw/docs/.github/workflows/translate-es.yml`, `translate-pt-br.yml`, `translate-ko.yml`, `translate-de.yml`, `translate-fr.yml`, `translate-ar.yml`, `translate-it.yml`, `translate-tr.yml`, `translate-uk.yml`, `translate-id.yml`, and `translate-pl.yml` do the same for `docs/es/**`, `docs/pt-BR/**`, `docs/ko/**`, `docs/de/**`, `docs/fr/**`, `docs/ar/**`, `docs/it/**`, `docs/tr/**`, `docs/uk/**`, `docs/id/**`, and `docs/pl/**`.
6. `openclaw/docs/.github/workflows/translate-zh-tw.yml` and `translate-ja-jp.yml` do the same for `docs/zh-TW/**` and `docs/ja-JP/**`.
7. `openclaw/docs/.github/workflows/translate-es.yml`, `translate-pt-br.yml`, `translate-ko.yml`, `translate-de.yml`, `translate-fr.yml`, `translate-ar.yml`, `translate-it.yml`, `translate-vi.yml`, `translate-nl.yml`, `translate-fa.yml`, `translate-tr.yml`, `translate-uk.yml`, `translate-id.yml`, `translate-pl.yml`, and `translate-th.yml` do the same for `docs/es/**`, `docs/pt-BR/**`, `docs/ko/**`, `docs/de/**`, `docs/fr/**`, `docs/ar/**`, `docs/it/**`, `docs/vi/**`, `docs/nl/**`, `docs/fa/**`, `docs/tr/**`, `docs/uk/**`, `docs/id/**`, `docs/pl/**`, and `docs/th/**`.
## Why the split exists
@@ -33,10 +33,10 @@ Generated locale trees and live translation memory now live in the publish repo:
- `glossary.<lang>.json` — preferred term mappings used as prompt guidance.
- `zh-Hans-navigation.json` — curated zh-Hans Mintlify locale navigation reinserted into the publish repo during sync.
- `ar-navigation.json`, `de-navigation.json`, `es-navigation.json`, `fr-navigation.json`, `id-navigation.json`, `it-navigation.json`, `ja-navigation.json`, `ko-navigation.json`, `pl-navigation.json`, `pt-BR-navigation.json`, `tr-navigation.json` — starter locale metadata kept alongside the source repo, but the publish sync now clones the full English nav tree for these locales so translated pages are visible in Mintlify without hand-maintaining per-locale nav JSON.
- `ar-navigation.json`, `de-navigation.json`, `es-navigation.json`, `fr-navigation.json`, `id-navigation.json`, `it-navigation.json`, `ja-navigation.json`, `ko-navigation.json`, `pl-navigation.json`, `pt-BR-navigation.json`, and `tr-navigation.json` — starter locale metadata kept alongside the source repo, but the publish sync now clones the full English nav tree for clone-en locales so translated pages are visible in Mintlify without hand-maintaining per-locale nav JSON.
- `<lang>.tm.jsonl` — translation memory keyed by workflow + model + text hash.
In this repo, generated locale TM files such as `docs/.i18n/zh-CN.tm.jsonl`, `docs/.i18n/ja-JP.tm.jsonl`, `docs/.i18n/es.tm.jsonl`, `docs/.i18n/pt-BR.tm.jsonl`, `docs/.i18n/ko.tm.jsonl`, `docs/.i18n/de.tm.jsonl`, `docs/.i18n/fr.tm.jsonl`, `docs/.i18n/ar.tm.jsonl`, `docs/.i18n/it.tm.jsonl`, `docs/.i18n/tr.tm.jsonl`, `docs/.i18n/uk.tm.jsonl`, `docs/.i18n/id.tm.jsonl`, and `docs/.i18n/pl.tm.jsonl` are intentionally no longer committed.
In this repo, generated locale TM files such as `docs/.i18n/zh-CN.tm.jsonl`, `docs/.i18n/zh-TW.tm.jsonl`, `docs/.i18n/ja-JP.tm.jsonl`, `docs/.i18n/es.tm.jsonl`, `docs/.i18n/pt-BR.tm.jsonl`, `docs/.i18n/ko.tm.jsonl`, `docs/.i18n/de.tm.jsonl`, `docs/.i18n/fr.tm.jsonl`, `docs/.i18n/ar.tm.jsonl`, `docs/.i18n/it.tm.jsonl`, `docs/.i18n/vi.tm.jsonl`, `docs/.i18n/nl.tm.jsonl`, `docs/.i18n/fa.tm.jsonl`, `docs/.i18n/tr.tm.jsonl`, `docs/.i18n/uk.tm.jsonl`, `docs/.i18n/id.tm.jsonl`, `docs/.i18n/pl.tm.jsonl`, and `docs/.i18n/th.tm.jsonl` are intentionally no longer committed.
## Glossary format
@@ -62,7 +62,7 @@ Fields:
- If the pending count is `0`, the expensive translation step is skipped entirely.
- If there are pending files, the workflow translates only those files.
- The publish workflow retries transient model-format failures, but unchanged files stay skipped because the same hash check runs on each retry.
- The source repo also dispatches zh-CN, ja-JP, es, pt-BR, ko, de, fr, ar, it, tr, uk, id, and pl refreshes after published GitHub releases so release docs can catch up without waiting for the daily cron.
- The source repo also dispatches zh-CN, zh-TW, ja-JP, es, pt-BR, ko, de, fr, ar, it, vi, nl, fa, tr, uk, id, pl, and th refreshes after published GitHub releases so release docs can catch up without waiting for the daily cron.
## Operational notes

View File

@@ -0,0 +1,78 @@
[
{
"source": "ACP",
"target": "ACP"
},
{
"source": "Active Memory",
"target": "Active Memory"
},
{
"source": "ClawHub",
"target": "ClawHub"
},
{
"source": "CLI",
"target": "CLI"
},
{
"source": "Compaction",
"target": "Compaction"
},
{
"source": "Cron",
"target": "Cron"
},
{
"source": "Dreaming",
"target": "Dreaming"
},
{
"source": "Gateway",
"target": "Gateway"
},
{
"source": "Heartbeat",
"target": "Heartbeat"
},
{
"source": "Mintlify",
"target": "Mintlify"
},
{
"source": "Node",
"target": "Node"
},
{
"source": "OpenClaw",
"target": "OpenClaw"
},
{
"source": "Pi",
"target": "Pi"
},
{
"source": "Plugin",
"target": "Plugin"
},
{
"source": "Skills",
"target": "Skills"
},
{
"source": "Tailscale",
"target": "Tailscale"
},
{
"source": "TaskFlow",
"target": "TaskFlow"
},
{
"source": "TUI",
"target": "TUI"
},
{
"source": "Webhook",
"target": "Webhook"
}
]

View File

@@ -0,0 +1,78 @@
[
{
"source": "ACP",
"target": "ACP"
},
{
"source": "Active Memory",
"target": "Active Memory"
},
{
"source": "ClawHub",
"target": "ClawHub"
},
{
"source": "CLI",
"target": "CLI"
},
{
"source": "Compaction",
"target": "Compaction"
},
{
"source": "Cron",
"target": "Cron"
},
{
"source": "Dreaming",
"target": "Dreaming"
},
{
"source": "Gateway",
"target": "Gateway"
},
{
"source": "Heartbeat",
"target": "Heartbeat"
},
{
"source": "Mintlify",
"target": "Mintlify"
},
{
"source": "Node",
"target": "Node"
},
{
"source": "OpenClaw",
"target": "OpenClaw"
},
{
"source": "Pi",
"target": "Pi"
},
{
"source": "Plugin",
"target": "Plugin"
},
{
"source": "Skills",
"target": "Skills"
},
{
"source": "Tailscale",
"target": "Tailscale"
},
{
"source": "TaskFlow",
"target": "TaskFlow"
},
{
"source": "TUI",
"target": "TUI"
},
{
"source": "Webhook",
"target": "Webhook"
}
]

View File

@@ -0,0 +1,78 @@
[
{
"source": "ACP",
"target": "ACP"
},
{
"source": "Active Memory",
"target": "Active Memory"
},
{
"source": "ClawHub",
"target": "ClawHub"
},
{
"source": "CLI",
"target": "CLI"
},
{
"source": "Compaction",
"target": "Compaction"
},
{
"source": "Cron",
"target": "Cron"
},
{
"source": "Dreaming",
"target": "Dreaming"
},
{
"source": "Gateway",
"target": "Gateway"
},
{
"source": "Heartbeat",
"target": "Heartbeat"
},
{
"source": "Mintlify",
"target": "Mintlify"
},
{
"source": "Node",
"target": "Node"
},
{
"source": "OpenClaw",
"target": "OpenClaw"
},
{
"source": "Pi",
"target": "Pi"
},
{
"source": "Plugin",
"target": "Plugin"
},
{
"source": "Skills",
"target": "Skills"
},
{
"source": "Tailscale",
"target": "Tailscale"
},
{
"source": "TaskFlow",
"target": "TaskFlow"
},
{
"source": "TUI",
"target": "TUI"
},
{
"source": "Webhook",
"target": "Webhook"
}
]

View File

@@ -0,0 +1,78 @@
[
{
"source": "ACP",
"target": "ACP"
},
{
"source": "Active Memory",
"target": "Active Memory"
},
{
"source": "ClawHub",
"target": "ClawHub"
},
{
"source": "CLI",
"target": "CLI"
},
{
"source": "Compaction",
"target": "Compaction"
},
{
"source": "Cron",
"target": "Cron"
},
{
"source": "Dreaming",
"target": "Dreaming"
},
{
"source": "Gateway",
"target": "Gateway"
},
{
"source": "Heartbeat",
"target": "Heartbeat"
},
{
"source": "Mintlify",
"target": "Mintlify"
},
{
"source": "Node",
"target": "Node"
},
{
"source": "OpenClaw",
"target": "OpenClaw"
},
{
"source": "Pi",
"target": "Pi"
},
{
"source": "Plugin",
"target": "Plugin"
},
{
"source": "Skills",
"target": "Skills"
},
{
"source": "Tailscale",
"target": "Tailscale"
},
{
"source": "TaskFlow",
"target": "TaskFlow"
},
{
"source": "TUI",
"target": "TUI"
},
{
"source": "Webhook",
"target": "Webhook"
}
]

View File

@@ -39,6 +39,7 @@ const MINTLIFY_LANGUAGE_CODES = new Set([
"nl",
"uk",
"vi",
"fa",
"pl",
"uz",
"he",

View File

@@ -92,11 +92,16 @@ const LOCALE_ENTRIES: readonly LocaleEntry[] = [
{ locale: "ja-JP", fileName: "ja-JP.ts", exportName: "ja_JP", languageKey: "jaJP" },
{ locale: "ko", fileName: "ko.ts", exportName: "ko", languageKey: "ko" },
{ locale: "fr", fileName: "fr.ts", exportName: "fr", languageKey: "fr" },
{ locale: "ar", fileName: "ar.ts", exportName: "ar", languageKey: "ar" },
{ locale: "it", fileName: "it.ts", exportName: "it", languageKey: "it" },
{ locale: "tr", fileName: "tr.ts", exportName: "tr", languageKey: "tr" },
{ locale: "uk", fileName: "uk.ts", exportName: "uk", languageKey: "uk" },
{ locale: "id", fileName: "id.ts", exportName: "id", languageKey: "id" },
{ locale: "pl", fileName: "pl.ts", exportName: "pl", languageKey: "pl" },
{ locale: "th", fileName: "th.ts", exportName: "th", languageKey: "th" },
{ locale: "vi", fileName: "vi.ts", exportName: "vi", languageKey: "vi" },
{ locale: "nl", fileName: "nl.ts", exportName: "nl", languageKey: "nl" },
{ locale: "fa", fileName: "fa.ts", exportName: "fa", languageKey: "fa" },
];
const DEFAULT_GLOSSARY: readonly GlossaryEntry[] = [
@@ -179,6 +184,10 @@ function prettyLanguageLabel(locale: string): string {
return "Korean";
case "fr":
return "French";
case "ar":
return "Arabic";
case "it":
return "Italian";
case "tr":
return "Turkish";
case "uk":
@@ -189,6 +198,12 @@ function prettyLanguageLabel(locale: string): string {
return "Polish";
case "th":
return "Thai";
case "vi":
return "Vietnamese";
case "nl":
return "Dutch";
case "fa":
return "Persian";
case "de":
return "German";
case "es":

View File

@@ -15,14 +15,40 @@ func prettyLanguageLabel(lang string) string {
return "English"
case strings.EqualFold(trimmed, "zh-CN"):
return "Simplified Chinese"
case strings.EqualFold(trimmed, "zh-TW"):
return "Traditional Chinese"
case strings.EqualFold(trimmed, "ja-JP"):
return "Japanese"
case strings.EqualFold(trimmed, "es"):
return "Spanish"
case strings.EqualFold(trimmed, "pt-BR"):
return "Brazilian Portuguese"
case strings.EqualFold(trimmed, "ko"):
return "Korean"
case strings.EqualFold(trimmed, "fr"):
return "French"
case strings.EqualFold(trimmed, "ar"):
return "Arabic"
case strings.EqualFold(trimmed, "it"):
return "Italian"
case strings.EqualFold(trimmed, "vi"):
return "Vietnamese"
case strings.EqualFold(trimmed, "nl"):
return "Dutch"
case strings.EqualFold(trimmed, "fa"):
return "Persian"
case strings.EqualFold(trimmed, "tr"):
return "Turkish"
case strings.EqualFold(trimmed, "de"):
return "German"
case strings.EqualFold(trimmed, "th"):
return "Thai"
case strings.EqualFold(trimmed, "uk"):
return "Ukrainian"
case strings.EqualFold(trimmed, "id"):
return "Indonesian"
case strings.EqualFold(trimmed, "pl"):
return "Polish"
default:
return trimmed
}

View File

@@ -32,6 +32,13 @@ const GENERATED_LOCALES = [
tmFile: "zh-CN.tm.jsonl",
navMode: "overlay",
},
{
language: "zh-Hant",
dir: "zh-TW",
navFile: "zh-Hant-navigation.json",
tmFile: "zh-TW.tm.jsonl",
navMode: "clone-en",
},
{
language: "ja",
dir: "ja-JP",
@@ -88,6 +95,27 @@ const GENERATED_LOCALES = [
tmFile: "it.tm.jsonl",
navMode: "clone-en",
},
{
language: "vi",
dir: "vi",
navFile: "vi-navigation.json",
tmFile: "vi.tm.jsonl",
navMode: "clone-en",
},
{
language: "nl",
dir: "nl",
navFile: "nl-navigation.json",
tmFile: "nl.tm.jsonl",
navMode: "clone-en",
},
{
language: "fa",
dir: "fa",
navFile: "fa-navigation.json",
tmFile: "fa.tm.jsonl",
navMode: "clone-en",
},
{
language: "tr",
dir: "tr",
@@ -122,7 +150,6 @@ const GENERATED_LOCALES = [
navFile: "th-navigation.json",
tmFile: "th.tm.jsonl",
navMode: "clone-en",
navigation: false,
},
];

View File

@@ -0,0 +1,780 @@
{
"fallbackKeys": [
"agentTools.builtIn",
"agentTools.channel",
"agentTools.channelSource",
"agentTools.connected",
"agentTools.connectedSource",
"channels.gatewayUrlConfirmation.subtitle",
"channels.gatewayUrlConfirmation.title",
"channels.gatewayUrlConfirmation.warning",
"channels.generic.subtitle",
"channels.health.noSnapshotYet",
"channels.health.subtitle",
"channels.health.title",
"channels.nostr.about",
"channels.nostr.account",
"channels.nostr.advanced",
"channels.nostr.avatarHelp",
"channels.nostr.avatarUrl",
"channels.nostr.bannerHelp",
"channels.nostr.bannerUrl",
"channels.nostr.bio",
"channels.nostr.bioHelp",
"channels.nostr.bioPlaceholder",
"channels.nostr.displayName",
"channels.nostr.displayNameHelp",
"channels.nostr.editProfile",
"channels.nostr.lightningAddress",
"channels.nostr.lightningHelp",
"channels.nostr.name",
"channels.nostr.nip05Help",
"channels.nostr.nip05Identifier",
"channels.nostr.noProfile",
"channels.nostr.noProfileHint",
"channels.nostr.profile",
"channels.nostr.profilePicture",
"channels.nostr.profilePicturePreview",
"channels.nostr.username",
"channels.nostr.usernameHelp",
"channels.nostr.website",
"channels.nostr.websiteHelp",
"chat.disconnected",
"chat.focusToggle",
"chat.hideCronSessions",
"chat.onboardingDisabled",
"chat.refreshTitle",
"chat.showCronSessions",
"chat.showCronSessionsHidden",
"chat.thinkingToggle",
"chat.toolCallsToggle",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connect",
"common.connected",
"common.credential",
"common.disabled",
"common.docs",
"common.enabled",
"common.health",
"common.hideAdvanced",
"common.importFromRelays",
"common.importing",
"common.lastConnect",
"common.lastInbound",
"common.lastMessage",
"common.lastProbe",
"common.lastStart",
"common.linked",
"common.loadApprovals",
"common.loadConfig",
"common.loading",
"common.logout",
"common.mode",
"common.na",
"common.no",
"common.offline",
"common.ok",
"common.online",
"common.probe",
"common.probeFailed",
"common.probeOk",
"common.publicKey",
"common.refresh",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.resources",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.search",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.theme",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"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",
"dreaming.advanced.description",
"dreaming.advanced.emptyGrounded",
"dreaming.advanced.emptyPromoted",
"dreaming.advanced.emptyShortTerm",
"dreaming.advanced.eyebrow",
"dreaming.advanced.originDailyLog",
"dreaming.advanced.originLive",
"dreaming.advanced.originMixed",
"dreaming.advanced.promotedDescription",
"dreaming.advanced.promotedTitle",
"dreaming.advanced.shortTermDescription",
"dreaming.advanced.shortTermTitle",
"dreaming.advanced.sortRecent",
"dreaming.advanced.sortSignals",
"dreaming.advanced.stagedDescription",
"dreaming.advanced.stagedTitle",
"dreaming.advanced.summaryFromDailyLog",
"dreaming.advanced.summaryPromotedToday",
"dreaming.advanced.summaryWaiting",
"dreaming.advanced.title",
"dreaming.advanced.updatedPrefix",
"dreaming.diary.newer",
"dreaming.diary.noDreamsHint",
"dreaming.diary.noDreamsYet",
"dreaming.diary.older",
"dreaming.diary.reload",
"dreaming.diary.reloading",
"dreaming.diary.title",
"dreaming.diary.waitingHint",
"dreaming.diary.waitingTitle",
"dreaming.header.off",
"dreaming.header.on",
"dreaming.header.refresh",
"dreaming.header.refreshing",
"dreaming.phase.deep",
"dreaming.phase.light",
"dreaming.phase.off",
"dreaming.phase.rem",
"dreaming.phrases.alphabetizingSubconscious",
"dreaming.phrases.compostingContext",
"dreaming.phrases.connectingDots",
"dreaming.phrases.consolidatingMemories",
"dreaming.phrases.defragmentingMindPalace",
"dreaming.phrases.dreamingEmbeddings",
"dreaming.phrases.filingLooseThoughts",
"dreaming.phrases.forgettingNoise",
"dreaming.phrases.indexingDay",
"dreaming.phrases.nurturingInsights",
"dreaming.phrases.promotingHunches",
"dreaming.phrases.reorganizingAttic",
"dreaming.phrases.replayingConversations",
"dreaming.phrases.simmeringIdeas",
"dreaming.phrases.tidyingKnowledgeGraph",
"dreaming.phrases.weavingShortTerm",
"dreaming.phrases.whisperingVectorStore",
"dreaming.restartConfirmation.confirm",
"dreaming.restartConfirmation.failed",
"dreaming.restartConfirmation.restarting",
"dreaming.restartConfirmation.subtitle",
"dreaming.restartConfirmation.title",
"dreaming.restartConfirmation.warning",
"dreaming.scene.backfill",
"dreaming.scene.clearGrounded",
"dreaming.scene.dedupeDiary",
"dreaming.scene.repairCache",
"dreaming.scene.reset",
"dreaming.scene.working",
"dreaming.stats.grounded",
"dreaming.stats.phaseHits",
"dreaming.stats.promoted",
"dreaming.stats.shortTerm",
"dreaming.stats.signals",
"dreaming.status.active",
"dreaming.status.idle",
"dreaming.status.nextSweepPrefix",
"dreaming.status.promotedSuffix",
"dreaming.tabs.advanced",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"dreaming.trace.emptyGrounded",
"dreaming.trace.emptyPromoted",
"dreaming.trace.emptyShortTerm",
"dreaming.trace.emptySignals",
"dreaming.trace.grounded",
"dreaming.trace.groundedLed",
"dreaming.trace.promoted",
"dreaming.trace.shortTerm",
"dreaming.trace.signals",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.ar",
"languages.de",
"languages.en",
"languages.es",
"languages.fa",
"languages.fr",
"languages.id",
"languages.it",
"languages.jaJP",
"languages.ko",
"languages.nl",
"languages.pl",
"languages.ptBR",
"languages.th",
"languages.tr",
"languages.uk",
"languages.vi",
"languages.zhCN",
"languages.zhTW",
"lazyView.errorSubtitle",
"lazyView.errorTitle",
"lazyView.loadingTitle",
"lazyView.retry",
"lazyView.unknownError",
"login.hidePassword",
"login.hideToken",
"login.passwordPlaceholder",
"login.showPassword",
"login.showToken",
"login.subtitle",
"login.togglePasswordVisibility",
"login.toggleTokenVisibility",
"nav.agent",
"nav.chat",
"nav.collapse",
"nav.control",
"nav.expand",
"nav.resize",
"nav.settings",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.connectHint",
"overview.access.hidePassword",
"overview.access.hideToken",
"overview.access.language",
"overview.access.password",
"overview.access.passwordPlaceholder",
"overview.access.sessionKey",
"overview.access.showPassword",
"overview.access.showToken",
"overview.access.subtitle",
"overview.access.title",
"overview.access.togglePasswordVisibility",
"overview.access.toggleTokenVisibility",
"overview.access.token",
"overview.access.trustedProxy",
"overview.access.wsUrl",
"overview.attention.title",
"overview.auth.failed",
"overview.auth.required",
"overview.cards.cost",
"overview.cards.modelAuth",
"overview.cards.modelAuthAttentionExpiredDesc",
"overview.cards.modelAuthAttentionExpiredTitle",
"overview.cards.modelAuthAttentionExpiringEntry",
"overview.cards.modelAuthAttentionExpiringTitle",
"overview.cards.modelAuthExpired",
"overview.cards.modelAuthExpiresIn",
"overview.cards.modelAuthExpiring",
"overview.cards.modelAuthOk",
"overview.cards.modelAuthProviders",
"overview.cards.modelAuthUsageLeft",
"overview.cards.recentSessions",
"overview.cards.skills",
"overview.connection.authDocsLink",
"overview.connection.authDocsTitle",
"overview.connection.copyCommand",
"overview.connection.copyCommandAria",
"overview.connection.docsHint",
"overview.connection.docsLink",
"overview.connection.insecureHttpDocsLink",
"overview.connection.insecureHttpDocsTitle",
"overview.connection.step1",
"overview.connection.step2",
"overview.connection.step3",
"overview.connection.step4",
"overview.connection.tailscaleDocsLink",
"overview.connection.tailscaleDocsTitle",
"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.docsLink",
"overview.pairing.docsTitle",
"overview.pairing.hint",
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.mobileHint",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle",
"overview.palette.categories.navigation",
"overview.palette.categories.search",
"overview.palette.categories.skills",
"overview.palette.descriptions.debugMode",
"overview.palette.descriptions.shellCommand",
"overview.palette.footer.close",
"overview.palette.footer.navigate",
"overview.palette.footer.select",
"overview.palette.items.agents",
"overview.palette.items.debugMode",
"overview.palette.items.overview",
"overview.palette.items.scheduled",
"overview.palette.items.sessions",
"overview.palette.items.settings",
"overview.palette.items.shellCommand",
"overview.palette.items.skills",
"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-29T13:38:10.208Z",
"locale": "ar",
"model": "",
"provider": "",
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 0,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:10:47.426Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:49.950Z",
"locale": "de",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:11:40.310Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:51.405Z",
"locale": "es",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -0,0 +1,780 @@
{
"fallbackKeys": [
"agentTools.builtIn",
"agentTools.channel",
"agentTools.channelSource",
"agentTools.connected",
"agentTools.connectedSource",
"channels.gatewayUrlConfirmation.subtitle",
"channels.gatewayUrlConfirmation.title",
"channels.gatewayUrlConfirmation.warning",
"channels.generic.subtitle",
"channels.health.noSnapshotYet",
"channels.health.subtitle",
"channels.health.title",
"channels.nostr.about",
"channels.nostr.account",
"channels.nostr.advanced",
"channels.nostr.avatarHelp",
"channels.nostr.avatarUrl",
"channels.nostr.bannerHelp",
"channels.nostr.bannerUrl",
"channels.nostr.bio",
"channels.nostr.bioHelp",
"channels.nostr.bioPlaceholder",
"channels.nostr.displayName",
"channels.nostr.displayNameHelp",
"channels.nostr.editProfile",
"channels.nostr.lightningAddress",
"channels.nostr.lightningHelp",
"channels.nostr.name",
"channels.nostr.nip05Help",
"channels.nostr.nip05Identifier",
"channels.nostr.noProfile",
"channels.nostr.noProfileHint",
"channels.nostr.profile",
"channels.nostr.profilePicture",
"channels.nostr.profilePicturePreview",
"channels.nostr.username",
"channels.nostr.usernameHelp",
"channels.nostr.website",
"channels.nostr.websiteHelp",
"chat.disconnected",
"chat.focusToggle",
"chat.hideCronSessions",
"chat.onboardingDisabled",
"chat.refreshTitle",
"chat.showCronSessions",
"chat.showCronSessionsHidden",
"chat.thinkingToggle",
"chat.toolCallsToggle",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connect",
"common.connected",
"common.credential",
"common.disabled",
"common.docs",
"common.enabled",
"common.health",
"common.hideAdvanced",
"common.importFromRelays",
"common.importing",
"common.lastConnect",
"common.lastInbound",
"common.lastMessage",
"common.lastProbe",
"common.lastStart",
"common.linked",
"common.loadApprovals",
"common.loadConfig",
"common.loading",
"common.logout",
"common.mode",
"common.na",
"common.no",
"common.offline",
"common.ok",
"common.online",
"common.probe",
"common.probeFailed",
"common.probeOk",
"common.publicKey",
"common.refresh",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.resources",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.search",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.theme",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"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",
"dreaming.advanced.description",
"dreaming.advanced.emptyGrounded",
"dreaming.advanced.emptyPromoted",
"dreaming.advanced.emptyShortTerm",
"dreaming.advanced.eyebrow",
"dreaming.advanced.originDailyLog",
"dreaming.advanced.originLive",
"dreaming.advanced.originMixed",
"dreaming.advanced.promotedDescription",
"dreaming.advanced.promotedTitle",
"dreaming.advanced.shortTermDescription",
"dreaming.advanced.shortTermTitle",
"dreaming.advanced.sortRecent",
"dreaming.advanced.sortSignals",
"dreaming.advanced.stagedDescription",
"dreaming.advanced.stagedTitle",
"dreaming.advanced.summaryFromDailyLog",
"dreaming.advanced.summaryPromotedToday",
"dreaming.advanced.summaryWaiting",
"dreaming.advanced.title",
"dreaming.advanced.updatedPrefix",
"dreaming.diary.newer",
"dreaming.diary.noDreamsHint",
"dreaming.diary.noDreamsYet",
"dreaming.diary.older",
"dreaming.diary.reload",
"dreaming.diary.reloading",
"dreaming.diary.title",
"dreaming.diary.waitingHint",
"dreaming.diary.waitingTitle",
"dreaming.header.off",
"dreaming.header.on",
"dreaming.header.refresh",
"dreaming.header.refreshing",
"dreaming.phase.deep",
"dreaming.phase.light",
"dreaming.phase.off",
"dreaming.phase.rem",
"dreaming.phrases.alphabetizingSubconscious",
"dreaming.phrases.compostingContext",
"dreaming.phrases.connectingDots",
"dreaming.phrases.consolidatingMemories",
"dreaming.phrases.defragmentingMindPalace",
"dreaming.phrases.dreamingEmbeddings",
"dreaming.phrases.filingLooseThoughts",
"dreaming.phrases.forgettingNoise",
"dreaming.phrases.indexingDay",
"dreaming.phrases.nurturingInsights",
"dreaming.phrases.promotingHunches",
"dreaming.phrases.reorganizingAttic",
"dreaming.phrases.replayingConversations",
"dreaming.phrases.simmeringIdeas",
"dreaming.phrases.tidyingKnowledgeGraph",
"dreaming.phrases.weavingShortTerm",
"dreaming.phrases.whisperingVectorStore",
"dreaming.restartConfirmation.confirm",
"dreaming.restartConfirmation.failed",
"dreaming.restartConfirmation.restarting",
"dreaming.restartConfirmation.subtitle",
"dreaming.restartConfirmation.title",
"dreaming.restartConfirmation.warning",
"dreaming.scene.backfill",
"dreaming.scene.clearGrounded",
"dreaming.scene.dedupeDiary",
"dreaming.scene.repairCache",
"dreaming.scene.reset",
"dreaming.scene.working",
"dreaming.stats.grounded",
"dreaming.stats.phaseHits",
"dreaming.stats.promoted",
"dreaming.stats.shortTerm",
"dreaming.stats.signals",
"dreaming.status.active",
"dreaming.status.idle",
"dreaming.status.nextSweepPrefix",
"dreaming.status.promotedSuffix",
"dreaming.tabs.advanced",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"dreaming.trace.emptyGrounded",
"dreaming.trace.emptyPromoted",
"dreaming.trace.emptyShortTerm",
"dreaming.trace.emptySignals",
"dreaming.trace.grounded",
"dreaming.trace.groundedLed",
"dreaming.trace.promoted",
"dreaming.trace.shortTerm",
"dreaming.trace.signals",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.ar",
"languages.de",
"languages.en",
"languages.es",
"languages.fa",
"languages.fr",
"languages.id",
"languages.it",
"languages.jaJP",
"languages.ko",
"languages.nl",
"languages.pl",
"languages.ptBR",
"languages.th",
"languages.tr",
"languages.uk",
"languages.vi",
"languages.zhCN",
"languages.zhTW",
"lazyView.errorSubtitle",
"lazyView.errorTitle",
"lazyView.loadingTitle",
"lazyView.retry",
"lazyView.unknownError",
"login.hidePassword",
"login.hideToken",
"login.passwordPlaceholder",
"login.showPassword",
"login.showToken",
"login.subtitle",
"login.togglePasswordVisibility",
"login.toggleTokenVisibility",
"nav.agent",
"nav.chat",
"nav.collapse",
"nav.control",
"nav.expand",
"nav.resize",
"nav.settings",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.connectHint",
"overview.access.hidePassword",
"overview.access.hideToken",
"overview.access.language",
"overview.access.password",
"overview.access.passwordPlaceholder",
"overview.access.sessionKey",
"overview.access.showPassword",
"overview.access.showToken",
"overview.access.subtitle",
"overview.access.title",
"overview.access.togglePasswordVisibility",
"overview.access.toggleTokenVisibility",
"overview.access.token",
"overview.access.trustedProxy",
"overview.access.wsUrl",
"overview.attention.title",
"overview.auth.failed",
"overview.auth.required",
"overview.cards.cost",
"overview.cards.modelAuth",
"overview.cards.modelAuthAttentionExpiredDesc",
"overview.cards.modelAuthAttentionExpiredTitle",
"overview.cards.modelAuthAttentionExpiringEntry",
"overview.cards.modelAuthAttentionExpiringTitle",
"overview.cards.modelAuthExpired",
"overview.cards.modelAuthExpiresIn",
"overview.cards.modelAuthExpiring",
"overview.cards.modelAuthOk",
"overview.cards.modelAuthProviders",
"overview.cards.modelAuthUsageLeft",
"overview.cards.recentSessions",
"overview.cards.skills",
"overview.connection.authDocsLink",
"overview.connection.authDocsTitle",
"overview.connection.copyCommand",
"overview.connection.copyCommandAria",
"overview.connection.docsHint",
"overview.connection.docsLink",
"overview.connection.insecureHttpDocsLink",
"overview.connection.insecureHttpDocsTitle",
"overview.connection.step1",
"overview.connection.step2",
"overview.connection.step3",
"overview.connection.step4",
"overview.connection.tailscaleDocsLink",
"overview.connection.tailscaleDocsTitle",
"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.docsLink",
"overview.pairing.docsTitle",
"overview.pairing.hint",
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.mobileHint",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle",
"overview.palette.categories.navigation",
"overview.palette.categories.search",
"overview.palette.categories.skills",
"overview.palette.descriptions.debugMode",
"overview.palette.descriptions.shellCommand",
"overview.palette.footer.close",
"overview.palette.footer.navigate",
"overview.palette.footer.select",
"overview.palette.items.agents",
"overview.palette.items.debugMode",
"overview.palette.items.overview",
"overview.palette.items.scheduled",
"overview.palette.items.sessions",
"overview.palette.items.settings",
"overview.palette.items.shellCommand",
"overview.palette.items.skills",
"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-29T14:18:04.097Z",
"locale": "fa",
"model": "",
"provider": "",
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 0,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:11:54.218Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:57.193Z",
"locale": "fr",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:12:51.726Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:08:05.845Z",
"locale": "id",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -0,0 +1,780 @@
{
"fallbackKeys": [
"agentTools.builtIn",
"agentTools.channel",
"agentTools.channelSource",
"agentTools.connected",
"agentTools.connectedSource",
"channels.gatewayUrlConfirmation.subtitle",
"channels.gatewayUrlConfirmation.title",
"channels.gatewayUrlConfirmation.warning",
"channels.generic.subtitle",
"channels.health.noSnapshotYet",
"channels.health.subtitle",
"channels.health.title",
"channels.nostr.about",
"channels.nostr.account",
"channels.nostr.advanced",
"channels.nostr.avatarHelp",
"channels.nostr.avatarUrl",
"channels.nostr.bannerHelp",
"channels.nostr.bannerUrl",
"channels.nostr.bio",
"channels.nostr.bioHelp",
"channels.nostr.bioPlaceholder",
"channels.nostr.displayName",
"channels.nostr.displayNameHelp",
"channels.nostr.editProfile",
"channels.nostr.lightningAddress",
"channels.nostr.lightningHelp",
"channels.nostr.name",
"channels.nostr.nip05Help",
"channels.nostr.nip05Identifier",
"channels.nostr.noProfile",
"channels.nostr.noProfileHint",
"channels.nostr.profile",
"channels.nostr.profilePicture",
"channels.nostr.profilePicturePreview",
"channels.nostr.username",
"channels.nostr.usernameHelp",
"channels.nostr.website",
"channels.nostr.websiteHelp",
"chat.disconnected",
"chat.focusToggle",
"chat.hideCronSessions",
"chat.onboardingDisabled",
"chat.refreshTitle",
"chat.showCronSessions",
"chat.showCronSessionsHidden",
"chat.thinkingToggle",
"chat.toolCallsToggle",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connect",
"common.connected",
"common.credential",
"common.disabled",
"common.docs",
"common.enabled",
"common.health",
"common.hideAdvanced",
"common.importFromRelays",
"common.importing",
"common.lastConnect",
"common.lastInbound",
"common.lastMessage",
"common.lastProbe",
"common.lastStart",
"common.linked",
"common.loadApprovals",
"common.loadConfig",
"common.loading",
"common.logout",
"common.mode",
"common.na",
"common.no",
"common.offline",
"common.ok",
"common.online",
"common.probe",
"common.probeFailed",
"common.probeOk",
"common.publicKey",
"common.refresh",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.resources",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.search",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.theme",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"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",
"dreaming.advanced.description",
"dreaming.advanced.emptyGrounded",
"dreaming.advanced.emptyPromoted",
"dreaming.advanced.emptyShortTerm",
"dreaming.advanced.eyebrow",
"dreaming.advanced.originDailyLog",
"dreaming.advanced.originLive",
"dreaming.advanced.originMixed",
"dreaming.advanced.promotedDescription",
"dreaming.advanced.promotedTitle",
"dreaming.advanced.shortTermDescription",
"dreaming.advanced.shortTermTitle",
"dreaming.advanced.sortRecent",
"dreaming.advanced.sortSignals",
"dreaming.advanced.stagedDescription",
"dreaming.advanced.stagedTitle",
"dreaming.advanced.summaryFromDailyLog",
"dreaming.advanced.summaryPromotedToday",
"dreaming.advanced.summaryWaiting",
"dreaming.advanced.title",
"dreaming.advanced.updatedPrefix",
"dreaming.diary.newer",
"dreaming.diary.noDreamsHint",
"dreaming.diary.noDreamsYet",
"dreaming.diary.older",
"dreaming.diary.reload",
"dreaming.diary.reloading",
"dreaming.diary.title",
"dreaming.diary.waitingHint",
"dreaming.diary.waitingTitle",
"dreaming.header.off",
"dreaming.header.on",
"dreaming.header.refresh",
"dreaming.header.refreshing",
"dreaming.phase.deep",
"dreaming.phase.light",
"dreaming.phase.off",
"dreaming.phase.rem",
"dreaming.phrases.alphabetizingSubconscious",
"dreaming.phrases.compostingContext",
"dreaming.phrases.connectingDots",
"dreaming.phrases.consolidatingMemories",
"dreaming.phrases.defragmentingMindPalace",
"dreaming.phrases.dreamingEmbeddings",
"dreaming.phrases.filingLooseThoughts",
"dreaming.phrases.forgettingNoise",
"dreaming.phrases.indexingDay",
"dreaming.phrases.nurturingInsights",
"dreaming.phrases.promotingHunches",
"dreaming.phrases.reorganizingAttic",
"dreaming.phrases.replayingConversations",
"dreaming.phrases.simmeringIdeas",
"dreaming.phrases.tidyingKnowledgeGraph",
"dreaming.phrases.weavingShortTerm",
"dreaming.phrases.whisperingVectorStore",
"dreaming.restartConfirmation.confirm",
"dreaming.restartConfirmation.failed",
"dreaming.restartConfirmation.restarting",
"dreaming.restartConfirmation.subtitle",
"dreaming.restartConfirmation.title",
"dreaming.restartConfirmation.warning",
"dreaming.scene.backfill",
"dreaming.scene.clearGrounded",
"dreaming.scene.dedupeDiary",
"dreaming.scene.repairCache",
"dreaming.scene.reset",
"dreaming.scene.working",
"dreaming.stats.grounded",
"dreaming.stats.phaseHits",
"dreaming.stats.promoted",
"dreaming.stats.shortTerm",
"dreaming.stats.signals",
"dreaming.status.active",
"dreaming.status.idle",
"dreaming.status.nextSweepPrefix",
"dreaming.status.promotedSuffix",
"dreaming.tabs.advanced",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"dreaming.trace.emptyGrounded",
"dreaming.trace.emptyPromoted",
"dreaming.trace.emptyShortTerm",
"dreaming.trace.emptySignals",
"dreaming.trace.grounded",
"dreaming.trace.groundedLed",
"dreaming.trace.promoted",
"dreaming.trace.shortTerm",
"dreaming.trace.signals",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.ar",
"languages.de",
"languages.en",
"languages.es",
"languages.fa",
"languages.fr",
"languages.id",
"languages.it",
"languages.jaJP",
"languages.ko",
"languages.nl",
"languages.pl",
"languages.ptBR",
"languages.th",
"languages.tr",
"languages.uk",
"languages.vi",
"languages.zhCN",
"languages.zhTW",
"lazyView.errorSubtitle",
"lazyView.errorTitle",
"lazyView.loadingTitle",
"lazyView.retry",
"lazyView.unknownError",
"login.hidePassword",
"login.hideToken",
"login.passwordPlaceholder",
"login.showPassword",
"login.showToken",
"login.subtitle",
"login.togglePasswordVisibility",
"login.toggleTokenVisibility",
"nav.agent",
"nav.chat",
"nav.collapse",
"nav.control",
"nav.expand",
"nav.resize",
"nav.settings",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.connectHint",
"overview.access.hidePassword",
"overview.access.hideToken",
"overview.access.language",
"overview.access.password",
"overview.access.passwordPlaceholder",
"overview.access.sessionKey",
"overview.access.showPassword",
"overview.access.showToken",
"overview.access.subtitle",
"overview.access.title",
"overview.access.togglePasswordVisibility",
"overview.access.toggleTokenVisibility",
"overview.access.token",
"overview.access.trustedProxy",
"overview.access.wsUrl",
"overview.attention.title",
"overview.auth.failed",
"overview.auth.required",
"overview.cards.cost",
"overview.cards.modelAuth",
"overview.cards.modelAuthAttentionExpiredDesc",
"overview.cards.modelAuthAttentionExpiredTitle",
"overview.cards.modelAuthAttentionExpiringEntry",
"overview.cards.modelAuthAttentionExpiringTitle",
"overview.cards.modelAuthExpired",
"overview.cards.modelAuthExpiresIn",
"overview.cards.modelAuthExpiring",
"overview.cards.modelAuthOk",
"overview.cards.modelAuthProviders",
"overview.cards.modelAuthUsageLeft",
"overview.cards.recentSessions",
"overview.cards.skills",
"overview.connection.authDocsLink",
"overview.connection.authDocsTitle",
"overview.connection.copyCommand",
"overview.connection.copyCommandAria",
"overview.connection.docsHint",
"overview.connection.docsLink",
"overview.connection.insecureHttpDocsLink",
"overview.connection.insecureHttpDocsTitle",
"overview.connection.step1",
"overview.connection.step2",
"overview.connection.step3",
"overview.connection.step4",
"overview.connection.tailscaleDocsLink",
"overview.connection.tailscaleDocsTitle",
"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.docsLink",
"overview.pairing.docsTitle",
"overview.pairing.hint",
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.mobileHint",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle",
"overview.palette.categories.navigation",
"overview.palette.categories.search",
"overview.palette.categories.skills",
"overview.palette.descriptions.debugMode",
"overview.palette.descriptions.shellCommand",
"overview.palette.footer.close",
"overview.palette.footer.navigate",
"overview.palette.footer.select",
"overview.palette.items.agents",
"overview.palette.items.debugMode",
"overview.palette.items.overview",
"overview.palette.items.scheduled",
"overview.palette.items.sessions",
"overview.palette.items.settings",
"overview.palette.items.shellCommand",
"overview.palette.items.skills",
"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-29T13:53:45.227Z",
"locale": "it",
"model": "",
"provider": "",
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 0,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:11:44.551Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:52.933Z",
"locale": "ja-JP",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:11:49.092Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:54.414Z",
"locale": "ko",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -0,0 +1,780 @@
{
"fallbackKeys": [
"agentTools.builtIn",
"agentTools.channel",
"agentTools.channelSource",
"agentTools.connected",
"agentTools.connectedSource",
"channels.gatewayUrlConfirmation.subtitle",
"channels.gatewayUrlConfirmation.title",
"channels.gatewayUrlConfirmation.warning",
"channels.generic.subtitle",
"channels.health.noSnapshotYet",
"channels.health.subtitle",
"channels.health.title",
"channels.nostr.about",
"channels.nostr.account",
"channels.nostr.advanced",
"channels.nostr.avatarHelp",
"channels.nostr.avatarUrl",
"channels.nostr.bannerHelp",
"channels.nostr.bannerUrl",
"channels.nostr.bio",
"channels.nostr.bioHelp",
"channels.nostr.bioPlaceholder",
"channels.nostr.displayName",
"channels.nostr.displayNameHelp",
"channels.nostr.editProfile",
"channels.nostr.lightningAddress",
"channels.nostr.lightningHelp",
"channels.nostr.name",
"channels.nostr.nip05Help",
"channels.nostr.nip05Identifier",
"channels.nostr.noProfile",
"channels.nostr.noProfileHint",
"channels.nostr.profile",
"channels.nostr.profilePicture",
"channels.nostr.profilePicturePreview",
"channels.nostr.username",
"channels.nostr.usernameHelp",
"channels.nostr.website",
"channels.nostr.websiteHelp",
"chat.disconnected",
"chat.focusToggle",
"chat.hideCronSessions",
"chat.onboardingDisabled",
"chat.refreshTitle",
"chat.showCronSessions",
"chat.showCronSessionsHidden",
"chat.thinkingToggle",
"chat.toolCallsToggle",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connect",
"common.connected",
"common.credential",
"common.disabled",
"common.docs",
"common.enabled",
"common.health",
"common.hideAdvanced",
"common.importFromRelays",
"common.importing",
"common.lastConnect",
"common.lastInbound",
"common.lastMessage",
"common.lastProbe",
"common.lastStart",
"common.linked",
"common.loadApprovals",
"common.loadConfig",
"common.loading",
"common.logout",
"common.mode",
"common.na",
"common.no",
"common.offline",
"common.ok",
"common.online",
"common.probe",
"common.probeFailed",
"common.probeOk",
"common.publicKey",
"common.refresh",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.resources",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.search",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.theme",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"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",
"dreaming.advanced.description",
"dreaming.advanced.emptyGrounded",
"dreaming.advanced.emptyPromoted",
"dreaming.advanced.emptyShortTerm",
"dreaming.advanced.eyebrow",
"dreaming.advanced.originDailyLog",
"dreaming.advanced.originLive",
"dreaming.advanced.originMixed",
"dreaming.advanced.promotedDescription",
"dreaming.advanced.promotedTitle",
"dreaming.advanced.shortTermDescription",
"dreaming.advanced.shortTermTitle",
"dreaming.advanced.sortRecent",
"dreaming.advanced.sortSignals",
"dreaming.advanced.stagedDescription",
"dreaming.advanced.stagedTitle",
"dreaming.advanced.summaryFromDailyLog",
"dreaming.advanced.summaryPromotedToday",
"dreaming.advanced.summaryWaiting",
"dreaming.advanced.title",
"dreaming.advanced.updatedPrefix",
"dreaming.diary.newer",
"dreaming.diary.noDreamsHint",
"dreaming.diary.noDreamsYet",
"dreaming.diary.older",
"dreaming.diary.reload",
"dreaming.diary.reloading",
"dreaming.diary.title",
"dreaming.diary.waitingHint",
"dreaming.diary.waitingTitle",
"dreaming.header.off",
"dreaming.header.on",
"dreaming.header.refresh",
"dreaming.header.refreshing",
"dreaming.phase.deep",
"dreaming.phase.light",
"dreaming.phase.off",
"dreaming.phase.rem",
"dreaming.phrases.alphabetizingSubconscious",
"dreaming.phrases.compostingContext",
"dreaming.phrases.connectingDots",
"dreaming.phrases.consolidatingMemories",
"dreaming.phrases.defragmentingMindPalace",
"dreaming.phrases.dreamingEmbeddings",
"dreaming.phrases.filingLooseThoughts",
"dreaming.phrases.forgettingNoise",
"dreaming.phrases.indexingDay",
"dreaming.phrases.nurturingInsights",
"dreaming.phrases.promotingHunches",
"dreaming.phrases.reorganizingAttic",
"dreaming.phrases.replayingConversations",
"dreaming.phrases.simmeringIdeas",
"dreaming.phrases.tidyingKnowledgeGraph",
"dreaming.phrases.weavingShortTerm",
"dreaming.phrases.whisperingVectorStore",
"dreaming.restartConfirmation.confirm",
"dreaming.restartConfirmation.failed",
"dreaming.restartConfirmation.restarting",
"dreaming.restartConfirmation.subtitle",
"dreaming.restartConfirmation.title",
"dreaming.restartConfirmation.warning",
"dreaming.scene.backfill",
"dreaming.scene.clearGrounded",
"dreaming.scene.dedupeDiary",
"dreaming.scene.repairCache",
"dreaming.scene.reset",
"dreaming.scene.working",
"dreaming.stats.grounded",
"dreaming.stats.phaseHits",
"dreaming.stats.promoted",
"dreaming.stats.shortTerm",
"dreaming.stats.signals",
"dreaming.status.active",
"dreaming.status.idle",
"dreaming.status.nextSweepPrefix",
"dreaming.status.promotedSuffix",
"dreaming.tabs.advanced",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"dreaming.trace.emptyGrounded",
"dreaming.trace.emptyPromoted",
"dreaming.trace.emptyShortTerm",
"dreaming.trace.emptySignals",
"dreaming.trace.grounded",
"dreaming.trace.groundedLed",
"dreaming.trace.promoted",
"dreaming.trace.shortTerm",
"dreaming.trace.signals",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.ar",
"languages.de",
"languages.en",
"languages.es",
"languages.fa",
"languages.fr",
"languages.id",
"languages.it",
"languages.jaJP",
"languages.ko",
"languages.nl",
"languages.pl",
"languages.ptBR",
"languages.th",
"languages.tr",
"languages.uk",
"languages.vi",
"languages.zhCN",
"languages.zhTW",
"lazyView.errorSubtitle",
"lazyView.errorTitle",
"lazyView.loadingTitle",
"lazyView.retry",
"lazyView.unknownError",
"login.hidePassword",
"login.hideToken",
"login.passwordPlaceholder",
"login.showPassword",
"login.showToken",
"login.subtitle",
"login.togglePasswordVisibility",
"login.toggleTokenVisibility",
"nav.agent",
"nav.chat",
"nav.collapse",
"nav.control",
"nav.expand",
"nav.resize",
"nav.settings",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.connectHint",
"overview.access.hidePassword",
"overview.access.hideToken",
"overview.access.language",
"overview.access.password",
"overview.access.passwordPlaceholder",
"overview.access.sessionKey",
"overview.access.showPassword",
"overview.access.showToken",
"overview.access.subtitle",
"overview.access.title",
"overview.access.togglePasswordVisibility",
"overview.access.toggleTokenVisibility",
"overview.access.token",
"overview.access.trustedProxy",
"overview.access.wsUrl",
"overview.attention.title",
"overview.auth.failed",
"overview.auth.required",
"overview.cards.cost",
"overview.cards.modelAuth",
"overview.cards.modelAuthAttentionExpiredDesc",
"overview.cards.modelAuthAttentionExpiredTitle",
"overview.cards.modelAuthAttentionExpiringEntry",
"overview.cards.modelAuthAttentionExpiringTitle",
"overview.cards.modelAuthExpired",
"overview.cards.modelAuthExpiresIn",
"overview.cards.modelAuthExpiring",
"overview.cards.modelAuthOk",
"overview.cards.modelAuthProviders",
"overview.cards.modelAuthUsageLeft",
"overview.cards.recentSessions",
"overview.cards.skills",
"overview.connection.authDocsLink",
"overview.connection.authDocsTitle",
"overview.connection.copyCommand",
"overview.connection.copyCommandAria",
"overview.connection.docsHint",
"overview.connection.docsLink",
"overview.connection.insecureHttpDocsLink",
"overview.connection.insecureHttpDocsTitle",
"overview.connection.step1",
"overview.connection.step2",
"overview.connection.step3",
"overview.connection.step4",
"overview.connection.tailscaleDocsLink",
"overview.connection.tailscaleDocsTitle",
"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.docsLink",
"overview.pairing.docsTitle",
"overview.pairing.hint",
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.mobileHint",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle",
"overview.palette.categories.navigation",
"overview.palette.categories.search",
"overview.palette.categories.skills",
"overview.palette.descriptions.debugMode",
"overview.palette.descriptions.shellCommand",
"overview.palette.footer.close",
"overview.palette.footer.navigate",
"overview.palette.footer.select",
"overview.palette.items.agents",
"overview.palette.items.debugMode",
"overview.palette.items.overview",
"overview.palette.items.scheduled",
"overview.palette.items.sessions",
"overview.palette.items.settings",
"overview.palette.items.shellCommand",
"overview.palette.items.skills",
"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-29T14:17:54.734Z",
"locale": "nl",
"model": "",
"provider": "",
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 0,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:12:49.607Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:08:07.501Z",
"locale": "pl",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:10:49.972Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:48.486Z",
"locale": "pt-BR",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:13:28.699Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:08:09.056Z",
"locale": "th",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:12:31.141Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:08:02.822Z",
"locale": "tr",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:12:37.957Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:08:04.234Z",
"locale": "uk",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -0,0 +1,780 @@
{
"fallbackKeys": [
"agentTools.builtIn",
"agentTools.channel",
"agentTools.channelSource",
"agentTools.connected",
"agentTools.connectedSource",
"channels.gatewayUrlConfirmation.subtitle",
"channels.gatewayUrlConfirmation.title",
"channels.gatewayUrlConfirmation.warning",
"channels.generic.subtitle",
"channels.health.noSnapshotYet",
"channels.health.subtitle",
"channels.health.title",
"channels.nostr.about",
"channels.nostr.account",
"channels.nostr.advanced",
"channels.nostr.avatarHelp",
"channels.nostr.avatarUrl",
"channels.nostr.bannerHelp",
"channels.nostr.bannerUrl",
"channels.nostr.bio",
"channels.nostr.bioHelp",
"channels.nostr.bioPlaceholder",
"channels.nostr.displayName",
"channels.nostr.displayNameHelp",
"channels.nostr.editProfile",
"channels.nostr.lightningAddress",
"channels.nostr.lightningHelp",
"channels.nostr.name",
"channels.nostr.nip05Help",
"channels.nostr.nip05Identifier",
"channels.nostr.noProfile",
"channels.nostr.noProfileHint",
"channels.nostr.profile",
"channels.nostr.profilePicture",
"channels.nostr.profilePicturePreview",
"channels.nostr.username",
"channels.nostr.usernameHelp",
"channels.nostr.website",
"channels.nostr.websiteHelp",
"chat.disconnected",
"chat.focusToggle",
"chat.hideCronSessions",
"chat.onboardingDisabled",
"chat.refreshTitle",
"chat.showCronSessions",
"chat.showCronSessionsHidden",
"chat.thinkingToggle",
"chat.toolCallsToggle",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connect",
"common.connected",
"common.credential",
"common.disabled",
"common.docs",
"common.enabled",
"common.health",
"common.hideAdvanced",
"common.importFromRelays",
"common.importing",
"common.lastConnect",
"common.lastInbound",
"common.lastMessage",
"common.lastProbe",
"common.lastStart",
"common.linked",
"common.loadApprovals",
"common.loadConfig",
"common.loading",
"common.logout",
"common.mode",
"common.na",
"common.no",
"common.offline",
"common.ok",
"common.online",
"common.probe",
"common.probeFailed",
"common.probeOk",
"common.publicKey",
"common.refresh",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.resources",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.search",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.theme",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"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",
"dreaming.advanced.description",
"dreaming.advanced.emptyGrounded",
"dreaming.advanced.emptyPromoted",
"dreaming.advanced.emptyShortTerm",
"dreaming.advanced.eyebrow",
"dreaming.advanced.originDailyLog",
"dreaming.advanced.originLive",
"dreaming.advanced.originMixed",
"dreaming.advanced.promotedDescription",
"dreaming.advanced.promotedTitle",
"dreaming.advanced.shortTermDescription",
"dreaming.advanced.shortTermTitle",
"dreaming.advanced.sortRecent",
"dreaming.advanced.sortSignals",
"dreaming.advanced.stagedDescription",
"dreaming.advanced.stagedTitle",
"dreaming.advanced.summaryFromDailyLog",
"dreaming.advanced.summaryPromotedToday",
"dreaming.advanced.summaryWaiting",
"dreaming.advanced.title",
"dreaming.advanced.updatedPrefix",
"dreaming.diary.newer",
"dreaming.diary.noDreamsHint",
"dreaming.diary.noDreamsYet",
"dreaming.diary.older",
"dreaming.diary.reload",
"dreaming.diary.reloading",
"dreaming.diary.title",
"dreaming.diary.waitingHint",
"dreaming.diary.waitingTitle",
"dreaming.header.off",
"dreaming.header.on",
"dreaming.header.refresh",
"dreaming.header.refreshing",
"dreaming.phase.deep",
"dreaming.phase.light",
"dreaming.phase.off",
"dreaming.phase.rem",
"dreaming.phrases.alphabetizingSubconscious",
"dreaming.phrases.compostingContext",
"dreaming.phrases.connectingDots",
"dreaming.phrases.consolidatingMemories",
"dreaming.phrases.defragmentingMindPalace",
"dreaming.phrases.dreamingEmbeddings",
"dreaming.phrases.filingLooseThoughts",
"dreaming.phrases.forgettingNoise",
"dreaming.phrases.indexingDay",
"dreaming.phrases.nurturingInsights",
"dreaming.phrases.promotingHunches",
"dreaming.phrases.reorganizingAttic",
"dreaming.phrases.replayingConversations",
"dreaming.phrases.simmeringIdeas",
"dreaming.phrases.tidyingKnowledgeGraph",
"dreaming.phrases.weavingShortTerm",
"dreaming.phrases.whisperingVectorStore",
"dreaming.restartConfirmation.confirm",
"dreaming.restartConfirmation.failed",
"dreaming.restartConfirmation.restarting",
"dreaming.restartConfirmation.subtitle",
"dreaming.restartConfirmation.title",
"dreaming.restartConfirmation.warning",
"dreaming.scene.backfill",
"dreaming.scene.clearGrounded",
"dreaming.scene.dedupeDiary",
"dreaming.scene.repairCache",
"dreaming.scene.reset",
"dreaming.scene.working",
"dreaming.stats.grounded",
"dreaming.stats.phaseHits",
"dreaming.stats.promoted",
"dreaming.stats.shortTerm",
"dreaming.stats.signals",
"dreaming.status.active",
"dreaming.status.idle",
"dreaming.status.nextSweepPrefix",
"dreaming.status.promotedSuffix",
"dreaming.tabs.advanced",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"dreaming.trace.emptyGrounded",
"dreaming.trace.emptyPromoted",
"dreaming.trace.emptyShortTerm",
"dreaming.trace.emptySignals",
"dreaming.trace.grounded",
"dreaming.trace.groundedLed",
"dreaming.trace.promoted",
"dreaming.trace.shortTerm",
"dreaming.trace.signals",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.ar",
"languages.de",
"languages.en",
"languages.es",
"languages.fa",
"languages.fr",
"languages.id",
"languages.it",
"languages.jaJP",
"languages.ko",
"languages.nl",
"languages.pl",
"languages.ptBR",
"languages.th",
"languages.tr",
"languages.uk",
"languages.vi",
"languages.zhCN",
"languages.zhTW",
"lazyView.errorSubtitle",
"lazyView.errorTitle",
"lazyView.loadingTitle",
"lazyView.retry",
"lazyView.unknownError",
"login.hidePassword",
"login.hideToken",
"login.passwordPlaceholder",
"login.showPassword",
"login.showToken",
"login.subtitle",
"login.togglePasswordVisibility",
"login.toggleTokenVisibility",
"nav.agent",
"nav.chat",
"nav.collapse",
"nav.control",
"nav.expand",
"nav.resize",
"nav.settings",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.connectHint",
"overview.access.hidePassword",
"overview.access.hideToken",
"overview.access.language",
"overview.access.password",
"overview.access.passwordPlaceholder",
"overview.access.sessionKey",
"overview.access.showPassword",
"overview.access.showToken",
"overview.access.subtitle",
"overview.access.title",
"overview.access.togglePasswordVisibility",
"overview.access.toggleTokenVisibility",
"overview.access.token",
"overview.access.trustedProxy",
"overview.access.wsUrl",
"overview.attention.title",
"overview.auth.failed",
"overview.auth.required",
"overview.cards.cost",
"overview.cards.modelAuth",
"overview.cards.modelAuthAttentionExpiredDesc",
"overview.cards.modelAuthAttentionExpiredTitle",
"overview.cards.modelAuthAttentionExpiringEntry",
"overview.cards.modelAuthAttentionExpiringTitle",
"overview.cards.modelAuthExpired",
"overview.cards.modelAuthExpiresIn",
"overview.cards.modelAuthExpiring",
"overview.cards.modelAuthOk",
"overview.cards.modelAuthProviders",
"overview.cards.modelAuthUsageLeft",
"overview.cards.recentSessions",
"overview.cards.skills",
"overview.connection.authDocsLink",
"overview.connection.authDocsTitle",
"overview.connection.copyCommand",
"overview.connection.copyCommandAria",
"overview.connection.docsHint",
"overview.connection.docsLink",
"overview.connection.insecureHttpDocsLink",
"overview.connection.insecureHttpDocsTitle",
"overview.connection.step1",
"overview.connection.step2",
"overview.connection.step3",
"overview.connection.step4",
"overview.connection.tailscaleDocsLink",
"overview.connection.tailscaleDocsTitle",
"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.docsLink",
"overview.pairing.docsTitle",
"overview.pairing.hint",
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.mobileHint",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle",
"overview.palette.categories.navigation",
"overview.palette.categories.search",
"overview.palette.categories.skills",
"overview.palette.descriptions.debugMode",
"overview.palette.descriptions.shellCommand",
"overview.palette.footer.close",
"overview.palette.footer.navigate",
"overview.palette.footer.select",
"overview.palette.items.agents",
"overview.palette.items.debugMode",
"overview.palette.items.overview",
"overview.palette.items.scheduled",
"overview.palette.items.sessions",
"overview.palette.items.settings",
"overview.palette.items.shellCommand",
"overview.palette.items.skills",
"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-29T14:00:04.888Z",
"locale": "vi",
"model": "",
"provider": "",
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 0,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:10:49.836Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:45.268Z",
"locale": "zh-CN",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-27T12:10:53.535Z",
"fallbackKeys": ["languages.ar", "languages.fa", "languages.it", "languages.nl", "languages.vi"],
"generatedAt": "2026-04-29T17:07:46.953Z",
"locale": "zh-TW",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "5e92fbfbb7e3026ea5f3a0835d933c9ce79369a85b1cf0628b1c86369f1c822d",
"totalKeys": 763,
"sourceHash": "e2d2b3df6a5e614401e887d4c49d24c633ac3435956040c48672ec8b289abdd4",
"totalKeys": 768,
"translatedKeys": 763,
"workflow": 1
}

View File

@@ -19,11 +19,16 @@ const LAZY_LOCALES: readonly LazyLocale[] = [
"ja-JP",
"ko",
"fr",
"ar",
"it",
"tr",
"uk",
"id",
"pl",
"th",
"vi",
"nl",
"fa",
];
const LAZY_LOCALE_REGISTRY: Record<LazyLocale, LazyLocaleRegistration> = {
@@ -59,6 +64,14 @@ const LAZY_LOCALE_REGISTRY: Record<LazyLocale, LazyLocaleRegistration> = {
exportName: "fr",
loader: () => import("../locales/fr.ts"),
},
ar: {
exportName: "ar",
loader: () => import("../locales/ar.ts"),
},
it: {
exportName: "it",
loader: () => import("../locales/it.ts"),
},
tr: {
exportName: "tr",
loader: () => import("../locales/tr.ts"),
@@ -79,6 +92,18 @@ const LAZY_LOCALE_REGISTRY: Record<LazyLocale, LazyLocaleRegistration> = {
exportName: "th",
loader: () => import("../locales/th.ts"),
},
vi: {
exportName: "vi",
loader: () => import("../locales/vi.ts"),
},
nl: {
exportName: "nl",
loader: () => import("../locales/nl.ts"),
},
fa: {
exportName: "fa",
loader: () => import("../locales/fa.ts"),
},
};
export const SUPPORTED_LOCALES: ReadonlyArray<Locale> = [DEFAULT_LOCALE, ...LAZY_LOCALES];
@@ -113,6 +138,12 @@ export function resolveNavigatorLocale(navLang: string): Locale {
if (navLang.startsWith("fr")) {
return "fr";
}
if (navLang.startsWith("ar")) {
return "ar";
}
if (navLang.startsWith("it")) {
return "it";
}
if (navLang.startsWith("tr")) {
return "tr";
}
@@ -128,6 +159,15 @@ export function resolveNavigatorLocale(navLang: string): Locale {
if (navLang.startsWith("th")) {
return "th";
}
if (navLang.startsWith("vi")) {
return "vi";
}
if (navLang.startsWith("nl")) {
return "nl";
}
if (navLang.startsWith("fa")) {
return "fa";
}
return DEFAULT_LOCALE;
}

View File

@@ -10,11 +10,16 @@ export type Locale =
| "ja-JP"
| "ko"
| "fr"
| "ar"
| "it"
| "tr"
| "uk"
| "id"
| "pl"
| "th";
| "th"
| "vi"
| "nl"
| "fa";
export interface I18nConfig {
locale: Locale;

936
ui/src/i18n/locales/ar.ts Normal file
View File

@@ -0,0 +1,936 @@
import type { TranslationMap } from "../lib/types.ts";
// Generated by scripts/control-ui-i18n.ts.
export const ar: TranslationMap = {
common: {
health: "Health",
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Connect",
connected: "Connected",
refresh: "Refresh",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Enabled",
disabled: "Disabled",
na: "n/a",
configured: "Configured",
running: "Running",
linked: "Linked",
mode: "Mode",
baseUrl: "Base URL",
lastStart: "Last start",
lastProbe: "Last probe",
lastInbound: "Last inbound",
lastConnect: "Last connect",
lastMessage: "Last message",
authAge: "Auth age",
credential: "Credential",
audience: "Audience",
publicKey: "Public Key",
probeOk: "Probe ok",
probeFailed: "Probe failed",
reloadConfig: "Reload Config",
loadConfig: "Load config",
loadApprovals: "Load approvals",
settingsSections: "Settings sections",
version: "Version",
docs: "Docs",
theme: "Theme",
resources: "Resources",
search: "Search",
save: "Save",
saving: "Saving…",
saveAndPublish: "Save & Publish",
importing: "Importing…",
importFromRelays: "Import from Relays",
showAdvanced: "Show Advanced",
hideAdvanced: "Hide Advanced",
unsavedChanges: "You have unsaved changes",
secondsAgo: "{count}s ago",
working: "Working…",
showQr: "Show QR",
relink: "Relink",
waitForScan: "Wait for scan",
logout: "Logout",
},
channels: {
health: {
title: "Channel health",
subtitle: "Channel status snapshots from the gateway.",
noSnapshotYet: "No snapshot yet.",
},
generic: {
subtitle: "Channel status and configuration.",
},
gatewayUrlConfirmation: {
title: "Change Gateway URL",
subtitle: "This will reconnect to a different gateway server",
warning: "Only confirm if you trust this URL. Malicious URLs can compromise your system.",
},
nostr: {
profile: "Profile",
editProfile: "Edit Profile",
profilePicture: "Profile picture",
noProfile: "No profile set.",
noProfileHint: 'Click "Edit Profile" to add your name, bio, and avatar.',
name: "Name",
displayName: "Display Name",
about: "About",
advanced: "Advanced",
profilePicturePreview: "Profile picture preview",
account: "Account",
username: "Username",
usernameHelp: "Short username (e.g., satoshi)",
bio: "Bio",
bioPlaceholder: "Tell people about yourself...",
bioHelp: "A brief bio or description",
displayNameHelp: "Your full display name",
avatarUrl: "Avatar URL",
avatarHelp: "HTTPS URL to your profile picture",
bannerUrl: "Banner URL",
bannerHelp: "HTTPS URL to a banner image",
website: "Website",
websiteHelp: "Your personal website",
nip05Identifier: "NIP-05 Identifier",
nip05Help: "Verifiable identifier (e.g., you@domain.com)",
lightningAddress: "Lightning Address",
lightningHelp: "Lightning address for tips (LUD-16)",
},
},
lazyView: {
loadingTitle: "Loading panel",
errorTitle: "Panel failed to load",
errorSubtitle:
"Reload the page to load the latest Control UI bundle, or retry if the network request failed.",
retry: "Retry",
unknownError: "Unknown module load error.",
},
nodes: {
binding: {
loadConfigHint: "Load config to edit bindings.",
formModeHint: "Switch the Config tab to Form mode to edit bindings here.",
execNodeBinding: "Exec node binding",
execNodeBindingSubtitle: "Pin agents to a specific node when using exec host=node.",
defaultBinding: "Default binding",
defaultBindingHint: "Used when agents do not override a node binding.",
node: "Node",
},
},
instances: {
title: "Connected Instances",
subtitle: "Presence beacons from the gateway and clients.",
showHosts: "Show hosts and IPs",
hideHosts: "Hide hosts and IPs",
toggleHostVisibility: "Toggle host visibility",
noInstances: "No instances reported yet.",
lastInput: "Last input {time}",
reason: "Reason {reason}",
},
agentTools: {
connectedSource: "Connected: {id}",
connected: "Connected",
channelSource: "Channel: {id}",
channel: "Channel",
builtIn: "Built-in",
},
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: "Dreaming",
},
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 dreaming, consolidation, and reflection.",
},
overview: {
access: {
title: "Gateway Access",
subtitle: "Where the dashboard connects and how it authenticates.",
wsUrl: "WebSocket URL",
token: "Gateway Token",
password: "Password (not stored)",
passwordPlaceholder: "system or shared password",
sessionKey: "Default Session Key",
language: "Language",
connectHint: "Click Connect to apply connection changes.",
trustedProxy: "Authenticated via trusted proxy.",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
docsTitle: "Device pairing docs (opens in new tab)",
docsLink: "Docs: Device pairing",
},
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 →",
authDocsTitle: "Control UI auth docs (opens in new tab)",
authDocsLink: "Docs: Control UI auth",
tailscaleDocsTitle: "Tailscale Serve docs (opens in new tab)",
tailscaleDocsLink: "Docs: Tailscale Serve",
insecureHttpDocsTitle: "Insecure HTTP docs (opens in new tab)",
insecureHttpDocsLink: "Docs: Insecure HTTP",
copyCommand: "Copy command",
copyCommandAria: "Copy command: {command}",
},
cards: {
cost: "Cost",
skills: "Skills",
recentSessions: "Recent Sessions",
modelAuth: "Model Auth",
modelAuthOk: "{count} ok",
modelAuthExpired: "{count} expired",
modelAuthExpiring: "{count} expiring",
modelAuthProviders: "{count} providers",
modelAuthUsageLeft: "{pct}% left",
modelAuthExpiresIn: "expires {when}",
modelAuthAttentionExpiredTitle: "Model auth expired",
modelAuthAttentionExpiringTitle: "Model auth expiring soon",
modelAuthAttentionExpiredDesc: "{providers} — re-authenticate with openclaw models auth",
modelAuthAttentionExpiringEntry: "{provider} ({when})",
},
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",
categories: {
search: "Search",
navigation: "Navigation",
skills: "Skills",
},
items: {
overview: "Overview",
sessions: "Sessions",
scheduled: "Scheduled",
skills: "Skills",
settings: "Settings",
agents: "Agents",
shellCommand: "Shell Command",
debugMode: "Debug Mode",
},
descriptions: {
shellCommand: "Run shell",
debugMode: "Toggle debug",
},
footer: {
navigate: "navigate",
select: "select",
close: "close",
},
},
},
dreaming: {
tabs: {
scene: "Scene",
diary: "Diary",
advanced: "Advanced",
},
header: {
refresh: "Refresh",
refreshing: "Refreshing…",
on: "Dreaming On",
off: "Dreaming Off",
},
restartConfirmation: {
title: "Restart Gateway to Apply Change",
subtitle: "Changing Dreaming mode restarts the gateway.",
warning:
"This action will restart the Gateway and may temporarily interrupt chats, automations, and connected channels.",
confirm: "Confirm Restart",
restarting: "Restarting…",
failed: "Could not apply change. Check your connection and try again.",
},
status: {
active: "Dreaming Active",
idle: "Dreaming Idle",
promotedSuffix: "promoted",
nextSweepPrefix: "next sweep",
},
scene: {
backfill: "Backfill",
dedupeDiary: "Dedupe Diary",
reset: "Reset",
clearGrounded: "Clear Replayed",
repairCache: "Repair Dream Cache",
working: "Working…",
},
phase: {
light: "Light",
deep: "Deep",
rem: "Rem",
off: "off",
},
advanced: {
eyebrow: "Review",
title: "Daily Log Review",
description:
"Review what came from the daily log, what is waiting for promotion, and what was promoted recently.",
summaryFromDailyLog: "from daily log",
summaryWaiting: "waiting",
summaryPromotedToday: "promoted today",
stagedTitle: "From the Daily Log",
stagedDescription: "Replay candidates pulled from older daily log entries.",
shortTermTitle: "Waiting for Promotion",
shortTermDescription: "Current short-term candidates waiting to graduate into real memory.",
sortRecent: "Most recent",
sortSignals: "Strongest support",
originDailyLog: "replayed",
originLive: "live",
originMixed: "mixed",
promotedTitle: "Recent Promotions",
promotedDescription: "Items that already made it through promotion.",
emptyGrounded: "No staged grounded replay entries right now.",
emptyShortTerm: "No short-term entries to inspect.",
emptyPromoted: "No recent promotions to inspect.",
updatedPrefix: "updated",
},
stats: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
phaseHits: "Phase Hits",
},
trace: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
groundedLed: "grounded-led",
emptyShortTerm: "No active short-term items.",
emptyGrounded: "No staged grounded items.",
emptySignals: "No active signals.",
emptyPromoted: "Nothing promoted yet today.",
},
diary: {
title: "Dream Diary",
noDreamsYet: "No dreams yet",
noDreamsHint: "Dreams will appear here after the first dreaming cycle runs.",
waitingTitle: "The diary is waiting",
waitingHint: "Narrative entries will appear after the next dreaming cycle.",
older: "Older",
newer: "Newer",
reload: "Reload",
reloading: "Reloading…",
},
phrases: {
consolidatingMemories: "consolidating memories…",
tidyingKnowledgeGraph: "tidying the knowledge graph…",
replayingConversations: "replaying today's conversations…",
weavingShortTerm: "weaving short-term into long-term…",
defragmentingMindPalace: "defragmenting the mind palace…",
filingLooseThoughts: "filing away loose thoughts…",
connectingDots: "connecting distant dots…",
compostingContext: "composting old context windows…",
alphabetizingSubconscious: "alphabetizing the subconscious…",
promotingHunches: "promoting promising hunches…",
forgettingNoise: "forgetting what doesn't matter…",
dreamingEmbeddings: "dreaming in embeddings…",
reorganizingAttic: "reorganizing the memory attic…",
indexingDay: "softly indexing the day…",
nurturingInsights: "nurturing fledgling insights…",
simmeringIdeas: "simmering half-formed ideas…",
whisperingVectorStore: "whispering to the vector store…",
},
},
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 + cache write). 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",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turkish)",
uk: "Українська (Ukrainian)",
id: "Bahasa Indonesia (Indonesian)",
pl: "Polski (Polish)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
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.",
},
},
};

View File

@@ -722,11 +722,16 @@ export const de: TranslationMap = {
jaJP: "日本語 (Japanisch)",
ko: "한국어 (Koreanisch)",
fr: "Français (Französisch)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Türkisch)",
uk: "Українська (Ukrainisch)",
id: "Bahasa Indonesia (Indonesisch)",
pl: "Polski (Polnisch)",
th: "ไทย (Thailändisch)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -710,11 +710,16 @@ export const en: TranslationMap = {
jaJP: "日本語 (Japanese)",
ko: "한국어 (Korean)",
fr: "Français (French)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turkish)",
uk: "Українська (Ukrainian)",
id: "Bahasa Indonesia (Indonesian)",
pl: "Polski (Polish)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -721,11 +721,16 @@ export const es: TranslationMap = {
jaJP: "日本語 (japonés)",
ko: "한국어 (coreano)",
fr: "Français (francés)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (turco)",
uk: "Українська (ucraniano)",
id: "Bahasa Indonesia (indonesio)",
pl: "Polski (polaco)",
th: "ไทย (tailandés)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

936
ui/src/i18n/locales/fa.ts Normal file
View File

@@ -0,0 +1,936 @@
import type { TranslationMap } from "../lib/types.ts";
// Generated by scripts/control-ui-i18n.ts.
export const fa: TranslationMap = {
common: {
health: "Health",
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Connect",
connected: "Connected",
refresh: "Refresh",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Enabled",
disabled: "Disabled",
na: "n/a",
configured: "Configured",
running: "Running",
linked: "Linked",
mode: "Mode",
baseUrl: "Base URL",
lastStart: "Last start",
lastProbe: "Last probe",
lastInbound: "Last inbound",
lastConnect: "Last connect",
lastMessage: "Last message",
authAge: "Auth age",
credential: "Credential",
audience: "Audience",
publicKey: "Public Key",
probeOk: "Probe ok",
probeFailed: "Probe failed",
reloadConfig: "Reload Config",
loadConfig: "Load config",
loadApprovals: "Load approvals",
settingsSections: "Settings sections",
version: "Version",
docs: "Docs",
theme: "Theme",
resources: "Resources",
search: "Search",
save: "Save",
saving: "Saving…",
saveAndPublish: "Save & Publish",
importing: "Importing…",
importFromRelays: "Import from Relays",
showAdvanced: "Show Advanced",
hideAdvanced: "Hide Advanced",
unsavedChanges: "You have unsaved changes",
secondsAgo: "{count}s ago",
working: "Working…",
showQr: "Show QR",
relink: "Relink",
waitForScan: "Wait for scan",
logout: "Logout",
},
channels: {
health: {
title: "Channel health",
subtitle: "Channel status snapshots from the gateway.",
noSnapshotYet: "No snapshot yet.",
},
generic: {
subtitle: "Channel status and configuration.",
},
gatewayUrlConfirmation: {
title: "Change Gateway URL",
subtitle: "This will reconnect to a different gateway server",
warning: "Only confirm if you trust this URL. Malicious URLs can compromise your system.",
},
nostr: {
profile: "Profile",
editProfile: "Edit Profile",
profilePicture: "Profile picture",
noProfile: "No profile set.",
noProfileHint: 'Click "Edit Profile" to add your name, bio, and avatar.',
name: "Name",
displayName: "Display Name",
about: "About",
advanced: "Advanced",
profilePicturePreview: "Profile picture preview",
account: "Account",
username: "Username",
usernameHelp: "Short username (e.g., satoshi)",
bio: "Bio",
bioPlaceholder: "Tell people about yourself...",
bioHelp: "A brief bio or description",
displayNameHelp: "Your full display name",
avatarUrl: "Avatar URL",
avatarHelp: "HTTPS URL to your profile picture",
bannerUrl: "Banner URL",
bannerHelp: "HTTPS URL to a banner image",
website: "Website",
websiteHelp: "Your personal website",
nip05Identifier: "NIP-05 Identifier",
nip05Help: "Verifiable identifier (e.g., you@domain.com)",
lightningAddress: "Lightning Address",
lightningHelp: "Lightning address for tips (LUD-16)",
},
},
lazyView: {
loadingTitle: "Loading panel",
errorTitle: "Panel failed to load",
errorSubtitle:
"Reload the page to load the latest Control UI bundle, or retry if the network request failed.",
retry: "Retry",
unknownError: "Unknown module load error.",
},
nodes: {
binding: {
loadConfigHint: "Load config to edit bindings.",
formModeHint: "Switch the Config tab to Form mode to edit bindings here.",
execNodeBinding: "Exec node binding",
execNodeBindingSubtitle: "Pin agents to a specific node when using exec host=node.",
defaultBinding: "Default binding",
defaultBindingHint: "Used when agents do not override a node binding.",
node: "Node",
},
},
instances: {
title: "Connected Instances",
subtitle: "Presence beacons from the gateway and clients.",
showHosts: "Show hosts and IPs",
hideHosts: "Hide hosts and IPs",
toggleHostVisibility: "Toggle host visibility",
noInstances: "No instances reported yet.",
lastInput: "Last input {time}",
reason: "Reason {reason}",
},
agentTools: {
connectedSource: "Connected: {id}",
connected: "Connected",
channelSource: "Channel: {id}",
channel: "Channel",
builtIn: "Built-in",
},
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: "Dreaming",
},
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 dreaming, consolidation, and reflection.",
},
overview: {
access: {
title: "Gateway Access",
subtitle: "Where the dashboard connects and how it authenticates.",
wsUrl: "WebSocket URL",
token: "Gateway Token",
password: "Password (not stored)",
passwordPlaceholder: "system or shared password",
sessionKey: "Default Session Key",
language: "Language",
connectHint: "Click Connect to apply connection changes.",
trustedProxy: "Authenticated via trusted proxy.",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
docsTitle: "Device pairing docs (opens in new tab)",
docsLink: "Docs: Device pairing",
},
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 →",
authDocsTitle: "Control UI auth docs (opens in new tab)",
authDocsLink: "Docs: Control UI auth",
tailscaleDocsTitle: "Tailscale Serve docs (opens in new tab)",
tailscaleDocsLink: "Docs: Tailscale Serve",
insecureHttpDocsTitle: "Insecure HTTP docs (opens in new tab)",
insecureHttpDocsLink: "Docs: Insecure HTTP",
copyCommand: "Copy command",
copyCommandAria: "Copy command: {command}",
},
cards: {
cost: "Cost",
skills: "Skills",
recentSessions: "Recent Sessions",
modelAuth: "Model Auth",
modelAuthOk: "{count} ok",
modelAuthExpired: "{count} expired",
modelAuthExpiring: "{count} expiring",
modelAuthProviders: "{count} providers",
modelAuthUsageLeft: "{pct}% left",
modelAuthExpiresIn: "expires {when}",
modelAuthAttentionExpiredTitle: "Model auth expired",
modelAuthAttentionExpiringTitle: "Model auth expiring soon",
modelAuthAttentionExpiredDesc: "{providers} — re-authenticate with openclaw models auth",
modelAuthAttentionExpiringEntry: "{provider} ({when})",
},
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",
categories: {
search: "Search",
navigation: "Navigation",
skills: "Skills",
},
items: {
overview: "Overview",
sessions: "Sessions",
scheduled: "Scheduled",
skills: "Skills",
settings: "Settings",
agents: "Agents",
shellCommand: "Shell Command",
debugMode: "Debug Mode",
},
descriptions: {
shellCommand: "Run shell",
debugMode: "Toggle debug",
},
footer: {
navigate: "navigate",
select: "select",
close: "close",
},
},
},
dreaming: {
tabs: {
scene: "Scene",
diary: "Diary",
advanced: "Advanced",
},
header: {
refresh: "Refresh",
refreshing: "Refreshing…",
on: "Dreaming On",
off: "Dreaming Off",
},
restartConfirmation: {
title: "Restart Gateway to Apply Change",
subtitle: "Changing Dreaming mode restarts the gateway.",
warning:
"This action will restart the Gateway and may temporarily interrupt chats, automations, and connected channels.",
confirm: "Confirm Restart",
restarting: "Restarting…",
failed: "Could not apply change. Check your connection and try again.",
},
status: {
active: "Dreaming Active",
idle: "Dreaming Idle",
promotedSuffix: "promoted",
nextSweepPrefix: "next sweep",
},
scene: {
backfill: "Backfill",
dedupeDiary: "Dedupe Diary",
reset: "Reset",
clearGrounded: "Clear Replayed",
repairCache: "Repair Dream Cache",
working: "Working…",
},
phase: {
light: "Light",
deep: "Deep",
rem: "Rem",
off: "off",
},
advanced: {
eyebrow: "Review",
title: "Daily Log Review",
description:
"Review what came from the daily log, what is waiting for promotion, and what was promoted recently.",
summaryFromDailyLog: "from daily log",
summaryWaiting: "waiting",
summaryPromotedToday: "promoted today",
stagedTitle: "From the Daily Log",
stagedDescription: "Replay candidates pulled from older daily log entries.",
shortTermTitle: "Waiting for Promotion",
shortTermDescription: "Current short-term candidates waiting to graduate into real memory.",
sortRecent: "Most recent",
sortSignals: "Strongest support",
originDailyLog: "replayed",
originLive: "live",
originMixed: "mixed",
promotedTitle: "Recent Promotions",
promotedDescription: "Items that already made it through promotion.",
emptyGrounded: "No staged grounded replay entries right now.",
emptyShortTerm: "No short-term entries to inspect.",
emptyPromoted: "No recent promotions to inspect.",
updatedPrefix: "updated",
},
stats: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
phaseHits: "Phase Hits",
},
trace: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
groundedLed: "grounded-led",
emptyShortTerm: "No active short-term items.",
emptyGrounded: "No staged grounded items.",
emptySignals: "No active signals.",
emptyPromoted: "Nothing promoted yet today.",
},
diary: {
title: "Dream Diary",
noDreamsYet: "No dreams yet",
noDreamsHint: "Dreams will appear here after the first dreaming cycle runs.",
waitingTitle: "The diary is waiting",
waitingHint: "Narrative entries will appear after the next dreaming cycle.",
older: "Older",
newer: "Newer",
reload: "Reload",
reloading: "Reloading…",
},
phrases: {
consolidatingMemories: "consolidating memories…",
tidyingKnowledgeGraph: "tidying the knowledge graph…",
replayingConversations: "replaying today's conversations…",
weavingShortTerm: "weaving short-term into long-term…",
defragmentingMindPalace: "defragmenting the mind palace…",
filingLooseThoughts: "filing away loose thoughts…",
connectingDots: "connecting distant dots…",
compostingContext: "composting old context windows…",
alphabetizingSubconscious: "alphabetizing the subconscious…",
promotingHunches: "promoting promising hunches…",
forgettingNoise: "forgetting what doesn't matter…",
dreamingEmbeddings: "dreaming in embeddings…",
reorganizingAttic: "reorganizing the memory attic…",
indexingDay: "softly indexing the day…",
nurturingInsights: "nurturing fledgling insights…",
simmeringIdeas: "simmering half-formed ideas…",
whisperingVectorStore: "whispering to the vector store…",
},
},
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 + cache write). 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",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turkish)",
uk: "Українська (Ukrainian)",
id: "Bahasa Indonesia (Indonesian)",
pl: "Polski (Polish)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
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.",
},
},
};

View File

@@ -723,11 +723,16 @@ export const fr: TranslationMap = {
jaJP: "日本語 (japonais)",
ko: "한국어 (coréen)",
fr: "Français (français)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (turc)",
uk: "Українська (ukrainien)",
id: "Bahasa Indonesia (indonésien)",
pl: "Polski (polonais)",
th: "ไทย (thaï)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -716,11 +716,16 @@ export const id: TranslationMap = {
jaJP: "日本語 (Jepang)",
ko: "한국어 (Korea)",
fr: "Français (Prancis)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turki)",
uk: "Українська (Ukraina)",
id: "Bahasa Indonesia (Indonesia)",
pl: "Polski (Polandia)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

936
ui/src/i18n/locales/it.ts Normal file
View File

@@ -0,0 +1,936 @@
import type { TranslationMap } from "../lib/types.ts";
// Generated by scripts/control-ui-i18n.ts.
export const it: TranslationMap = {
common: {
health: "Health",
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Connect",
connected: "Connected",
refresh: "Refresh",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Enabled",
disabled: "Disabled",
na: "n/a",
configured: "Configured",
running: "Running",
linked: "Linked",
mode: "Mode",
baseUrl: "Base URL",
lastStart: "Last start",
lastProbe: "Last probe",
lastInbound: "Last inbound",
lastConnect: "Last connect",
lastMessage: "Last message",
authAge: "Auth age",
credential: "Credential",
audience: "Audience",
publicKey: "Public Key",
probeOk: "Probe ok",
probeFailed: "Probe failed",
reloadConfig: "Reload Config",
loadConfig: "Load config",
loadApprovals: "Load approvals",
settingsSections: "Settings sections",
version: "Version",
docs: "Docs",
theme: "Theme",
resources: "Resources",
search: "Search",
save: "Save",
saving: "Saving…",
saveAndPublish: "Save & Publish",
importing: "Importing…",
importFromRelays: "Import from Relays",
showAdvanced: "Show Advanced",
hideAdvanced: "Hide Advanced",
unsavedChanges: "You have unsaved changes",
secondsAgo: "{count}s ago",
working: "Working…",
showQr: "Show QR",
relink: "Relink",
waitForScan: "Wait for scan",
logout: "Logout",
},
channels: {
health: {
title: "Channel health",
subtitle: "Channel status snapshots from the gateway.",
noSnapshotYet: "No snapshot yet.",
},
generic: {
subtitle: "Channel status and configuration.",
},
gatewayUrlConfirmation: {
title: "Change Gateway URL",
subtitle: "This will reconnect to a different gateway server",
warning: "Only confirm if you trust this URL. Malicious URLs can compromise your system.",
},
nostr: {
profile: "Profile",
editProfile: "Edit Profile",
profilePicture: "Profile picture",
noProfile: "No profile set.",
noProfileHint: 'Click "Edit Profile" to add your name, bio, and avatar.',
name: "Name",
displayName: "Display Name",
about: "About",
advanced: "Advanced",
profilePicturePreview: "Profile picture preview",
account: "Account",
username: "Username",
usernameHelp: "Short username (e.g., satoshi)",
bio: "Bio",
bioPlaceholder: "Tell people about yourself...",
bioHelp: "A brief bio or description",
displayNameHelp: "Your full display name",
avatarUrl: "Avatar URL",
avatarHelp: "HTTPS URL to your profile picture",
bannerUrl: "Banner URL",
bannerHelp: "HTTPS URL to a banner image",
website: "Website",
websiteHelp: "Your personal website",
nip05Identifier: "NIP-05 Identifier",
nip05Help: "Verifiable identifier (e.g., you@domain.com)",
lightningAddress: "Lightning Address",
lightningHelp: "Lightning address for tips (LUD-16)",
},
},
lazyView: {
loadingTitle: "Loading panel",
errorTitle: "Panel failed to load",
errorSubtitle:
"Reload the page to load the latest Control UI bundle, or retry if the network request failed.",
retry: "Retry",
unknownError: "Unknown module load error.",
},
nodes: {
binding: {
loadConfigHint: "Load config to edit bindings.",
formModeHint: "Switch the Config tab to Form mode to edit bindings here.",
execNodeBinding: "Exec node binding",
execNodeBindingSubtitle: "Pin agents to a specific node when using exec host=node.",
defaultBinding: "Default binding",
defaultBindingHint: "Used when agents do not override a node binding.",
node: "Node",
},
},
instances: {
title: "Connected Instances",
subtitle: "Presence beacons from the gateway and clients.",
showHosts: "Show hosts and IPs",
hideHosts: "Hide hosts and IPs",
toggleHostVisibility: "Toggle host visibility",
noInstances: "No instances reported yet.",
lastInput: "Last input {time}",
reason: "Reason {reason}",
},
agentTools: {
connectedSource: "Connected: {id}",
connected: "Connected",
channelSource: "Channel: {id}",
channel: "Channel",
builtIn: "Built-in",
},
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: "Dreaming",
},
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 dreaming, consolidation, and reflection.",
},
overview: {
access: {
title: "Gateway Access",
subtitle: "Where the dashboard connects and how it authenticates.",
wsUrl: "WebSocket URL",
token: "Gateway Token",
password: "Password (not stored)",
passwordPlaceholder: "system or shared password",
sessionKey: "Default Session Key",
language: "Language",
connectHint: "Click Connect to apply connection changes.",
trustedProxy: "Authenticated via trusted proxy.",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
docsTitle: "Device pairing docs (opens in new tab)",
docsLink: "Docs: Device pairing",
},
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 →",
authDocsTitle: "Control UI auth docs (opens in new tab)",
authDocsLink: "Docs: Control UI auth",
tailscaleDocsTitle: "Tailscale Serve docs (opens in new tab)",
tailscaleDocsLink: "Docs: Tailscale Serve",
insecureHttpDocsTitle: "Insecure HTTP docs (opens in new tab)",
insecureHttpDocsLink: "Docs: Insecure HTTP",
copyCommand: "Copy command",
copyCommandAria: "Copy command: {command}",
},
cards: {
cost: "Cost",
skills: "Skills",
recentSessions: "Recent Sessions",
modelAuth: "Model Auth",
modelAuthOk: "{count} ok",
modelAuthExpired: "{count} expired",
modelAuthExpiring: "{count} expiring",
modelAuthProviders: "{count} providers",
modelAuthUsageLeft: "{pct}% left",
modelAuthExpiresIn: "expires {when}",
modelAuthAttentionExpiredTitle: "Model auth expired",
modelAuthAttentionExpiringTitle: "Model auth expiring soon",
modelAuthAttentionExpiredDesc: "{providers} — re-authenticate with openclaw models auth",
modelAuthAttentionExpiringEntry: "{provider} ({when})",
},
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",
categories: {
search: "Search",
navigation: "Navigation",
skills: "Skills",
},
items: {
overview: "Overview",
sessions: "Sessions",
scheduled: "Scheduled",
skills: "Skills",
settings: "Settings",
agents: "Agents",
shellCommand: "Shell Command",
debugMode: "Debug Mode",
},
descriptions: {
shellCommand: "Run shell",
debugMode: "Toggle debug",
},
footer: {
navigate: "navigate",
select: "select",
close: "close",
},
},
},
dreaming: {
tabs: {
scene: "Scene",
diary: "Diary",
advanced: "Advanced",
},
header: {
refresh: "Refresh",
refreshing: "Refreshing…",
on: "Dreaming On",
off: "Dreaming Off",
},
restartConfirmation: {
title: "Restart Gateway to Apply Change",
subtitle: "Changing Dreaming mode restarts the gateway.",
warning:
"This action will restart the Gateway and may temporarily interrupt chats, automations, and connected channels.",
confirm: "Confirm Restart",
restarting: "Restarting…",
failed: "Could not apply change. Check your connection and try again.",
},
status: {
active: "Dreaming Active",
idle: "Dreaming Idle",
promotedSuffix: "promoted",
nextSweepPrefix: "next sweep",
},
scene: {
backfill: "Backfill",
dedupeDiary: "Dedupe Diary",
reset: "Reset",
clearGrounded: "Clear Replayed",
repairCache: "Repair Dream Cache",
working: "Working…",
},
phase: {
light: "Light",
deep: "Deep",
rem: "Rem",
off: "off",
},
advanced: {
eyebrow: "Review",
title: "Daily Log Review",
description:
"Review what came from the daily log, what is waiting for promotion, and what was promoted recently.",
summaryFromDailyLog: "from daily log",
summaryWaiting: "waiting",
summaryPromotedToday: "promoted today",
stagedTitle: "From the Daily Log",
stagedDescription: "Replay candidates pulled from older daily log entries.",
shortTermTitle: "Waiting for Promotion",
shortTermDescription: "Current short-term candidates waiting to graduate into real memory.",
sortRecent: "Most recent",
sortSignals: "Strongest support",
originDailyLog: "replayed",
originLive: "live",
originMixed: "mixed",
promotedTitle: "Recent Promotions",
promotedDescription: "Items that already made it through promotion.",
emptyGrounded: "No staged grounded replay entries right now.",
emptyShortTerm: "No short-term entries to inspect.",
emptyPromoted: "No recent promotions to inspect.",
updatedPrefix: "updated",
},
stats: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
phaseHits: "Phase Hits",
},
trace: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
groundedLed: "grounded-led",
emptyShortTerm: "No active short-term items.",
emptyGrounded: "No staged grounded items.",
emptySignals: "No active signals.",
emptyPromoted: "Nothing promoted yet today.",
},
diary: {
title: "Dream Diary",
noDreamsYet: "No dreams yet",
noDreamsHint: "Dreams will appear here after the first dreaming cycle runs.",
waitingTitle: "The diary is waiting",
waitingHint: "Narrative entries will appear after the next dreaming cycle.",
older: "Older",
newer: "Newer",
reload: "Reload",
reloading: "Reloading…",
},
phrases: {
consolidatingMemories: "consolidating memories…",
tidyingKnowledgeGraph: "tidying the knowledge graph…",
replayingConversations: "replaying today's conversations…",
weavingShortTerm: "weaving short-term into long-term…",
defragmentingMindPalace: "defragmenting the mind palace…",
filingLooseThoughts: "filing away loose thoughts…",
connectingDots: "connecting distant dots…",
compostingContext: "composting old context windows…",
alphabetizingSubconscious: "alphabetizing the subconscious…",
promotingHunches: "promoting promising hunches…",
forgettingNoise: "forgetting what doesn't matter…",
dreamingEmbeddings: "dreaming in embeddings…",
reorganizingAttic: "reorganizing the memory attic…",
indexingDay: "softly indexing the day…",
nurturingInsights: "nurturing fledgling insights…",
simmeringIdeas: "simmering half-formed ideas…",
whisperingVectorStore: "whispering to the vector store…",
},
},
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 + cache write). 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",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turkish)",
uk: "Українська (Ukrainian)",
id: "Bahasa Indonesia (Indonesian)",
pl: "Polski (Polish)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
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.",
},
},
};

View File

@@ -719,11 +719,16 @@ export const ja_JP: TranslationMap = {
jaJP: "日本語Japanese",
ko: "한국어Korean",
fr: "FrançaisFrench",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "TürkçeTurkish",
uk: "Українська(ウクライナ語)",
id: "Bahasa IndonesiaIndonesian",
pl: "PolskiPolish",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -712,11 +712,16 @@ export const ko: TranslationMap = {
jaJP: "日本語 (일본어)",
ko: "한국어 (한국어)",
fr: "Français (프랑스어)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (터키어)",
uk: "우크라이나어 (Ukrainian)",
id: "Bahasa Indonesia (인도네시아어)",
pl: "Polski (폴란드어)",
th: "ไทย (태국어)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

936
ui/src/i18n/locales/nl.ts Normal file
View File

@@ -0,0 +1,936 @@
import type { TranslationMap } from "../lib/types.ts";
// Generated by scripts/control-ui-i18n.ts.
export const nl: TranslationMap = {
common: {
health: "Health",
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Connect",
connected: "Connected",
refresh: "Refresh",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Enabled",
disabled: "Disabled",
na: "n/a",
configured: "Configured",
running: "Running",
linked: "Linked",
mode: "Mode",
baseUrl: "Base URL",
lastStart: "Last start",
lastProbe: "Last probe",
lastInbound: "Last inbound",
lastConnect: "Last connect",
lastMessage: "Last message",
authAge: "Auth age",
credential: "Credential",
audience: "Audience",
publicKey: "Public Key",
probeOk: "Probe ok",
probeFailed: "Probe failed",
reloadConfig: "Reload Config",
loadConfig: "Load config",
loadApprovals: "Load approvals",
settingsSections: "Settings sections",
version: "Version",
docs: "Docs",
theme: "Theme",
resources: "Resources",
search: "Search",
save: "Save",
saving: "Saving…",
saveAndPublish: "Save & Publish",
importing: "Importing…",
importFromRelays: "Import from Relays",
showAdvanced: "Show Advanced",
hideAdvanced: "Hide Advanced",
unsavedChanges: "You have unsaved changes",
secondsAgo: "{count}s ago",
working: "Working…",
showQr: "Show QR",
relink: "Relink",
waitForScan: "Wait for scan",
logout: "Logout",
},
channels: {
health: {
title: "Channel health",
subtitle: "Channel status snapshots from the gateway.",
noSnapshotYet: "No snapshot yet.",
},
generic: {
subtitle: "Channel status and configuration.",
},
gatewayUrlConfirmation: {
title: "Change Gateway URL",
subtitle: "This will reconnect to a different gateway server",
warning: "Only confirm if you trust this URL. Malicious URLs can compromise your system.",
},
nostr: {
profile: "Profile",
editProfile: "Edit Profile",
profilePicture: "Profile picture",
noProfile: "No profile set.",
noProfileHint: 'Click "Edit Profile" to add your name, bio, and avatar.',
name: "Name",
displayName: "Display Name",
about: "About",
advanced: "Advanced",
profilePicturePreview: "Profile picture preview",
account: "Account",
username: "Username",
usernameHelp: "Short username (e.g., satoshi)",
bio: "Bio",
bioPlaceholder: "Tell people about yourself...",
bioHelp: "A brief bio or description",
displayNameHelp: "Your full display name",
avatarUrl: "Avatar URL",
avatarHelp: "HTTPS URL to your profile picture",
bannerUrl: "Banner URL",
bannerHelp: "HTTPS URL to a banner image",
website: "Website",
websiteHelp: "Your personal website",
nip05Identifier: "NIP-05 Identifier",
nip05Help: "Verifiable identifier (e.g., you@domain.com)",
lightningAddress: "Lightning Address",
lightningHelp: "Lightning address for tips (LUD-16)",
},
},
lazyView: {
loadingTitle: "Loading panel",
errorTitle: "Panel failed to load",
errorSubtitle:
"Reload the page to load the latest Control UI bundle, or retry if the network request failed.",
retry: "Retry",
unknownError: "Unknown module load error.",
},
nodes: {
binding: {
loadConfigHint: "Load config to edit bindings.",
formModeHint: "Switch the Config tab to Form mode to edit bindings here.",
execNodeBinding: "Exec node binding",
execNodeBindingSubtitle: "Pin agents to a specific node when using exec host=node.",
defaultBinding: "Default binding",
defaultBindingHint: "Used when agents do not override a node binding.",
node: "Node",
},
},
instances: {
title: "Connected Instances",
subtitle: "Presence beacons from the gateway and clients.",
showHosts: "Show hosts and IPs",
hideHosts: "Hide hosts and IPs",
toggleHostVisibility: "Toggle host visibility",
noInstances: "No instances reported yet.",
lastInput: "Last input {time}",
reason: "Reason {reason}",
},
agentTools: {
connectedSource: "Connected: {id}",
connected: "Connected",
channelSource: "Channel: {id}",
channel: "Channel",
builtIn: "Built-in",
},
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: "Dreaming",
},
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 dreaming, consolidation, and reflection.",
},
overview: {
access: {
title: "Gateway Access",
subtitle: "Where the dashboard connects and how it authenticates.",
wsUrl: "WebSocket URL",
token: "Gateway Token",
password: "Password (not stored)",
passwordPlaceholder: "system or shared password",
sessionKey: "Default Session Key",
language: "Language",
connectHint: "Click Connect to apply connection changes.",
trustedProxy: "Authenticated via trusted proxy.",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
docsTitle: "Device pairing docs (opens in new tab)",
docsLink: "Docs: Device pairing",
},
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 →",
authDocsTitle: "Control UI auth docs (opens in new tab)",
authDocsLink: "Docs: Control UI auth",
tailscaleDocsTitle: "Tailscale Serve docs (opens in new tab)",
tailscaleDocsLink: "Docs: Tailscale Serve",
insecureHttpDocsTitle: "Insecure HTTP docs (opens in new tab)",
insecureHttpDocsLink: "Docs: Insecure HTTP",
copyCommand: "Copy command",
copyCommandAria: "Copy command: {command}",
},
cards: {
cost: "Cost",
skills: "Skills",
recentSessions: "Recent Sessions",
modelAuth: "Model Auth",
modelAuthOk: "{count} ok",
modelAuthExpired: "{count} expired",
modelAuthExpiring: "{count} expiring",
modelAuthProviders: "{count} providers",
modelAuthUsageLeft: "{pct}% left",
modelAuthExpiresIn: "expires {when}",
modelAuthAttentionExpiredTitle: "Model auth expired",
modelAuthAttentionExpiringTitle: "Model auth expiring soon",
modelAuthAttentionExpiredDesc: "{providers} — re-authenticate with openclaw models auth",
modelAuthAttentionExpiringEntry: "{provider} ({when})",
},
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",
categories: {
search: "Search",
navigation: "Navigation",
skills: "Skills",
},
items: {
overview: "Overview",
sessions: "Sessions",
scheduled: "Scheduled",
skills: "Skills",
settings: "Settings",
agents: "Agents",
shellCommand: "Shell Command",
debugMode: "Debug Mode",
},
descriptions: {
shellCommand: "Run shell",
debugMode: "Toggle debug",
},
footer: {
navigate: "navigate",
select: "select",
close: "close",
},
},
},
dreaming: {
tabs: {
scene: "Scene",
diary: "Diary",
advanced: "Advanced",
},
header: {
refresh: "Refresh",
refreshing: "Refreshing…",
on: "Dreaming On",
off: "Dreaming Off",
},
restartConfirmation: {
title: "Restart Gateway to Apply Change",
subtitle: "Changing Dreaming mode restarts the gateway.",
warning:
"This action will restart the Gateway and may temporarily interrupt chats, automations, and connected channels.",
confirm: "Confirm Restart",
restarting: "Restarting…",
failed: "Could not apply change. Check your connection and try again.",
},
status: {
active: "Dreaming Active",
idle: "Dreaming Idle",
promotedSuffix: "promoted",
nextSweepPrefix: "next sweep",
},
scene: {
backfill: "Backfill",
dedupeDiary: "Dedupe Diary",
reset: "Reset",
clearGrounded: "Clear Replayed",
repairCache: "Repair Dream Cache",
working: "Working…",
},
phase: {
light: "Light",
deep: "Deep",
rem: "Rem",
off: "off",
},
advanced: {
eyebrow: "Review",
title: "Daily Log Review",
description:
"Review what came from the daily log, what is waiting for promotion, and what was promoted recently.",
summaryFromDailyLog: "from daily log",
summaryWaiting: "waiting",
summaryPromotedToday: "promoted today",
stagedTitle: "From the Daily Log",
stagedDescription: "Replay candidates pulled from older daily log entries.",
shortTermTitle: "Waiting for Promotion",
shortTermDescription: "Current short-term candidates waiting to graduate into real memory.",
sortRecent: "Most recent",
sortSignals: "Strongest support",
originDailyLog: "replayed",
originLive: "live",
originMixed: "mixed",
promotedTitle: "Recent Promotions",
promotedDescription: "Items that already made it through promotion.",
emptyGrounded: "No staged grounded replay entries right now.",
emptyShortTerm: "No short-term entries to inspect.",
emptyPromoted: "No recent promotions to inspect.",
updatedPrefix: "updated",
},
stats: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
phaseHits: "Phase Hits",
},
trace: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
groundedLed: "grounded-led",
emptyShortTerm: "No active short-term items.",
emptyGrounded: "No staged grounded items.",
emptySignals: "No active signals.",
emptyPromoted: "Nothing promoted yet today.",
},
diary: {
title: "Dream Diary",
noDreamsYet: "No dreams yet",
noDreamsHint: "Dreams will appear here after the first dreaming cycle runs.",
waitingTitle: "The diary is waiting",
waitingHint: "Narrative entries will appear after the next dreaming cycle.",
older: "Older",
newer: "Newer",
reload: "Reload",
reloading: "Reloading…",
},
phrases: {
consolidatingMemories: "consolidating memories…",
tidyingKnowledgeGraph: "tidying the knowledge graph…",
replayingConversations: "replaying today's conversations…",
weavingShortTerm: "weaving short-term into long-term…",
defragmentingMindPalace: "defragmenting the mind palace…",
filingLooseThoughts: "filing away loose thoughts…",
connectingDots: "connecting distant dots…",
compostingContext: "composting old context windows…",
alphabetizingSubconscious: "alphabetizing the subconscious…",
promotingHunches: "promoting promising hunches…",
forgettingNoise: "forgetting what doesn't matter…",
dreamingEmbeddings: "dreaming in embeddings…",
reorganizingAttic: "reorganizing the memory attic…",
indexingDay: "softly indexing the day…",
nurturingInsights: "nurturing fledgling insights…",
simmeringIdeas: "simmering half-formed ideas…",
whisperingVectorStore: "whispering to the vector store…",
},
},
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 + cache write). 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",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turkish)",
uk: "Українська (Ukrainian)",
id: "Bahasa Indonesia (Indonesian)",
pl: "Polski (Polish)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
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.",
},
},
};

View File

@@ -721,11 +721,16 @@ export const pl: TranslationMap = {
jaJP: "日本語 (japoński)",
ko: "한국어 (koreański)",
fr: "Français (francuski)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (turecki)",
uk: "Українська (ukraiński)",
id: "Bahasa Indonesia (indonezyjski)",
pl: "Polski (polski)",
th: "ไทย (tajski)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -718,11 +718,16 @@ export const pt_BR: TranslationMap = {
jaJP: "日本語 (Japonês)",
ko: "한국어 (Coreano)",
fr: "Français (Francês)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turco)",
uk: "Українська (ucraniano)",
id: "Bahasa Indonesia (Indonésio)",
pl: "Polski (Polonês)",
th: "ไทย (tailandês)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -703,11 +703,16 @@ export const th: TranslationMap = {
jaJP: "日本語 (ญี่ปุ่น)",
ko: "한국어 (เกาหลี)",
fr: "Français (ฝรั่งเศส)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (ตุรกี)",
uk: "Українська (ยูเครน)",
id: "Bahasa Indonesia (อินโดนีเซีย)",
pl: "Polski (โปแลนด์)",
th: "ไทย (ไทย)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -721,11 +721,16 @@ export const tr: TranslationMap = {
jaJP: "日本語 (Japonca)",
ko: "한국어 (Korece)",
fr: "Français (Fransızca)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Türkçe)",
uk: "Українська (Ukraynaca)",
id: "Bahasa Indonesia (Endonezce)",
pl: "Polski (Lehçe)",
th: "ไทย (Tayca)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -720,11 +720,16 @@ export const uk: TranslationMap = {
jaJP: "日本語 (японська)",
ko: "한국어 (корейська)",
fr: "Français (французька)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (турецька)",
uk: "Українська (українська)",
id: "Bahasa Indonesia (індонезійська)",
pl: "Polski (польська)",
th: "ไทย (тайська)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

936
ui/src/i18n/locales/vi.ts Normal file
View File

@@ -0,0 +1,936 @@
import type { TranslationMap } from "../lib/types.ts";
// Generated by scripts/control-ui-i18n.ts.
export const vi: TranslationMap = {
common: {
health: "Health",
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Connect",
connected: "Connected",
refresh: "Refresh",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Enabled",
disabled: "Disabled",
na: "n/a",
configured: "Configured",
running: "Running",
linked: "Linked",
mode: "Mode",
baseUrl: "Base URL",
lastStart: "Last start",
lastProbe: "Last probe",
lastInbound: "Last inbound",
lastConnect: "Last connect",
lastMessage: "Last message",
authAge: "Auth age",
credential: "Credential",
audience: "Audience",
publicKey: "Public Key",
probeOk: "Probe ok",
probeFailed: "Probe failed",
reloadConfig: "Reload Config",
loadConfig: "Load config",
loadApprovals: "Load approvals",
settingsSections: "Settings sections",
version: "Version",
docs: "Docs",
theme: "Theme",
resources: "Resources",
search: "Search",
save: "Save",
saving: "Saving…",
saveAndPublish: "Save & Publish",
importing: "Importing…",
importFromRelays: "Import from Relays",
showAdvanced: "Show Advanced",
hideAdvanced: "Hide Advanced",
unsavedChanges: "You have unsaved changes",
secondsAgo: "{count}s ago",
working: "Working…",
showQr: "Show QR",
relink: "Relink",
waitForScan: "Wait for scan",
logout: "Logout",
},
channels: {
health: {
title: "Channel health",
subtitle: "Channel status snapshots from the gateway.",
noSnapshotYet: "No snapshot yet.",
},
generic: {
subtitle: "Channel status and configuration.",
},
gatewayUrlConfirmation: {
title: "Change Gateway URL",
subtitle: "This will reconnect to a different gateway server",
warning: "Only confirm if you trust this URL. Malicious URLs can compromise your system.",
},
nostr: {
profile: "Profile",
editProfile: "Edit Profile",
profilePicture: "Profile picture",
noProfile: "No profile set.",
noProfileHint: 'Click "Edit Profile" to add your name, bio, and avatar.',
name: "Name",
displayName: "Display Name",
about: "About",
advanced: "Advanced",
profilePicturePreview: "Profile picture preview",
account: "Account",
username: "Username",
usernameHelp: "Short username (e.g., satoshi)",
bio: "Bio",
bioPlaceholder: "Tell people about yourself...",
bioHelp: "A brief bio or description",
displayNameHelp: "Your full display name",
avatarUrl: "Avatar URL",
avatarHelp: "HTTPS URL to your profile picture",
bannerUrl: "Banner URL",
bannerHelp: "HTTPS URL to a banner image",
website: "Website",
websiteHelp: "Your personal website",
nip05Identifier: "NIP-05 Identifier",
nip05Help: "Verifiable identifier (e.g., you@domain.com)",
lightningAddress: "Lightning Address",
lightningHelp: "Lightning address for tips (LUD-16)",
},
},
lazyView: {
loadingTitle: "Loading panel",
errorTitle: "Panel failed to load",
errorSubtitle:
"Reload the page to load the latest Control UI bundle, or retry if the network request failed.",
retry: "Retry",
unknownError: "Unknown module load error.",
},
nodes: {
binding: {
loadConfigHint: "Load config to edit bindings.",
formModeHint: "Switch the Config tab to Form mode to edit bindings here.",
execNodeBinding: "Exec node binding",
execNodeBindingSubtitle: "Pin agents to a specific node when using exec host=node.",
defaultBinding: "Default binding",
defaultBindingHint: "Used when agents do not override a node binding.",
node: "Node",
},
},
instances: {
title: "Connected Instances",
subtitle: "Presence beacons from the gateway and clients.",
showHosts: "Show hosts and IPs",
hideHosts: "Hide hosts and IPs",
toggleHostVisibility: "Toggle host visibility",
noInstances: "No instances reported yet.",
lastInput: "Last input {time}",
reason: "Reason {reason}",
},
agentTools: {
connectedSource: "Connected: {id}",
connected: "Connected",
channelSource: "Channel: {id}",
channel: "Channel",
builtIn: "Built-in",
},
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: "Dreaming",
},
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 dreaming, consolidation, and reflection.",
},
overview: {
access: {
title: "Gateway Access",
subtitle: "Where the dashboard connects and how it authenticates.",
wsUrl: "WebSocket URL",
token: "Gateway Token",
password: "Password (not stored)",
passwordPlaceholder: "system or shared password",
sessionKey: "Default Session Key",
language: "Language",
connectHint: "Click Connect to apply connection changes.",
trustedProxy: "Authenticated via trusted proxy.",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
docsTitle: "Device pairing docs (opens in new tab)",
docsLink: "Docs: Device pairing",
},
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 →",
authDocsTitle: "Control UI auth docs (opens in new tab)",
authDocsLink: "Docs: Control UI auth",
tailscaleDocsTitle: "Tailscale Serve docs (opens in new tab)",
tailscaleDocsLink: "Docs: Tailscale Serve",
insecureHttpDocsTitle: "Insecure HTTP docs (opens in new tab)",
insecureHttpDocsLink: "Docs: Insecure HTTP",
copyCommand: "Copy command",
copyCommandAria: "Copy command: {command}",
},
cards: {
cost: "Cost",
skills: "Skills",
recentSessions: "Recent Sessions",
modelAuth: "Model Auth",
modelAuthOk: "{count} ok",
modelAuthExpired: "{count} expired",
modelAuthExpiring: "{count} expiring",
modelAuthProviders: "{count} providers",
modelAuthUsageLeft: "{pct}% left",
modelAuthExpiresIn: "expires {when}",
modelAuthAttentionExpiredTitle: "Model auth expired",
modelAuthAttentionExpiringTitle: "Model auth expiring soon",
modelAuthAttentionExpiredDesc: "{providers} — re-authenticate with openclaw models auth",
modelAuthAttentionExpiringEntry: "{provider} ({when})",
},
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",
categories: {
search: "Search",
navigation: "Navigation",
skills: "Skills",
},
items: {
overview: "Overview",
sessions: "Sessions",
scheduled: "Scheduled",
skills: "Skills",
settings: "Settings",
agents: "Agents",
shellCommand: "Shell Command",
debugMode: "Debug Mode",
},
descriptions: {
shellCommand: "Run shell",
debugMode: "Toggle debug",
},
footer: {
navigate: "navigate",
select: "select",
close: "close",
},
},
},
dreaming: {
tabs: {
scene: "Scene",
diary: "Diary",
advanced: "Advanced",
},
header: {
refresh: "Refresh",
refreshing: "Refreshing…",
on: "Dreaming On",
off: "Dreaming Off",
},
restartConfirmation: {
title: "Restart Gateway to Apply Change",
subtitle: "Changing Dreaming mode restarts the gateway.",
warning:
"This action will restart the Gateway and may temporarily interrupt chats, automations, and connected channels.",
confirm: "Confirm Restart",
restarting: "Restarting…",
failed: "Could not apply change. Check your connection and try again.",
},
status: {
active: "Dreaming Active",
idle: "Dreaming Idle",
promotedSuffix: "promoted",
nextSweepPrefix: "next sweep",
},
scene: {
backfill: "Backfill",
dedupeDiary: "Dedupe Diary",
reset: "Reset",
clearGrounded: "Clear Replayed",
repairCache: "Repair Dream Cache",
working: "Working…",
},
phase: {
light: "Light",
deep: "Deep",
rem: "Rem",
off: "off",
},
advanced: {
eyebrow: "Review",
title: "Daily Log Review",
description:
"Review what came from the daily log, what is waiting for promotion, and what was promoted recently.",
summaryFromDailyLog: "from daily log",
summaryWaiting: "waiting",
summaryPromotedToday: "promoted today",
stagedTitle: "From the Daily Log",
stagedDescription: "Replay candidates pulled from older daily log entries.",
shortTermTitle: "Waiting for Promotion",
shortTermDescription: "Current short-term candidates waiting to graduate into real memory.",
sortRecent: "Most recent",
sortSignals: "Strongest support",
originDailyLog: "replayed",
originLive: "live",
originMixed: "mixed",
promotedTitle: "Recent Promotions",
promotedDescription: "Items that already made it through promotion.",
emptyGrounded: "No staged grounded replay entries right now.",
emptyShortTerm: "No short-term entries to inspect.",
emptyPromoted: "No recent promotions to inspect.",
updatedPrefix: "updated",
},
stats: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
phaseHits: "Phase Hits",
},
trace: {
shortTerm: "Short-term",
grounded: "Grounded",
signals: "Signals",
promoted: "Promoted",
groundedLed: "grounded-led",
emptyShortTerm: "No active short-term items.",
emptyGrounded: "No staged grounded items.",
emptySignals: "No active signals.",
emptyPromoted: "Nothing promoted yet today.",
},
diary: {
title: "Dream Diary",
noDreamsYet: "No dreams yet",
noDreamsHint: "Dreams will appear here after the first dreaming cycle runs.",
waitingTitle: "The diary is waiting",
waitingHint: "Narrative entries will appear after the next dreaming cycle.",
older: "Older",
newer: "Newer",
reload: "Reload",
reloading: "Reloading…",
},
phrases: {
consolidatingMemories: "consolidating memories…",
tidyingKnowledgeGraph: "tidying the knowledge graph…",
replayingConversations: "replaying today's conversations…",
weavingShortTerm: "weaving short-term into long-term…",
defragmentingMindPalace: "defragmenting the mind palace…",
filingLooseThoughts: "filing away loose thoughts…",
connectingDots: "connecting distant dots…",
compostingContext: "composting old context windows…",
alphabetizingSubconscious: "alphabetizing the subconscious…",
promotingHunches: "promoting promising hunches…",
forgettingNoise: "forgetting what doesn't matter…",
dreamingEmbeddings: "dreaming in embeddings…",
reorganizingAttic: "reorganizing the memory attic…",
indexingDay: "softly indexing the day…",
nurturingInsights: "nurturing fledgling insights…",
simmeringIdeas: "simmering half-formed ideas…",
whisperingVectorStore: "whispering to the vector store…",
},
},
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 + cache write). 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",
showToken: "Show token",
hideToken: "Hide token",
toggleTokenVisibility: "Toggle token visibility",
showPassword: "Show password",
hidePassword: "Hide password",
togglePasswordVisibility: "Toggle password visibility",
},
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)",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "Türkçe (Turkish)",
uk: "Українська (Ukrainian)",
id: "Bahasa Indonesia (Indonesian)",
pl: "Polski (Polish)",
th: "ไทย (Thai)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
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.",
},
},
};

View File

@@ -702,11 +702,16 @@ export const zh_CN: TranslationMap = {
jaJP: "日本語Japanese",
ko: "한국어Korean",
fr: "FrançaisFrench",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "TürkçeTurkish",
uk: "乌克兰语Ukrainian",
id: "Bahasa IndonesiaIndonesian",
pl: "PolskiPolish",
th: "ไทย (泰语)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -703,11 +703,16 @@ export const zh_TW: TranslationMap = {
jaJP: "日本語Japanese",
ko: "한국어Korean",
fr: "FrançaisFrench",
ar: "العربية (Arabic)",
it: "Italiano (Italian)",
tr: "TürkçeTurkish",
uk: "Українська (烏克蘭語)",
id: "Bahasa IndonesiaIndonesian",
pl: "PolskiPolish",
th: "ไทย(泰文)",
vi: "Tiếng Việt (Vietnamese)",
nl: "Nederlands (Dutch)",
fa: "فارسی (Persian)",
},
cron: {
summary: {

View File

@@ -1,18 +1,23 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { createStorageMock } from "../../test-helpers/storage.ts";
import * as translate from "../lib/translate.ts";
import { ar } from "../locales/ar.ts";
import { de } from "../locales/de.ts";
import { en } from "../locales/en.ts";
import { es } from "../locales/es.ts";
import { fa } from "../locales/fa.ts";
import { fr } from "../locales/fr.ts";
import { id } from "../locales/id.ts";
import { it } from "../locales/it.ts";
import { ja_JP } from "../locales/ja-JP.ts";
import { ko } from "../locales/ko.ts";
import { nl } from "../locales/nl.ts";
import { pl } from "../locales/pl.ts";
import { pt_BR } from "../locales/pt-BR.ts";
import { th } from "../locales/th.ts";
import { tr } from "../locales/tr.ts";
import { uk } from "../locales/uk.ts";
import { vi } from "../locales/vi.ts";
import { zh_CN } from "../locales/zh-CN.ts";
import { zh_TW } from "../locales/zh-TW.ts";
@@ -101,17 +106,22 @@ describe("i18n", () => {
});
it("keeps the version label available in shipped locales", () => {
expect((ar.common as { version?: string }).version).toBeTruthy();
expect((de.common as { version?: string }).version).toBeTruthy();
expect((es.common as { version?: string }).version).toBeTruthy();
expect((fa.common as { version?: string }).version).toBeTruthy();
expect((fr.common as { version?: string }).version).toBeTruthy();
expect((id.common as { version?: string }).version).toBeTruthy();
expect((it.common as { version?: string }).version).toBeTruthy();
expect((ja_JP.common as { version?: string }).version).toBeTruthy();
expect((ko.common as { version?: string }).version).toBeTruthy();
expect((nl.common as { version?: string }).version).toBeTruthy();
expect((pl.common as { version?: string }).version).toBeTruthy();
expect((pt_BR.common as { version?: string }).version).toBeTruthy();
expect((th.common as { version?: string }).version).toBeTruthy();
expect((tr.common as { version?: string }).version).toBeTruthy();
expect((uk.common as { version?: string }).version).toBeTruthy();
expect((vi.common as { version?: string }).version).toBeTruthy();
expect((zh_CN.common as { version?: string }).version).toBeTruthy();
expect((zh_TW.common as { version?: string }).version).toBeTruthy();
});
@@ -119,17 +129,22 @@ describe("i18n", () => {
it("keeps shipped locales structurally aligned with English", () => {
const englishKeys = flatten(en);
for (const [locale, value] of Object.entries({
ar,
de,
es,
fa,
fr,
id,
it,
ja_JP,
ko,
nl,
pl,
pt_BR,
th,
tr,
uk,
vi,
zh_CN,
zh_TW,
})) {