- Add i18n to channels.slack.ts with status labels, probe messages - Add i18n to channels.signal.ts with status labels, probe messages - Add i18n to channels.imessage.ts with status labels, probe messages - Add translations to en-US and zh-TW locales
682 lines
18 KiB
TypeScript
682 lines
18 KiB
TypeScript
/**
|
|
* English (US) translations - Baseline
|
|
*/
|
|
export const enUS = {
|
|
// Common
|
|
common: {
|
|
loading: "Loading…",
|
|
refresh: "Refresh",
|
|
save: "Save",
|
|
saving: "Saving…",
|
|
apply: "Apply",
|
|
applying: "Applying…",
|
|
cancel: "Cancel",
|
|
delete: "Delete",
|
|
edit: "Edit",
|
|
close: "Close",
|
|
yes: "Yes",
|
|
no: "No",
|
|
ok: "OK",
|
|
error: "Error",
|
|
success: "Success",
|
|
warning: "Warning",
|
|
info: "Info",
|
|
enabled: "Enabled",
|
|
disabled: "Disabled",
|
|
configured: "Configured",
|
|
connected: "Connected",
|
|
disconnected: "Disconnected",
|
|
running: "Running",
|
|
stopped: "Stopped",
|
|
active: "Active",
|
|
inactive: "Inactive",
|
|
unknown: "Unknown",
|
|
none: "None",
|
|
all: "All",
|
|
search: "Search",
|
|
filter: "Filter",
|
|
export: "Export",
|
|
import: "Import",
|
|
copy: "Copy",
|
|
copied: "Copied!",
|
|
na: "n/a",
|
|
optional: "(optional)",
|
|
required: "Required",
|
|
inherit: "inherit",
|
|
actions: "Actions",
|
|
},
|
|
|
|
// App header and branding
|
|
app: {
|
|
title: "MOLTBOT",
|
|
subtitle: "Gateway Dashboard",
|
|
health: "Health",
|
|
offline: "Offline",
|
|
expandSidebar: "Expand sidebar",
|
|
collapseSidebar: "Collapse sidebar",
|
|
},
|
|
|
|
// Navigation
|
|
nav: {
|
|
groups: {
|
|
chat: "Chat",
|
|
control: "Control",
|
|
agent: "Agent",
|
|
settings: "Settings",
|
|
resources: "Resources",
|
|
},
|
|
tabs: {
|
|
overview: "Overview",
|
|
channels: "Channels",
|
|
instances: "Instances",
|
|
sessions: "Sessions",
|
|
cron: "Cron Jobs",
|
|
skills: "Skills",
|
|
nodes: "Nodes",
|
|
chat: "Chat",
|
|
config: "Config",
|
|
debug: "Debug",
|
|
logs: "Logs",
|
|
},
|
|
subtitles: {
|
|
overview: "Gateway status, entry points, and a fast health read.",
|
|
channels: "Manage channels and settings.",
|
|
instances: "Presence beacons from connected clients and nodes.",
|
|
sessions: "Inspect active sessions and adjust per-session defaults.",
|
|
cron: "Schedule wakeups and recurring agent runs.",
|
|
skills: "Manage skill availability and API key injection.",
|
|
nodes: "Paired devices, capabilities, and command exposure.",
|
|
chat: "Direct gateway chat session for quick interventions.",
|
|
config: "Edit ~/.clawdbot/moltbot.json safely.",
|
|
debug: "Gateway snapshots, events, and manual RPC calls.",
|
|
logs: "Live tail of the gateway file logs.",
|
|
},
|
|
docs: "Docs",
|
|
docsTooltip: "Docs (opens in new tab)",
|
|
},
|
|
|
|
// Overview page
|
|
overview: {
|
|
gatewayAccess: "Gateway Access",
|
|
gatewayAccessDesc: "Where the dashboard connects and how it authenticates.",
|
|
websocketUrl: "WebSocket URL",
|
|
gatewayToken: "Gateway Token",
|
|
password: "Password (not stored)",
|
|
passwordPlaceholder: "system or shared password",
|
|
defaultSessionKey: "Default Session Key",
|
|
connect: "Connect",
|
|
connectNote: "Click Connect to apply connection changes.",
|
|
|
|
snapshot: "Snapshot",
|
|
snapshotDesc: "Latest gateway handshake information.",
|
|
status: "Status",
|
|
uptime: "Uptime",
|
|
tickInterval: "Tick Interval",
|
|
lastChannelsRefresh: "Last Channels Refresh",
|
|
|
|
authRequired: "This gateway requires auth. Add a token or password, then click Connect.",
|
|
authFailed: "Auth failed. Re-copy a tokenized URL with",
|
|
authDocsLink: "Docs: Control UI auth",
|
|
tokenizedUrlCmd: "moltbot dashboard --no-open",
|
|
generateTokenCmd: "moltbot doctor --generate-gateway-token",
|
|
thenClickConnect: ", or update the token, then click Connect.",
|
|
|
|
insecureContext: "This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open",
|
|
insecureContextLocal: "on the gateway host.",
|
|
insecureContextConfig: "If you must stay on HTTP, set",
|
|
insecureContextConfigValue: "gateway.controlUi.allowInsecureAuth: true",
|
|
insecureContextNote: "(token-only).",
|
|
tailscaleDocsLink: "Docs: Tailscale Serve",
|
|
insecureHttpDocsLink: "Docs: Insecure HTTP",
|
|
|
|
channelsHint: "Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.",
|
|
|
|
instancesCard: "Instances",
|
|
instancesDesc: "Presence beacons in the last 5 minutes.",
|
|
sessionsCard: "Sessions",
|
|
sessionsDesc: "Recent session keys tracked by the gateway.",
|
|
cronCard: "Cron",
|
|
nextWake: "Next wake",
|
|
|
|
notes: "Notes",
|
|
notesDesc: "Quick reminders for remote control setups.",
|
|
tailscaleServe: "Tailscale serve",
|
|
tailscaleServeDesc: "Prefer serve mode to keep the gateway on loopback with tailnet auth.",
|
|
sessionHygiene: "Session hygiene",
|
|
sessionHygieneDesc: "Use /new or sessions.patch to reset context.",
|
|
cronReminders: "Cron reminders",
|
|
cronRemindersDesc: "Use isolated sessions for recurring runs.",
|
|
},
|
|
|
|
// Chat page
|
|
chat: {
|
|
message: "Message",
|
|
messagePlaceholder: "Message (↩ to send, Shift+↩ for line breaks, paste images)",
|
|
messagePlaceholderWithImages: "Add a message or paste more images...",
|
|
connectToChat: "Connect to the gateway to start chatting…",
|
|
send: "Send",
|
|
queue: "Queue",
|
|
stop: "Stop",
|
|
newSession: "New session",
|
|
loadingChat: "Loading chat…",
|
|
compacting: "Compacting context...",
|
|
compacted: "Context compacted",
|
|
queued: "Queued",
|
|
removeQueued: "Remove queued message",
|
|
exitFocusMode: "Exit focus mode",
|
|
removeAttachment: "Remove attachment",
|
|
attachmentPreview: "Attachment preview",
|
|
showingLast: "Showing last {{count}} messages ({{hidden}} hidden).",
|
|
image: "Image",
|
|
},
|
|
|
|
// Channels page
|
|
channels: {
|
|
title: "Channels",
|
|
health: "Channel health",
|
|
healthDesc: "Channel status snapshots from the gateway.",
|
|
noSnapshot: "No snapshot yet.",
|
|
statusAndConfig: "Channel status and configuration.",
|
|
lastInbound: "Last inbound",
|
|
|
|
// Status labels
|
|
labels: {
|
|
configured: "Configured",
|
|
running: "Running",
|
|
connected: "Connected",
|
|
},
|
|
|
|
// General
|
|
accounts: "Accounts",
|
|
|
|
// WhatsApp
|
|
whatsapp: {
|
|
title: "WhatsApp",
|
|
desc: "Link WhatsApp Web and monitor connection health.",
|
|
start: "Start",
|
|
relink: "Relink",
|
|
logout: "Logout",
|
|
scanQr: "Scan QR with WhatsApp on your phone.",
|
|
linking: "Linking…",
|
|
waitingForQr: "Waiting for QR code…",
|
|
notConfigured: "Not configured.",
|
|
linked: "Linked",
|
|
lastConnect: "Last connect",
|
|
authAge: "Auth age",
|
|
showQr: "Show QR",
|
|
waitForScan: "Wait for scan",
|
|
working: "Working…",
|
|
},
|
|
|
|
// Telegram
|
|
telegram: {
|
|
title: "Telegram",
|
|
desc: "Bot status and channel configuration.",
|
|
mode: "Mode",
|
|
lastStart: "Last start",
|
|
lastProbe: "Last probe",
|
|
probe: "Probe",
|
|
probeOk: "ok",
|
|
probeFailed: "failed",
|
|
},
|
|
|
|
// Discord
|
|
discord: {
|
|
title: "Discord",
|
|
desc: "Bot status and channel configuration.",
|
|
lastStart: "Last start",
|
|
lastProbe: "Last probe",
|
|
probe: "Probe",
|
|
probeOk: "ok",
|
|
probeFailed: "failed",
|
|
},
|
|
|
|
// Slack
|
|
slack: {
|
|
title: "Slack",
|
|
desc: "Socket mode status and channel configuration.",
|
|
lastStart: "Last start",
|
|
lastProbe: "Last probe",
|
|
probe: "Probe",
|
|
probeOk: "ok",
|
|
probeFailed: "failed",
|
|
},
|
|
|
|
// Signal
|
|
signal: {
|
|
title: "Signal",
|
|
desc: "signal-cli status and channel configuration.",
|
|
baseUrl: "Base URL",
|
|
lastStart: "Last start",
|
|
lastProbe: "Last probe",
|
|
probe: "Probe",
|
|
probeOk: "ok",
|
|
probeFailed: "failed",
|
|
},
|
|
|
|
// iMessage
|
|
imessage: {
|
|
title: "iMessage",
|
|
desc: "macOS bridge status and channel configuration.",
|
|
lastStart: "Last start",
|
|
lastProbe: "Last probe",
|
|
probe: "Probe",
|
|
probeOk: "ok",
|
|
probeFailed: "failed",
|
|
},
|
|
|
|
// Google Chat
|
|
googlechat: {
|
|
title: "Google Chat",
|
|
desc: "Google Chat via service account.",
|
|
},
|
|
|
|
// Nostr
|
|
nostr: {
|
|
title: "Nostr",
|
|
desc: "Nostr protocol via NIP-04 DMs.",
|
|
editProfile: "Edit Profile",
|
|
profileForm: {
|
|
title: "Edit Nostr Profile",
|
|
name: "Display Name",
|
|
about: "About",
|
|
picture: "Picture URL",
|
|
nip05: "NIP-05 Identifier",
|
|
lud16: "Lightning Address",
|
|
banner: "Banner URL",
|
|
website: "Website",
|
|
showAdvanced: "Show advanced fields",
|
|
hideAdvanced: "Hide advanced fields",
|
|
importFromRelays: "Import from relays",
|
|
importing: "Importing…",
|
|
},
|
|
},
|
|
|
|
// Config section
|
|
config: {
|
|
title: "Channel Configuration",
|
|
saveChanges: "Save Changes",
|
|
reloadConfig: "Reload Config",
|
|
unsavedChanges: "Unsaved changes",
|
|
},
|
|
},
|
|
|
|
// Sessions page
|
|
sessions: {
|
|
title: "Sessions",
|
|
desc: "Active session keys and per-session overrides.",
|
|
activeWithin: "Active within (minutes)",
|
|
limit: "Limit",
|
|
includeGlobal: "Include global",
|
|
includeUnknown: "Include unknown",
|
|
store: "Store",
|
|
noSessions: "No sessions found.",
|
|
|
|
columns: {
|
|
key: "Key",
|
|
label: "Label",
|
|
kind: "Kind",
|
|
updated: "Updated",
|
|
tokens: "Tokens",
|
|
thinking: "Thinking",
|
|
verbose: "Verbose",
|
|
reasoning: "Reasoning",
|
|
actions: "Actions",
|
|
},
|
|
|
|
levels: {
|
|
off: "off",
|
|
minimal: "minimal",
|
|
low: "low",
|
|
medium: "medium",
|
|
high: "high",
|
|
on: "on",
|
|
stream: "stream",
|
|
offExplicit: "off (explicit)",
|
|
},
|
|
},
|
|
|
|
// Cron page
|
|
cron: {
|
|
title: "Cron Jobs",
|
|
desc: "Scheduled agent wakeups and recurring tasks.",
|
|
noJobs: "No jobs yet.",
|
|
addJob: "Add job",
|
|
runNow: "Run",
|
|
remove: "Remove",
|
|
enable: "Enable",
|
|
disable: "Disable",
|
|
runs: "Runs",
|
|
lastRun: "Last run",
|
|
nextRun: "Next run",
|
|
|
|
// Scheduler card
|
|
scheduler: "Scheduler",
|
|
schedulerDesc: "Gateway-owned cron scheduler status.",
|
|
jobs: "Jobs",
|
|
|
|
// New job form
|
|
newJob: "New Job",
|
|
newJobDesc: "Create a scheduled wakeup or agent run.",
|
|
name: "Name",
|
|
description: "Description",
|
|
agentId: "Agent ID",
|
|
agentIdPlaceholder: "default",
|
|
scheduleKind: "Schedule",
|
|
everyLabel: "Every",
|
|
atLabel: "At",
|
|
cronLabel: "Cron",
|
|
runAt: "Run at",
|
|
every: "Every",
|
|
unit: "Unit",
|
|
minutes: "Minutes",
|
|
hours: "Hours",
|
|
days: "Days",
|
|
expression: "Expression",
|
|
timezone: "Timezone (optional)",
|
|
session: "Session",
|
|
main: "Main",
|
|
isolated: "Isolated",
|
|
wakeMode: "Wake mode",
|
|
nextHeartbeat: "Next heartbeat",
|
|
now: "Now",
|
|
payload: "Payload",
|
|
systemEvent: "System event",
|
|
agentTurn: "Agent turn",
|
|
systemText: "System text",
|
|
agentMessage: "Agent message",
|
|
deliver: "Deliver",
|
|
to: "To",
|
|
toPlaceholder: "+1555… or chat id",
|
|
timeoutSeconds: "Timeout (seconds)",
|
|
postToMainPrefix: "Post to main prefix",
|
|
|
|
// Jobs list
|
|
jobsList: "Jobs",
|
|
jobsListDesc: "All scheduled jobs stored in the gateway.",
|
|
|
|
// Run history
|
|
runHistory: "Run history",
|
|
runHistoryDesc: "Latest runs for",
|
|
selectJob: "Select a job to inspect run history.",
|
|
noRuns: "No runs yet.",
|
|
|
|
form: {
|
|
schedule: "Schedule (cron)",
|
|
message: "Message",
|
|
sessionKey: "Session Key",
|
|
channel: "Channel",
|
|
channelPlaceholder: "Select channel",
|
|
enabled: "Enabled",
|
|
},
|
|
|
|
status: {
|
|
enabled: "Cron Enabled",
|
|
disabled: "Cron Disabled",
|
|
nextWake: "Next wake",
|
|
},
|
|
},
|
|
|
|
// Skills page
|
|
skills: {
|
|
title: "Skills",
|
|
desc: "Manage bundled and installed skills.",
|
|
noSkills: "No skills found.",
|
|
filter: "Filter skills",
|
|
shown: "shown",
|
|
apiKey: "API key",
|
|
saveKey: "Save key",
|
|
install: "Install",
|
|
installing: "Installing…",
|
|
enabled: "Enabled",
|
|
disabled: "Disabled",
|
|
toggle: "Toggle",
|
|
keySaved: "API key saved",
|
|
keyError: "Failed to save API key",
|
|
eligible: "eligible",
|
|
blocked: "blocked",
|
|
missing: "Missing",
|
|
reason: "Reason",
|
|
blockedByAllowlist: "blocked by allowlist",
|
|
},
|
|
|
|
// Nodes page
|
|
nodes: {
|
|
title: "Nodes",
|
|
desc: "Paired devices and live links.",
|
|
noNodes: "No nodes found.",
|
|
devices: "Devices",
|
|
devicesDesc: "Pairing requests + role tokens.",
|
|
noDevices: "No paired devices.",
|
|
approve: "Approve",
|
|
reject: "Reject",
|
|
revoke: "Revoke",
|
|
rotate: "Rotate",
|
|
pending: "Pending",
|
|
paired: "Paired",
|
|
approved: "Approved",
|
|
offline: "offline",
|
|
tokens: "Tokens",
|
|
tokensNone: "Tokens: none",
|
|
role: "role",
|
|
requested: "requested",
|
|
repair: "repair",
|
|
active: "active",
|
|
revoked: "revoked",
|
|
scopes: "scopes",
|
|
roles: "roles",
|
|
|
|
bindings: {
|
|
title: "Exec node binding",
|
|
desc: "Pin agents to a specific node when using",
|
|
default: "Default binding",
|
|
defaultDesc: "Used when agents do not override a node binding.",
|
|
agent: "Agent",
|
|
node: "Node",
|
|
anyNode: "Any node",
|
|
useDefault: "Use default",
|
|
save: "Save",
|
|
loadConfig: "Load config",
|
|
loadConfigNote: "Load config to edit bindings.",
|
|
noNodesAvailable: "No nodes with system.run available.",
|
|
defaultAgent: "default agent",
|
|
usesDefault: "uses default",
|
|
override: "override",
|
|
switchToForm: "Switch the Config tab to Form mode to edit bindings here.",
|
|
},
|
|
|
|
approvals: {
|
|
title: "Exec approvals",
|
|
desc: "Allowlist and approval policy for",
|
|
target: "Target",
|
|
targetDesc: "Gateway edits local approvals; node edits the selected node.",
|
|
host: "Host",
|
|
gateway: "Gateway",
|
|
selectNode: "Select node",
|
|
noNodesYet: "No nodes advertise exec approvals yet.",
|
|
scope: "Scope",
|
|
defaults: "Defaults",
|
|
security: "Security",
|
|
securityDesc: "Default security mode.",
|
|
mode: "Mode",
|
|
deny: "Deny",
|
|
allowlist: "Allowlist",
|
|
full: "Full",
|
|
ask: "Ask",
|
|
askDesc: "Default prompt policy.",
|
|
off: "Off",
|
|
onMiss: "On miss",
|
|
always: "Always",
|
|
askFallback: "Ask fallback",
|
|
askFallbackDesc: "Applied when the UI prompt is unavailable.",
|
|
fallback: "Fallback",
|
|
autoAllowSkills: "Auto-allow skill CLIs",
|
|
autoAllowSkillsDesc: "Allow skill executables listed by the Gateway.",
|
|
usingDefault: "Using default",
|
|
addPattern: "Add pattern",
|
|
allowlistTitle: "Allowlist",
|
|
allowlistDesc: "Case-insensitive glob patterns.",
|
|
noAllowlist: "No allowlist entries yet.",
|
|
pattern: "Pattern",
|
|
newPattern: "New pattern",
|
|
lastUsed: "Last used",
|
|
never: "never",
|
|
remove: "Remove",
|
|
loadApprovals: "Load approvals",
|
|
loadApprovalsNote: "Load exec approvals to edit allowlists.",
|
|
},
|
|
},
|
|
|
|
// Config page
|
|
config: {
|
|
title: "Settings",
|
|
desc: "Configuration editor with schema validation.",
|
|
valid: "valid",
|
|
invalid: "invalid",
|
|
searchSettings: "Search settings...",
|
|
allSettings: "All Settings",
|
|
form: "Form",
|
|
raw: "Raw",
|
|
rawJson5: "Raw JSON5",
|
|
reload: "Reload",
|
|
update: "Update",
|
|
updating: "Updating…",
|
|
noChanges: "No changes",
|
|
unsavedChanges: "Unsaved changes",
|
|
unsavedCount: "{{count}} unsaved change",
|
|
unsavedCountPlural: "{{count}} unsaved changes",
|
|
viewPending: "View {{count}} pending change",
|
|
viewPendingPlural: "View {{count}} pending changes",
|
|
loadingSchema: "Loading schema…",
|
|
formUnsafe: "Form view can't safely edit some fields. Use Raw to avoid losing config entries.",
|
|
|
|
sections: {
|
|
env: "Environment",
|
|
update: "Updates",
|
|
agents: "Agents",
|
|
auth: "Authentication",
|
|
channels: "Channels",
|
|
messages: "Messages",
|
|
commands: "Commands",
|
|
hooks: "Hooks",
|
|
skills: "Skills",
|
|
tools: "Tools",
|
|
gateway: "Gateway",
|
|
wizard: "Setup Wizard",
|
|
},
|
|
},
|
|
|
|
// Debug page
|
|
debug: {
|
|
title: "Debug",
|
|
desc: "Gateway internals and manual RPC testing.",
|
|
status: "Status",
|
|
health: "Health",
|
|
models: "Models",
|
|
modelsDesc: "Catalog from models.list.",
|
|
heartbeat: "Heartbeat",
|
|
lastHeartbeat: "Last heartbeat",
|
|
events: "Events",
|
|
eventLog: "Event Log",
|
|
eventLogDesc: "Latest gateway events.",
|
|
noEvents: "No events yet.",
|
|
rpcCall: "RPC Call",
|
|
manualRpc: "Manual RPC",
|
|
manualRpcDesc: "Send a raw gateway method with JSON params.",
|
|
method: "Method",
|
|
params: "Params",
|
|
paramsJson: "Params (JSON)",
|
|
call: "Call",
|
|
result: "Result",
|
|
noResult: "No result yet.",
|
|
snapshots: "Snapshots",
|
|
snapshotsDesc: "Status, health, and heartbeat data.",
|
|
securityAudit: "Security audit",
|
|
critical: "critical",
|
|
warnings: "warnings",
|
|
noCritical: "No critical issues",
|
|
runAuditCmd: "Run for details.",
|
|
},
|
|
|
|
// Logs page
|
|
logs: {
|
|
title: "Logs",
|
|
desc: "Gateway file logs (JSONL).",
|
|
filter: "Filter",
|
|
searchLogs: "Search logs",
|
|
autoFollow: "Auto-follow",
|
|
file: "File",
|
|
truncated: "Log output truncated; showing latest chunk.",
|
|
noEntries: "No log entries.",
|
|
exportFiltered: "Export filtered",
|
|
exportVisible: "Export visible",
|
|
|
|
levels: {
|
|
trace: "trace",
|
|
debug: "debug",
|
|
info: "info",
|
|
warn: "warn",
|
|
error: "error",
|
|
fatal: "fatal",
|
|
},
|
|
},
|
|
|
|
// Instances page
|
|
instances: {
|
|
title: "Instances",
|
|
desc: "Presence beacons from connected gateways and nodes.",
|
|
noInstances: "No presence beacons found.",
|
|
id: "ID",
|
|
type: "Type",
|
|
version: "Version",
|
|
lastSeen: "Last Seen",
|
|
},
|
|
|
|
// Exec approval prompt
|
|
execApproval: {
|
|
title: "Execution Approval Required",
|
|
command: "Command",
|
|
agent: "Agent",
|
|
allowOnce: "Allow Once",
|
|
allowAlways: "Allow Always",
|
|
deny: "Deny",
|
|
},
|
|
|
|
// Theme
|
|
theme: {
|
|
toggle: "Toggle theme",
|
|
light: "Light",
|
|
dark: "Dark",
|
|
system: "System",
|
|
},
|
|
|
|
// Time/date formatting
|
|
time: {
|
|
justNow: "just now",
|
|
minutesAgo: "{{count}}m ago",
|
|
hoursAgo: "{{count}}h ago",
|
|
daysAgo: "{{count}}d ago",
|
|
never: "never",
|
|
},
|
|
|
|
// Markdown sidebar
|
|
sidebar: {
|
|
close: "Close",
|
|
viewRaw: "View raw",
|
|
error: "Error loading content",
|
|
},
|
|
|
|
// Errors
|
|
errors: {
|
|
connectionFailed: "Connection failed",
|
|
loadFailed: "Failed to load",
|
|
saveFailed: "Failed to save",
|
|
unknownError: "An unknown error occurred",
|
|
networkError: "Network error",
|
|
timeout: "Request timed out",
|
|
unauthorized: "Unauthorized",
|
|
forbidden: "Forbidden",
|
|
notFound: "Not found",
|
|
},
|
|
};
|