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>
802 lines
34 KiB
JSON
802 lines
34 KiB
JSON
{
|
||
"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 1k–500k, 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"
|
||
}
|
||
}
|