fix(ui): localize more control ui strings

This commit is contained in:
Vincent Koc
2026-04-06 03:07:38 +01:00
parent 1f951897f6
commit 547bd6f7d5
38 changed files with 2293 additions and 153 deletions

View File

@@ -233,8 +233,8 @@ Docs: https://docs.openclaw.ai
- Plugins: suppress trust-warning noise during non-activating snapshot and CLI metadata loads. (#61427) Thanks @gumadeiras.
- Agents/video generation: accept `agents.defaults.videoGenerationModel` in strict config validation and `openclaw config set/get`, so gateways using `video_generate` no longer fail to boot after enabling a video model.
- Matrix/streaming: add a quiet preview mode for streamed Matrix replies, keep legacy `partial` preview-first behavior, and finalize quiet media captions correctly so previews stop notifying early without dropping final text semantics. (#61450) Thanks @gumadeiras.
- Gateway/shutdown: bound websocket-server shutdown even when no tracked clients remain, so gateway restarts stop hanging until the watchdog kills the process. (#61565) Thanks @mbelinky.
- Control UI/multilingual: localize the remaining shared channel, instances, nodes, and gateway-confirmation strings so the dashboard stops mixing translated UI with hardcoded English labels. Thanks @vincentkoc.
## 2026.4.2

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.offline",
@@ -22,12 +72,22 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -88,9 +148,24 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"login.passwordPlaceholder",
"nav.agent",
"nav.chat",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.cards.skills",
"overview.quickActions.terminal",
"overview.snapshot.status",
@@ -114,12 +189,12 @@
"usage.presets.last30d",
"usage.presets.last7d"
],
"generatedAt": "2026-04-06T01:49:59.211Z",
"generatedAt": "2026-04-06T02:05:57.570Z",
"locale": "de",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 464,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.probe",
@@ -19,11 +69,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -75,8 +135,23 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"nav.chat",
"nav.control",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.cards.skills",
"overview.notes.tailscaleTitle",
"overview.quickActions.terminal",
@@ -97,12 +172,12 @@
"usage.presets.last30d",
"usage.presets.last7d"
],
"generatedAt": "2026-04-06T01:49:59.510Z",
"generatedAt": "2026-04-06T02:05:57.828Z",
"locale": "es",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 481,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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",
@@ -21,12 +71,22 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.version",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.description",
@@ -84,8 +144,23 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"nav.agent",
"nav.chat",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.attention.title",
"overview.cards.skills",
"overview.notes.tailscaleTitle",
@@ -124,12 +199,12 @@
"usage.overview.sessions",
"usage.sessions.title"
],
"generatedAt": "2026-04-06T01:50:00.328Z",
"generatedAt": "2026-04-06T02:05:58.613Z",
"locale": "fr",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 454,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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",
@@ -23,11 +73,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -86,6 +146,14 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.de",
"languages.en",
"languages.es",
@@ -99,6 +167,13 @@
"languages.zhCN",
"languages.zhTW",
"nav.chat",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.cards.skills",
"overview.notes.tailscaleTitle",
"overview.quickActions.terminal",
@@ -127,12 +202,12 @@
"usage.overview.throughput",
"usage.sessions.total"
],
"generatedAt": "2026-04-06T01:50:01.318Z",
"generatedAt": "2026-04-06T02:05:59.429Z",
"locale": "id",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 451,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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",
@@ -21,11 +71,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -84,6 +144,14 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.de",
"languages.en",
"languages.es",
@@ -96,6 +164,13 @@
"languages.tr",
"languages.zhCN",
"languages.zhTW",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.wsUrl",
"overview.cards.skills",
"overview.notes.tailscaleTitle",
@@ -111,12 +186,12 @@
"usage.filters.timeZoneUtc",
"usage.overview.tokensPerMinute"
],
"generatedAt": "2026-04-06T01:49:59.804Z",
"generatedAt": "2026-04-06T02:05:58.089Z",
"locale": "ja-JP",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 467,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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",
@@ -20,11 +70,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -76,6 +136,14 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.de",
"languages.en",
"languages.es",
@@ -89,6 +157,13 @@
"languages.zhCN",
"languages.zhTW",
"nav.control",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.token",
"overview.access.wsUrl",
"overview.cards.skills",
@@ -105,12 +180,12 @@
"usage.overview.tokensPerMinute",
"usage.overview.user"
],
"generatedAt": "2026-04-06T01:50:00.073Z",
"generatedAt": "2026-04-06T02:05:58.349Z",
"locale": "ko",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 473,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.offline",
@@ -22,11 +72,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -83,6 +143,14 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.de",
"languages.en",
"languages.es",
@@ -96,6 +164,13 @@
"languages.zhCN",
"languages.zhTW",
"nav.agent",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.cards.skills",
"overview.notes.tailscaleTitle",
"overview.quickActions.terminal",
@@ -117,12 +192,12 @@
"usage.presets.last30d",
"usage.presets.last7d"
],
"generatedAt": "2026-04-06T01:50:01.601Z",
"generatedAt": "2026-04-06T02:05:59.759Z",
"locale": "pl",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 461,
"workflow": 1
}

View File

