791 lines
33 KiB
JSON
Raw Normal View History

{
"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...",
release(v1.7.35-alpha): rootless-netns self-heal + app update button + bitcoin-core 28.4 + Node DID unification - core/archipelago/src/bootstrap.rs (NEW): embed scripts/container-doctor.sh and image-recipe/configs/archipelago-doctor.{service,timer} via include_str! and sync to disk + enable the timer on every archipelago startup. Idempotent (content-hash compare), dev-box symlink guard keeps the git checkout untouched, best-effort (warn-only on failure) so bootstrap never blocks server readiness. Wired in main.rs as a background tokio task. - scripts/container-doctor.sh: add fix_rootless_netns_egress(). Detects when the rootless-netns has lost its pasta tap (container-to-container still works but outbound DNS/TCP fails) via an nsenter probe into aardvark-dns; with a two-probe 10s debounce to rule out transients and a host-precheck that bails out if the host itself is offline. When the rootless-netns is truly broken, does a graceful podman stop --all / start --all so pasta + aardvark-dns rebuild the netns from scratch. Bitcoin-knots and every other outbound container recover in one cycle. - core/archipelago/src/update.rs: host_sudo → pub(crate) so bootstrap.rs can reuse the existing systemd-run escape hatch. - apps/bitcoin-core/manifest.yml: bump app version 24.0.0 → 28.4.0 and image bitcoin/bitcoin:24.0 → bitcoin/bitcoin:28.4. Resources aligned with the real container-specs.sh large-disk tune (4 GiB memory cap, cpu_limit: 0 so bitcoind can run -par=auto across every core). - neode-ui/src/views/apps/AppCard.vue + Apps.vue: add an Update button + Updating spinner to every app card that has available-update set. Wires through serverStore.updatePackage(id) — the same RPC the detail view already calls. common.update / common.updating i18n keys added in en.json and es.json. - core/archipelago/src/identity_manager.rs: add create_from_signing_key() that mirrors an existing Ed25519 key as a manager-level identity with a deterministic id (`node-<pubkey16>`). Idempotent across restarts, gets the hex-SVG master avatar. - core/archipelago/src/server.rs: the auto-create path on first boot now mirrors the node's own signing_key (seed-derived on onboarded installs) as a "Node" identity instead of generating a random "Default" keypair. Once this ships, the DID on the Web5 DID Status card (via node.did RPC), the Node entry on the Identities page (via identity.list), and the DID used for peer-to-peer connects (via server_info.pubkey) all resolve to the same seed-derived pubkey. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 08:29:56 -04:00
"update": "Update",
"updating": "Updating...",
"send": "Send",
"sending": "Sending...",
"back": "Back",
"done": "Done",
"manage": "Manage",
"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": "Your 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",
"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",
2026-03-14 17:12:41 +00:00
"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...",
"decentralizedWebNode": "Decentralized Web Node",
"dwnDescription": "Personal data store with DID-based access control",
"manageDwn": "Manage DWN",
"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",
"channels": "Channels",
"noLaunchUrl": "No launch URL available for this app yet"
},
"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",
"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"
},
"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",
release(v1.7.2-alpha): fix Install Update + identity avatar backfill + label Three user-visible fixes shipped together. 1. update.apply permission-denied apply_update() was doing fs::copy into /usr/local/bin/archipelago and tar xzf into /opt/archipelago as the archipelago user — both root-owned. The backup step succeeded (it wrote to data_dir) but the swap failed with a silent permission denied, wrapped as "Failed to apply archipelago". Now uses `sudo install -m 0755` for the binary and `sudo tar -xzf` for the frontend, plus a post-apply `sudo systemctl --no-block restart archipelago` scheduled 2s after the RPC reply so the UI sees success. 2. Apply → Install label en/es locale strings: applyUpdate / applyTitle / applyNow changed from "Apply" to "Install". Matches the user's mental model and distinguishes the user-facing verb from the internal apply_update() function. 3. Identity avatar backfill Identities created before df83163f had profile=None on disk and so rendered as initials. load_record() now synthesizes an IdentityProfile with a default picture (identicon for regular identities, the hex node SVG for derivation_index=0) when profile is missing. The synthetic profile lives only in the returned record; the file stays untouched so a later explicit Save persists whatever the user actually chose. Artefacts: archipelago 70e5444e…67c589 40381960 archipelago-frontend-1.7.2-alpha.tar.gz 806b027b…358a824 76983699 Changelog rewritten layman-style per saved feedback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 11:25:10 -04:00
"applyUpdate": "Install Update",
"checkForUpdates": "Check for Updates",
"checking": "Checking...",
release(v1.7.14-alpha): install overlay + FIPS real fix + AIUI restore Install UX SystemUpdate.vue now shows a full-screen overlay after apply: the BitcoinFaceAscii logo, a target-version label, an indeterminate progress stripe (solid orange; solid green on ready), and an elapsed-time readout. Polls /health every 1.5s and auto-reloads once the backend reports the new version. 3-min stall → "Reload now" button. Download UI also shows a spinner + "Finishing download — verifying checksum…" while the fake bar sits at 95%. FIPS reconnect — for real this time New fips.reconnect RPC does stop → start → wait 20s → re-poll → classify. Classification buckets: connected / daemon_down / no_seed_key / no_outbound_udp_or_anchor_down / peers_but_no_anchor, each with a plain-language hint surfaced verbatim by the Reconnect button. The real reason nodes like .198/.253 couldn't reach the anchor: identity::write_fips_key_from_seed was writing fips_key.pub as a bech32 npub TEXT file, but upstream fips expects 32 raw bytes. The daemon silently authenticated with garbage. Fix: PublicKey::to_bytes() → raw 32 bytes, and new fips::config::normalize_pub_file migrates legacy files by decoding the npub and rewriting in place. fips.reconnect also re-installs the config + healed keys to /etc/fips before restarting. AIUI preservation + restore apply_update was wiping /opt/archipelago/web-ui/aiui because the Vue build doesn't include it — every OTA lost the Claude sidebar. The preserve block now copies aiui/ + archipelago-companion.apk from the old web-ui into the staging dir before the swap, and prefers new-tar versions if present. To restore it on the three nodes that already lost it (.116/.198/.253), this release bundles the 85 MB aiui build into the frontend tarball. Frontend component size is now ~155 MB. Download / install timeouts Backend download client timeout 1800s → 3600s (1 h). Larger tarball + slow gitea raw throughput put us above the old cap. Frontend update.download rpc timeout 30 min → 65 min to match. package.install rpc timeout 15 min → 45 min — IndeedHub pulls 6 images and was timing out mid-install. UI nit "Rollback to Previous" → "Rollback Available". App-catalog proxy already landed in v1.7.13. Artefacts: archipelago 725e18e6…3c525e6 40462288 archipelago-frontend-1.7.14-alpha.tar.gz c35284be…ff2c16 162077052 (+aiui) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 16:40:25 -04:00
"rollback": "Rollback Available",
"backToSettings": "Back to Settings",
"percentComplete": "{percent}% complete",
"applyWarning": "Installing components and restarting services. Do not power off.",
release(v1.7.2-alpha): fix Install Update + identity avatar backfill + label Three user-visible fixes shipped together. 1. update.apply permission-denied apply_update() was doing fs::copy into /usr/local/bin/archipelago and tar xzf into /opt/archipelago as the archipelago user — both root-owned. The backup step succeeded (it wrote to data_dir) but the swap failed with a silent permission denied, wrapped as "Failed to apply archipelago". Now uses `sudo install -m 0755` for the binary and `sudo tar -xzf` for the frontend, plus a post-apply `sudo systemctl --no-block restart archipelago` scheduled 2s after the RPC reply so the UI sees success. 2. Apply → Install label en/es locale strings: applyUpdate / applyTitle / applyNow changed from "Apply" to "Install". Matches the user's mental model and distinguishes the user-facing verb from the internal apply_update() function. 3. Identity avatar backfill Identities created before df83163f had profile=None on disk and so rendered as initials. load_record() now synthesizes an IdentityProfile with a default picture (identicon for regular identities, the hex node SVG for derivation_index=0) when profile is missing. The synthetic profile lives only in the returned record; the file stays untouched so a later explicit Save persists whatever the user actually chose. Artefacts: archipelago 70e5444e…67c589 40381960 archipelago-frontend-1.7.2-alpha.tar.gz 806b027b…358a824 76983699 Changelog rewritten layman-style per saved feedback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 11:25:10 -04:00
"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.",
release(v1.7.2-alpha): fix Install Update + identity avatar backfill + label Three user-visible fixes shipped together. 1. update.apply permission-denied apply_update() was doing fs::copy into /usr/local/bin/archipelago and tar xzf into /opt/archipelago as the archipelago user — both root-owned. The backup step succeeded (it wrote to data_dir) but the swap failed with a silent permission denied, wrapped as "Failed to apply archipelago". Now uses `sudo install -m 0755` for the binary and `sudo tar -xzf` for the frontend, plus a post-apply `sudo systemctl --no-block restart archipelago` scheduled 2s after the RPC reply so the UI sees success. 2. Apply → Install label en/es locale strings: applyUpdate / applyTitle / applyNow changed from "Apply" to "Install". Matches the user's mental model and distinguishes the user-facing verb from the internal apply_update() function. 3. Identity avatar backfill Identities created before df83163f had profile=None on disk and so rendered as initials. load_record() now synthesizes an IdentityProfile with a default picture (identicon for regular identities, the hex node SVG for derivation_index=0) when profile is missing. The synthetic profile lives only in the returned record; the file stays untouched so a later explicit Save persists whatever the user actually chose. Artefacts: archipelago 70e5444e…67c589 40381960 archipelago-frontend-1.7.2-alpha.tar.gz 806b027b…358a824 76983699 Changelog rewritten layman-style per saved feedback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 11:25:10 -04:00
"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",
release(v1.7.14-alpha): install overlay + FIPS real fix + AIUI restore Install UX SystemUpdate.vue now shows a full-screen overlay after apply: the BitcoinFaceAscii logo, a target-version label, an indeterminate progress stripe (solid orange; solid green on ready), and an elapsed-time readout. Polls /health every 1.5s and auto-reloads once the backend reports the new version. 3-min stall → "Reload now" button. Download UI also shows a spinner + "Finishing download — verifying checksum…" while the fake bar sits at 95%. FIPS reconnect — for real this time New fips.reconnect RPC does stop → start → wait 20s → re-poll → classify. Classification buckets: connected / daemon_down / no_seed_key / no_outbound_udp_or_anchor_down / peers_but_no_anchor, each with a plain-language hint surfaced verbatim by the Reconnect button. The real reason nodes like .198/.253 couldn't reach the anchor: identity::write_fips_key_from_seed was writing fips_key.pub as a bech32 npub TEXT file, but upstream fips expects 32 raw bytes. The daemon silently authenticated with garbage. Fix: PublicKey::to_bytes() → raw 32 bytes, and new fips::config::normalize_pub_file migrates legacy files by decoding the npub and rewriting in place. fips.reconnect also re-installs the config + healed keys to /etc/fips before restarting. AIUI preservation + restore apply_update was wiping /opt/archipelago/web-ui/aiui because the Vue build doesn't include it — every OTA lost the Claude sidebar. The preserve block now copies aiui/ + archipelago-companion.apk from the old web-ui into the staging dir before the swap, and prefers new-tar versions if present. To restore it on the three nodes that already lost it (.116/.198/.253), this release bundles the 85 MB aiui build into the frontend tarball. Frontend component size is now ~155 MB. Download / install timeouts Backend download client timeout 1800s → 3600s (1 h). Larger tarball + slow gitea raw throughput put us above the old cap. Frontend update.download rpc timeout 30 min → 65 min to match. package.install rpc timeout 15 min → 45 min — IndeedHub pulls 6 images and was timing out mid-install. UI nit "Rollback to Previous" → "Rollback Available". App-catalog proxy already landed in v1.7.13. Artefacts: archipelago 725e18e6…3c525e6 40462288 archipelago-frontend-1.7.14-alpha.tar.gz c35284be…ff2c16 162077052 (+aiui) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 16:40:25 -04:00
"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 1k\u2013500k, 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"
}
}