{ "common": { "loading": "Loading...", "error": "Error", "save": "Save", "cancel": "Cancel", "back": "Back", "done": "Done", "continue": "Continue", "refresh": "Refresh", "create": "Create", "delete": "Delete", "confirm": "Confirm", "created": "Created", "expires": "Expires", "name": "Name", "dashboard": "Dashboard", "backToDashboard": "← Dashboard", "copied": "Copied!", "copyToClipboard": "Copy to Clipboard", "verifying": "Verifying...", "saving": "Saving...", "creating": "Creating...", "updating": "Updating...", "sending": "Sending...", "authenticating": "Authenticating...", "checking": "Checking...", "redirecting": "Redirecting...", "signIn": "Sign In", "verify": "Verify", "remove": "Remove", "revoke": "Revoke", "resendCode": "Resend Code", "startOver": "Start Over", "tryAgain": "Try Again", "password": "Password", "email": "Email", "emailAddress": "Email Address", "handle": "Handle", "did": "DID", "verificationCode": "Verification Code", "inviteCode": "Invite Code", "newPassword": "New Password", "confirmPassword": "Confirm Password", "enterSixDigitCode": "Enter 6-digit code", "passwordHint": "At least 8 characters", "enterPassword": "Enter your password", "emailPlaceholder": "you@example.com", "verified": "Verified", "disabled": "Disabled", "available": "Available", "deactivated": "Deactivated", "unverified": "Unverified", "backToLogin": "Back to Login", "backToSettings": "Back to Settings", "alreadyHaveAccount": "Already have an account?", "createAccount": "Create account", "passwordsMismatch": "Passwords do not match", "passwordTooShort": "Password must be at least 8 characters" }, "login": { "title": "Sign In", "subtitle": "Sign in to manage your PDS account", "button": "Sign In", "redirecting": "Redirecting...", "chooseAccount": "Choose an account", "signInToAnother": "Sign in to another account", "backToSaved": "← Back to saved accounts", "forgotPassword": "Forgot password?", "lostPasskey": "Lost passkey?", "noAccount": "Don't have an account?", "createAccount": "Create account", "removeAccount": "Remove from saved accounts", "infoSavedAccountsTitle": "Saved accounts", "infoSavedAccountsDesc": "Click an account to sign in instantly. Your session tokens are stored securely in this browser.", "infoNewAccountTitle": "New account", "infoNewAccountDesc": "Use the sign-in button to add a different account. Click the × to remove saved accounts from this browser.", "infoSecureSignInTitle": "Secure sign-in", "infoSecureSignInDesc": "You'll be redirected to authenticate securely. If you have passkeys or two-factor authentication enabled, you'll be prompted for those too.", "infoStaySignedInTitle": "Stay signed in", "infoStaySignedInDesc": "After signing in, your account will be saved to this browser for quick access next time.", "infoRecoveryTitle": "Account recovery", "infoRecoveryDesc": "Lost your password or passkey? Use the recovery links below the sign-in button." }, "verification": { "title": "Verify Your Account", "subtitle": "Your account needs verification. Enter the code sent to your verification method.", "codeLabel": "Verification Code", "codePlaceholder": "Enter 6-digit code", "verifyButton": "Verify Account", "resent": "Verification code resent!" }, "register": { "title": "Create Account", "subtitle": "Create a new account on this PDS", "subtitleKeyChoice": "Choose how to set up your external did:web identity.", "subtitleInitialDidDoc": "Upload your DID document to continue.", "subtitleVerify": "Verify your {channel} to continue.", "subtitleUpdatedDidDoc": "Update your DID document with the PDS signing key.", "subtitleActivating": "Activating your account...", "subtitleComplete": "Your account has been created successfully!", "redirecting": "Redirecting to dashboard...", "infoIdentityDesc": "Your identity determines how your account is identified across the ATProto network. Most users should choose the standard option.", "infoContactDesc": "We'll use this to verify your account and send important notifications about your account security.", "infoNextTitle": "What happens next?", "infoNextDesc": "After creating your account, you'll verify your contact method and then you're ready to use any ATProto app with your new identity.", "migrateTitle": "Already have a Bluesky account?", "migrateDescription": "You can migrate your existing account to this PDS instead of creating a new one. Your followers, posts, and identity will come with you.", "migrateLink": "Migrate your account", "handle": "Handle", "handlePlaceholder": "yourname", "handleHint": "Your full handle will be: @{handle}", "handleDotWarning": "Custom domain handles can be set up after account creation in Settings.", "password": "Password", "passwordPlaceholder": "At least 8 characters", "confirmPassword": "Confirm Password", "confirmPasswordPlaceholder": "Confirm your password", "identityType": "Identity Type", "identityHint": "Choose how your decentralized identity will be managed.", "didPlc": "did:plc", "didPlcRecommended": "(Recommended)", "didPlcHint": "Portable identity managed by PLC Directory", "didWeb": "did:web", "didWebHint": "Identity hosted on this PDS (read warning below)", "didWebDisabledHint": "Not available on this PDS - use did:plc or bring your own did:web", "didWebBYOD": "did:web (BYOD)", "didWebBYODHint": "Bring your own domain", "didWebWarningTitle": "Important: Understand the trade-offs", "didWebWarning1": "Permanent tie to this PDS:", "didWebWarning1Detail": "Your identity will be {did}. Even if you migrate to another PDS later, this server must continue hosting your DID document.", "didWebWarning2": "No recovery mechanism:", "didWebWarning2Detail": "Unlike did:plc, did:web has no rotation keys. If this PDS goes offline permanently, your identity cannot be recovered.", "didWebWarning3": "We commit to you:", "didWebWarning3Detail": "If you migrate away, we will continue serving a minimal DID document pointing to your new PDS. Your identity will remain functional.", "didWebWarning4": "Recommendation:", "didWebWarning4Detail": "Choose did:plc unless you have a specific reason to prefer did:web.", "externalDid": "Your did:web", "externalDidPlaceholder": "did:web:yourdomain.com", "externalDidHint": "Your domain must serve a valid DID document at /.well-known/did.json pointing to this PDS", "contactMethod": "Contact Method", "contactMethodHint": "Choose how you'd like to verify your account and receive notifications. You only need one.", "verificationMethod": "Verification Method", "email": "Email", "emailAddress": "Email Address", "emailPlaceholder": "you@example.com", "discord": "Discord", "discordId": "Discord User ID", "discordIdPlaceholder": "Your Discord user ID", "discordIdHint": "Your numeric Discord user ID (enable Developer Mode to find it)", "telegram": "Telegram", "telegramUsername": "Telegram Username", "telegramUsernamePlaceholder": "@yourusername", "signal": "Signal", "signalNumber": "Signal Phone Number", "signalNumberPlaceholder": "+1234567890", "signalNumberHint": "Include country code (e.g., +1 for US)", "notConfigured": "not configured", "inviteCode": "Invite Code", "inviteCodePlaceholder": "Enter your invite code", "inviteCodeRequired": "required", "createButton": "Create Account", "alreadyHaveAccount": "Already have an account?", "signIn": "Sign in", "passkeyAccount": "Passkey", "passwordAccount": "Password", "validation": { "handleRequired": "Handle is required", "handleNoDots": "Handle cannot contain dots. You can set up a custom domain handle after creating your account.", "passwordRequired": "Password is required", "passwordLength": "Password must be at least 8 characters", "passwordsMismatch": "Passwords do not match", "inviteCodeRequired": "Invite code is required", "externalDidRequired": "External did:web is required", "externalDidFormat": "External DID must start with did:web:", "emailRequired": "Email is required for email verification", "discordIdRequired": "Discord ID is required for Discord verification", "telegramRequired": "Telegram username is required for Telegram verification", "signalRequired": "Phone number is required for Signal verification" } }, "dashboard": { "title": "Dashboard", "switchAccount": "Switch Account", "addAnotherAccount": "Add another account", "signOut": "Sign out @{handle}", "deactivatedTitle": "Account Deactivated", "deactivatedMessage": "Your account is currently deactivated. This typically happens during account migration. Some features may be limited until your account is reactivated.", "accountOverview": "Account Overview", "handle": "Handle", "did": "DID", "primaryContact": "Primary Contact", "admin": "Admin", "deactivated": "Deactivated", "verified": "Verified", "unverified": "Unverified", "navAppPasswords": "App Passwords", "navAppPasswordsDesc": "Manage passwords for third-party apps", "navSessions": "Active Sessions", "navSessionsDesc": "View and manage your login sessions", "navInviteCodes": "Invite Codes", "navInviteCodesDesc": "View and create invite codes", "navSettings": "Account Settings", "navSettingsDesc": "Email, password, handle, and more", "navSecurity": "Security", "navSecurityDesc": "Two-factor authentication", "navComms": "Communication Preferences", "navCommsDesc": "Discord, Telegram, Signal channels", "navRepo": "Repository Explorer", "navRepoDesc": "Browse and manage raw AT Protocol records", "navDelegation": "Delegation", "navDelegationDesc": "Manage account controllers and delegated accounts", "navAdmin": "Admin Panel", "navAdminDesc": "Server stats and admin operations", "navDidDocument": "DID Document", "navDidDocumentDesc": "Manage your DID document for external migrations", "navDidDocumentDescActive": "Edit your DID document settings", "navBackup": "Download Backup", "navBackupDesc": "Download your repository as a CAR file", "downloadingBackup": "Downloading...", "backupFailed": "Failed to download backup", "migrated": "Migrated", "migratedTitle": "Account Migrated", "migratedMessage": "Your account has migrated to {pds}. Your DID document is still hosted here, and you can update it for future migrations.", "navMigrateAgain": "Migrate Again", "navMigrateAgainDesc": "Move to another PDS and update your DID document" }, "didEditor": { "title": "DID Document Editor", "preview": "Current DID Document", "verificationMethods": "Verification Methods", "verificationMethodsDesc": "Signing keys that can act on behalf of your DID. When you migrate to a new PDS, add their signing key here.", "addKey": "Add Key", "removeKey": "Remove", "keyId": "Key ID", "keyIdPlaceholder": "#atproto", "publicKey": "Public Key (Multibase)", "publicKeyPlaceholder": "zQ3sh...", "noKeys": "No verification methods configured. Using the local PDS key.", "alsoKnownAs": "Also Known As", "alsoKnownAsDesc": "Handles that point to your DID. Update this when your handle changes on a new PDS.", "addHandle": "Add Handle", "removeHandle": "Remove", "handle": "Handle", "handlePlaceholder": "at://handle.newpds.com", "noHandles": "No handles configured. Using the local handle.", "serviceEndpoint": "Service Endpoint", "serviceEndpointDesc": "The PDS that currently hosts your account data. Update this when migrating.", "currentPds": "Current PDS URL", "save": "Save Changes", "success": "DID document updated successfully", "saveFailed": "Failed to save DID document", "loadFailed": "Failed to load DID document", "invalidMultibase": "Public key must be a valid multibase string starting with 'z'", "invalidHandle": "Handle must be an at:// URI (e.g., at://handle.example.com)", "helpTitle": "What is this?", "helpText": "When you migrate to another PDS, that PDS generates new signing keys. Update your DID document here so it points to your new keys and location. This enables multi-hop migrations (PDS 1 → PDS 2 → PDS 3)." }, "settings": { "title": "Account Settings", "language": "Language", "languageDescription": "Choose your preferred language", "changeEmail": "Change Email", "currentEmail": "Current: {email}", "newEmail": "New Email", "newEmailPlaceholder": "new@example.com", "changeEmailButton": "Change Email", "requesting": "Requesting...", "verificationCode": "Verification Code", "verificationCodePlaceholder": "Enter verification code", "confirmEmailChange": "Confirm Email Change", "updating": "Updating...", "changeHandle": "Change Handle", "currentHandle": "Current: @{handle}", "pdsHandle": "PDS Handle", "customDomain": "Custom Domain", "customDomainDescription": "Use your own domain as your handle. You need to verify domain ownership first.", "setupInstructions": "Setup Instructions", "setupMethodsIntro": "Choose one of these verification methods:", "dnsMethod": "Option 1: DNS TXT Record (Recommended)", "dnsMethodDesc": "Add this TXT record to your domain:", "httpMethod": "Option 2: HTTP Well-Known File", "httpMethodDesc": "Serve your DID at this URL:", "httpMethodContent": "The file should contain only:", "yourDomain": "Your Domain", "yourDomainPlaceholder": "example.com", "verifyAndUpdate": "Verify & Update Handle", "newHandle": "New Handle", "newHandlePlaceholder": "yourhandle", "changeHandleButton": "Change Handle", "changePassword": "Change Password", "currentPassword": "Current Password", "currentPasswordPlaceholder": "Enter current password", "newPassword": "New Password", "newPasswordPlaceholder": "At least 8 characters", "confirmNewPassword": "Confirm New Password", "confirmNewPasswordPlaceholder": "Confirm new password", "changePasswordButton": "Change Password", "changing": "Changing...", "setPassword": "Set Password", "setPasswordDescription": "Your account is currently passkey-only. You can add a password to enable traditional login alongside your passkeys.", "setPasswordButton": "Set Password", "setting": "Setting...", "exportData": "Export Data", "exportDataDescription": "Download your entire repository as a CAR (Content Addressable Archive) file. This includes all your posts, likes, follows, and other data.", "downloadRepo": "Download Repository", "downloadBlobs": "Download Media", "exporting": "Exporting...", "backups": { "title": "Backups", "description": "Your repository is automatically backed up daily. You can also create manual backups or restore from a previous backup.", "enableAutomatic": "Enable automatic backups", "enabled": "Automatic backups enabled", "disabled": "Automatic backups disabled", "toggleFailed": "Failed to update backup setting", "noBackups": "No backups available yet.", "blocks": "blocks", "download": "Download", "delete": "Delete", "createNow": "Create Backup Now", "created": "Backup created successfully", "createFailed": "Failed to create backup", "downloadFailed": "Failed to download backup", "deleted": "Backup deleted", "deleteFailed": "Failed to delete backup", "restoreTitle": "Restore from Backup", "restoreDescription": "Upload a CAR file to restore your repository. This will overwrite your current data.", "selectFile": "Select CAR file", "selectedFile": "Selected file", "restore": "Restore", "restoring": "Restoring...", "restored": "Repository restored successfully", "restoreFailed": "Failed to restore repository" }, "deleteAccount": "Delete Account", "deleteWarning": "This action is irreversible. All your data will be permanently deleted.", "requestDeletion": "Request Account Deletion", "confirmationCode": "Confirmation Code", "confirmationCodePlaceholder": "Enter confirmation code", "yourPassword": "Your Password", "yourPasswordPlaceholder": "Enter your password", "permanentlyDelete": "Permanently Delete Account", "deleting": "Deleting...", "messages": { "emailCodeSent": "Verification code sent to your notification channel", "emailCodeSentToCurrent": "Verification code sent to your current email address", "emailUpdated": "Email updated successfully", "emailUpdateFailed": "Failed to update email", "handleUpdated": "Handle updated successfully", "handleUpdateFailed": "Failed to update handle", "passwordChanged": "Password changed successfully", "passwordChangeFailed": "Failed to change password", "passwordSet": "Password set successfully", "passwordSetFailed": "Failed to set password", "passwordsMismatch": "Passwords do not match", "passwordsDoNotMatch": "Passwords do not match", "passwordLength": "Password must be at least 8 characters", "passwordTooShort": "Password must be at least 8 characters", "deletionCodeSent": "Deletion confirmation sent to your email", "deletionConfirmationSent": "Deletion confirmation sent to your email", "deletionRequestFailed": "Failed to request account deletion", "deleteConfirmation": "Are you absolutely sure you want to delete your account? This cannot be undone.", "deletionFailed": "Failed to delete account", "repoExported": "Repository exported successfully", "blobsExported": "Media files exported successfully", "noBlobsToExport": "No media files to export", "exportFailed": "Failed to export", "confirmDelete": "Are you absolutely sure you want to delete your account? This cannot be undone." } }, "appPasswords": { "title": "App Passwords", "description": "App passwords let you sign in to third-party apps without giving them your main password. Each app password can be revoked individually.", "createNew": "Create New App Password", "appNamePlaceholder": "App name (e.g., Graysky, Skeets)", "created": "App Password Created", "createdMessage": "Copy this password now. You won't be able to see it again.", "yourPasswords": "Your App Passwords", "noPasswords": "No app passwords yet", "revoke": "Revoke", "revoking": "Revoking...", "revokeConfirm": "Revoke app password \"{name}\"? Apps using this password will no longer be able to access your account.", "saveWarningTitle": "Important: Save this app password!", "saveWarningMessage": "This password is required to sign into apps that don't support passkeys or OAuth. You will only see it once.", "acknowledgeLabel": "I have saved my app password in a secure location", "permissions": "Permissions", "scopeFull": "Full Access", "scopeReadOnly": "Read Only", "scopePostOnly": "Post Only", "scopeCustom": "Custom", "byController": "By Controller" }, "sessions": { "title": "Active Sessions", "loadingSessions": "Loading sessions...", "noSessions": "No active sessions found.", "current": "Current", "oauth": "OAuth", "session": "Session", "signOut": "Sign Out", "revoke": "Revoke", "revokeAll": "Revoke All Other Sessions", "revokeCurrentConfirm": "This will log you out of this session. Continue?", "revokeConfirm": "Revoke this session?", "revokeAllConfirm": "This will revoke {count} other session(s). Continue?", "noOtherSessions": "No other sessions to revoke", "failedToLoad": "Failed to load sessions", "failedToRevoke": "Failed to revoke session", "failedToRevokeAll": "Failed to revoke sessions", "created": "Created:", "expires": "Expires:", "daysAgo": "{count} day(s) ago", "hoursAgo": "{count} hour(s) ago", "minutesAgo": "{count} minute(s) ago", "justNow": "Just now" }, "inviteCodes": { "title": "Invite Codes", "description": "Invite codes let you invite friends to join. Each code can be used once.", "createNew": "Create New Invite Code", "uses": "Uses", "usesPlaceholder": "Number of uses (1-100)", "yourCodes": "Your Invite Codes", "noCodes": "No invite codes yet", "available": "Available", "used": "Used by @{handle}", "disabled": "Disabled", "usedBy": "Used by", "disableConfirm": "Disable this invite code? It can no longer be used.", "created": "Invite Code Created", "copy": "Copy", "createdOn": "Created {date}" }, "security": { "title": "Security", "passkeys": "Passkeys", "passkeysDescription": "Passkeys provide secure, passwordless authentication using your device's built-in security (fingerprint, face, or PIN).", "addPasskey": "Add Passkey", "adding": "Adding...", "noPasskeys": "No passkeys registered", "passkeyName": "Passkey name", "passkeyNamePlaceholder": "e.g., MacBook Pro, iPhone", "register": "Register", "registering": "Registering...", "rename": "Rename", "renaming": "Renaming...", "deletePasskey": "Delete", "deletePasskeyConfirm": "Delete passkey \"{name}\"? You won't be able to use it to sign in anymore.", "totp": "Authenticator App (TOTP)", "totpDescription": "Use an authenticator app like Google Authenticator, Authy, or 1Password for two-factor authentication.", "totpEnabled": "TOTP is enabled", "totpDisabled": "TOTP is not enabled", "enableTotp": "Enable TOTP", "disableTotp": "Disable TOTP", "disabling": "Disabling...", "totpSetup": "Set up Authenticator App", "totpSetupInstructions": "Scan this QR code with your authenticator app, then enter the 6-digit code to verify.", "totpCode": "Verification Code", "totpCodePlaceholder": "Enter 6-digit code", "verifyAndEnable": "Verify & Enable", "backupCodes": "Backup Codes", "backupCodesDescription": "Use these codes to sign in if you lose access to your authenticator app. Each code can only be used once.", "regenerateBackupCodes": "Regenerate Backup Codes", "regenerating": "Regenerating...", "regenerateConfirm": "Regenerate backup codes? Your current codes will no longer work.", "legacyLogin": "Legacy Login", "legacyLoginDescription": "Allow signing in with username/password directly (legacy mode). When disabled, you must use OAuth with MFA.", "legacyLoginOn": "Legacy login is enabled", "legacyLoginOff": "Legacy login is disabled", "enableLegacyLogin": "Enable legacy login", "disableLegacyLogin": "Disable legacy login", "legacyLoginWarning": "Warning: Enabling legacy login bypasses MFA for direct password logins. Only enable if needed for app compatibility.", "totpPasswordWarning": "With TOTP enabled, changing your password from the Bluesky app (or other legacy apps) will be blocked. To change your password, you have two options:", "totpPasswordOption1Label": "Change it here:", "totpPasswordOption1Text": "Use this website's", "totpPasswordOption1Link": "Settings page", "totpPasswordOption1Suffix": "where you can verify with your authenticator app.", "totpPasswordOption2Label": "Verify your session first:", "totpPasswordOption2Text": "Use the", "totpPasswordOption2Link": "re-authenticate option", "totpPasswordOption2Suffix": "to verify your Bluesky session with TOTP, then password changes will work temporarily.", "legacyAppsTitle": "What are legacy apps?", "legacyAppsDescription": "Some apps (like the official Bluesky app) use older authentication that only requires your password. When you have MFA enabled, these apps bypass your second factor. Disabling legacy login forces all apps to use OAuth, which properly enforces MFA.", "password": "Password", "passwordStatus": "You have a password set", "noPassword": "No password set (passkey-only account)", "setPassword": "Set Password", "removePassword": "Remove Password", "removePasswordConfirm": "Remove your password? You'll need to use passkeys to sign in.", "removing": "Removing...", "loading": "Loading...", "loadingPasskeys": "Loading passkeys...", "cancel": "Cancel", "save": "Save", "back": "Back", "next": "Next: Verify Code", "copyToClipboard": "Copy to Clipboard", "savedMyCodes": "I've Saved My Codes", "cantScan": "Can't scan? Enter manually", "unnamedPasskey": "Unnamed passkey", "added": "Added", "lastUsed": "Last used", "passwordDescription": "Manage your account password. If you have passkeys set up, you can optionally remove your password for a fully passwordless experience.", "disableTotpWarning": "This will make your account less secure.", "removePasswordWarning": "This will make your account passkey-only. You'll only be able to sign in using your registered passkeys. If you lose access to all your passkeys, you can recover your account using your notification channel.", "beforeProceeding": "Before proceeding:", "beforeProceedingItem1": "Make sure you have at least one reliable passkey registered", "beforeProceedingItem2": "Consider registering passkeys on multiple devices", "beforeProceedingItem3": "Ensure your recovery notification channel is up to date", "addPasskeyFirst": "Add at least one passkey before you can remove your password.", "passkeyOnlyHint": "You sign in using passkeys only. If you ever lose access to your passkeys, you can recover your account using the \"Lost passkey?\" link on the login page.", "addPasswordHint": "Want to add a password? Go to Settings to set one up.", "goToSettings": "Go to Settings", "trustedDevices": "Trusted Devices", "trustedDevicesDescription": "Manage devices that can skip two-factor authentication when signing in. Trust is granted for 30 days and automatically extends when you use the device.", "manageTrustedDevices": "Manage Trusted Devices", "appCompatibility": "App Compatibility", "enterPassword": "Enter your password", "sessionExpired": "Session expired. Please log in again.", "legacyLoginEnabled": "Legacy app login enabled", "legacyLoginDisabled": "Legacy app login disabled - only OAuth apps can sign in", "failedToUpdatePreference": "Failed to update preference", "passwordRemoved": "Password removed. Your account is now passkey-only.", "failedToRemovePassword": "Failed to remove password", "failedToLoadTotpStatus": "Failed to load TOTP status", "totpEnabledSuccess": "Two-factor authentication enabled successfully", "totpDisabledSuccess": "Two-factor authentication disabled", "backupCodesCopied": "Backup codes copied to clipboard", "failedToLoadPasskeys": "Failed to load passkeys", "passkeysNotSupported": "Passkeys are not supported in this browser", "passkeyCreationCancelled": "Passkey creation was cancelled", "passkeyAddedSuccess": "Passkey added successfully", "passkeyDeleted": "Passkey deleted", "passkeyRenamed": "Passkey renamed" }, "comms": { "title": "Communication Preferences", "description": "Choose how you want to receive important messages like password resets, security alerts, and account updates.", "preferredChannel": "Preferred Channel", "preferredChannelDescription": "Select your preferred way to receive messages. You must configure a channel before you can select it.", "channelConfiguration": "Channel Configuration", "emailVia": "Receive messages via email", "discordVia": "Receive messages via Discord DM", "telegramVia": "Receive messages via Telegram", "signalVia": "Receive messages via Signal", "configureToEnable": "Configure below to enable", "notConfiguredOnServer": "Not configured on this server", "emailManagedInSettings": "Your email is managed in Account Settings", "discordIdHint": "Your Discord user ID (not username). Enable Developer Mode in Discord to copy it.", "telegramHint": "Your Telegram username without the @ symbol", "signalHint": "Your Signal phone number with country code", "primary": "Primary", "verified": "Verified", "notVerified": "Not verified", "verifyButton": "Verify", "verifyCodePlaceholder": "Enter verification code", "submit": "Submit", "savePreferences": "Save Preferences", "preferencesSaved": "Communication preferences saved", "verifiedSuccess": "{channel} verified successfully", "messageHistory": "Message History", "historyDescription": "View recent messages sent to your account.", "loadHistory": "Load History", "hideHistory": "Hide History", "noMessages": "No messages found.", "sent": "sent", "failed": "failed" }, "repoExplorer": { "title": "Repository Explorer", "description": "Browse and manage your raw AT Protocol records.", "collections": "Collections", "noCollections": "No collections found", "records": "Records", "noRecords": "No records in this collection", "recordDetails": "Record Details", "rkey": "Record Key", "uri": "URI", "cid": "CID", "value": "Value", "deleteRecord": "Delete Record", "deleteConfirm": "Delete record {rkey}? This cannot be undone.", "unknownError": "An unknown error occurred", "invalidJson": "Invalid JSON", "collectionRequired": "Collection is required", "recordCreated": "Record created: {uri}", "recordUpdated": "Record updated", "recordDeleted": "Record deleted", "newRecord": "New Record", "createRecord": "Create Record", "filterCollections": "Filter collections...", "filterRecords": "Filter records...", "noCollectionsYet": "No collections yet. Create your first record to get started.", "loadMore": "Load More", "recordJson": "Record JSON", "updateRecord": "Update Record", "collectionNsid": "Collection (NSID)", "recordKeyOptional": "Record Key (optional)", "autoGenerated": "Auto-generated if empty (TID)", "autoGeneratedHint": "Leave empty to auto-generate a TID-based key", "demoPostText": "Hello from my PDS! This is my first post.", "demoDisplayName": "Your Display Name", "demoBio": "A short bio about yourself." }, "admin": { "title": "Admin Panel", "loading": "Loading...", "serverConfig": "Server Configuration", "serverName": "Server Name", "serverNamePlaceholder": "My PDS", "serverNameHelp": "Displayed in the browser tab and other places", "serverLogo": "Server Logo", "logoPreview": "Logo preview", "removeLogo": "Remove", "logoHelp": "Used as favicon and shown in the navbar", "themeColors": "Theme Colors", "themeColorsHint": "Leave blank to use default colors.", "primaryLight": "Primary (Light Mode)", "colorDefault": "{color} (default)", "primaryDark": "Primary (Dark Mode)", "secondaryLight": "Secondary (Light Mode)", "secondaryDark": "Secondary (Dark Mode)", "configSaved": "Server configuration saved", "saveConfig": "Save Configuration", "serverStats": "Server Statistics", "users": "Users", "repos": "Repositories", "records": "Records", "blobStorage": "Blob Storage", "refreshStats": "Refresh Stats", "userManagement": "User Management", "searchPlaceholder": "Search by handle (optional)", "searchUsers": "Search Users", "noUsers": "No users found", "handle": "Handle", "email": "Email", "status": "Status", "created": "Created", "loadMore": "Load More", "inviteCodes": "Invite Codes", "loadInviteCodes": "Load Invite Codes", "refresh": "Refresh", "noInvites": "No invite codes found", "code": "Code", "available": "Available", "uses": "Uses", "actions": "Actions", "disable": "Disable", "disableInviteConfirm": "Disable invite code {code}?", "active": "Active", "exhausted": "Exhausted", "disabled": "Disabled", "userDetails": "User Details", "did": "DID", "invites": "Invites", "enabled": "Enabled", "enableInvites": "Enable Invites", "disableInvites": "Disable Invites", "deleteAccount": "Delete Account", "deleteConfirm": "Delete account @{handle}? This cannot be undone.", "verified": "Verified", "unverified": "Unverified", "deactivated": "Deactivated" }, "oauth": { "login": { "title": "Sign In", "subtitle": "Sign in to continue to the application", "signingIn": "Signing in...", "authenticating": "Authenticating...", "checkingPasskey": "Checking passkey...", "signInWithPasskey": "Sign in with passkey", "passkeyNotSetUp": "Passkey not set up", "orUsePassword": "or use password", "password": "Password", "rememberDevice": "Remember this device", "passkeyHintChecking": "Checking passkey status...", "passkeyHintAvailable": "Sign in with your passkey", "passkeyHintNotAvailable": "No passkeys registered for this account", "passkeyHint": "Use your device's biometrics or security key", "passwordPlaceholder": "Enter your password", "usePasskey": "Use Passkey" }, "consent": { "title": "Authorize Application", "appWantsAccess": "{app} wants to access your account", "permissions": "This application will be able to:", "readProfile": "Read your profile information", "readPosts": "Read your posts and content", "writePosts": "Create and delete posts on your behalf", "readNotifications": "Read your notifications", "fullAccess": "Full access to your account", "authorize": "Authorize", "deny": "Deny", "authorizing": "Authorizing...", "rememberChoice": "Remember this choice", "signingInAs": "Signing in as:", "permissionsRequested": "Permissions Requested", "required": "Required", "rememberChoiceLabel": "Remember my choice for this application" }, "accounts": { "title": "Choose Account", "subtitle": "Select an account to continue", "useAnother": "Use a different account" }, "twoFactor": { "title": "Two-Factor Authentication", "subtitle": "Additional verification is required", "usePasskey": "Use Passkey", "useTotp": "Use Authenticator App" }, "twoFactorCode": { "title": "Two-Factor Authentication", "subtitle": "A verification code has been sent to your {channel}. Enter the code below to continue.", "codeLabel": "Verification Code", "codePlaceholder": "Enter 6-digit code", "errors": { "missingRequestUri": "Missing request_uri parameter", "verificationFailed": "Verification failed", "connectionFailed": "Failed to connect to server", "unexpectedResponse": "Unexpected response from server" } }, "totp": { "title": "Enter Authenticator Code", "subtitle": "Enter the 6-digit code from your authenticator app", "codePlaceholder": "Enter 6-digit code", "useBackupCode": "Use backup code instead", "backupCodePlaceholder": "Enter backup code", "trustDevice": "Trust this device for 30 days", "hintBackupCode": "Using backup code", "hintTotpCode": "Using authenticator code", "hintDefault": "6 digits for authenticator, 8 characters for backup code" }, "passkey": { "title": "Passkey Verification", "subtitle": "Use your passkey to verify your identity", "waiting": "Waiting for passkey...", "useTotp": "Use authenticator app instead" }, "error": { "title": "Authorization Error", "genericError": "An error occurred during authorization.", "tryAgain": "Try Again", "backToApp": "Back to Application" } }, "verify": { "title": "Verify Your Account", "subtitle": "We've sent a verification code to your {channel}. Enter it below to complete registration.", "tokenSubtitle": "Enter the verification code and the identifier it was sent to.", "tokenTitle": "Verify", "codePlaceholder": "XXXX-XXXX-XXXX-XXXX...", "codeLabel": "Verification Code", "codeHelp": "Copy the entire code from your message, including dashes", "verifyButton": "Verify Account", "pleaseWait": "Please wait...", "codeResent": "Verification code resent!", "codeResentDetail": "Verification code sent! Check your inbox.", "verifyingAccount": "Verifying account: @{handle}", "startOver": "Start over with a different account", "noPending": "No pending verification found.", "noPendingInfo": "If you recently created an account and need to verify it, you may need to create a new account. If you already verified your account, you can sign in.", "createAccount": "Create Account", "signIn": "Sign In", "verified": "Verified!", "channelVerified": "Your {channel} has been verified successfully.", "canNowSignIn": "You can now sign in to your account.", "migrationContinue": "You can close this tab and continue your migration in the original window.", "continue": "Continue", "identifierLabel": "Email or Identifier", "identifierPlaceholder": "you@example.com", "identifierHelp": "The email address or identifier the code was sent to", "emailUpdateTitle": "Update Email Address", "emailUpdateSubtitle": "Enter your new email address and the verification code sent to your current email.", "emailUpdateRequiresAuth": "You must be signed in to update your email address.", "emailUpdateFailed": "Failed to update email address", "emailUpdateCodeHelp": "The code was sent to your current email address", "newEmailLabel": "New Email Address", "newEmailPlaceholder": "new@example.com", "updateEmail": "Update Email", "updating": "Updating...", "emailUpdated": "Your email has been updated successfully.", "emailUpdatedInfo": "You may need to verify your new email address." }, "resetPassword": { "title": "Reset Password", "forgotTitle": "Forgot Password", "subtitle": "Enter the code you received and choose a new password.", "forgotSubtitle": "Enter your handle or email and we'll send you a code to reset your password.", "handleOrEmail": "Handle or Email", "emailPlaceholder": "handle or you@example.com", "sendCode": "Send Reset Code", "sending": "Sending...", "codeSent": "Password reset code sent! Check your preferred notification channel.", "enterCode": "Enter the code you received and your new password.", "code": "Reset Code", "codePlaceholder": "Enter reset code", "newPassword": "New Password", "newPasswordPlaceholder": "At least 8 characters", "confirmPassword": "Confirm Password", "confirmPasswordPlaceholder": "Confirm new password", "resetButton": "Reset Password", "resetting": "Resetting...", "success": "Password reset successfully!", "requestNewCode": "Request New Code", "passwordsMismatch": "Passwords do not match", "passwordLength": "Password must be at least 8 characters" }, "recoverPasskey": { "title": "Recover Your Account", "invalidLinkTitle": "Invalid Recovery Link", "invalidLinkMessage": "This recovery link is invalid or has been corrupted. Please request a new recovery email.", "goToLogin": "Go to Login", "successTitle": "Password Set!", "successMessage": "Your temporary password has been set. You can now sign in with this password.", "successNextSteps": "After signing in, we recommend adding a new passkey in your security settings to restore passkey-only authentication.", "signIn": "Sign In", "subtitle": "Set a temporary password to regain access to your passkey-only account.", "newPassword": "New Password", "newPasswordPlaceholder": "At least 8 characters", "confirmPassword": "Confirm Password", "confirmPasswordPlaceholder": "Confirm your password", "whatHappensNext": "What happens next?", "whatHappensNextDetail": "After setting this password, you can sign in and add a new passkey in your security settings. Once you have a new passkey, you can optionally remove the temporary password.", "setPassword": "Set Password", "settingPassword": "Setting password...", "validation": { "passwordRequired": "New password is required", "passwordLength": "Password must be at least 8 characters", "passwordsMismatch": "Passwords do not match" }, "errors": { "invalidLink": "Invalid recovery link. Please request a new one.", "expired": "This recovery link has expired. Please request a new one." } }, "requestPasskeyRecovery": { "title": "Recover Passkey Account", "subtitle": "Lost access to your passkey? Enter your handle or email and we'll send you a recovery link.", "successTitle": "Recovery Link Sent", "successMessage": "If your account exists and is a passkey-only account, you'll receive a recovery link at your preferred notification channel.", "successInfo": "The link will expire in 1 hour. Check your email, Discord, Telegram, or Signal depending on your account settings.", "handleOrEmail": "Handle or Email", "emailPlaceholder": "handle or you@example.com", "howItWorks": "How it works", "howItWorksDetail": "We'll send a secure link to your registered notification channel. Click the link to set a temporary password. Then you can sign in and add a new passkey.", "sendRecoveryLink": "Send Recovery Link", "sending": "Sending..." }, "registerPasskey": { "title": "Create Passkey Account", "subtitle": "Create an ultra-secure account using a passkey instead of a password.", "subtitleKeyChoice": "Choose how to set up your external did:web identity.", "subtitleInitialDidDoc": "Upload your DID document to continue.", "subtitleCreating": "Creating your account...", "subtitlePasskey": "Register your passkey to secure your account.", "subtitleAppPassword": "Save your app password for third-party apps.", "subtitleVerify": "Verify your {channel} to continue.", "subtitleUpdatedDidDoc": "Update your DID document with the PDS signing key.", "subtitleActivating": "Activating your account...", "subtitleComplete": "Your account has been created successfully!", "handle": "Handle", "handlePlaceholder": "yourname", "handleHint": "Your full handle will be: @{handle}", "handleDotWarning": "Custom domain handles can be set up after account creation.", "email": "Email Address", "emailPlaceholder": "you@example.com", "inviteCode": "Invite Code", "inviteCodePlaceholder": "Enter your invite code", "createButton": "Create Account", "continue": "Continue", "back": "Back", "alreadyHaveAccount": "Already have an account?", "signIn": "Sign in", "wantPassword": "Want to use a password?", "createPasswordAccount": "Create a password account", "wantTraditional": "Want a traditional password?", "registerWithPassword": "Register with password", "contactMethod": "Contact Method", "contactMethodHint": "Choose how you'd like to verify your account and receive notifications.", "verificationMethod": "Verification Method", "identityType": "Identity Type", "identityTypeHint": "Choose how your decentralized identity will be managed.", "didPlcRecommended": "did:plc (Recommended)", "didPlcHint": "Portable identity managed by PLC Directory", "didWeb": "did:web", "didWebHint": "Identity hosted on this PDS (read warning below)", "didWebDisabledHint": "Not available on this PDS - use did:plc or bring your own did:web", "didWebBYOD": "did:web (BYOD)", "didWebBYODHint": "Bring your own domain", "didWebWarningTitle": "Important: Understand the trade-offs", "didWebWarning1": "Permanent tie to this PDS:", "didWebWarning1Detail": "Your identity will be {did}.", "didWebWarning2": "No recovery mechanism:", "didWebWarning2Detail": "Unlike did:plc, did:web has no rotation keys.", "didWebWarning3": "We commit to you:", "didWebWarning3Detail": "If you migrate away, we will continue serving a minimal DID document.", "didWebWarning4": "Recommendation:", "didWebWarning4Detail": "Choose did:plc unless you have a specific reason to prefer did:web.", "externalDid": "Your did:web", "externalDidPlaceholder": "did:web:yourdomain.com", "externalDidHint": "You'll need to serve a DID document at", "whyPasskeyOnly": "Why passkey-only?", "whyPasskeyOnlyDesc": "Passkey accounts are more secure than password-based accounts because they:", "whyPasskeyBullet1": "Cannot be phished or stolen in data breaches", "whyPasskeyBullet2": "Use hardware-backed cryptographic keys", "whyPasskeyBullet3": "Require your biometric or device PIN to use", "infoWhyPasskey": "Why use a passkey?", "infoWhyPasskeyDesc": "Passkeys are cryptographic credentials stored on your device. They cannot be phished, guessed, or stolen in data breaches like passwords can.", "infoHowItWorks": "How it works", "infoHowItWorksDesc": "When you sign in, your device will prompt you to verify with Face ID, Touch ID, or your device PIN. No password to remember or type.", "infoAppAccess": "Using third-party apps", "infoAppAccessDesc": "After creating your account, you will receive an app password. Use this to sign in to Bluesky apps and other AT Protocol clients.", "passkeyNameLabel": "Passkey Name (optional)", "passkeyNamePlaceholder": "e.g., MacBook Touch ID", "passkeyNameHint": "A friendly name to identify this passkey", "passkeyPrompt": "Click the button below to create your passkey. You'll be prompted to use:", "passkeyPromptBullet1": "Touch ID or Face ID", "passkeyPromptBullet2": "Your device PIN or password", "passkeyPromptBullet3": "A security key (if you have one)", "createPasskey": "Create Passkey", "creatingPasskey": "Creating Passkey...", "redirecting": "Redirecting to dashboard...", "loading": "Loading...", "errors": { "handleRequired": "Handle is required", "handleNoDots": "Handle cannot contain dots. You can set up a custom domain handle after creating your account.", "inviteRequired": "Invite code is required", "externalDidRequired": "External did:web is required", "externalDidFormat": "External DID must start with did:web:", "emailRequired": "Email is required for email verification", "discordRequired": "Discord ID is required for Discord verification", "telegramRequired": "Telegram username is required for Telegram verification", "signalRequired": "Phone number is required for Signal verification", "passkeysNotSupported": "Passkeys are not supported in this browser. Please use a different browser or register with a password instead.", "passkeyCancelled": "Passkey creation was cancelled", "passkeyFailed": "Passkey registration failed" } }, "trustedDevices": { "title": "Trusted Devices", "backToSecurity": "← Security Settings", "description": "Trusted devices can skip two-factor authentication when logging in. Trust is granted for 30 days and automatically extends when you use the device.", "failedToLoad": "Failed to load trusted devices", "noDevices": "No trusted devices yet.", "noDevicesHint": "When you log in with two-factor authentication enabled, you can choose to trust the device for 30 days.", "lastSeen": "Last seen:", "trustedSince": "Trusted since:", "trustExpires": "Trust expires:", "expired": "Expired", "tomorrow": "Tomorrow", "inDays": "In {days} days", "revoke": "Revoke Trust", "revokeConfirm": "Are you sure you want to revoke trust for this device? You will need to enter your 2FA code next time you log in from this device.", "deviceRevoked": "Device trust revoked", "deviceRenamed": "Device renamed", "deviceNamePlaceholder": "Device name", "browser": "Browser:", "unknownDevice": "Unknown device" }, "reauth": { "title": "Re-authentication Required", "subtitle": "Please verify your identity to continue.", "password": "Password", "totp": "TOTP", "passkey": "Passkey", "authenticatorCode": "Authenticator Code", "usePassword": "Use Password", "usePasskey": "Use Passkey", "useTotp": "Use Authenticator", "passwordPlaceholder": "Enter your password", "totpPlaceholder": "Enter 6-digit code", "authenticating": "Authenticating...", "passkeyPrompt": "Click the button below to authenticate with your passkey.", "cancel": "Cancel" }, "delegation": { "title": "Account Delegation", "loading": "Loading...", "controllers": "Controllers", "controllersDesc": "Accounts that can act on your behalf", "noControllers": "No controllers have been granted access to your account.", "inactive": "Inactive", "did": "DID", "granted": "Granted", "remove": "Remove", "removeConfirm": "Are you sure you want to remove this controller?", "cannotAddControllers": "You cannot add controllers because this account controls other accounts. An account can either have controllers or control other accounts, but not both.", "addController": "Add Controller", "controllerDid": "Controller DID", "accessLevel": "Access Level", "adding": "Adding...", "addControllerButton": "+ Add Controller", "controllerAdded": "Controller added successfully", "controllerRemoved": "Controller removed successfully", "failedToAddController": "Failed to add controller", "failedToRemoveController": "Failed to remove controller", "controlledAccounts": "Controlled Accounts", "controlledAccountsDesc": "Accounts you can act on behalf of", "noControlledAccounts": "You do not have access to any delegated accounts.", "actAs": "Act As", "cannotControlAccounts": "You cannot control other accounts because this account has controllers. An account can either have controllers or control other accounts, but not both.", "createDelegatedAccount": "Create Delegated Account", "handle": "Handle", "emailOptional": "Email (optional)", "yourAccessLevel": "Your Access Level", "createAccount": "Create Account", "createDelegatedAccountButton": "+ Create Delegated Account", "accountCreated": "Created delegated account: {handle}", "failedToCreateAccount": "Failed to create delegated account", "auditLog": "Audit Log", "auditLogDesc": "View all delegation activity", "viewAuditLog": "View Audit Log", "scopeOwner": "Owner", "scopeViewer": "Viewer", "scopeCustom": "Custom", "backToControllers": "Back to Controllers", "auditLogTitle": "Delegation Audit Log", "noActivity": "No delegation activity recorded.", "actor": "Actor", "controller": "Controller", "account": "Account", "details": "Details", "previous": "Previous", "next": "Next", "showing": "Showing {start} - {end} of {total}", "refresh": "Refresh", "failedToLoadAuditLog": "Failed to load audit log", "actionGrantCreated": "Grant Created", "actionGrantRevoked": "Grant Revoked", "actionScopesModified": "Scopes Modified", "actionTokenIssued": "Token Issued", "actionRepoWrite": "Repository Write", "actionBlobUpload": "Blob Upload", "actionAccountAction": "Account Action" }, "actAs": { "noAccountSpecified": "No account DID specified", "failedToVerify": "Failed to verify delegation access", "noAccess": "You do not have access to this account", "failedToInitiate": "Failed to initiate OAuth flow", "invalidResponse": "Invalid OAuth response", "failedError": "Failed to initiate act-as: {error}", "preparing": "Preparing to switch accounts...", "title": "Act As", "backToControllers": "Back to Controllers" }, "oauthDelegation": { "loading": "Loading...", "title": "Delegated Account", "isDelegated": "{handle} is a delegated account.", "enterControllerHandle": "Sign in with your controller account to access this account.", "controllerHandle": "Controller handle", "handlePlaceholder": "handle.example.com", "checking": "Checking...", "controllerNotFound": "Account not found or you don't have access to this delegated account", "missingParams": "Missing delegation parameters", "missingInfo": "Missing required information", "passkeyCancelled": "Passkey authentication cancelled", "passkeyFailed": "Passkey authentication failed", "failedPasskeyStart": "Failed to start passkey login", "authFailed": "Authentication failed", "unexpectedResponse": "Unexpected response from server", "signInAsController": "Sign In as Controller", "authenticateAs": "Authenticate as {controller} to act on behalf of {delegated}", "useDifferentController": "Use a different controller", "signInWithPasskey": "Sign in with Passkey", "authenticating": "Authenticating...", "usePasskey": "Use Passkey", "or": "or", "password": "Password", "enterPassword": "Enter password", "rememberDevice": "Remember this device", "signingIn": "Signing in...", "signIn": "Sign In", "goBack": "Go Back", "unableToLoad": "Unable to load delegation info" }, "oauthConsent": { "delegatedAccess": "Delegated Access", "actingAs": "Acting as", "controller": "Controller", "accessLevel": "Access Level", "readOnlyAccess": "Read-Only Access", "readOnlyDesc": "View public information only. No write access to this account.", "permissionsLimited": "Permissions Limited", "permissionsLimitedDesc": "Your actual permissions will be limited to your {level} access level, regardless of what the app requests.", "viewerLimitedDesc": "As a Viewer, you have read-only access. This app will not be able to create, update, or delete content on this account.", "editorLimitedDesc": "As an Editor, you can create and edit content but cannot manage account settings or security." }, "verifyChannel": { "title": "Verify Channel", "subtitle": "Enter the verification code sent to your notification channel.", "signInRequired": "Sign In Required", "signInRequiredDesc": "You must be signed in to verify a channel.", "signIn": "Sign In", "verifying": "Verifying...", "pleaseWait": "Please wait while we verify your channel.", "successTitle": "Verified!", "successDesc": "Your {channel} has been verified successfully.", "backToSettings": "Back to Settings", "channelLabel": "Channel", "selectChannel": "Select channel...", "identifierLabel": "Identifier", "identifierPlaceholder": "Email, Discord ID, etc.", "identifierHelp": "The email address, Discord ID, Telegram username, or Signal number being verified.", "codeLabel": "Verification Code", "codeHelp": "Copy the entire code from your message, including dashes.", "verifyButton": "Verify" }, "migration": { "title": "Account Migration", "subtitle": "Move your AT Protocol identity between servers", "navTitle": "Migration", "navDesc": "Move your account to or from another PDS", "migrateHere": "Migrate Here", "migrateHereDesc": "Move your existing AT Protocol account to this PDS from another server.", "bringDid": "Bring your DID and identity", "transferData": "Transfer all your data", "keepFollowers": "Keep your followers", "whatIsMigration": "What is account migration?", "whatIsMigrationDesc": "Account migration allows you to move your AT Protocol identity between Personal Data Servers (PDSes). Your DID (decentralized identifier) stays the same, so your followers and social connections are preserved.", "beforeMigrate": "Before you migrate", "beforeMigrate1": "You will need your current account credentials", "beforeMigrate2": "Migration requires email verification for security", "beforeMigrate3": "Large accounts with many images may take several minutes", "beforeMigrate4": "Your old PDS will be notified to deactivate your account", "importantWarning": "Account migration is a significant action. Make sure you trust the destination PDS and understand that your data will be moved. If something goes wrong, recovery may require manual intervention.", "learnMore": "Learn more about migration risks", "offlineRestore": "Offline Restore", "offlineRestoreDesc": "Restore from backup when your old PDS is unavailable.", "offlineFeature1": "Use a CAR file backup", "offlineFeature2": "Prove ownership with rotation key", "offlineFeature3": "Recovery for shutdown servers", "oauthCompleting": "Completing authentication...", "oauthFailed": "Authentication Failed", "tryAgain": "Try Again", "resume": { "title": "Resume Migration?", "incomplete": "You have an incomplete migration in progress:", "direction": "Direction", "migratingHere": "Migrating here", "from": "From", "to": "To", "progress": "Progress", "reenterCredentials": "You will need to re-enter your credentials to continue.", "startOver": "Start Over", "resumeButton": "Resume" }, "inbound": { "welcome": { "title": "Migrate to This PDS", "desc": "Move your existing AT Protocol account to this server.", "understand": "I understand the risks and want to proceed" }, "sourceAuth": { "title": "Enter Your Current Handle", "titleResume": "Resume Migration", "desc": "Enter the handle of the account you want to migrate.", "descResume": "Re-authenticate to your source PDS to continue the migration.", "handle": "Handle", "handlePlaceholder": "alice.bsky.social", "handleHint": "Your current handle on your existing PDS", "continue": "Continue", "connecting": "Connecting...", "reauthenticate": "Re-authenticate", "resumeTitle": "Migration in Progress", "resumeFrom": "From", "resumeTo": "To", "resumeProgress": "Progress", "resumeOAuthNote": "You need to re-authenticate via OAuth to continue." }, "chooseHandle": { "title": "Choose Your New Handle", "desc": "Select a handle for your account on this PDS.", "migratingFrom": "Migrating from", "newHandle": "New Handle", "checkingAvailability": "Checking availability...", "handleAvailable": "Handle is available!", "handleTaken": "Handle is already taken", "handleHint": "You can also use your own domain by entering the full handle (e.g., alice.mydomain.com)", "email": "Email Address", "authMethod": "Authentication Method", "authPassword": "Password", "authPasswordDesc": "Traditional password-based login", "authPasskey": "Passkey", "authPasskeyDesc": "Passwordless login using biometrics or security key", "password": "Password", "passwordHint": "At least 8 characters", "passkeyInfo": "You'll set up a passkey after your account is created. Your device will prompt you to use biometrics (fingerprint, Face ID) or a security key.", "inviteCode": "Invite Code" }, "review": { "title": "Review Migration", "desc": "Please confirm the details of your migration.", "currentHandle": "Current Handle", "newHandle": "New Handle", "did": "DID", "sourcePds": "From PDS", "targetPds": "To PDS", "email": "Email", "authentication": "Authentication", "authPasskey": "Passkey (passwordless)", "authPassword": "Password", "inviteCode": "Invite Code", "warning": "After you click \"Start Migration\", your repository and data will begin transferring. This process cannot be easily undone.", "startMigration": "Start Migration", "starting": "Starting..." }, "migrating": { "title": "Migration in Progress", "desc": "Please wait while your account is being transferred...", "exportRepo": "Export repository", "importRepo": "Import repository", "migrateBlobs": "Migrate blobs", "migratePrefs": "Migrate preferences" }, "passkeySetup": { "title": "Set Up Your Passkey", "desc": "Your email has been verified. Now set up your passkey for secure, passwordless login.", "nameLabel": "Passkey Name (optional)", "namePlaceholder": "e.g., MacBook Pro, iPhone", "nameHint": "A friendly name to identify this passkey", "instructions": "Click the button below to register your passkey. Your device will prompt you to use biometrics (fingerprint, Face ID) or a security key.", "register": "Register Passkey", "registering": "Registering..." }, "appPassword": { "title": "Save Your App Password", "desc": "Your passkey has been created. An app password has been generated for you to use with apps that don't support passkeys yet.", "warning": "This app password is required to sign into apps that don't support passkeys yet (like bsky.app). You will only see this password once.", "label": "App Password for", "saved": "I have saved my app password in a secure location", "continue": "Continue" }, "emailVerify": { "title": "Verify Your Email", "desc": "A verification code has been sent to {email}.", "hint": "Enter the code below, or click the link in the email to continue automatically.", "tokenLabel": "Verification Code", "tokenPlaceholder": "Enter code from email", "resend": "Resend Code", "verify": "Verify Email", "verifying": "Verifying..." }, "plcToken": { "title": "Verify Migration", "desc": "A verification code has been sent to the email registered with your old account.", "info": "This code confirms you have access to the account and authorizes updating your identity to point to this PDS.", "tokenLabel": "Verification Code", "tokenPlaceholder": "Enter code from email", "resend": "Resend Code", "complete": "Complete Migration", "completing": "Verifying..." }, "didWebUpdate": { "title": "Update Your DID Document", "desc": "Since you're using a did:web identity, you need to update your DID document to point to this PDS.", "yourDid": "Your DID is:", "updateInstructions": "Update the did.json file at your domain to point the atproto_pds service endpoint to this PDS:", "important": "Important:", "verifyFirst": "Make sure your DID document is updated and publicly accessible before completing the migration.", "fileLocation": "The file should be at:", "complete": "Complete Migration", "completing": "Completing..." }, "finalizing": { "title": "Finalizing Migration", "desc": "Please wait while we complete the migration...", "signingPlc": "Sign identity update", "activating": "Activate account on new PDS", "deactivating": "Deactivate account on old PDS" }, "success": { "title": "Migration Complete!", "desc": "Your account has been successfully migrated to this PDS.", "yourNewHandle": "Your new handle", "did": "DID", "blobsWarning": "{count} blobs could not be migrated. These may be images or other media that are no longer available.", "redirecting": "Redirecting to dashboard..." }, "error": { "title": "Migration Error", "desc": "An error occurred during migration.", "startOver": "Start Over", "unknown": "An unknown error occurred." }, "common": { "back": "Back", "cancel": "Cancel", "continue": "Continue", "whatWillHappen": "What will happen:", "step1": "Log in to your current PDS", "step2": "Choose your new handle on this server", "step3": "Your repository and blobs will be transferred", "step4": "Verify the migration via email", "step5": "Your identity will be updated to point here", "beforeProceed": "Before you proceed:", "warning1": "You need access to the email registered with your current account", "warning2": "Large accounts may take several minutes to transfer", "warning3": "Your old account will be deactivated after migration" } }, "offline": { "welcome": { "title": "Offline Restore", "desc": "Restore your account when your old PDS is unavailable. This is for disaster recovery when you cannot contact your previous server.", "warningTitle": "Advanced Recovery Method", "warningDesc": "This method requires your rotation key private key. Only use this if your previous PDS has shut down or you cannot access it.", "requirementsTitle": "You will need:", "requirement1": "Your DID (did:plc:...)", "requirement2": "A CAR file backup of your repository", "requirement3": "Your rotation key (private key in hex, base58, or JWK format)", "understand": "I understand this is for offline recovery only" }, "provideDid": { "title": "Enter Your DID", "desc": "Enter the DID of the account you want to restore.", "label": "Your DID", "hint": "Your decentralized identifier (e.g., did:plc:abc123...)" }, "uploadCar": { "title": "Upload Repository Backup", "desc": "Upload the CAR file containing your repository data.", "label": "CAR File", "hint": "This should be a .car file from a previous backup of your repository", "reuploadWarningTitle": "CAR File Required", "reuploadWarning": "Your session was restored, but you need to re-upload your CAR file. For security reasons, file contents are not stored between sessions." }, "rotationKey": { "title": "Provide Rotation Key", "desc": "Enter your rotation key to prove ownership of this DID.", "securityWarningTitle": "Security Warning", "securityWarning1": "Your rotation key is extremely sensitive - anyone with it can take over your identity", "securityWarning2": "Only enter it on trusted devices and connections", "securityWarning3": "The key will not be stored after migration", "label": "Rotation Key", "placeholder": "Paste your rotation key (hex, base58, or JWK)...", "hint": "Supports 64-character hex, base58, or JWK format", "valid": "Rotation key verified! You have control of this DID.", "invalid": "This key is not a valid rotation key for this DID.", "validating": "Validating...", "validate": "Validate Key" }, "chooseHandle": { "migratingDid": "Restoring DID" }, "review": { "desc": "Please confirm the details of your offline restoration.", "carFile": "CAR File", "rotationKey": "Rotation Key", "warning": "After you click \"Start Migration\", your repository will be imported and your DID will be updated to point to this PDS.", "plcWarningTitle": "Point of No Return", "plcWarning": "Once you start, your DID document will be updated to point to this PDS. If something goes wrong, you can use your rotation key to recover, but you should complete the migration to avoid a broken identity state." }, "migrating": { "title": "Restoring Account", "desc": "Please wait while your account is being restored...", "creating": "Creating account", "importing": "Importing repository", "plcSigning": "Signing identity update", "activating": "Activating account" }, "blobs": { "title": "Migrating Blobs", "desc": "Attempting to recover images and media from your old PDS...", "migrating": "Migrating blobs", "failedTitle": "Some blobs could not be migrated", "failedDesc": "{count} blobs could not be fetched from your old PDS. This may happen if the server is unreachable or the files were deleted.", "sourceUnreachableTitle": "Source PDS Unreachable", "sourceUnreachable": "Could not connect to your old PDS to fetch media files. This is common when migrating from a shut-down server. Your posts will work, but some images may be missing." }, "success": { "desc": "Your account has been successfully restored to this PDS." } }, "progress": { "repoExported": "Repository exported", "repoImported": "Repository imported", "blobsMigrated": "{count} blobs migrated", "prefsMigrated": "Preferences migrated", "plcSigned": "Identity updated", "activated": "Account activated", "deactivated": "Old account deactivated" }, "errors": { "connectionFailed": "Could not connect to PDS", "invalidCredentials": "Invalid credentials", "twoFactorRequired": "Two-factor authentication required", "accountExists": "Account already exists on target PDS", "plcFailed": "PLC operation failed", "blobFailed": "Failed to migrate blob: {cid}", "networkError": "Network error. Please try again." } } }