@@ -1,18 +1,68 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"common.docs",
"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.no",
"common.offline",
@@ -23,11 +73,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -81,6 +141,14 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.en",
"languages.fr",
"languages.id",
@@ -89,6 +157,13 @@
"languages.pl",
"languages.tr",
"nav.chat",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.notes.tailscaleTitle",
"overview.quickActions.terminal",
"overview.snapshot.status",
@@ -110,12 +185,12 @@
"usage.presets.last30d",
"usage.presets.last7d"
],
"generatedAt": "2026-04-06T01:49:58.896Z",
"generatedAt": "2026-04-06T02:05:57.310Z",
"locale": "pt-BR",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 468,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.probe",
@@ -19,11 +69,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -75,6 +135,21 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.token",
"overview.access.wsUrl",
"overview.cards.skills",
@@ -88,12 +163,12 @@
"usage.filters.model",
"usage.filters.timeZoneUtc"
],
"generatedAt": "2026-04-06T01:50:00.704Z",
"generatedAt": "2026-04-06T02:05:58.874Z",
"locale": "tr",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 490,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.ok",
@@ -20,11 +70,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -76,6 +136,14 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.de",
"languages.en",
"languages.es",
@@ -90,18 +158,25 @@
"languages.zhCN",
"languages.zhTW",
"login.subtitle",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.notes.tailscaleTitle",
"overview.stats.cron",
"usage.common.emptyValue",
"usage.export.json",
"usage.filters.timeZoneUtc"
],
"generatedAt": "2026-04-06T01:50:00.992Z",
"generatedAt": "2026-04-06T02:05:59.135Z",
"locale": "uk",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 482,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.probe",
@@ -19,11 +69,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.cronOption",
"cron.form.everyAmountPlaceholder",
@@ -74,7 +134,22 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.en",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.wsUrl",
"overview.notes.tailscaleTitle",
"usage.common.emptyValue",
@@ -83,12 +158,12 @@
"usage.filters.timeZoneUtc",
"usage.overview.tokensPerMinute"
],
"generatedAt": "2026-04-06T01:49:58.244Z",
"generatedAt": "2026-04-06T02:05:56.738Z",
"locale": "zh-CN",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 495,
"workflow": 1
}

View File

@@ -1,17 +1,67 @@
{
"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",
"common.active",
"common.audience",
"common.authAge",
"common.baseUrl",
"common.call",
"common.cancel",
"common.configured",
"common.confirm",
"common.connected",
"common.credential",
"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.no",
"common.probe",
@@ -19,11 +69,21 @@
"common.probeOk",
"common.publicKey",
"common.refreshing",
"common.relink",
"common.reload",
"common.reloadConfig",
"common.running",
"common.save",
"common.saveAndPublish",
"common.saving",
"common.secondsAgo",
"common.settingsSections",
"common.showAdvanced",
"common.showQr",
"common.unsavedChanges",
"common.unselect",
"common.waitForScan",
"common.working",
"common.yes",
"cron.form.agentId",
"cron.form.cronOption",
@@ -78,7 +138,22 @@
"dreaming.status.promotedSuffix",
"dreaming.tabs.diary",
"dreaming.tabs.scene",
"instances.hideHosts",
"instances.lastInput",
"instances.noInstances",
"instances.reason",
"instances.showHosts",
"instances.subtitle",
"instances.title",
"instances.toggleHostVisibility",
"languages.en",
"nodes.binding.defaultBinding",
"nodes.binding.defaultBindingHint",
"nodes.binding.execNodeBinding",
"nodes.binding.execNodeBindingSubtitle",
"nodes.binding.formModeHint",
"nodes.binding.loadConfigHint",
"nodes.binding.node",
"overview.access.wsUrl",
"overview.notes.tailscaleTitle",
"usage.common.emptyValue",
@@ -88,12 +163,12 @@
"usage.filters.timeZoneUtc",
"usage.overview.tokensPerMinute"
],
"generatedAt": "2026-04-06T01:49:58.556Z",
"generatedAt": "2026-04-06T02:05:57.047Z",
"locale": "zh-TW",
"model": "",
"provider": "",
"sourceHash": "a5a5f4f337bf840323582ead83e9abd0b64becd5be8d0ff93ef631af457dfac7",
"totalKeys": 577,
"sourceHash": "aa6728f46c7479ccfd4277a8d1614ba5f9d1d690c9052a5654c066e16218b768",
"totalKeys": 652,
"translatedKeys": 490,
"workflow": 1
}

View File

@@ -7,15 +7,18 @@ export const de: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Verbinden",
connected: "Connected",
refresh: "Aktualisieren",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Aktiviert",
@@ -23,11 +26,15 @@ export const de: TranslationMap = {
na: "k. 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",
@@ -42,6 +49,92 @@ export const de: TranslationMap = {
theme: "Design",
resources: "Ressourcen",
search: "Suchen",
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)",
},
},
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",

View File

@@ -6,15 +6,18 @@ export const en: TranslationMap = {
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",
@@ -22,11 +25,15 @@ export const en: TranslationMap = {
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",
@@ -41,6 +48,92 @@ export const en: TranslationMap = {
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)",
},
},
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",

View File

