openclaw/ui/src/i18n/locales/en-US.ts
Claude d0a086c921
feat(ui): translate Slack, Signal, iMessage channel views
- 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
2026-01-28 23:54:09 +00:00

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",
},
};