archipelago 095a76cd20 fix(bitcoin): bulletproof multi-version switching (Knots & Core)
Three stacked bugs made "switch version" silently fail / crash-loop, and
the data-access mismatch corrupted a node's index during recovery attempts.

Backend renderer:
- sync_quadlet_unit ignored the per-app pinned version and re-rendered the
  quadlet with the manifest's :latest every reconcile tick, reverting any
  switch. Factor the install-time catalog/pin resolution into a shared
  resolve_catalog_image() and call it in BOTH install_fresh and
  sync_quadlet_unit.
- The renderer folded manifest `entrypoint: ["sh","-lc"]` into Exec=, which
  only worked when the image entrypoint was a passthrough shell wrapper. The
  versioned images use ENTRYPOINT ["bitcoind"], so Exec=sh -lc ... became
  `bitcoind sh -lc ...` and crash-looped. Emit a real Entrypoint= override;
  exec_changed now also compares Entrypoint=.

Images:
- Build all bitcoin images (Core + Knots, every version) as container-root
  (USER removed) like the legacy :latest image. Chain data is owned by the
  data_uid (container uid 102); root reads it via CAP_DAC_OVERRIDE (granted in
  the manifest). A non-root USER (the previous uid 1000) can't read existing
  chain data → "Error initializing block database". Still fully rootless:
  container-root maps to the unprivileged host service user.

Catalog:
- bitcoin-knots versions[]: 29.3.knots20260508/20260507/20260210 +
  29.2.knots20251110, "latest" tracking newest.
- bitcoin-core versions[]: add 29.2 + a "latest" entry. All images rebuilt
  root and published to the mirror.

Frontend:
- AppSidebar version dropdown: rename the latest option to "Always use the
  latest version" (no v prefix), fix right padding, and guarantee the current
  selection matches a real option (was rendering blank).
- New InstallVersionModal: full-screen version chooser shown from the App
  Store / Discover install button for multi-version apps (Bitcoin Knots/Core),
  app icon + "Install <name>", latest pre-selected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 05:46:04 -04:00