@@ -7,15 +7,18 @@ export const es: TranslationMap = {
ok: "Correcto",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "En línea",
offline: "Desconectado",
connect: "Conectar",
connected: "Connected",
refresh: "Actualizar",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Habilitado",
@@ -23,11 +26,15 @@ export const es: TranslationMap = {
na: "n/d",
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",
@@ -42,6 +49,92 @@ export const es: TranslationMap = {
theme: "Tema",
resources: "Recursos",
search: "Buscar",
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)",
},
},
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",

View File

@@ -7,15 +7,18 @@ export const fr: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "En ligne",
offline: "Hors ligne",
connect: "Connecter",
connected: "Connected",
refresh: "Actualiser",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Activé",
@@ -23,11 +26,15 @@ export const fr: TranslationMap = {
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",
@@ -42,6 +49,92 @@ export const fr: TranslationMap = {
theme: "Thème",
resources: "Ressources",
search: "Rechercher",
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)",
},
},
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",

View File

@@ -7,15 +7,18 @@ export const id: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Hubungkan",
connected: "Connected",
refresh: "Muat ulang",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Diaktifkan",
@@ -23,11 +26,15 @@ export const id: TranslationMap = {
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",
@@ -42,6 +49,92 @@ export const id: TranslationMap = {
theme: "Tema",
resources: "Sumber daya",
search: "Cari",
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)",
},
},
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",

View File

@@ -7,15 +7,18 @@ export const ja_JP: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "オンライン",
offline: "オフライン",
connect: "接続",
connected: "Connected",
refresh: "更新",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "有効",
@@ -23,11 +26,15 @@ export const ja_JP: TranslationMap = {
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",
@@ -42,6 +49,92 @@ export const ja_JP: TranslationMap = {
theme: "テーマ",
resources: "リソース",
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)",
},
},
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: "チャット",

View File

@@ -7,15 +7,18 @@ export const ko: TranslationMap = {
ok: "확인",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "온라인",
offline: "오프라인",
connect: "연결",
connected: "Connected",
refresh: "새로고침",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "사용",
@@ -23,11 +26,15 @@ export const ko: TranslationMap = {
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",
@@ -42,6 +49,92 @@ export const ko: TranslationMap = {
theme: "테마",
resources: "리소스",
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)",
},
},
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: "채팅",

View File

@@ -7,15 +7,18 @@ export const pl: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Połącz",
connected: "Connected",
refresh: "Odśwież",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Włączone",
@@ -23,11 +26,15 @@ export const pl: TranslationMap = {
na: "n/d",
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",
@@ -42,6 +49,92 @@ export const pl: TranslationMap = {
theme: "Motyw",
resources: "Zasoby",
search: "Szukaj",
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)",
},
},
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: "Czat",

View File

@@ -7,15 +7,18 @@ export const pt_BR: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Online",
offline: "Offline",
connect: "Conectar",
connected: "Connected",
refresh: "Atualizar",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Ativado",
@@ -23,11 +26,15 @@ export const pt_BR: TranslationMap = {
na: "n/d",
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",
@@ -42,6 +49,92 @@ export const pt_BR: TranslationMap = {
theme: "Tema",
resources: "Recursos",
search: "Pesquisar",
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)",
},
},
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",

View File

@@ -7,15 +7,18 @@ export const tr: TranslationMap = {
ok: "Tamam",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Çevrimiçi",
offline: "Çevrimdışı",
connect: "Bağlan",
connected: "Connected",
refresh: "Yenile",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Etkin",
@@ -23,11 +26,15 @@ export const tr: TranslationMap = {
na: "yok",
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",
@@ -42,6 +49,92 @@ export const tr: TranslationMap = {
theme: "Tema",
resources: "Kaynaklar",
search: "Ara",
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)",
},
},
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: "Sohbet",

View File

@@ -7,15 +7,18 @@ export const uk: TranslationMap = {
ok: "OK",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "Онлайн",
offline: "Офлайн",
connect: "Підключити",
connected: "Connected",
refresh: "Оновити",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "Увімкнено",
@@ -23,11 +26,15 @@ export const uk: TranslationMap = {
na: "н/д",
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",
@@ -42,6 +49,92 @@ export const uk: TranslationMap = {
theme: "Тема",
resources: "Ресурси",
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)",
},
},
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: "Чат",

View File

@@ -7,15 +7,18 @@ export const zh_CN: TranslationMap = {
ok: "正常",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "在线",
offline: "离线",
connect: "连接",
connected: "Connected",
refresh: "刷新",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "已启用",
@@ -23,11 +26,15 @@ export const zh_CN: TranslationMap = {
na: "不适用",
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",
@@ -42,6 +49,92 @@ export const zh_CN: TranslationMap = {
theme: "主题",
resources: "资源",
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)",
},
},
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: "聊天",

View File

@@ -7,15 +7,18 @@ export const zh_TW: TranslationMap = {
ok: "正常",
yes: "Yes",
no: "No",
active: "Active",
loading: "Loading…",
refreshing: "Refreshing…",
online: "在線",
offline: "離線",
connect: "連接",
connected: "Connected",
refresh: "刷新",
reload: "Reload",
probe: "Probe",
call: "Call",
confirm: "Confirm",
cancel: "Cancel",
unselect: "Unselect",
enabled: "已啟用",
@@ -23,11 +26,15 @@ export const zh_TW: TranslationMap = {
na: "不適用",
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",
@@ -42,6 +49,92 @@ export const zh_TW: TranslationMap = {
theme: "主題",
resources: "資源",
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)",
},
},
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: "聊天",