802 lines
34 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"common": {
"cancel": "Cancel",
"save": "Save",
"close": "Close",
"copy": "Copy",
"copied": "Copied",
"copiedBang": "Copied!",
"loading": "Loading...",
"retry": "Retry",
"refresh": "Refresh",
"install": "Install",
"installing": "Installing...",
"uninstall": "Uninstall",
"uninstalling": "Uninstalling...",
"start": "Start",
"stop": "Stop",
"restart": "Restart",
"launch": "Launch",
"starting": "Starting...",
"stopping": "Stopping...",
"update": "Update",
"updating": "Updating...",
"send": "Send",
"sending": "Sending...",
"back": "Back",
"done": "Done",
"manage": "Manage",
"settings": "Settings",
"connect": "Connect",
"connecting": "Connecting...",
"disconnect": "Disconnect",
"running": "running",
"stopped": "stopped",
"exited": "exited",
"healthy": "Healthy",
"elevated": "Elevated",
"critical": "Critical",
"connected": "Connected",
"disconnected": "Disconnected",
"active": "Active",
"inactive": "Inactive",
"synced": "Synced",
"enabled": "Enabled",
"disabled": "Disabled",
"dismiss": "Dismiss",
"apply": "Apply",
"configure": "Configure",
"export": "Export",
"delete": "Delete",
"remove": "Remove",
"error": "Error",
"version": "Version",
"status": "Status",
"category": "Category",
"developer": "Developer",
"license": "License",
"never": "Never",
"notAvailable": "Not Available",
"goBack": "Go back",
"skipToContent": "Skip to main content",
"continue": "Continue",
"verify": "Verify",
"create": "Create",
"restore": "Restore",
"disabling": "Disabling...",
"creating": "Creating...",
"restoring": "Restoring...",
"manageUpdates": "Manage Updates",
"enableAll": "Enable All",
"networkDiagnostics": "Network Diagnostics",
"network": "Network",
"saveConfiguration": "Save Configuration",
"sendTest": "Send Test"
},
"login": {
"title": "Welcome to Archipelago",
"setupTitle": "Set Up Your Node",
"twoFactorTitle": "Two-Factor Authentication",
"password": "Password",
"confirmPassword": "Confirm Password",
"enterPasswordPlaceholder": "Enter your password",
"enterPasswordSetup": "Enter a password (min 8 characters)",
"confirmPasswordPlaceholder": "Confirm your password",
"setupButton": "Set Up Node",
"settingUp": "Setting up...",
"loginButton": "Login",
"loggingIn": "Logging in...",
"verifyButton": "Verify",
"verifying": "Verifying...",
"useAuthCode": "Use authenticator code",
"useBackupCode": "Use a backup code instead",
"totpInstruction": "Enter the 6-digit code from your authenticator app",
"totpPlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"serverStarting": "Server starting up...",
"replayIntro": "Replay Intro",
"onboarding": "Onboarding",
"resetting": "Resetting...",
"recoveryNote": "Password recovery requires SSH access to the server.",
"errorMinLength": "Password must be at least 8 characters",
"errorMismatch": "Passwords do not match",
"errorServerStarting": "Server is starting up. Please try again in a moment.",
"errorSetupFailed": "Setup failed. Please try again.",
"errorLoginFailed": "Login failed. Please check your password.",
"errorInvalidCode": "Invalid code. Please try again.",
"totpLabel": "Two-factor authentication code"
},
"home": {
"title": "Welcome Noderunner",
"subtitle": "Here's an overview of your sovereign life",
"dashboardTab": "Dashboard",
"setupTab": "Setup",
"myApps": "My Apps",
"myAppsDesc": "Manage your installed applications",
"recommendedApps": "Recommended Apps",
"recommendedAppsDesc": "Add useful App Store apps to your Home screen",
"cloud": "Cloud",
"cloudDesc": "Cloud services and storage",
"network": "Network",
"networkDesc": "Network infrastructure and mesh services",
"web5": "Web5",
"web5Desc": "Decentralized identity and data protocols",
"system": "System",
"quickStartGoals": "Quick Start Goals",
"quickStartDesc": "Not sure where to start? Try a guided setup.",
"installed": "Installed",
"runningLabel": "Running",
"storageUsed": "Storage Used",
"folders": "Folders",
"servicesStatus": "Services Status",
"connectivity": "Connectivity",
"runningApps": "Running Apps",
"didStatus": "DID Status",
"dwnSync": "DWN Sync",
"credentials": "Credentials",
"cpu": "CPU",
"ram": "RAM",
"disk": "Disk",
"browseStore": "Browse Store",
"manageApps": "Manage Apps",
"viewFolders": "View Folders",
"uploadFiles": "Upload Files",
"manageNetwork": "Manage Network",
"manageWeb5": "Manage Web5",
"openAI": "Open AI Assistant",
"noApps": "No Apps",
"allRunning": "All Running",
"systemMonitoring": "System monitoring",
"updateAvailable": "Update Available: v{version}",
"updateNow": "Update Now",
"goToApps": "Go to Apps",
"goToAppStore": "Go to App Store",
"goToCloud": "Go to Cloud",
"goToNetwork": "Go to Network",
"goToWeb5": "Go to Web5",
"goToSettings": "Go to Settings"
},
"apps": {
"title": "My Apps",
"subtitle": "Manage your installed applications",
"searchPlaceholder": "Search installed apps...",
"noAppsTitle": "No Apps Installed",
"noAppsMessage": "Get started by browsing the app store",
"browseAppStore": "Browse App Store",
"noResults": "No apps matching \"{query}\"",
"uninstallTitle": "Uninstall App?",
"uninstallConfirm": "Are you sure you want to uninstall {name}? This will remove the app and stop its container.",
"deleteAppDataLabel": "Delete app data and reset it",
"deleteAppDataHelp": "Check this to remove the app's data, backups, and persistent files. Leave it off to reinstall later without starting over.",
"dismissError": "Dismiss error",
"searchLabel": "Search installed apps"
},
"settings": {
"title": "Settings",
"subtitle": "Configure your Archipelago experience",
"account": "Account",
"interfaceMode": "Interface Mode",
"claudeAuth": "Claude Authentication",
"aiDataAccess": "AI Data Access",
"serverName": "Hostname",
"sessionStatus": "Session Status",
"yourDid": "Node DID",
"onionAddress": "Node .onion Address",
"loggedIn": "Currently logged in",
"didHelper": "Decentralized identifier for passwordless auth",
"onionHelper": "Onion address for node interface and peer discovery over Tor",
"changePassword": "Set Password",
"enable2fa": "Enable 2FA",
"disable2fa": "Disable 2FA",
"logout": "Logout",
"loggingOut": "Logging out...",
"twoFactorAuth": "Two-Factor Authentication",
"twoFaProtect": "Protect your account with an authenticator app",
"changePasswordTitle": "Set Password",
"changePasswordDesc": "Set a new password for web login and SSH access. Default password is 'password123'. Use a strong password (12+ chars, upper, lower, digit, special).",
"currentPassword": "Current Password",
"newPassword": "New Password",
"confirmNewPassword": "Confirm New Password",
"passwordPlaceholder": "12+ chars, upper, lower, digit, special",
"updateSshCheckbox": "Also update SSH password (recommended)",
"updatePassword": "Update Password",
"updatingPassword": "Updating...",
"setup2faTitle": "Two-Factor Authentication",
"setup2faPasswordPrompt": "Enter your password to begin setup.",
"scanQrCode": "Scan QR Code",
"scanQrInstruction": "Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.), then enter the 6-digit code.",
"manualEntryKey": "Manual entry key:",
"verifyAndEnable": "Verify & Enable",
"saveBackupCodes": "Save Your Backup Codes",
"backupCodesInstruction": "Store these codes safely. Each can be used once if you lose access to your authenticator app.",
"copyAllCodes": "Copy All Codes",
"disable2faTitle": "Disable Two-Factor Authentication",
"disable2faDesc": "Enter your password and a current TOTP code to disable 2FA.",
"authenticatorCode": "Authenticator Code",
"webhooks": "Webhooks",
"webhooksDesc": "Get notified when important events happen on your node",
"webhookUrl": "Webhook URL",
"webhookUrlPlaceholder": "https://example.com/webhook",
"webhookSecret": "Secret (for HMAC signing)",
"webhookSecretPlaceholder": "Optional shared secret",
"webhookEvents": "Events",
"containerCrash": "Container Crash",
"updateAvailableEvent": "Update Available",
"diskWarning": "Disk Warning",
"backupComplete": "Backup Complete",
"saveWebhook": "Save",
"savingWebhook": "Saving...",
"testWebhook": "Test",
"testingWebhook": "Testing...",
"webhookSaved": "Webhook configuration saved",
"webhookTestSent": "Test webhook sent successfully",
"systemUpdates": "System Updates",
"backup": "Backup & Restore",
"backupDesc": "Back up your node data to external storage",
"createBackup": "Create Backup",
"creatingBackup": "Creating...",
"restoreBackup": "Restore Backup",
"deleteBackup": "Delete backup",
"backupCreated": "Backup created successfully",
"sendMessage": "Send Message",
"sendMessageTitle": "Send Broadcast Message",
"messagePlaceholder": "Enter your message...",
"messageSent": "Message sent",
"claudeConnected": "Connected to Claude",
"claudeDisconnected": "Not connected",
"claudeApiKey": "API Key",
"claudeApiKeyPlaceholder": "Enter your Anthropic API key",
"claudeSave": "Save Key",
"advancedMode": "Advanced Mode",
"beginnerMode": "Beginner Mode",
"advancedModeDesc": "Show all system controls and developer tools",
"beginnerModeDesc": "Simplified interface with guided experience",
"networkSettings": "Network Settings",
"torEnabled": "Tor Enabled",
"torAddress": "Tor Address",
"interfaceModeDesc": "Choose how you want to interact with your node.",
"claudeAuthDesc": "Connect your Claude Max account to enable AI chat features.",
"connectionStatus": "Connection Status",
"notConnected": "Not connected",
"reAuthenticate": "Re-authenticate",
"loginWithClaude": "Login with Claude",
"aiDataAccessDesc": "Control what data the AI assistant can see. All categories are off by default.",
"enableAllDesc": "Grant access to all data categories at once",
"systemUpdatesDesc": "Check for and install software updates",
"webhookNotifications": "Webhook Notifications",
"webhookNotificationsDesc": "Get push notifications for critical events via webhook",
"enableWebhooks": "Enable webhooks",
"disableWebhooks": "Disable webhooks",
"webhookUrlLabel": "Webhook URL",
"webhookSecretLabel": "Secret (optional, for HMAC-SHA256 signing)",
"eventsToNotify": "Events to notify",
"containerCrashDesc": "A running container stops unexpectedly",
"updateAvailableDesc": "A new system or app update is ready",
"diskWarningDesc": "Disk usage exceeds warning threshold",
"backupCompleteDesc": "A scheduled or manual backup finishes",
"backupRestoreDesc": "Encrypted backups of your identity, settings, and data",
"loadingBackups": "Loading backups...",
"noBackups": "No backups yet. Create one to protect your node data.",
"systemBackup": "System Backup",
"createEncryptedBackup": "Create Encrypted Backup",
"encryptionPassphrase": "Encryption Passphrase",
"enterPassphrase": "Enter a strong passphrase",
"descriptionOptional": "Description (optional)",
"descriptionPlaceholder": "e.g. Before update",
"restoreBackupTitle": "Restore Backup",
"restoreWarning": "This will overwrite current node data. Make sure you have the correct passphrase.",
"enterBackupPassphrase": "Enter backup passphrase",
"networkDesc": "Network connectivity, UPnP, and diagnostics",
"webhookSecretPlaceholderFull": "Shared secret for payload signing",
"backupCreatedSuccess": "Backup created successfully",
"backupCreateFailed": "Failed to create backup",
"backupVerifiedOk": "Backup verified — integrity OK",
"backupVerifyFailed": "Verification failed: {error}",
"backupVerifyRequestFailed": "Verification request failed",
"backupRestored": "Backup restored. Restart may be needed.",
"backupRestoreFailed": "Restore failed — check passphrase",
"backupDeleted": "Backup deleted",
"backupDeleteFailed": "Failed to delete backup",
"noUsbDrives": "No mounted USB drives found. Insert and mount a USB drive first.",
"backupCopiedToUsb": "Backup copied to {path}",
"backupUsbFailed": "Failed to copy backup to USB",
"deleteBackupConfirm": "Delete this backup permanently?",
"verifyPassphrasePrompt": "Enter backup passphrase to verify:",
"webhookSaveFailed": "Failed to save webhook configuration",
"webhookTestFailed": "Test failed: webhook not sent",
"webhookSendFailed": "Failed to send test webhook",
"passwordAllFieldsRequired": "All fields are required",
"passwordMismatch": "New passwords do not match",
"passwordUpdatedSuccess": "Web password updated successfully.",
"passwordUpdatedSshFailed": "SSH password update failed:",
"passwordChangeFailed": "Failed to change password",
"passwordMinLength": "Password must be at least 12 characters",
"passwordNeedUppercase": "Password must contain at least one uppercase letter",
"passwordNeedLowercase": "Password must contain at least one lowercase letter",
"passwordNeedDigit": "Password must contain at least one digit",
"passwordNeedSpecial": "Password must contain at least one special character (!@#$%^&* etc.)",
"setupFailed": "Setup failed",
"verificationFailed": "Verification failed",
"disableFailed": "Failed to disable 2FA",
"copyToUsb": "Copy to USB",
"diskSpaceWarning": "Disk Space Warning",
"modeEasy": "Easy",
"modeEasyDesc": "Goal-based interface. Choose what you want to do, and the system handles the rest.",
"modePro": "Pro",
"modeProDesc": "Full control over all services. Configure everything manually with all technical details.",
"modeChat": "AIUI",
"modeChatDesc": "Conversational AI interface. Manage your node through natural language. Coming soon."
},
"marketplace": {
"title": "App Store",
"subtitle": "Discover and install apps for your new sovereign life",
"installModalTitle": "Install {name}",
"installModalHint": "Choose a version to install. The latest is recommended.",
"curatedTab": "Curated",
"communityTab": "Community",
"nostrCommunityTab": "Nostr Community",
"filterByCategory": "Filter by Category",
"searchPlaceholder": "Search apps...",
"downloading": "Downloading...",
"alreadyInstalled": "Already Installed",
"queryingRelays": "Querying Nostr relays for apps...",
"noCommunityApps": "No community apps discovered yet.",
"noResults": "No apps found in {category} matching \"{query}\"",
"noResultsCategory": "No apps found in {category}",
"noResultsSearch": "No apps matching \"{query}\"",
"all": "All",
"community": "Community",
"commerce": "Commerce",
"money": "Money",
"data": "Data",
"homeCategory": "Home",
"auto": "Auto",
"networking": "Networking",
"other": "Other",
"searchApps": "Search apps",
"percentComplete": "{percent}% complete"
},
"dashboard": {
"mainNav": "Main navigation",
"mobileNav": "Mobile navigation"
},
"chat": {
"close": "Close",
"aiuiConnected": "AIUI connected",
"closeAssistant": "Close AI Assistant",
"loadingAssistant": "Loading AI assistant...",
"aiAssistant": "AI Assistant",
"notConfigured": "AI Assistant needs to be enabled before use.",
"deployCta": "Go to Settings to configure your AI provider API key, then return here to start chatting."
},
"web5": {
"title": "Web5",
"subtitle": "Decentralized identity and data protocols",
"profitsHelper": "Earn networking profits by hosting decentralized services",
"networkingProfits": "Networking Profits",
"didStatus": "DID Status",
"walletConnection": "Wallet Connection",
"wallet": "Wallet",
"walletSubtitle": "On-chain, Lightning & Ecash",
"nostrRelays": "Nostr Relays",
"connectedNodes": "Connected Nodes",
"bitcoinDomains": "Bitcoin Domain Names",
"domainsSubtitle": "NIP-05 verified identities",
"copyDid": "Copy",
"viewDidDocument": "View",
"createDid": "Create DID",
"creatingDid": "Creating...",
"manageDomains": "Manage Domains",
"relaysConnected": "{count} connected",
"peersKnown": "{count} peer(s) known",
"findNodes": "Find Nodes",
"sendMessage": "Send Message",
"sendMessageTitle": "Send Message (over Tor)",
"to": "To",
"selectPeer": "Select a peer...",
"message": "Message",
"messagePlaceholder": "Type your message...",
"didDocument": "DID Document",
"addContent": "Add Content",
"addContentTitle": "Add Content",
"createIdentity": "Create Identity",
"createIdentityTitle": "Create Identity",
"deleteIdentity": "Delete Identity",
"deleteIdentityTitle": "Delete Identity",
"sendBitcoin": "Send Bitcoin",
"sendBitcoinTitle": "Send Bitcoin",
"receiveBitcoin": "Receive Bitcoin",
"receiveBitcoinTitle": "Receive Bitcoin",
"domains": "Domains",
"domainsTitle": "Domains",
"relays": "Relays",
"relaysTitle": "Relays",
"totalEarned": "Total Earned",
"monthlyAvg": "Monthly Avg",
"ecashBalance": "Ecash Balance",
"onChain": "On-chain",
"lightning": "Lightning",
"ecash": "Ecash",
"identityName": "Identity Name",
"identityNamePlaceholder": "Enter identity name",
"contentTitle": "Title",
"contentTitlePlaceholder": "Enter content title",
"amount": "Amount",
"amountPlaceholder": "Enter amount in sats",
"address": "Address",
"addressPlaceholder": "Enter Bitcoin address",
"deleteIdentityConfirm": "Are you sure you want to delete this identity? This action cannot be undone.",
"confirm": "Confirm",
"noRelays": "No relays connected",
"noDomains": "No domains configured",
"addRelay": "Add Relay",
"addDomain": "Add Domain",
"relayUrl": "Relay URL",
"relayUrlPlaceholder": "wss://relay.example.com",
"domainName": "Domain Name",
"domainNamePlaceholder": "user{'@'}example.com",
"peerNodesDescription": "Peer nodes discovered via Nostr. Messages sent over Tor.",
"nodeVisibility": "Node Visibility",
"nodeVisibilityDesc": "Control how other nodes can discover you",
"yourTorAddress": "Your Tor address",
"discoverableWarning": "Making your node discoverable lets other Archipelago users find and connect with you.",
"noPeers": "No peers yet. Add a peer manually or use Discover to find nodes on Nostr.",
"noMessages": "No messages yet. Messages from peers will appear here.",
"noRequests": "No pending connection requests.",
"accept": "Accept",
"reject": "Reject",
"discovering": "Discovering...",
"discoverNodes": "Discover Nodes on Nostr",
"refreshMessages": "Refresh Messages",
"refreshRequests": "Refresh Requests",
"torServices": "Tor Services",
"torServicesDesc": "Hidden services exposing your apps over Tor",
"noTorServices": "No Tor hidden services configured.",
"content": "Content",
"contentDesc": "Share and browse content with peers over Tor",
"noSharedContent": "No shared content",
"addFilesToShare": "Add files to share with connected peers.",
"browse": "Browse",
"connectingToPeer": "Connecting to peer over Tor...",
"selectPeerToBrowse": "Select a peer to browse",
"choosePeerDesc": "Choose a connected peer to see their shared content.",
"peerNoContent": "This peer has no shared content.",
"identities": "Identities",
"identitiesDesc": "Sovereign digital identities (DID:key)",
"noIdentities": "No identities yet",
"createFirstIdentity": "Create your first sovereign digital identity.",
"deleting": "Deleting...",
"syncing": "Syncing...",
"syncNow": "Sync Now",
"verifiableCredentials": "Verifiable Credentials",
"verifiableCredentialsDesc": "Issue and manage W3C Verifiable Credentials",
"noCredentials": "No credentials issued yet",
"messageSent": "Message sent over Tor!",
"failedToSend": "Failed to send",
"pasteInvoice": "Paste a Lightning invoice (BOLT11)",
"enterBitcoinAddress": "Enter a Bitcoin address",
"sendFailed": "Send failed",
"broadcastViaHwWallet": "Broadcast via hardware wallet",
"broadcastFailed": "Broadcast failed",
"psbtCopied": "PSBT copied!",
"enterAmount": "Enter an amount",
"pasteEcashToken": "Paste an ecash token",
"receiveFailed": "Receive failed",
"ecashTokenCopied": "Ecash token copied",
"contentAdded": "Content added",
"failedToAddContent": "Failed to add content",
"contentRemoved": "Content removed",
"failedToRemoveContent": "Failed to remove content",
"failedToUpdatePricing": "Failed to update pricing",
"failedToUpdatePrice": "Failed to update price",
"failedToConnectPeer": "Failed to connect to peer",
"onionAddressCopied": "Onion address copied",
"streamUrlCopied": "Stream URL copied",
"playerError": "Unable to load media. The content may only be accessible over Tor.",
"connectionAccepted": "Connection accepted",
"failedToAcceptRequest": "Failed to accept request",
"requestRejected": "Request rejected",
"failedToRejectRequest": "Failed to reject request",
"visibilitySetTo": "Visibility set to {level}",
"failedToUpdateVisibility": "Failed to update visibility",
"didCopied": "DID copied to clipboard",
"defaultIdentityUpdated": "Default identity updated",
"failedToSetDefault": "Failed to set default",
"identityCreated": "Identity created",
"failedToCreateIdentity": "Failed to create identity",
"identityDeleted": "Identity deleted",
"failedToDeleteIdentity": "Failed to delete identity",
"registrationFailed": "Registration failed",
"removeFailed": "Remove failed",
"failedToAddRelay": "Failed to add relay",
"failedToRemoveRelay": "Failed to remove relay",
"failedToToggleRelay": "Failed to toggle relay",
"downloadUrlCopied": "Download URL copied",
"hardwareWalletDetected": "Hardware Wallet Detected",
"namesRegistered": "Names Registered",
"expiringSoon": "Expiring Soon",
"nostrRelaysDesc": "Decentralized social networking relays",
"relaysConnectedLabel": "Relays Connected",
"totalRelays": "Total Relays",
"freeAccessDesc": "Available to all peers for free",
"peersOnlyAccessDesc": "Available only to connected peers",
"signWithHwWallet": "Sign with Hardware Wallet",
"createsPsbt": "Creates a PSBT for external signing",
"generateFreshAddress": "Generate a fresh Bitcoin address",
"registerNewName": "Register New Name",
"verifyNip05": "Verify NIP-05",
"peers": "Peers",
"trusted": "Trusted",
"observer": "Observer",
"observers": "Observers",
"noObservers": "No observers yet.",
"messages": "Messages",
"requests": "Requests",
"myContent": "My Content",
"browsePeers": "Browse Peers",
"verified": "Verified",
"invalid": "Invalid",
"stream": "Stream",
"download": "Download"
},
"appDetails": {
"backToApps": "Back to My Apps",
"backToStore": "Back to App Store",
"screenshots": "Screenshots",
"screenshotPlaceholder": "Screenshot placeholders - images coming soon",
"about": "About {name}",
"features": "Features",
"information": "Information",
"requirements": "Requirements",
"setupInstructions": "Setup Instructions",
"ram": "RAM",
"ramDesc": "Minimum 512MB",
"storage": "Storage",
"storageDesc": "~100MB",
"links": "Links",
"website": "Website",
"sourceCode": "Source Code",
"documentation": "Documentation",
"services": "Services",
"guardian": "Guardian",
"gateway": "Gateway",
"access": "Access",
"lan": "LAN",
"tor": "Tor",
"requiresTor": "Requires Tor Browser",
"channels": "Channels",
"uninstallTitle": "Uninstall App?",
"uninstallConfirm": "Are you sure you want to uninstall {name}? This will remove the app and stop its container.",
"notFoundTitle": "App Not Found",
"notFoundMessage": "The requested application could not be found",
"installed": "Installed",
"noLaunchUrl": "No launch URL available for this app yet",
"versionUpdates": "Version & Updates",
"runningVersion": "Running version",
"selectVersion": "Version",
"alwaysUseLatestVersion": "Always use the latest version",
"autoUpdateLatest": "Auto-update to latest",
"autoUpdatePinnedNote": "Auto-update is disabled while a version is pinned.",
"confirmDowngrade": "Downgrade anyway",
"applyingVersion": "Applying…",
"applyVersion": "Apply",
"downgradeGeneric": "This is a downgrade and may require a re-sync. Re-confirm to proceed."
},
"containerDetails": {
"back": "Back",
"subtitle": "Container details and management",
"containerInfo": "Container Information",
"actions": "Actions",
"logs": "Logs",
"containerId": "Container ID",
"image": "Image",
"state": "State",
"created": "Created",
"startContainer": "Start Container",
"stopContainer": "Stop Container",
"loadingLogs": "Loading logs...",
"noLogs": "No logs available"
},
"marketplaceDetails": {
"backToStore": "Back to App Store",
"backToHome": "Back to Home",
"screenshots": "Screenshots",
"screenshotPlaceholder": "Screenshot placeholders - images coming soon",
"about": "About {name}",
"features": "Features",
"information": "Information",
"requirements": "Requirements",
"noRequirements": "No additional dependencies required",
"installRequirements": "Install Requirements",
"links": "Links",
"downloadPackage": "Download Package",
"installed": "Installed",
"notInstalled": "Not Installed",
"open": "Open",
"loadingDetails": "Loading app details...",
"notFoundTitle": "App Not Found",
"notFoundMessage": "The requested application could not be found in the marketplace",
"installFailed": "Installation Failed",
"depRunning": "Running",
"depStopped": "Installed but stopped",
"depNotInstalled": "Not installed",
"selectVersion": "Select version"
},
"goalDetail": {
"backToGoals": "Back to Goals",
"notFound": "Goal not found.",
"stepOf": "Step {current} of {total}",
"notStarted": "Not Started",
"inProgress": "In Progress",
"completed": "Completed",
"syncTitle": "Sovereignty takes a little patience",
"syncMessage": "Your Bitcoin node is syncing the entire blockchain so you don't have to trust anyone else. This takes 2-3 days on first run. Meanwhile, you can explore your node, set up your identity, or back up your keys.",
"installApp": "Install {name}",
"openAndConfigure": "Open & Configure",
"checkAndContinue": "Check & Continue",
"iveDoneThis": "I've Done This",
"complete": "Complete",
"allSet": "All Set!",
"goalReady": "{title} is ready to go.",
"viewMyServices": "View My Services"
},
"monitoring": {
"title": "Monitoring",
"subtitle": "Real-time system metrics and container resource usage",
"cpuUsage": "CPU Usage (%)",
"memoryUsage": "Memory Usage (%)",
"networkIo": "Network I/O (bytes)",
"rpcLatency": "RPC Latency (ms)",
"alertHistory": "Alert History",
"hideConfig": "Hide Config",
"noAlerts": "No alerts fired",
"containerResources": "Container Resources",
"noContainerMetrics": "No container metrics available",
"systemHealth": "System Health",
"load": "Load:",
"exportCsv": "Export CSV",
"exportJson": "Export JSON",
"diskUsage": "Disk Usage",
"ramUsage": "RAM Usage",
"containerCrash": "Container Crash",
"rpcLatencySpike": "RPC Latency Spike",
"sslCertExpiry": "SSL Cert Expiry",
"refreshFooter": "Refreshing every 5 seconds",
"wsConnections": "WS connections: {count}",
"cpu": "CPU",
"memory": "Memory",
"network": "Network"
},
"systemUpdate": {
"title": "System Update",
"subtitle": "Manage software updates for your Archipelago node",
"currentSystem": "Current System",
"updateAvailable": "Update Available",
"upToDate": "System is up to date",
"downloading": "Downloading Update...",
"applying": "Applying Update...",
"updateSchedule": "Update Schedule",
"actions": "Actions",
"lastChecked": "Last Checked",
"new": "New",
"changelog": "Changelog",
"componentsToUpdate": "{count} component(s) to update",
"manualOnly": "Manual Only",
"manualOnlyDesc": "Never check automatically. You control when to check and install updates.",
"dailyCheck": "Daily Check",
"dailyCheckDesc": "Check for updates once per day. You decide when to install.",
"autoApply": "Auto-Apply",
"autoApplyDesc": "Check daily and automatically install updates at 3 AM. Service restarts as needed.",
"downloadUpdate": "Download Update",
"applyUpdate": "Install Update",
"checkForUpdates": "Check for Updates",
"checking": "Checking...",
"rollback": "Rollback Available",
"backToSettings": "Back to Settings",
"percentComplete": "{percent}% complete",
"applyWarning": "Installing components and restarting services. Do not power off.",
"applyTitle": "Install Update?",
"applyMessage": "The backend service will restart. This may take a moment.",
"rollbackTitle": "Rollback Version?",
"rollbackMessage": "This will restore the previous version. The backend service will restart.",
"applyNow": "Install Now",
"rollbackButton": "Rollback",
"upToDateMessage": "Your system is up to date. No updates available. Your system is running the latest version.",
"checkFailed": "Failed to check for updates. Check your internet connection.",
"downloadSuccess": "Downloaded {count} component(s) ({size}MB)",
"downloadFailed": "Download failed. Please try again.",
"applySuccess": "Update applied. The service will restart momentarily.",
"applyFailed": "Failed to apply update. You can try again or rollback.",
"rollbackSuccess": "Rolled back to previous version. Service will restart.",
"rollbackFailed": "Rollback failed.",
"pullAndRebuild": "Pull & Rebuild",
"finishingDownload": "Finishing download — verifying checksum…",
"overlayApplying": "Installing update…",
"overlayRestarting": "Restarting server…",
"overlayReconnecting": "Reconnecting to the new version…",
"overlayReady": "Update installed — reloading…",
"overlayStalled": "Taking longer than expected",
"overlayTarget": "Installing v{version}",
"overlayReloadNow": "Reload now",
"gitMethodHint": "This node builds from source. Update will git-pull, rebuild the backend and UI, then restart — takes a few minutes.",
"gitApplyTitle": "Pull & Rebuild?",
"gitApplyMessage": "Archipelago will pull the latest code, rebuild, and restart. This can take several minutes and the UI will be briefly unavailable.",
"gitApplyStarted": "Update started. The backend will rebuild and restart — this can take a few minutes.",
"cancelDownload": "Cancel Download",
"cancelingDownload": "Canceling…",
"cancelDownloadTitle": "Cancel Download?",
"cancelDownloadConfirm": "This will stop the current download and discard the partial file. You can start again from scratch afterwards.",
"cancelDownloadButton": "Cancel Download",
"cancelDownloadSuccess": "Download canceled. You can try again.",
"cancelDownloadFailed": "Failed to cancel download.",
"downloadStalled": "Download appears stuck — try Cancel and start again."
},
"kiosk": {
"pressEsc": "Press ESC to exit",
"online": "Online",
"offline": "Offline",
"escHint": "Press ESC to exit apps",
"navHint": "Use arrow keys to navigate"
},
"kioskRecovery": {
"title": "Archipelago Recovery",
"subtitle": "Kiosk failsafe — no authentication required",
"serverAddress": "Server Address",
"webUi": "Web UI: http://{address}",
"scanForMobile": "Scan for mobile access",
"backend": "Backend",
"unreachable": "Unreachable",
"containers": "Containers",
"goToLogin": "Go to Login",
"lastChecked": "Last checked: {time}"
},
"receiveBitcoin": {
"onChain": "On-Chain",
"lightning": "Lightning",
"ecash": "Ecash",
"amountSats": "Amount (sats)",
"memoOptional": "Memo (optional)",
"memoPlaceholder": "Payment for...",
"invoiceShareLabel": "Invoice (share with sender):",
"yourBitcoinAddress": "Your Bitcoin address:",
"pasteEcashToken": "Paste ecash token",
"processing": "Processing...",
"generateAddress": "Generate Address",
"createInvoice": "Create Invoice",
"receive": "Receive",
"enterAnAmount": "Enter an amount",
"pasteAnEcashToken": "Paste an ecash token",
"tokenReceivedSuccess": "Token received successfully!"
},
"sendBitcoin": {
"onChain": "On-chain",
"auto": "Auto",
"lightning": "Lightning",
"ecash": "Ecash",
"autoMethodDesc": "Auto-selects method based on amount: ecash < 1k sats, Lightning 1k500k, on-chain > 500k",
"amountSats": "Amount (sats)",
"lightningInvoice": "Lightning Invoice (BOLT11)",
"bitcoinAddress": "Bitcoin Address",
"tokenShareLabel": "Token (share with recipient):",
"sentTx": "Sent! TX: {txid}",
"paidHash": "Paid! Hash: {hash}"
},
"transactions": {
"title": "Transactions",
"noTransactionsYet": "No transactions yet",
"unconfirmed": "Unconfirmed",
"confirmations": "{count} conf",
"justNow": "just now",
"minutesAgo": "{count}m ago",
"hoursAgo": "{count}h ago",
"daysAgo": "{count}d ago"
},
"easyHome": {
"beginner": "Beginner",
"intermediate": "Intermediate",
"done": "Done",
"inProgress": "In Progress",
"start": "Start"
}
}