View File

@@ -276,14 +276,18 @@ export function renderAgentCron(params: {
</div>
<div class="stat-grid" style="margin-top: 16px;">
<div class="stat">
<div class="stat-label">Enabled</div>
<div class="stat-label">${t("common.enabled")}</div>
<div class="stat-value">
${params.status ? (params.status.enabled ? "Yes" : "No") : "n/a"}
${params.status
? params.status.enabled
? t("common.yes")
: t("common.no")
: t("common.na")}
</div>
</div>
<div class="stat">
<div class="stat-label">Jobs</div>
<div class="stat-value">${params.status?.jobs ?? "n/a"}</div>
<div class="stat-value">${params.status?.jobs ?? t("common.na")}</div>
</div>
<div class="stat">
<div class="stat-label">Next wake</div>

View File

@@ -53,12 +53,16 @@ function renderEffectiveToolBadge(tool: {
channelId?: string;
}) {
if (tool.source === "plugin") {
return tool.pluginId ? `Connected: ${tool.pluginId}` : "Connected";
return tool.pluginId
? t("agentTools.connectedSource", { id: tool.pluginId })
: t("agentTools.connected");
}
if (tool.source === "channel") {
return tool.channelId ? `Channel: ${tool.channelId}` : "Channel";
return tool.channelId
? t("agentTools.channelSource", { id: tool.channelId })
: t("agentTools.channel");
}
return "Built-in";
return t("agentTools.builtIn");
}
export function renderAgentTools(params: {

View File

@@ -1,3 +1,5 @@
import { t } from "../../i18n/index.ts";
export function resolveChannelConfigValue(
configForm: Record<string, unknown> | null | undefined,
channelId: string,
@@ -19,7 +21,7 @@ export function resolveChannelConfigValue(
export function formatChannelExtraValue(raw: unknown): string {
if (raw == null) {
return "n/a";
return t("common.na");
}
if (typeof raw === "string" || typeof raw === "number" || typeof raw === "boolean") {
return String(raw);
@@ -27,7 +29,7 @@ export function formatChannelExtraValue(raw: unknown): string {
try {
return JSON.stringify(raw);
} catch {
return "n/a";
return t("common.na");
}
}

View File

@@ -5,6 +5,7 @@
*/
import { html, nothing, type TemplateResult } from "lit";
import { t } from "../../i18n/index.ts";
import type { NostrProfile as NostrProfileType } from "../types.ts";
// ============================================================================
@@ -164,7 +165,7 @@ export function renderNostrProfileForm(params: {
<div style="margin-bottom: 12px;">
<img
src=${picture}
alt="Profile picture preview"
alt=${t("channels.nostr.profilePicturePreview")}
style="max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
@error=${(e: Event) => {
const img = e.target as HTMLImageElement;
@@ -187,8 +188,10 @@ export function renderNostrProfileForm(params: {
<div
style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"
>
<div style="font-weight: 600; font-size: 16px;">Edit Profile</div>
<div style="font-size: 12px; color: var(--text-muted);">Account: ${accountId}</div>
<div style="font-weight: 600; font-size: 16px;">${t("channels.nostr.editProfile")}</div>
<div style="font-size: 12px; color: var(--text-muted);">
${t("channels.nostr.account")}: ${accountId}
</div>
</div>
${state.error
@@ -198,26 +201,26 @@ export function renderNostrProfileForm(params: {
? html`<div class="callout success" style="margin-bottom: 12px;">${state.success}</div>`
: nothing}
${renderPicturePreview()}
${renderField("name", "Username", {
${renderField("name", t("channels.nostr.username"), {
placeholder: "satoshi",
maxLength: 256,
help: "Short username (e.g., satoshi)",
help: t("channels.nostr.usernameHelp"),
})}
${renderField("displayName", "Display Name", {
${renderField("displayName", t("channels.nostr.displayName"), {
placeholder: "Satoshi Nakamoto",
maxLength: 256,
help: "Your full display name",
help: t("channels.nostr.displayNameHelp"),
})}
${renderField("about", "Bio", {
${renderField("about", t("channels.nostr.bio"), {
type: "textarea",
placeholder: "Tell people about yourself...",
placeholder: t("channels.nostr.bioPlaceholder"),
maxLength: 2000,
help: "A brief bio or description",
help: t("channels.nostr.bioHelp"),
})}
${renderField("picture", "Avatar URL", {
${renderField("picture", t("channels.nostr.avatarUrl"), {
type: "url",
placeholder: "https://example.com/avatar.jpg",
help: "HTTPS URL to your profile picture",
help: t("channels.nostr.avatarHelp"),
})}
${state.showAdvanced
? html`
@@ -225,26 +228,26 @@ export function renderNostrProfileForm(params: {
style="border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px;"
>
<div style="font-weight: 500; margin-bottom: 12px; color: var(--text-muted);">
Advanced
${t("channels.nostr.advanced")}
</div>
${renderField("banner", "Banner URL", {
${renderField("banner", t("channels.nostr.bannerUrl"), {
type: "url",
placeholder: "https://example.com/banner.jpg",
help: "HTTPS URL to a banner image",
help: t("channels.nostr.bannerHelp"),
})}
${renderField("website", "Website", {
${renderField("website", t("channels.nostr.website"), {
type: "url",
placeholder: "https://example.com",
help: "Your personal website",
help: t("channels.nostr.websiteHelp"),
})}
${renderField("nip05", "NIP-05 Identifier", {
${renderField("nip05", t("channels.nostr.nip05Identifier"), {
placeholder: "you@example.com",
help: "Verifiable identifier (e.g., you@domain.com)",
help: t("channels.nostr.nip05Help"),
})}
${renderField("lud16", "Lightning Address", {
${renderField("lud16", t("channels.nostr.lightningAddress"), {
placeholder: "you@getalby.com",
help: "Lightning address for tips (LUD-16)",
help: t("channels.nostr.lightningHelp"),
})}
</div>
`
@@ -256,7 +259,7 @@ export function renderNostrProfileForm(params: {
@click=${callbacks.onSave}
?disabled=${state.saving || !isDirty}
>
${state.saving ? "Saving..." : "Save & Publish"}
${state.saving ? t("common.saving") : t("common.saveAndPublish")}
</button>
<button
@@ -264,20 +267,22 @@ export function renderNostrProfileForm(params: {
@click=${callbacks.onImport}
?disabled=${state.importing || state.saving}
>
${state.importing ? "Importing..." : "Import from Relays"}
${state.importing ? t("common.importing") : t("common.importFromRelays")}
</button>
<button class="btn" @click=${callbacks.onToggleAdvanced}>
${state.showAdvanced ? "Hide Advanced" : "Show Advanced"}
${state.showAdvanced ? t("common.hideAdvanced") : t("common.showAdvanced")}
</button>
<button class="btn" @click=${callbacks.onCancel} ?disabled=${state.saving}>Cancel</button>
<button class="btn" @click=${callbacks.onCancel} ?disabled=${state.saving}>
${t("common.cancel")}
</button>
</div>
${isDirty
? html`
<div style="font-size: 12px; color: var(--warning-color); margin-top: 8px">
You have unsaved changes
${t("common.unsavedChanges")}
</div>
`
: nothing}

View File

@@ -15,7 +15,7 @@ import type { ChannelsProps } from "./channels.types.ts";
*/
function truncatePubkey(pubkey: string | null | undefined): string {
if (!pubkey) {
return "n/a";
return t("common.na");
}
if (pubkey.length <= 20) {
return pubkey;
@@ -67,23 +67,23 @@ export function renderNostrCard(params: {
</div>
<div class="status-list account-card-status">
<div>
<span class="label">Running</span>
<span>${account.running ? "Yes" : "No"}</span>
<span class="label">${t("common.running")}</span>
<span>${account.running ? t("common.yes") : t("common.no")}</span>
</div>
<div>
<span class="label">Configured</span>
<span>${account.configured ? "Yes" : "No"}</span>
<span class="label">${t("common.configured")}</span>
<span>${account.configured ? t("common.yes") : t("common.no")}</span>
</div>
<div>
<span class="label">Public Key</span>
<span class="label">${t("common.publicKey")}</span>
<span class="monospace" title="${publicKey ?? ""}">${truncatePubkey(publicKey)}</span>
</div>
<div>
<span class="label">Last inbound</span>
<span class="label">${t("common.lastInbound")}</span>
<span
>${account.lastInboundAt
? formatRelativeTimestamp(account.lastInboundAt)
: "n/a"}</span
: t("common.na")}</span
>
</div>
${account.lastError
@@ -128,7 +128,7 @@ export function renderNostrCard(params: {
<div
style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"
>
<div style="font-weight: 500;">Profile</div>
<div style="font-weight: 500;">${t("channels.nostr.profile")}</div>
${summaryConfigured
? html`
<button
@@ -136,7 +136,7 @@ export function renderNostrCard(params: {
@click=${onEditProfile}
style="font-size: 12px; padding: 4px 8px;"
>
Edit Profile
${t("channels.nostr.editProfile")}
</button>
`
: nothing}
@@ -149,7 +149,7 @@ export function renderNostrCard(params: {
<div style="margin-bottom: 8px;">
<img
src=${picture}
alt="Profile picture"
alt=${t("channels.nostr.profilePicture")}
style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
@error=${(e: Event) => {
(e.target as HTMLImageElement).style.display = "none";
@@ -159,16 +159,19 @@ export function renderNostrCard(params: {
`
: nothing}
${name
? html`<div><span class="label">Name</span><span>${name}</span></div>`
? html`<div>
<span class="label">${t("channels.nostr.name")}</span><span>${name}</span>
</div>`
: nothing}
${displayName
? html`<div>
<span class="label">Display Name</span><span>${displayName}</span>
<span class="label">${t("channels.nostr.displayName")}</span
><span>${displayName}</span>
</div>`
: nothing}
${about
? html`<div>
<span class="label">About</span
<span class="label">${t("channels.nostr.about")}</span
><span style="max-width: 300px; overflow: hidden; text-overflow: ellipsis;"
>${about}</span
>
@@ -181,7 +184,7 @@ export function renderNostrCard(params: {
`
: html`
<div style="color: var(--text-muted); font-size: 13px">
No profile set. Click "Edit Profile" to add your name, bio, and avatar.
${t("channels.nostr.noProfile")} ${t("channels.nostr.noProfileHint")}
</div>
`}
</div>
@@ -202,12 +205,12 @@ export function renderNostrCard(params: {
: html`
<div class="status-list" style="margin-top: 16px;">
<div>
<span class="label">Configured</span>
<span>${summaryConfigured ? "Yes" : "No"}</span>
<span class="label">${t("common.configured")}</span>
<span>${summaryConfigured ? t("common.yes") : t("common.no")}</span>
</div>
<div>
<span class="label">Running</span>
<span>${summaryRunning ? "Yes" : "No"}</span>
<span class="label">${t("common.running")}</span>
<span>${summaryRunning ? t("common.yes") : t("common.no")}</span>
</div>
<div>
<span class="label">${t("common.publicKey")}</span>

View File

@@ -1,4 +1,5 @@
import { html, nothing } from "lit";
import { t } from "../../i18n/index.ts";
import { formatRelativeTimestamp } from "../format.ts";
import type {
ChannelAccountSnapshot,
@@ -75,18 +76,18 @@ export function renderChannels(props: ChannelsProps) {
<section class="card" style="margin-top: 18px;">
<div class="row" style="justify-content: space-between;">
<div>
<div class="card-title">Channel health</div>
<div class="card-sub">Channel status snapshots from the gateway.</div>
<div class="card-title">${t("channels.health.title")}</div>
<div class="card-sub">${t("channels.health.subtitle")}</div>
</div>
<div class="muted">
${props.lastSuccessAt ? formatRelativeTimestamp(props.lastSuccessAt) : "n/a"}
${props.lastSuccessAt ? formatRelativeTimestamp(props.lastSuccessAt) : t("common.na")}
</div>
</div>
${props.lastError
? html`<div class="callout danger" style="margin-top: 12px;">${props.lastError}</div>`
: nothing}
<pre class="code-block" style="margin-top: 12px;">
${props.snapshot ? JSON.stringify(props.snapshot, null, 2) : "No snapshot yet."}
${props.snapshot ? JSON.stringify(props.snapshot, null, 2) : t("channels.health.noSnapshotYet")}
</pre
>
</section>
@@ -196,7 +197,7 @@ function renderGenericChannelCard(
return html`
<div class="card">
<div class="card-title">${label}</div>
<div class="card-sub">Channel status and configuration.</div>
<div class="card-sub">${t("channels.generic.subtitle")}</div>
${accountCountLabel}
${accounts.length > 0
? html`
@@ -207,15 +208,15 @@ function renderGenericChannelCard(
: html`
<div class="status-list" style="margin-top: 16px;">
<div>
<span class="label">Configured</span>
<span class="label">${t("common.configured")}</span>
<span>${formatNullableBoolean(displayState.configured)}</span>
</div>
<div>
<span class="label">Running</span>
<span class="label">${t("common.running")}</span>
<span>${formatNullableBoolean(displayState.running)}</span>
</div>
<div>
<span class="label">Connected</span>
<span class="label">${t("common.connected")}</span>
<span>${formatNullableBoolean(displayState.connected)}</span>
</div>
</div>
@@ -251,29 +252,29 @@ function hasRecentActivity(account: ChannelAccountSnapshot): boolean {
return Date.now() - account.lastInboundAt < RECENT_ACTIVITY_THRESHOLD_MS;
}
function deriveRunningStatus(account: ChannelAccountSnapshot): "Yes" | "No" | "Active" {
function deriveRunningStatus(account: ChannelAccountSnapshot): string {
if (account.running) {
return "Yes";
return t("common.yes");
}
// If we have recent inbound activity, the channel is effectively running
if (hasRecentActivity(account)) {
return "Active";
return t("common.active");
}
return "No";
return t("common.no");
}
function deriveConnectedStatus(account: ChannelAccountSnapshot): "Yes" | "No" | "Active" | "n/a" {
function deriveConnectedStatus(account: ChannelAccountSnapshot): string {
if (account.connected === true) {
return "Yes";
return t("common.yes");
}
if (account.connected === false) {
return "No";
return t("common.no");
}
// If connected is null/undefined but we have recent activity, show as active
if (hasRecentActivity(account)) {
return "Active";
return t("common.active");
}
return "n/a";
return t("common.na");
}
function renderGenericAccount(account: ChannelAccountSnapshot) {
@@ -288,21 +289,23 @@ function renderGenericAccount(account: ChannelAccountSnapshot) {
</div>
<div class="status-list account-card-status">
<div>
<span class="label">Running</span>
<span class="label">${t("common.running")}</span>
<span>${runningStatus}</span>
</div>
<div>
<span class="label">Configured</span>
<span>${account.configured ? "Yes" : "No"}</span>
<span class="label">${t("common.configured")}</span>
<span>${account.configured ? t("common.yes") : t("common.no")}</span>
</div>
<div>
<span class="label">Connected</span>
<span class="label">${t("common.connected")}</span>
<span>${connectedStatus}</span>
</div>
<div>
<span class="label">Last inbound</span>
<span class="label">${t("common.lastInbound")}</span>
<span
>${account.lastInboundAt ? formatRelativeTimestamp(account.lastInboundAt) : "n/a"}</span
>${account.lastInboundAt
? formatRelativeTimestamp(account.lastInboundAt)
: t("common.na")}</span
>
</div>
${account.lastError

View File

@@ -23,23 +23,29 @@ export function renderWhatsAppCard(params: {
subtitle: "Link WhatsApp Web and monitor connection health.",
accountCountLabel,
statusRows: [
{ label: "Configured", value: formatNullableBoolean(configured) },
{ label: "Linked", value: whatsapp?.linked ? "Yes" : "No" },
{ label: "Running", value: whatsapp?.running ? "Yes" : "No" },
{ label: "Connected", value: whatsapp?.connected ? "Yes" : "No" },
{ label: t("common.configured"), value: formatNullableBoolean(configured) },
{ label: t("common.linked"), value: whatsapp?.linked ? t("common.yes") : t("common.no") },
{ label: t("common.running"), value: whatsapp?.running ? t("common.yes") : t("common.no") },
{
label: "Last connect",
label: t("common.connected"),
value: whatsapp?.connected ? t("common.yes") : t("common.no"),
},
{
label: t("common.lastConnect"),
value: whatsapp?.lastConnectedAt
? formatRelativeTimestamp(whatsapp.lastConnectedAt)
: "n/a",
: t("common.na"),
},
{
label: "Last message",
value: whatsapp?.lastMessageAt ? formatRelativeTimestamp(whatsapp.lastMessageAt) : "n/a",
label: t("common.lastMessage"),
value: whatsapp?.lastMessageAt
? formatRelativeTimestamp(whatsapp.lastMessageAt)
: t("common.na"),
},
{
label: "Auth age",
value: whatsapp?.authAgeMs != null ? formatDurationHuman(whatsapp.authAgeMs) : "n/a",
label: t("common.authAge"),
value:
whatsapp?.authAgeMs != null ? formatDurationHuman(whatsapp.authAgeMs) : t("common.na"),
},
],
lastError: whatsapp?.lastError,
@@ -60,24 +66,24 @@ export function renderWhatsAppCard(params: {
?disabled=${props.whatsappBusy}
@click=${() => props.onWhatsAppStart(false)}
>
${props.whatsappBusy ? "Working" : "Show QR"}
${props.whatsappBusy ? t("common.working") : t("common.showQr")}
</button>
<button
class="btn"
?disabled=${props.whatsappBusy}
@click=${() => props.onWhatsAppStart(true)}
>
Relink
${t("common.relink")}
</button>
<button class="btn" ?disabled=${props.whatsappBusy} @click=${() => props.onWhatsAppWait()}>
Wait for scan
${t("common.waitForScan")}
</button>
<button
class="btn danger"
?disabled=${props.whatsappBusy}
@click=${() => props.onWhatsAppLogout()}
>
Logout
${t("common.logout")}
</button>
<button class="btn" @click=${() => props.onRefresh(true)}>${t("common.refresh")}</button>
</div>`,

View File

@@ -643,7 +643,7 @@ function renderAppearanceSection(props: ConfigProps) {
<span
class="settings-status-dot ${props.connected ? "settings-status-dot--ok" : ""}"
></span>
${props.connected ? "Connected" : "Offline"}
${props.connected ? t("common.connected") : t("common.offline")}
</span>
</div>
${props.assistantName

View File

@@ -1,4 +1,5 @@
import { html, nothing } from "lit";
import { t } from "../../i18n/index.ts";
import type { AppViewState } from "../app-view-state.ts";
export function renderGatewayUrlConfirmation(state: AppViewState) {
@@ -12,19 +13,21 @@ export function renderGatewayUrlConfirmation(state: AppViewState) {
<div class="exec-approval-card">
<div class="exec-approval-header">
<div>
<div class="exec-approval-title">Change Gateway URL</div>
<div class="exec-approval-sub">This will reconnect to a different gateway server</div>
<div class="exec-approval-title">${t("channels.gatewayUrlConfirmation.title")}</div>
<div class="exec-approval-sub">${t("channels.gatewayUrlConfirmation.subtitle")}</div>
</div>
</div>
<div class="exec-approval-command mono">${pendingGatewayUrl}</div>
<div class="callout danger" style="margin-top: 12px;">
Only confirm if you trust this URL. Malicious URLs can compromise your system.
${t("channels.gatewayUrlConfirmation.warning")}
</div>
<div class="exec-approval-actions">
<button class="btn primary" @click=${() => state.handleGatewayUrlConfirm()}>
Confirm
${t("common.confirm")}
</button>
<button class="btn" @click=${() => state.handleGatewayUrlCancel()}>
${t("common.cancel")}
</button>
<button class="btn" @click=${() => state.handleGatewayUrlCancel()}>Cancel</button>
</div>
</div>
</div>

View File

@@ -21,8 +21,8 @@ export function renderInstances(props: InstancesProps) {
<section class="card">
<div class="row" style="justify-content: space-between;">
<div>
<div class="card-title">Connected Instances</div>
<div class="card-sub">Presence beacons from the gateway and clients.</div>
<div class="card-title">${t("instances.title")}</div>
<div class="card-sub">${t("instances.subtitle")}</div>
</div>
<div class="row" style="gap: 8px;">
<button
@@ -31,8 +31,8 @@ export function renderInstances(props: InstancesProps) {
hostsRevealed = !hostsRevealed;
props.onRefresh();
}}
title=${masked ? "Show hosts and IPs" : "Hide hosts and IPs"}
aria-label="Toggle host visibility"
title=${masked ? t("instances.showHosts") : t("instances.hideHosts")}
aria-label=${t("instances.toggleHostVisibility")}
aria-pressed=${!masked}
style="width: 36px; height: 36px;"
>
@@ -51,7 +51,7 @@ export function renderInstances(props: InstancesProps) {
: nothing}
<div class="list" style="margin-top: 16px;">
${props.entries.length === 0
? html` <div class="muted">No instances reported yet.</div> `
? html` <div class="muted">${t("instances.noInstances")}</div> `
: props.entries.map((entry) => renderEntry(entry, masked))}
</div>
</section>
@@ -59,7 +59,10 @@ export function renderInstances(props: InstancesProps) {
}
function renderEntry(entry: PresenceEntry, masked: boolean) {
const lastInput = entry.lastInputSeconds != null ? `${entry.lastInputSeconds}s ago` : "n/a";
const lastInput =
entry.lastInputSeconds != null
? t("common.secondsAgo", { count: String(entry.lastInputSeconds) })
: t("common.na");
const mode = entry.mode ?? "unknown";
const host = entry.host ?? "unknown host";
const ip = entry.ip ?? null;
@@ -95,8 +98,8 @@ function renderEntry(entry: PresenceEntry, masked: boolean) {
</div>
<div class="list-meta">
<div>${formatPresenceAge(entry)}</div>
<div class="muted">Last input ${lastInput}</div>
<div class="muted">Reason ${entry.reason ?? ""}</div>
<div class="muted">${t("instances.lastInput", { time: lastInput })}</div>
<div class="muted">${t("instances.reason", { reason: entry.reason ?? "" })}</div>
</div>
</div>
`;

View File

@@ -112,7 +112,7 @@ function renderDevices(props: NodesProps) {
function renderPendingDevice(req: PendingDevice, props: NodesProps) {
const name = req.displayName?.trim() || req.deviceId;
const age = typeof req.ts === "number" ? formatRelativeTimestamp(req.ts) : "n/a";
const age = typeof req.ts === "number" ? formatRelativeTimestamp(req.ts) : t("common.na");
const roleValue = req.role?.trim() || formatList(req.roles);
const scopesValue = formatList(req.scopes);
const repair = req.isRepair ? " · repair" : "";
@@ -252,30 +252,28 @@ function renderBindings(state: BindingState) {
<section class="card">
<div class="row" style="justify-content: space-between; align-items: center;">
<div>
<div class="card-title">Exec node binding</div>
<div class="card-sub">
Pin agents to a specific node when using <span class="mono">exec host=node</span>.
</div>
<div class="card-title">${t("nodes.binding.execNodeBinding")}</div>
<div class="card-sub">${t("nodes.binding.execNodeBindingSubtitle")}</div>
</div>
<button
class="btn"
?disabled=${state.disabled || !state.configDirty}
@click=${state.onSave}
>
${state.configSaving ? "Saving" : "Save"}
${state.configSaving ? t("common.saving") : t("common.save")}
</button>
</div>
${state.formMode === "raw"
? html`
<div class="callout warn" style="margin-top: 12px">
Switch the Config tab to <strong>Form</strong> mode to edit bindings here.
${t("nodes.binding.formModeHint")}
</div>
`
: nothing}
${!state.ready
? html`<div class="row" style="margin-top: 12px; gap: 12px;">
<div class="muted">Load config to edit bindings.</div>
<div class="muted">${t("nodes.binding.loadConfigHint")}</div>
<button class="btn" ?disabled=${state.configLoading} @click=${state.onLoadConfig}>
${state.configLoading ? t("common.loading") : t("common.loadConfig")}
</button>
@@ -284,12 +282,12 @@ function renderBindings(state: BindingState) {
<div class="list" style="margin-top: 16px;">
<div class="list-item">
<div class="list-main">
<div class="list-title">Default binding</div>
<div class="list-sub">Used when agents do not override a node binding.</div>
<div class="list-title">${t("nodes.binding.defaultBinding")}</div>
<div class="list-sub">${t("nodes.binding.defaultBindingHint")}</div>
</div>
<div class="list-meta">
<label class="field">
<span>Node</span>
<span>${t("nodes.binding.node")}</span>
<select
?disabled=${state.disabled || !supportsBinding}
@change=${(event: Event) => {

View File

@@ -425,7 +425,7 @@ function renderRow(
disabled: boolean,
onNavigateToChat?: (sessionKey: string) => void,
) {
const updated = row.updatedAt ? formatRelativeTimestamp(row.updatedAt) : "n/a";
const updated = row.updatedAt ? formatRelativeTimestamp(row.updatedAt) : t("common.na");
const rawThinking = row.thinkingLevel ?? "";
const isBinaryThinking = isBinaryThinkingProvider(row.modelProvider);
const thinking = resolveThinkLevelDisplay(rawThinking, isBinaryThinking);