From 9bb4809a3a17395fc6a8eddfd466553f3aa5082d Mon Sep 17 00:00:00 2001 From: evansvl Date: Sat, 17 Jan 2026 20:22:15 +0300 Subject: [PATCH] feat: integrate branding API and enhance referral sharing functionality - Added branding API integration to fetch branding details. - Updated share link functionality to include branding name in the share message. --- src/locales/en.json | 1974 +++++++++++++++++----------------- src/locales/fa.json | 1530 +++++++++++++-------------- src/locales/ru.json | 2290 ++++++++++++++++++++-------------------- src/locales/zh.json | 1530 +++++++++++++-------------- src/pages/Referral.tsx | 526 +++++---- 5 files changed, 3972 insertions(+), 3878 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 4ae21e8..f8aeff7 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,989 +1,989 @@ { - "common": { - "loading": "Loading...", - "error": "Error", - "success": "Success", - "save": "Save", - "cancel": "Cancel", - "confirm": "Confirm", - "back": "Back", - "next": "Next", - "close": "Close", - "search": "Search", - "noData": "No data", - "actions": "Actions", - "yes": "Yes", - "no": "No", - "or": "or", - "and": "and", - "edit": "Edit", - "delete": "Delete", - "currency": "$" - }, - "nav": { - "dashboard": "Dashboard", - "subscription": "Subscription", - "balance": "Balance", - "referral": "Referrals", - "support": "Support", - "profile": "Profile", - "logout": "Logout", - "contests": "Contests", - "polls": "Polls", - "info": "Info", - "wheel": "Fortune Wheel" - }, - "auth": { - "login": "Login", - "register": "Register", - "logout": "Logout", - "email": "Email", - "password": "Password", - "confirmPassword": "Confirm password", - "forgotPassword": "Forgot password?", - "resetPassword": "Reset password", - "loginWithTelegram": "Login with Telegram", - "loginWithEmail": "Login with Email", - "noAccount": "Don't have an account?", - "hasAccount": "Already have an account?", - "registerHint": "To register with email, first log in via Telegram, then link your email in settings.", - "telegramRequired": "Telegram authorization required", - "telegramNotConfigured": "Telegram bot is not configured", - "authenticating": "Authenticating...", - "orOpenInApp": "Or open the bot in the app", - "loginFailed": "Login Failed", - "tryAgain": "Try Again", - "welcomeBack": "Welcome back!", - "loginTitle": "Login to Cabinet", - "loginSubtitle": "Sign in with Telegram or use your email" - }, - "emailVerification": { - "title": "Email Verification", - "verifying": "Verifying email...", - "pleaseWait": "Please wait while we verify your email address.", - "success": "Email Verified!", - "successMessage": "Your email has been successfully verified. You can now log in with your email and password.", - "failed": "Verification Failed", - "goToLogin": "Go to Login" - }, - "dashboard": { - "title": "Dashboard", - "welcome": "Welcome, {{name}}!", - "yourSubscription": "Your Subscription", - "quickActions": "Quick Actions", - "viewSubscription": "Manage Subscription", - "topUpBalance": "Top Up Balance", - "inviteFriends": "Invite Friends", - "getSupport": "Get Support", - "currentBalance": "Current Balance", - "activeUntil": "Active until", - "noActiveSubscription": "No active subscription", - "devicesUsed": "Devices: {{used}} of {{total}}", - "trafficUsed": "Traffic: {{used}} of {{total}} GB", - "unlimitedTraffic": "Unlimited traffic" - }, - "subscription": { - "title": "Subscription", - "currentPlan": "Current Plan", - "status": "Status", - "active": "Active", - "inactive": "Inactive", - "trialStatus": "Trial", - "expired": "Expired", - "expiresAt": "Expires at", - "daysLeft": "Days left", - "devices": "Devices", - "servers": "Servers", - "traffic": "Traffic", - "unlimited": "Unlimited", - "used": "Used", - "of": "of", - "renew": "Renew", - "extend": "Extend Subscription", - "buyTraffic": "Buy Traffic", - "buyDevices": "Buy Devices", - "renewalOptions": "Renewal Options", - "days": "days", - "hours": "h", - "minutes": "m", - "price": "Price", - "noSubscription": "You don't have an active subscription", - "getSubscription": "Get Subscription", - "connectionInfo": "Connection Info", - "copyLink": "Copy Link", - "copied": "Copied!", - "showQR": "Show QR Code", - "downloadConfig": "Download Config", - "trafficUsed": "Traffic used", - "timeLeft": "Time left", - "getConfig": "Connect Devices", - "autoRenewal": "Auto-renewal", - "daysBeforeExpiry": "days before expiry", - "selectPeriod": "Select Period", - "selectTraffic": "Select Traffic", - "selectServers": "Select Servers", - "selectDevices": "Devices", - "perDevice": "/ device", - "summary": "Summary", - "total": "Total", - "purchase": "Purchase", - "step": "Step {{current}} of {{total}}", - "stepPeriod": "Period", - "stepTraffic": "Traffic", - "stepServers": "Servers", - "stepDevices": "Devices", - "stepConfirm": "Confirm", - "currentTariff": "Current", - "from": "from", - "month": "mo", - "insufficientBalance": "Insufficient balance. Missing {{missing}} ₽", - "trial": { - "title": "Free Trial", - "description": "Try our VPN service for free!", - "days": "days", - "devices": "devices", - "price": "Activation price", - "activate": "Activate Free Trial", - "unavailable": "Trial is not available" - }, - "connection": { - "title": "Connect VPN", - "selectDevice": "Select your device", - "selectApp": "Select app", - "installApp": "1. Install the app", - "addSubscription": "2. Add subscription", - "connectVpn": "3. Connect VPN", - "addToApp": "Add to {{appName}}", - "connect": "Connect", - "noApps": "No apps available for this platform", - "noSubscription": "You need an active subscription to connect", - "featured": "Recommended", - "yourDevice": "Your device", - "copyLink": "Copy subscription link", - "copied": "Link copied!", - "openLink": "Open link" - }, - "myDevices": "My Devices", - "noDevices": "No connected devices", - "deleteDevice": "Delete device", - "deleteAllDevices": "Delete all", - "confirmDeleteDevice": "Delete this device?", - "confirmDeleteAllDevices": "Delete all devices?", - "deviceDeleted": "Device deleted", - "allDevicesDeleted": "All devices deleted", - "platform": "Platform", - "model": "Model", - "connectedAt": "Connected", - "pause": { - "title": "Subscription Pause", - "paused": "Paused", - "active": "Active", - "pauseBtn": "Pause", - "resumeBtn": "Resume", - "pausedMessage": "Subscription paused", - "resumedMessage": "Subscription resumed", - "dailyOnly": "Pause is only available for daily tariffs", - "pausedInfo": "Subscription paused", - "pausedDescription": "Charges stopped. Subscription will be active until", - "nextCharge": "Until next charge", - "willBeCharged": "Will be charged", - "days_one": "day", - "days_few": "days", - "days_many": "days", - "hours": "h", - "minutes": "m" - }, - "dailyPurchase": { - "costPerDay": "Cost per day", - "chargedDaily": "Payment is charged daily from balance", - "canPause": "Can be paused at any time", - "pausedOnLowBalance": "Subscription will be paused if balance is insufficient", - "activate": "Activate for {{price}}" - }, - "switchTariff": { - "title": "Switch Tariff", - "preview": "Preview", - "currentTariff": "Current tariff", - "newTariff": "New tariff", - "remainingDays": "Days remaining", - "upgradeCost": "Upgrade cost", - "free": "Free", - "switch": "Switch", - "switched": "Tariff switched", - "notEnoughBalance": "Insufficient balance" - }, - "switchTraffic": { - "title": "Change Traffic", - "currentPackage": "Current package", - "newPackage": "New package", - "switch": "Change", - "switched": "Traffic changed" - }, - "purchasedTraffic": "Purchased Traffic", - "trafficResetAt": "Reset" - }, - "balance": { - "title": "Balance", - "currentBalance": "Current Balance", - "topUp": "Top Up", - "topUpBalance": "Top Up Balance", - "paymentMethods": "Payment Methods", - "transactionHistory": "Transaction History", - "noTransactions": "No transactions", - "date": "Date", - "type": "Type", - "description": "Description", - "amount": "Amount", - "deposit": "Deposit", - "withdrawal": "Withdrawal", - "subscriptionPayment": "Subscription Payment", - "referralReward": "Referral Reward", - "minAmount": "Min.", - "maxAmount": "Max.", - "notAvailable": "Not available", - "useBot": "Please use the Telegram bot to top up your balance.", - "page": "Page {{current}} of {{total}}", - "invalidAmount": "Invalid amount", - "promocode": { - "title": "Promo Code", - "placeholder": "Enter promo code", - "activate": "Activate", - "activating": "Activating...", - "success": "Promo code activated successfully!", - "balanceAdded": "Balance added: {{amount}} ₽", - "errors": { - "not_found": "Promo code not found", - "expired": "Promo code has expired", - "used": "Promo code has already been used", - "already_used_by_user": "You have already used this promo code", - "user_not_found": "User not found", - "server_error": "Server error" - } - }, - "minAmountError": "Minimum amount: {{amount}} ₽", - "maxAmountError": "Maximum amount: {{amount}} ₽", - "paymentOption": "Payment option", - "selectPaymentOption": "Select payment option", - "paymentMethods": { - "yookassa": { - "name": "YooKassa", - "description": "Pay via YooKassa" - }, - "cryptobot": { - "name": "CryptoBot", - "description": "Pay with cryptocurrency via CryptoBot" - }, - "telegram_stars": { - "name": "Telegram Stars", - "description": "Pay with Telegram Stars" - }, - "heleket": { - "name": "Heleket Crypto", - "description": "Pay with cryptocurrency via Heleket" - }, - "mulenpay": { - "name": "MulenPay", - "description": "Pay via MulenPay" - }, - "pal24": { - "name": "PAL24", - "description": "Pay via PAL24" - }, - "platega": { - "name": "Platega", - "description": "Pay via Platega" - }, - "wata": { - "name": "Wata", - "description": "Pay via Wata" - }, - "cloudpayments": { - "name": "CloudPayments", - "description": "Pay with bank card via CloudPayments" - }, - "freekassa": { - "name": "FreeKassa", - "description": "Pay via FreeKassa" - } - }, - "pendingPayments": { - "title": "Pending Payments", - "pay": "Pay", - "checkStatus": "Check Status", - "checking": "Checking..." - } - }, - "referral": { - "title": "Referral Program", - "yourLink": "Your Referral Link", - "copyLink": "Copy Link", - "copied": "Copied!", - "shareButton": "Share", - "shareMessage": "Join me on and earn up to {{percent}}% cashback!", - "shareHint": "Share this link with friends. When they sign up and make a purchase, you'll earn {{percent}}% commission!", - "stats": { - "totalReferrals": "Total Referrals", - "activeReferrals": "Active", - "totalEarnings": "Total Earnings", - "commissionRate": "Commission Rate" - }, - "terms": { - "title": "Program Terms", - "commission": "Commission", - "minTopup": "Min. Top-up", - "newUserBonus": "New User Bonus", - "inviterBonus": "Inviter Bonus" - }, - "yourReferrals": "Your Referrals", - "noReferrals": "No referrals yet. Share your link to invite friends!", - "user": "User", - "joined": "Joined", - "hasPaid": "Has Paid", - "status": { - "pending": "Pending", - "paid": "Paid" - }, - "earningsHistory": "Earnings History", - "reason": "Reason", - "reasons": { - "referral_registration_pending": "Referral Registration", - "referral_registration": "Referral Registration", - "referral_first_payment": "Referral First Payment", - "referral_subscription_renewal": "Referral Subscription Renewal", - "referral_bonus": "Referral Bonus" - } - }, - "support": { - "title": "Support", - "newTicket": "New Ticket", - "yourTickets": "Your Tickets", - "noTickets": "No tickets yet", - "createTicket": "Create New Ticket", - "subject": "Subject", - "subjectPlaceholder": "Brief description of your issue", - "message": "Message", - "messagePlaceholder": "Describe your issue in detail...", - "send": "Send", - "sending": "Sending...", - "creating": "Creating...", - "reply": "Reply", - "replyPlaceholder": "Type your reply...", - "sendReply": "Send Reply", - "you": "You", - "supportTeam": "Support", - "selectTicket": "Select a ticket or create a new one", - "created": "Created", - "repliesDisabled": "Replies to this ticket are disabled", - "status": { - "open": "Open", - "answered": "Answered", - "pending": "Pending", - "closed": "Closed" - }, - "attachImage": "Attach image", - "invalidFileType": "Invalid file type. Use JPEG, PNG, GIF or WebP.", - "fileTooLarge": "File is too large. Maximum size is 10MB.", - "uploadFailed": "Failed to upload image", - "imageLoadFailed": "Failed to load image", - "ticketsDisabled": "Tickets Disabled", - "useProfile": "Please go to the bot profile to get support", - "goToProfile": "Go to Profile", - "useExternalLink": "Please use the external link to get support", - "openSupport": "Open Support", - "contactSupport": "Please contact {{username}} for support", - "contactUs": "Contact Support" - }, - "wheel": { - "title": "Fortune Wheel", - "disabled": "Fortune Wheel is currently unavailable", - "spinsRemaining": "Spins remaining today", - "choosePayment": "Choose payment method", - "stars": "Stars", - "telegramStars": "Telegram Stars", - "days": "days", - "subscriptionDays": "Subscription days", - "day": "Day", - "spin": "SPIN!", - "spinning": "Spinning...", - "history": "History", - "recentSpins": "Recent spins", - "congratulations": "Congratulations!", - "noLuck": "No luck!", - "oops": "Oops!", - "yourPromoCode": "Your promo code:", - "close": "Close", - "errors": { - "networkError": "A network error occurred", - "loadFailed": "Failed to load wheel configuration", - "dailyLimitReached": "Daily spin limit reached", - "cannotSpin": "Cannot spin right now", - "insufficientBalance": "Insufficient balance", - "topUpRequired": "Top up your balance to pay for spin", - "starsNotAvailable": "Stars payment not available. Open the app via Telegram." - }, - "payWithStars": "Pay with Stars", - "payWithDays": "Pay with days", - "processingPayment": "Processing...", - "starsPaymentSuccess": "Payment successful! Spin result sent to Telegram.", - "starsPaymentSuccessCheckHistory": "Payment successful! Check history or Telegram for the result.", - "starsPaymentFailed": "Payment failed. Please try again.", - "youWon": "You won", - "noPrize": "No luck this time...", - "noHistory": "No spin history yet", - "banner": { - "title": "Try your luck!", - "description": "Spin the wheel and win prizes: subscription days, balance, traffic and more!", - "button": "Go to wheel" - } - }, - "admin": { - "nav": { - "title": "Admin", - "dashboard": "Dashboard", - "tickets": "Tickets", - "settings": "Settings", - "apps": "Apps", - "wheel": "Wheel", - "tariffs": "Tariffs", - "servers": "Servers", - "broadcasts": "Broadcasts", - "users": "Users", - "payments": "Payments", - "remnawave": "RemnaWave" - }, - "panel": { - "title": "Admin Panel", - "subtitle": "System management", - "dashboardDesc": "Statistics and system monitoring", - "ticketsDesc": "Handle user support tickets", - "settingsDesc": "System settings and parameters", - "appsDesc": "Manage connection apps", - "wheelDesc": "Configure fortune wheel and prizes", - "tariffsDesc": "Manage tariff plans", - "serversDesc": "Configure VPN servers", - "broadcastsDesc": "Mass messaging to users", - "usersDesc": "Manage bot users", - "paymentsDesc": "Payment verification", - "remnawaveDesc": "Panel management and statistics" - }, - "payments": { - "title": "Payment Verification", - "description": "Pending payments in the last 24 hours", - "totalPending": "Total Pending", - "filterByMethod": "Filter by method", - "noPayments": "No pending payments", - "paid": "Paid", - "user": "User", - "openLink": "Open Link", - "checkStatus": "Check Status", - "checking": "Checking..." - }, - "remnawave": { - "title": "RemnaWave", - "subtitle": "Panel management and statistics", - "connected": "Connected", - "disconnected": "Not configured", - "noData": "Failed to load data", - "tabs": { - "overview": "Overview", - "nodes": "Nodes", - "squads": "Squads", - "sync": "Sync" - }, - "overview": { - "system": "System", - "usersOnline": "Online", - "totalUsers": "Total Users", - "nodesOnline": "Nodes Online", - "connections": "Connections", - "bandwidth": "Realtime Bandwidth", - "download": "Download", - "upload": "Upload", - "total": "Total", - "server": "Server", - "cpu": "CPU Cores", - "memory": "Memory", - "uptime": "Uptime", - "traffic": "Traffic Statistics", - "usersByStatus": "Users by Status" - }, - "nodes": { - "online": "Online", - "offline": "Offline", - "disabled": "Disabled", - "noNodes": "No nodes found", - "restart": "Restart", - "enable": "Enable", - "disable": "Disable", - "restartAll": "Restart All", - "confirmRestartAll": "Are you sure you want to restart all nodes?" - }, - "squads": { - "synced": "Synced", - "notSynced": "Not synced", - "noSquads": "No squads found", - "syncServers": "Sync Servers" - }, - "sync": { - "autoSync": "Auto Sync", - "runNow": "Run Now", - "manual": "Manual Sync", - "fromPanel": "Sync from Panel", - "fromPanelDesc": "Import users from RemnaWave panel to bot database", - "toPanel": "Sync to Panel", - "toPanelDesc": "Export users from bot database to RemnaWave panel", - "subscriptions": "Subscriptions", - "validate": "Validate", - "validateDesc": "Check and fix subscription inconsistencies", - "cleanup": "Cleanup", - "cleanupDesc": "Remove orphaned subscriptions without users", - "statuses": "Sync Statuses", - "statusesDesc": "Synchronize subscription statuses with panel" - } - }, - "wheel": { - "title": "Fortune Wheel Settings", - "enabled": "Enabled", - "disabled": "Disabled", - "tabs": { - "settings": "Settings", - "prizes": "Prizes", - "statistics": "Statistics" - }, - "settings": { - "enableWheel": "Enable Wheel", - "allowSpins": "Allow users to spin the wheel", - "costInStars": "Cost in Stars", - "costInDays": "Cost in Days", - "rtpPercent": "RTP (Return to Player) %", - "dailyLimit": "Daily Spin Limit (0 = unlimited)", - "minSubDays": "Min subscription days for day payment", - "promoPrefix": "Promo code prefix" - }, - "prizes": { - "addPrize": "Add Prize", - "editPrize": "Edit Prize", - "noPrizes": "No prizes configured. Add some prizes to enable the wheel.", - "deletePrize": "Delete this prize?", - "types": { - "subscription_days": "Subscription Days", - "balance_bonus": "Balance Bonus", - "traffic_gb": "Traffic GB", - "promocode": "Promo Code", - "nothing": "Nothing (Empty)" - }, - "fields": { - "type": "Type", - "displayName": "Display Name", - "value": "Value", - "valueKopeks": "Value in Kopeks (for RTP)", - "emoji": "Emoji", - "color": "Color", - "active": "Active", - "worth": "Worth" - }, - "promo": { - "title": "Promo Code Settings", - "balanceBonus": "Balance bonus (kopeks)", - "subscriptionDays": "Subscription days" - } - }, - "statistics": { - "totalSpins": "Total Spins", - "revenue": "Revenue", - "payouts": "Payouts", - "actualRtp": "Actual RTP", - "targetRtp": "target", - "prizeDistribution": "Prize Distribution", - "times": "times", - "topWins": "Top Wins" - } - }, - "broadcasts": { - "title": "Broadcasts", - "subtitle": "Mass messaging to users", - "create": "Create Broadcast", - "empty": "No broadcasts yet", - "selectFilter": "Select audience", - "selectFilterPlaceholder": "Select filter...", - "recipients": "recip.", - "messageText": "Message text", - "messageTextPlaceholder": "Enter broadcast message...", - "media": "Media file", - "addMedia": "Add media", - "uploading": "Uploading...", - "buttons": "Buttons", - "willBeSent": "Will be sent to", - "users": "users", - "send": "Send", - "stop": "Stop", - "progress": "Progress", - "total": "Total", - "sent": "Sent", - "failed": "Failed", - "filter": "Filter", - "message": "Message", - "unknownAdmin": "Unknown admin" - }, - "settings": { - "title": "System Settings", - "allCategories": "All categories", - "noSettings": "No settings found", - "modified": "Modified", - "readOnly": "Read only", - "reset": "Reset", - "categoriesCount": "categories", - "settingsCount": "settings", - "expandAll": "Expand all", - "collapseAll": "Collapse all", - "searchPlaceholder": "Search settings...", - "searchCategoriesPlaceholder": "Search categories...", - "noSearchResults": "Nothing found", - "example": "Example" - }, - "apps": { - "title": "App Management", - "addApp": "Add App", - "addFirstApp": "Add First App", - "noApps": "No apps for this platform", - "createApp": "Create App", - "editApp": "Edit App", - "confirmDelete": "Are you sure you want to delete this app?", - "copyTo": "Copy to...", - "appId": "App ID", - "appName": "Name", - "urlScheme": "URL Scheme", - "featured": "Featured", - "base64Encoding": "Base64 Encoding", - "buttons": "Buttons", - "button": "Button", - "addButton": "Add Button", - "buttonText": "Button Text", - "installDescription": "Installation Description", - "subscriptionDescription": "Add Subscription Description", - "connectDescription": "Connect Description", - "beforeSubscription": "Before Add Subscription", - "afterSubscription": "After Add Subscription", - "stepTitle": "Title", - "stepDescription": "Description", - "tabs": { - "basic": "Basic", - "installation": "Installation", - "subscription": "Subscription", - "connect": "Connect", - "additional": "Additional" - }, - "import": "Import", - "export": "Export", - "importApps": "Import apps from JSON", - "exportApps": "Export apps to JSON", - "importPreview": "Import Preview", - "confirmImport": "Import Apps", - "importError": "Invalid JSON file format", - "importCreateError": "Failed to create some apps", - "noAppsToImport": "No apps to import", - "remnaWaveToggle": "Toggle RemnaWave source", - "refreshRemnaWave": "Refresh from RemnaWave", - "remnaWaveMode": "Showing apps from RemnaWave panel. Read-only mode.", - "remnaWaveSettings": "RemnaWave Settings", - "remnaWaveConfigUuid": "Config UUID", - "remnaWaveConfigUuidHint": "UUID of subscription page config from RemnaWave panel", - "availableConfigs": "Available configs" - }, - "tickets": { - "title": "Ticket Management", - "total": "Total", - "list": "Tickets", - "noTickets": "No tickets", - "selectTicket": "Select a ticket from the list", - "allStatuses": "All statuses", - "statusOpen": "Open", - "statusPending": "Pending", - "statusAnswered": "Answered", - "statusClosed": "Closed", - "from": "From", - "created": "Created", - "user": "User", - "you": "You", - "userLabel": "User", - "adminLabel": "Admin", - "replyPlaceholder": "Type your reply...", - "sendReply": "Send Reply", - "settings": "Settings", - "supportMode": "Support mode", - "supportModeDesc": "Choose how users can contact support", - "modeBoth": "Tickets and contact", - "modeTickets": "Tickets only", - "modeContact": "Contact only", - "slaSettings": "SLA Settings", - "slaEnabled": "Enable SLA (response time monitoring)", - "slaEnabledDesc": "Automatic notifications for overdue tickets", - "slaMinutes": "Response time (minutes)", - "slaMinutesDesc": "Maximum time to respond to a ticket (1-1440 minutes)", - "checkInterval": "Check interval (seconds)", - "checkIntervalDesc": "How often to check for overdue tickets (30-600 seconds)", - "reminderCooldown": "Reminder interval (minutes)", - "reminderCooldownDesc": "Minimum time between reminders (1-120 minutes)", - "settingsUpdateError": "Error saving settings" - }, - "tariffs": { - "title": "Tariff Management", - "subtitle": "Configure tariff plans", - "create": "Create Tariff", - "edit": "Edit Tariff", - "noTariffs": "No tariffs", - "name": "Name", - "namePlaceholder": "Enter tariff name", - "description": "Description", - "descriptionPlaceholder": "Enter tariff description", - "trafficLimit": "Traffic Limit", - "trafficHint": "0 = unlimited traffic", - "deviceLimit": "Device Limit", - "tierLevel": "Tier Level", - "tierHint": "1-10, affects priority during upgrade", - "unlimited": "Unlimited", - "devices": "devices", - "servers": "servers", - "subscriptions": "subscriptions", - "trial": "Trial", - "inactive": "Inactive", - "activate": "Activate", - "deactivate": "Deactivate", - "toggleTrial": "Toggle Trial", - "delete": "Delete", - "confirmDelete": "Delete tariff?", - "confirmDeleteText": "This action cannot be undone. The tariff will be permanently deleted.", - "days": "days", - "tabs": { - "basic": "Basic", - "prices": "Prices", - "servers": "Servers" - }, - "pricesHint": "Enable required periods and set prices (in rubles)", - "periodDisabled": "Disabled", - "serversHint": "Select servers available for this tariff. You can set individual traffic limits for each server.", - "noServers": "No servers available", - "serverTrafficLimit": "Traffic limit", - "useDefault": "default" - }, - "servers": { - "title": "Server Management", - "subtitle": "Configure VPN servers", - "sync": "Sync", - "syncing": "Syncing...", - "syncNow": "Sync now", - "noServers": "No servers. Sync with RemnaWave.", - "edit": "Edit Server", - "originalName": "Original Name", - "displayName": "Display Name", - "displayNamePlaceholder": "Enter display name", - "description": "Description", - "descriptionPlaceholder": "Enter server description", - "countryCode": "Country Code", - "price": "Price", - "priceHint": "Additional server cost", - "maxUsers": "Max Users", - "sortOrder": "Sort Order", - "unlimited": "Unlimited", - "stats": "Statistics", - "currentUsers": "Current Users", - "activeSubscriptions": "Active Subscriptions", - "usedByTariffs": "Used by Tariffs", - "trial": "Trial", - "unavailable": "Unavailable", - "full": "Full", - "enable": "Enable", - "disable": "Disable", - "toggleTrial": "Toggle Trial", - "loadError": "Failed to load server" - } - }, - "adminDashboard": { - "title": "Statistics Dashboard", - "subtitle": "Real-time system overview", - "refresh": "Refresh", - "loadError": "Failed to load statistics", - "stats": { - "usersOnline": "Users Online", - "activeSubscriptions": "Active Subscriptions", - "incomeToday": "Today's Income", - "incomeMonth": "Monthly Income", - "incomeTotal": "Total Income", - "subscriptionIncome": "Subscription Income", - "total": "total" - }, - "nodes": { - "title": "Nodes", - "online": "Online", - "offline": "Offline", - "disabled": "Disabled", - "noNodes": "No nodes available", - "usersOnline": "Online", - "traffic": "Traffic", - "enable": "Enable", - "disable": "Disable" - }, - "revenue": { - "title": "Revenue", - "last7Days": "Last 7 days" - }, - "subscriptions": { - "title": "Subscriptions", - "subtitle": "Subscription statistics", - "active": "Active", - "trial": "Trial", - "paid": "Paid", - "expired": "Expired", - "newSubscriptions": "New Subscriptions", - "today": "Today", - "week": "Week", - "month": "Month", - "conversion": "Trial to Paid Conversion" - }, - "servers": { - "title": "Servers", - "total": "Total Servers", - "available": "Available", - "withConnections": "With Connections", - "revenue": "Revenue" - }, - "tariffs": { - "title": "Tariff Statistics", - "subtitle": "Subscription distribution by tariffs", - "tariffName": "Tariff", - "activeSubscriptions": "Active", - "trialSubscriptions": "Trial", - "purchasedToday": "Today", - "purchasedWeek": "Week", - "purchasedMonth": "Month", - "noTariffs": "No tariffs" - } - }, - "profile": { - "title": "Profile", - "accountInfo": "Account Information", - "telegramId": "Telegram ID", - "username": "Username", - "name": "Name", - "registeredAt": "Registered", - "emailAuth": "Email Authentication", - "linkEmailDescription": "Link your email to log in without Telegram. After linking, you'll receive a verification email.", - "linkEmail": "Link Email", - "emailRequired": "Email is required", - "passwordMinLength": "Password must be at least 8 characters", - "passwordsMismatch": "Passwords do not match", - "passwordPlaceholder": "Enter password", - "confirmPasswordPlaceholder": "Confirm password", - "passwordHint": "Minimum 8 characters", - "emailSent": "Verification email sent! Please check your inbox.", - "verified": "Verified", - "notVerified": "Not verified", - "verificationRequired": "Please verify your email to use email login.", - "resendVerification": "Resend Verification Email", - "verificationResent": "Verification email resent!", - "canLoginWithEmail": "You can now log in using your email and password.", - "notifications": { - "title": "Notification Settings", - "subscriptionExpiry": "Subscription Expiry", - "subscriptionExpiryDesc": "Notify about expiring subscription", - "daysBeforeExpiry": "Days before expiry", - "trafficWarning": "Traffic Warning", - "trafficWarningDesc": "Notify when approaching traffic limit", - "atPercent": "At usage", - "balanceLow": "Low Balance", - "balanceLowDesc": "Notify about low balance", - "threshold": "Threshold", - "news": "News", - "newsDesc": "Receive news and service updates", - "promoOffers": "Promo Offers", - "promoOffersDesc": "Receive special offers and discounts", - "unavailable": "Notification settings unavailable" - } - }, - "theme": { - "colors": "Theme Colors", - "reset": "Reset", - "accent": "Accent Color", - "accentDescription": "Main brand color for buttons, links and interactive elements", - "darkTheme": "Dark Theme", - "lightTheme": "Light Theme", - "background": "Background", - "surface": "Surface", - "text": "Text", - "textSecondary": "Secondary Text", - "statusColors": "Status Colors", - "success": "Success", - "warning": "Warning", - "error": "Error", - "preview": "Preview", - "previewButton": "Primary Button", - "previewSecondary": "Secondary Button", - "light": "Light Theme", - "dark": "Dark Theme" - }, - "languages": { - "ru": "Русский", - "en": "English", - "zh": "中文", - "fa": "فارسی" - }, - "contests": { - "title": "Contests", - "error": "Failed to load contests", - "noContests": "No contests available", - "days": "days", - "play": "Play", - "alreadyPlayed": "Already played", - "enterAnswer": "Enter your answer", - "submit": "Submit", - "imHere": "I'm here!" - }, - "polls": { - "title": "Polls", - "error": "Failed to load polls", - "noPolls": "No polls available", - "questions": "questions", - "question": "Question", - "of": "of", - "start": "Start", - "continue": "Continue", - "completed": "Completed", - "reward": "$" - }, - "info": { - "title": "Information", - "faq": "FAQ", - "rules": "Rules", - "privacy": "Privacy Policy", - "offer": "Public Offer", - "noFaq": "No FAQ available", - "noContent": "No content available", - "updatedAt": "Updated" - }, - "onboarding": { - "skip": "Skip", - "finish": "Finish", - "steps": { - "welcome": { - "title": "Welcome!", - "description": "This is your personal cabinet. Here you can manage your subscription, top up balance and connect devices." - }, - "connectDevices": { - "title": "Connect Devices", - "description": "Click this button to get instructions on how to connect VPN on your devices." - }, - "balance": { - "title": "Your Balance", - "description": "Your current balance is displayed here. Click to top it up." - }, - "subscription": { - "title": "Subscription Status", - "description": "Here you can see how many days are left until your subscription expires." - }, - "quickActions": { - "title": "Quick Actions", - "description": "Use these buttons for quick access to main features: top up balance, extend subscription, and invite friends." - } - } - } + "common": { + "loading": "Loading...", + "error": "Error", + "success": "Success", + "save": "Save", + "cancel": "Cancel", + "confirm": "Confirm", + "back": "Back", + "next": "Next", + "close": "Close", + "search": "Search", + "noData": "No data", + "actions": "Actions", + "yes": "Yes", + "no": "No", + "or": "or", + "and": "and", + "edit": "Edit", + "delete": "Delete", + "currency": "$" + }, + "nav": { + "dashboard": "Dashboard", + "subscription": "Subscription", + "balance": "Balance", + "referral": "Referrals", + "support": "Support", + "profile": "Profile", + "logout": "Logout", + "contests": "Contests", + "polls": "Polls", + "info": "Info", + "wheel": "Fortune Wheel" + }, + "auth": { + "login": "Login", + "register": "Register", + "logout": "Logout", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "forgotPassword": "Forgot password?", + "resetPassword": "Reset password", + "loginWithTelegram": "Login with Telegram", + "loginWithEmail": "Login with Email", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "registerHint": "To register with email, first log in via Telegram, then link your email in settings.", + "telegramRequired": "Telegram authorization required", + "telegramNotConfigured": "Telegram bot is not configured", + "authenticating": "Authenticating...", + "orOpenInApp": "Or open the bot in the app", + "loginFailed": "Login Failed", + "tryAgain": "Try Again", + "welcomeBack": "Welcome back!", + "loginTitle": "Login to Cabinet", + "loginSubtitle": "Sign in with Telegram or use your email" + }, + "emailVerification": { + "title": "Email Verification", + "verifying": "Verifying email...", + "pleaseWait": "Please wait while we verify your email address.", + "success": "Email Verified!", + "successMessage": "Your email has been successfully verified. You can now log in with your email and password.", + "failed": "Verification Failed", + "goToLogin": "Go to Login" + }, + "dashboard": { + "title": "Dashboard", + "welcome": "Welcome, {{name}}!", + "yourSubscription": "Your Subscription", + "quickActions": "Quick Actions", + "viewSubscription": "Manage Subscription", + "topUpBalance": "Top Up Balance", + "inviteFriends": "Invite Friends", + "getSupport": "Get Support", + "currentBalance": "Current Balance", + "activeUntil": "Active until", + "noActiveSubscription": "No active subscription", + "devicesUsed": "Devices: {{used}} of {{total}}", + "trafficUsed": "Traffic: {{used}} of {{total}} GB", + "unlimitedTraffic": "Unlimited traffic" + }, + "subscription": { + "title": "Subscription", + "currentPlan": "Current Plan", + "status": "Status", + "active": "Active", + "inactive": "Inactive", + "trialStatus": "Trial", + "expired": "Expired", + "expiresAt": "Expires at", + "daysLeft": "Days left", + "devices": "Devices", + "servers": "Servers", + "traffic": "Traffic", + "unlimited": "Unlimited", + "used": "Used", + "of": "of", + "renew": "Renew", + "extend": "Extend Subscription", + "buyTraffic": "Buy Traffic", + "buyDevices": "Buy Devices", + "renewalOptions": "Renewal Options", + "days": "days", + "hours": "h", + "minutes": "m", + "price": "Price", + "noSubscription": "You don't have an active subscription", + "getSubscription": "Get Subscription", + "connectionInfo": "Connection Info", + "copyLink": "Copy Link", + "copied": "Copied!", + "showQR": "Show QR Code", + "downloadConfig": "Download Config", + "trafficUsed": "Traffic used", + "timeLeft": "Time left", + "getConfig": "Connect Devices", + "autoRenewal": "Auto-renewal", + "daysBeforeExpiry": "days before expiry", + "selectPeriod": "Select Period", + "selectTraffic": "Select Traffic", + "selectServers": "Select Servers", + "selectDevices": "Devices", + "perDevice": "/ device", + "summary": "Summary", + "total": "Total", + "purchase": "Purchase", + "step": "Step {{current}} of {{total}}", + "stepPeriod": "Period", + "stepTraffic": "Traffic", + "stepServers": "Servers", + "stepDevices": "Devices", + "stepConfirm": "Confirm", + "currentTariff": "Current", + "from": "from", + "month": "mo", + "insufficientBalance": "Insufficient balance. Missing {{missing}} ₽", + "trial": { + "title": "Free Trial", + "description": "Try our VPN service for free!", + "days": "days", + "devices": "devices", + "price": "Activation price", + "activate": "Activate Free Trial", + "unavailable": "Trial is not available" + }, + "connection": { + "title": "Connect VPN", + "selectDevice": "Select your device", + "selectApp": "Select app", + "installApp": "1. Install the app", + "addSubscription": "2. Add subscription", + "connectVpn": "3. Connect VPN", + "addToApp": "Add to {{appName}}", + "connect": "Connect", + "noApps": "No apps available for this platform", + "noSubscription": "You need an active subscription to connect", + "featured": "Recommended", + "yourDevice": "Your device", + "copyLink": "Copy subscription link", + "copied": "Link copied!", + "openLink": "Open link" + }, + "myDevices": "My Devices", + "noDevices": "No connected devices", + "deleteDevice": "Delete device", + "deleteAllDevices": "Delete all", + "confirmDeleteDevice": "Delete this device?", + "confirmDeleteAllDevices": "Delete all devices?", + "deviceDeleted": "Device deleted", + "allDevicesDeleted": "All devices deleted", + "platform": "Platform", + "model": "Model", + "connectedAt": "Connected", + "pause": { + "title": "Subscription Pause", + "paused": "Paused", + "active": "Active", + "pauseBtn": "Pause", + "resumeBtn": "Resume", + "pausedMessage": "Subscription paused", + "resumedMessage": "Subscription resumed", + "dailyOnly": "Pause is only available for daily tariffs", + "pausedInfo": "Subscription paused", + "pausedDescription": "Charges stopped. Subscription will be active until", + "nextCharge": "Until next charge", + "willBeCharged": "Will be charged", + "days_one": "day", + "days_few": "days", + "days_many": "days", + "hours": "h", + "minutes": "m" + }, + "dailyPurchase": { + "costPerDay": "Cost per day", + "chargedDaily": "Payment is charged daily from balance", + "canPause": "Can be paused at any time", + "pausedOnLowBalance": "Subscription will be paused if balance is insufficient", + "activate": "Activate for {{price}}" + }, + "switchTariff": { + "title": "Switch Tariff", + "preview": "Preview", + "currentTariff": "Current tariff", + "newTariff": "New tariff", + "remainingDays": "Days remaining", + "upgradeCost": "Upgrade cost", + "free": "Free", + "switch": "Switch", + "switched": "Tariff switched", + "notEnoughBalance": "Insufficient balance" + }, + "switchTraffic": { + "title": "Change Traffic", + "currentPackage": "Current package", + "newPackage": "New package", + "switch": "Change", + "switched": "Traffic changed" + }, + "purchasedTraffic": "Purchased Traffic", + "trafficResetAt": "Reset" + }, + "balance": { + "title": "Balance", + "currentBalance": "Current Balance", + "topUp": "Top Up", + "topUpBalance": "Top Up Balance", + "paymentMethods": "Payment Methods", + "transactionHistory": "Transaction History", + "noTransactions": "No transactions", + "date": "Date", + "type": "Type", + "description": "Description", + "amount": "Amount", + "deposit": "Deposit", + "withdrawal": "Withdrawal", + "subscriptionPayment": "Subscription Payment", + "referralReward": "Referral Reward", + "minAmount": "Min.", + "maxAmount": "Max.", + "notAvailable": "Not available", + "useBot": "Please use the Telegram bot to top up your balance.", + "page": "Page {{current}} of {{total}}", + "invalidAmount": "Invalid amount", + "promocode": { + "title": "Promo Code", + "placeholder": "Enter promo code", + "activate": "Activate", + "activating": "Activating...", + "success": "Promo code activated successfully!", + "balanceAdded": "Balance added: {{amount}} ₽", + "errors": { + "not_found": "Promo code not found", + "expired": "Promo code has expired", + "used": "Promo code has already been used", + "already_used_by_user": "You have already used this promo code", + "user_not_found": "User not found", + "server_error": "Server error" + } + }, + "minAmountError": "Minimum amount: {{amount}} ₽", + "maxAmountError": "Maximum amount: {{amount}} ₽", + "paymentOption": "Payment option", + "selectPaymentOption": "Select payment option", + "paymentMethods": { + "yookassa": { + "name": "YooKassa", + "description": "Pay via YooKassa" + }, + "cryptobot": { + "name": "CryptoBot", + "description": "Pay with cryptocurrency via CryptoBot" + }, + "telegram_stars": { + "name": "Telegram Stars", + "description": "Pay with Telegram Stars" + }, + "heleket": { + "name": "Heleket Crypto", + "description": "Pay with cryptocurrency via Heleket" + }, + "mulenpay": { + "name": "MulenPay", + "description": "Pay via MulenPay" + }, + "pal24": { + "name": "PAL24", + "description": "Pay via PAL24" + }, + "platega": { + "name": "Platega", + "description": "Pay via Platega" + }, + "wata": { + "name": "Wata", + "description": "Pay via Wata" + }, + "cloudpayments": { + "name": "CloudPayments", + "description": "Pay with bank card via CloudPayments" + }, + "freekassa": { + "name": "FreeKassa", + "description": "Pay via FreeKassa" + } + }, + "pendingPayments": { + "title": "Pending Payments", + "pay": "Pay", + "checkStatus": "Check Status", + "checking": "Checking..." + } + }, + "referral": { + "title": "Referral Program", + "yourLink": "Your Referral Link", + "copyLink": "Copy Link", + "copied": "Copied!", + "shareButton": "Share", + "shareMessage": "Join me on {{botName}} and earn up to {{percent}}% cashback!", + "shareHint": "Share this link with friends. When they sign up and make a purchase, you'll earn {{percent}}% commission!", + "stats": { + "totalReferrals": "Total Referrals", + "activeReferrals": "Active", + "totalEarnings": "Total Earnings", + "commissionRate": "Commission Rate" + }, + "terms": { + "title": "Program Terms", + "commission": "Commission", + "minTopup": "Min. Top-up", + "newUserBonus": "New User Bonus", + "inviterBonus": "Inviter Bonus" + }, + "yourReferrals": "Your Referrals", + "noReferrals": "No referrals yet. Share your link to invite friends!", + "user": "User", + "joined": "Joined", + "hasPaid": "Has Paid", + "status": { + "pending": "Pending", + "paid": "Paid" + }, + "earningsHistory": "Earnings History", + "reason": "Reason", + "reasons": { + "referral_registration_pending": "Referral Registration", + "referral_registration": "Referral Registration", + "referral_first_payment": "Referral First Payment", + "referral_subscription_renewal": "Referral Subscription Renewal", + "referral_bonus": "Referral Bonus" + } + }, + "support": { + "title": "Support", + "newTicket": "New Ticket", + "yourTickets": "Your Tickets", + "noTickets": "No tickets yet", + "createTicket": "Create New Ticket", + "subject": "Subject", + "subjectPlaceholder": "Brief description of your issue", + "message": "Message", + "messagePlaceholder": "Describe your issue in detail...", + "send": "Send", + "sending": "Sending...", + "creating": "Creating...", + "reply": "Reply", + "replyPlaceholder": "Type your reply...", + "sendReply": "Send Reply", + "you": "You", + "supportTeam": "Support", + "selectTicket": "Select a ticket or create a new one", + "created": "Created", + "repliesDisabled": "Replies to this ticket are disabled", + "status": { + "open": "Open", + "answered": "Answered", + "pending": "Pending", + "closed": "Closed" + }, + "attachImage": "Attach image", + "invalidFileType": "Invalid file type. Use JPEG, PNG, GIF or WebP.", + "fileTooLarge": "File is too large. Maximum size is 10MB.", + "uploadFailed": "Failed to upload image", + "imageLoadFailed": "Failed to load image", + "ticketsDisabled": "Tickets Disabled", + "useProfile": "Please go to the bot profile to get support", + "goToProfile": "Go to Profile", + "useExternalLink": "Please use the external link to get support", + "openSupport": "Open Support", + "contactSupport": "Please contact {{username}} for support", + "contactUs": "Contact Support" + }, + "wheel": { + "title": "Fortune Wheel", + "disabled": "Fortune Wheel is currently unavailable", + "spinsRemaining": "Spins remaining today", + "choosePayment": "Choose payment method", + "stars": "Stars", + "telegramStars": "Telegram Stars", + "days": "days", + "subscriptionDays": "Subscription days", + "day": "Day", + "spin": "SPIN!", + "spinning": "Spinning...", + "history": "History", + "recentSpins": "Recent spins", + "congratulations": "Congratulations!", + "noLuck": "No luck!", + "oops": "Oops!", + "yourPromoCode": "Your promo code:", + "close": "Close", + "errors": { + "networkError": "A network error occurred", + "loadFailed": "Failed to load wheel configuration", + "dailyLimitReached": "Daily spin limit reached", + "cannotSpin": "Cannot spin right now", + "insufficientBalance": "Insufficient balance", + "topUpRequired": "Top up your balance to pay for spin", + "starsNotAvailable": "Stars payment not available. Open the app via Telegram." + }, + "payWithStars": "Pay with Stars", + "payWithDays": "Pay with days", + "processingPayment": "Processing...", + "starsPaymentSuccess": "Payment successful! Spin result sent to Telegram.", + "starsPaymentSuccessCheckHistory": "Payment successful! Check history or Telegram for the result.", + "starsPaymentFailed": "Payment failed. Please try again.", + "youWon": "You won", + "noPrize": "No luck this time...", + "noHistory": "No spin history yet", + "banner": { + "title": "Try your luck!", + "description": "Spin the wheel and win prizes: subscription days, balance, traffic and more!", + "button": "Go to wheel" + } + }, + "admin": { + "nav": { + "title": "Admin", + "dashboard": "Dashboard", + "tickets": "Tickets", + "settings": "Settings", + "apps": "Apps", + "wheel": "Wheel", + "tariffs": "Tariffs", + "servers": "Servers", + "broadcasts": "Broadcasts", + "users": "Users", + "payments": "Payments", + "remnawave": "RemnaWave" + }, + "panel": { + "title": "Admin Panel", + "subtitle": "System management", + "dashboardDesc": "Statistics and system monitoring", + "ticketsDesc": "Handle user support tickets", + "settingsDesc": "System settings and parameters", + "appsDesc": "Manage connection apps", + "wheelDesc": "Configure fortune wheel and prizes", + "tariffsDesc": "Manage tariff plans", + "serversDesc": "Configure VPN servers", + "broadcastsDesc": "Mass messaging to users", + "usersDesc": "Manage bot users", + "paymentsDesc": "Payment verification", + "remnawaveDesc": "Panel management and statistics" + }, + "payments": { + "title": "Payment Verification", + "description": "Pending payments in the last 24 hours", + "totalPending": "Total Pending", + "filterByMethod": "Filter by method", + "noPayments": "No pending payments", + "paid": "Paid", + "user": "User", + "openLink": "Open Link", + "checkStatus": "Check Status", + "checking": "Checking..." + }, + "remnawave": { + "title": "RemnaWave", + "subtitle": "Panel management and statistics", + "connected": "Connected", + "disconnected": "Not configured", + "noData": "Failed to load data", + "tabs": { + "overview": "Overview", + "nodes": "Nodes", + "squads": "Squads", + "sync": "Sync" + }, + "overview": { + "system": "System", + "usersOnline": "Online", + "totalUsers": "Total Users", + "nodesOnline": "Nodes Online", + "connections": "Connections", + "bandwidth": "Realtime Bandwidth", + "download": "Download", + "upload": "Upload", + "total": "Total", + "server": "Server", + "cpu": "CPU Cores", + "memory": "Memory", + "uptime": "Uptime", + "traffic": "Traffic Statistics", + "usersByStatus": "Users by Status" + }, + "nodes": { + "online": "Online", + "offline": "Offline", + "disabled": "Disabled", + "noNodes": "No nodes found", + "restart": "Restart", + "enable": "Enable", + "disable": "Disable", + "restartAll": "Restart All", + "confirmRestartAll": "Are you sure you want to restart all nodes?" + }, + "squads": { + "synced": "Synced", + "notSynced": "Not synced", + "noSquads": "No squads found", + "syncServers": "Sync Servers" + }, + "sync": { + "autoSync": "Auto Sync", + "runNow": "Run Now", + "manual": "Manual Sync", + "fromPanel": "Sync from Panel", + "fromPanelDesc": "Import users from RemnaWave panel to bot database", + "toPanel": "Sync to Panel", + "toPanelDesc": "Export users from bot database to RemnaWave panel", + "subscriptions": "Subscriptions", + "validate": "Validate", + "validateDesc": "Check and fix subscription inconsistencies", + "cleanup": "Cleanup", + "cleanupDesc": "Remove orphaned subscriptions without users", + "statuses": "Sync Statuses", + "statusesDesc": "Synchronize subscription statuses with panel" + } + }, + "wheel": { + "title": "Fortune Wheel Settings", + "enabled": "Enabled", + "disabled": "Disabled", + "tabs": { + "settings": "Settings", + "prizes": "Prizes", + "statistics": "Statistics" + }, + "settings": { + "enableWheel": "Enable Wheel", + "allowSpins": "Allow users to spin the wheel", + "costInStars": "Cost in Stars", + "costInDays": "Cost in Days", + "rtpPercent": "RTP (Return to Player) %", + "dailyLimit": "Daily Spin Limit (0 = unlimited)", + "minSubDays": "Min subscription days for day payment", + "promoPrefix": "Promo code prefix" + }, + "prizes": { + "addPrize": "Add Prize", + "editPrize": "Edit Prize", + "noPrizes": "No prizes configured. Add some prizes to enable the wheel.", + "deletePrize": "Delete this prize?", + "types": { + "subscription_days": "Subscription Days", + "balance_bonus": "Balance Bonus", + "traffic_gb": "Traffic GB", + "promocode": "Promo Code", + "nothing": "Nothing (Empty)" + }, + "fields": { + "type": "Type", + "displayName": "Display Name", + "value": "Value", + "valueKopeks": "Value in Kopeks (for RTP)", + "emoji": "Emoji", + "color": "Color", + "active": "Active", + "worth": "Worth" + }, + "promo": { + "title": "Promo Code Settings", + "balanceBonus": "Balance bonus (kopeks)", + "subscriptionDays": "Subscription days" + } + }, + "statistics": { + "totalSpins": "Total Spins", + "revenue": "Revenue", + "payouts": "Payouts", + "actualRtp": "Actual RTP", + "targetRtp": "target", + "prizeDistribution": "Prize Distribution", + "times": "times", + "topWins": "Top Wins" + } + }, + "broadcasts": { + "title": "Broadcasts", + "subtitle": "Mass messaging to users", + "create": "Create Broadcast", + "empty": "No broadcasts yet", + "selectFilter": "Select audience", + "selectFilterPlaceholder": "Select filter...", + "recipients": "recip.", + "messageText": "Message text", + "messageTextPlaceholder": "Enter broadcast message...", + "media": "Media file", + "addMedia": "Add media", + "uploading": "Uploading...", + "buttons": "Buttons", + "willBeSent": "Will be sent to", + "users": "users", + "send": "Send", + "stop": "Stop", + "progress": "Progress", + "total": "Total", + "sent": "Sent", + "failed": "Failed", + "filter": "Filter", + "message": "Message", + "unknownAdmin": "Unknown admin" + }, + "settings": { + "title": "System Settings", + "allCategories": "All categories", + "noSettings": "No settings found", + "modified": "Modified", + "readOnly": "Read only", + "reset": "Reset", + "categoriesCount": "categories", + "settingsCount": "settings", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "searchPlaceholder": "Search settings...", + "searchCategoriesPlaceholder": "Search categories...", + "noSearchResults": "Nothing found", + "example": "Example" + }, + "apps": { + "title": "App Management", + "addApp": "Add App", + "addFirstApp": "Add First App", + "noApps": "No apps for this platform", + "createApp": "Create App", + "editApp": "Edit App", + "confirmDelete": "Are you sure you want to delete this app?", + "copyTo": "Copy to...", + "appId": "App ID", + "appName": "Name", + "urlScheme": "URL Scheme", + "featured": "Featured", + "base64Encoding": "Base64 Encoding", + "buttons": "Buttons", + "button": "Button", + "addButton": "Add Button", + "buttonText": "Button Text", + "installDescription": "Installation Description", + "subscriptionDescription": "Add Subscription Description", + "connectDescription": "Connect Description", + "beforeSubscription": "Before Add Subscription", + "afterSubscription": "After Add Subscription", + "stepTitle": "Title", + "stepDescription": "Description", + "tabs": { + "basic": "Basic", + "installation": "Installation", + "subscription": "Subscription", + "connect": "Connect", + "additional": "Additional" + }, + "import": "Import", + "export": "Export", + "importApps": "Import apps from JSON", + "exportApps": "Export apps to JSON", + "importPreview": "Import Preview", + "confirmImport": "Import Apps", + "importError": "Invalid JSON file format", + "importCreateError": "Failed to create some apps", + "noAppsToImport": "No apps to import", + "remnaWaveToggle": "Toggle RemnaWave source", + "refreshRemnaWave": "Refresh from RemnaWave", + "remnaWaveMode": "Showing apps from RemnaWave panel. Read-only mode.", + "remnaWaveSettings": "RemnaWave Settings", + "remnaWaveConfigUuid": "Config UUID", + "remnaWaveConfigUuidHint": "UUID of subscription page config from RemnaWave panel", + "availableConfigs": "Available configs" + }, + "tickets": { + "title": "Ticket Management", + "total": "Total", + "list": "Tickets", + "noTickets": "No tickets", + "selectTicket": "Select a ticket from the list", + "allStatuses": "All statuses", + "statusOpen": "Open", + "statusPending": "Pending", + "statusAnswered": "Answered", + "statusClosed": "Closed", + "from": "From", + "created": "Created", + "user": "User", + "you": "You", + "userLabel": "User", + "adminLabel": "Admin", + "replyPlaceholder": "Type your reply...", + "sendReply": "Send Reply", + "settings": "Settings", + "supportMode": "Support mode", + "supportModeDesc": "Choose how users can contact support", + "modeBoth": "Tickets and contact", + "modeTickets": "Tickets only", + "modeContact": "Contact only", + "slaSettings": "SLA Settings", + "slaEnabled": "Enable SLA (response time monitoring)", + "slaEnabledDesc": "Automatic notifications for overdue tickets", + "slaMinutes": "Response time (minutes)", + "slaMinutesDesc": "Maximum time to respond to a ticket (1-1440 minutes)", + "checkInterval": "Check interval (seconds)", + "checkIntervalDesc": "How often to check for overdue tickets (30-600 seconds)", + "reminderCooldown": "Reminder interval (minutes)", + "reminderCooldownDesc": "Minimum time between reminders (1-120 minutes)", + "settingsUpdateError": "Error saving settings" + }, + "tariffs": { + "title": "Tariff Management", + "subtitle": "Configure tariff plans", + "create": "Create Tariff", + "edit": "Edit Tariff", + "noTariffs": "No tariffs", + "name": "Name", + "namePlaceholder": "Enter tariff name", + "description": "Description", + "descriptionPlaceholder": "Enter tariff description", + "trafficLimit": "Traffic Limit", + "trafficHint": "0 = unlimited traffic", + "deviceLimit": "Device Limit", + "tierLevel": "Tier Level", + "tierHint": "1-10, affects priority during upgrade", + "unlimited": "Unlimited", + "devices": "devices", + "servers": "servers", + "subscriptions": "subscriptions", + "trial": "Trial", + "inactive": "Inactive", + "activate": "Activate", + "deactivate": "Deactivate", + "toggleTrial": "Toggle Trial", + "delete": "Delete", + "confirmDelete": "Delete tariff?", + "confirmDeleteText": "This action cannot be undone. The tariff will be permanently deleted.", + "days": "days", + "tabs": { + "basic": "Basic", + "prices": "Prices", + "servers": "Servers" + }, + "pricesHint": "Enable required periods and set prices (in rubles)", + "periodDisabled": "Disabled", + "serversHint": "Select servers available for this tariff. You can set individual traffic limits for each server.", + "noServers": "No servers available", + "serverTrafficLimit": "Traffic limit", + "useDefault": "default" + }, + "servers": { + "title": "Server Management", + "subtitle": "Configure VPN servers", + "sync": "Sync", + "syncing": "Syncing...", + "syncNow": "Sync now", + "noServers": "No servers. Sync with RemnaWave.", + "edit": "Edit Server", + "originalName": "Original Name", + "displayName": "Display Name", + "displayNamePlaceholder": "Enter display name", + "description": "Description", + "descriptionPlaceholder": "Enter server description", + "countryCode": "Country Code", + "price": "Price", + "priceHint": "Additional server cost", + "maxUsers": "Max Users", + "sortOrder": "Sort Order", + "unlimited": "Unlimited", + "stats": "Statistics", + "currentUsers": "Current Users", + "activeSubscriptions": "Active Subscriptions", + "usedByTariffs": "Used by Tariffs", + "trial": "Trial", + "unavailable": "Unavailable", + "full": "Full", + "enable": "Enable", + "disable": "Disable", + "toggleTrial": "Toggle Trial", + "loadError": "Failed to load server" + } + }, + "adminDashboard": { + "title": "Statistics Dashboard", + "subtitle": "Real-time system overview", + "refresh": "Refresh", + "loadError": "Failed to load statistics", + "stats": { + "usersOnline": "Users Online", + "activeSubscriptions": "Active Subscriptions", + "incomeToday": "Today's Income", + "incomeMonth": "Monthly Income", + "incomeTotal": "Total Income", + "subscriptionIncome": "Subscription Income", + "total": "total" + }, + "nodes": { + "title": "Nodes", + "online": "Online", + "offline": "Offline", + "disabled": "Disabled", + "noNodes": "No nodes available", + "usersOnline": "Online", + "traffic": "Traffic", + "enable": "Enable", + "disable": "Disable" + }, + "revenue": { + "title": "Revenue", + "last7Days": "Last 7 days" + }, + "subscriptions": { + "title": "Subscriptions", + "subtitle": "Subscription statistics", + "active": "Active", + "trial": "Trial", + "paid": "Paid", + "expired": "Expired", + "newSubscriptions": "New Subscriptions", + "today": "Today", + "week": "Week", + "month": "Month", + "conversion": "Trial to Paid Conversion" + }, + "servers": { + "title": "Servers", + "total": "Total Servers", + "available": "Available", + "withConnections": "With Connections", + "revenue": "Revenue" + }, + "tariffs": { + "title": "Tariff Statistics", + "subtitle": "Subscription distribution by tariffs", + "tariffName": "Tariff", + "activeSubscriptions": "Active", + "trialSubscriptions": "Trial", + "purchasedToday": "Today", + "purchasedWeek": "Week", + "purchasedMonth": "Month", + "noTariffs": "No tariffs" + } + }, + "profile": { + "title": "Profile", + "accountInfo": "Account Information", + "telegramId": "Telegram ID", + "username": "Username", + "name": "Name", + "registeredAt": "Registered", + "emailAuth": "Email Authentication", + "linkEmailDescription": "Link your email to log in without Telegram. After linking, you'll receive a verification email.", + "linkEmail": "Link Email", + "emailRequired": "Email is required", + "passwordMinLength": "Password must be at least 8 characters", + "passwordsMismatch": "Passwords do not match", + "passwordPlaceholder": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordHint": "Minimum 8 characters", + "emailSent": "Verification email sent! Please check your inbox.", + "verified": "Verified", + "notVerified": "Not verified", + "verificationRequired": "Please verify your email to use email login.", + "resendVerification": "Resend Verification Email", + "verificationResent": "Verification email resent!", + "canLoginWithEmail": "You can now log in using your email and password.", + "notifications": { + "title": "Notification Settings", + "subscriptionExpiry": "Subscription Expiry", + "subscriptionExpiryDesc": "Notify about expiring subscription", + "daysBeforeExpiry": "Days before expiry", + "trafficWarning": "Traffic Warning", + "trafficWarningDesc": "Notify when approaching traffic limit", + "atPercent": "At usage", + "balanceLow": "Low Balance", + "balanceLowDesc": "Notify about low balance", + "threshold": "Threshold", + "news": "News", + "newsDesc": "Receive news and service updates", + "promoOffers": "Promo Offers", + "promoOffersDesc": "Receive special offers and discounts", + "unavailable": "Notification settings unavailable" + } + }, + "theme": { + "colors": "Theme Colors", + "reset": "Reset", + "accent": "Accent Color", + "accentDescription": "Main brand color for buttons, links and interactive elements", + "darkTheme": "Dark Theme", + "lightTheme": "Light Theme", + "background": "Background", + "surface": "Surface", + "text": "Text", + "textSecondary": "Secondary Text", + "statusColors": "Status Colors", + "success": "Success", + "warning": "Warning", + "error": "Error", + "preview": "Preview", + "previewButton": "Primary Button", + "previewSecondary": "Secondary Button", + "light": "Light Theme", + "dark": "Dark Theme" + }, + "languages": { + "ru": "Русский", + "en": "English", + "zh": "中文", + "fa": "فارسی" + }, + "contests": { + "title": "Contests", + "error": "Failed to load contests", + "noContests": "No contests available", + "days": "days", + "play": "Play", + "alreadyPlayed": "Already played", + "enterAnswer": "Enter your answer", + "submit": "Submit", + "imHere": "I'm here!" + }, + "polls": { + "title": "Polls", + "error": "Failed to load polls", + "noPolls": "No polls available", + "questions": "questions", + "question": "Question", + "of": "of", + "start": "Start", + "continue": "Continue", + "completed": "Completed", + "reward": "$" + }, + "info": { + "title": "Information", + "faq": "FAQ", + "rules": "Rules", + "privacy": "Privacy Policy", + "offer": "Public Offer", + "noFaq": "No FAQ available", + "noContent": "No content available", + "updatedAt": "Updated" + }, + "onboarding": { + "skip": "Skip", + "finish": "Finish", + "steps": { + "welcome": { + "title": "Welcome!", + "description": "This is your personal cabinet. Here you can manage your subscription, top up balance and connect devices." + }, + "connectDevices": { + "title": "Connect Devices", + "description": "Click this button to get instructions on how to connect VPN on your devices." + }, + "balance": { + "title": "Your Balance", + "description": "Your current balance is displayed here. Click to top it up." + }, + "subscription": { + "title": "Subscription Status", + "description": "Here you can see how many days are left until your subscription expires." + }, + "quickActions": { + "title": "Quick Actions", + "description": "Use these buttons for quick access to main features: top up balance, extend subscription, and invite friends." + } + } + } } diff --git a/src/locales/fa.json b/src/locales/fa.json index d3777eb..78c9181 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -1,766 +1,766 @@ { - "common": { - "loading": "در حال بارگذاری...", - "error": "خطا", - "success": "موفق", - "save": "ذخیره", - "cancel": "لغو", - "confirm": "تایید", - "back": "بازگشت", - "next": "بعدی", - "close": "بستن", - "search": "جستجو", - "noData": "داده‌ای موجود نیست", - "actions": "عملیات", - "yes": "بله", - "no": "خیر", - "or": "یا", - "and": "و", - "edit": "ویرایش", - "delete": "حذف", - "currency": "تومان" - }, - "nav": { - "dashboard": "داشبورد", - "subscription": "اشتراک", - "balance": "موجودی", - "referral": "معرفی", - "support": "پشتیبانی", - "profile": "پروفایل", - "logout": "خروج", - "contests": "مسابقات", - "polls": "نظرسنجی", - "info": "اطلاعات", - "wheel": "چرخ شانس" - }, - "auth": { - "login": "ورود", - "register": "ثبت نام", - "logout": "خروج", - "email": "ایمیل", - "password": "رمز عبور", - "confirmPassword": "تایید رمز عبور", - "forgotPassword": "رمز عبور را فراموش کردید؟", - "resetPassword": "بازنشانی رمز عبور", - "loginWithTelegram": "ورود با تلگرام", - "loginWithEmail": "ورود با ایمیل", - "noAccount": "حساب کاربری ندارید؟", - "hasAccount": "قبلاً حساب دارید؟", - "registerHint": "برای ثبت نام با ایمیل، ابتدا با تلگرام وارد شوید، سپس ایمیل خود را در تنظیمات متصل کنید.", - "telegramRequired": "نیاز به تایید تلگرام", - "telegramNotConfigured": "ربات تلگرام پیکربندی نشده", - "authenticating": "در حال تایید هویت...", - "orOpenInApp": "یا ربات را در برنامه باز کنید", - "loginFailed": "ورود ناموفق", - "tryAgain": "تلاش مجدد", - "welcomeBack": "خوش آمدید!", - "loginTitle": "ورود به کابین", - "loginSubtitle": "با تلگرام یا ایمیل وارد شوید" - }, - "emailVerification": { - "title": "تایید ایمیل", - "verifying": "در حال تایید ایمیل...", - "pleaseWait": "لطفاً صبر کنید تا ایمیل شما تایید شود.", - "success": "ایمیل تایید شد!", - "successMessage": "ایمیل شما با موفقیت تایید شد. اکنون می‌توانید با ایمیل و رمز عبور وارد شوید.", - "failed": "تایید ناموفق", - "goToLogin": "رفتن به صفحه ورود" - }, - "dashboard": { - "title": "داشبورد", - "welcome": "خوش آمدید، {{name}}!", - "yourSubscription": "اشتراک شما", - "quickActions": "دسترسی سریع", - "viewSubscription": "مدیریت اشتراک", - "topUpBalance": "شارژ موجودی", - "inviteFriends": "دعوت دوستان", - "getSupport": "دریافت پشتیبانی", - "currentBalance": "موجودی فعلی", - "activeUntil": "فعال تا", - "noActiveSubscription": "اشتراک فعال ندارید", - "devicesUsed": "دستگاه‌ها: {{used}} از {{total}}", - "trafficUsed": "ترافیک: {{used}} از {{total}} گیگ", - "unlimitedTraffic": "ترافیک نامحدود" - }, - "subscription": { - "title": "اشتراک", - "currentPlan": "پلن فعلی", - "status": "وضعیت", - "active": "فعال", - "inactive": "غیرفعال", - "trialStatus": "دوره آزمایشی", - "expired": "منقضی شده", - "expiresAt": "تاریخ انقضا", - "daysLeft": "روز باقی‌مانده", - "devices": "دستگاه‌ها", - "servers": "سرورها", - "traffic": "ترافیک", - "unlimited": "نامحدود", - "used": "استفاده شده", - "of": "از", - "renew": "تمدید", - "extend": "تمدید اشتراک", - "buyTraffic": "خرید ترافیک", - "buyDevices": "خرید دستگاه", - "renewalOptions": "گزینه‌های تمدید", - "days": "روز", - "hours": "ساعت", - "minutes": "دقیقه", - "price": "قیمت", - "noSubscription": "اشتراک فعال ندارید", - "getSubscription": "خرید اشتراک", - "connectionInfo": "اطلاعات اتصال", - "copyLink": "کپی لینک", - "copied": "کپی شد!", - "showQR": "نمایش QR کد", - "downloadConfig": "دانلود تنظیمات", - "trafficUsed": "ترافیک استفاده شده", - "timeLeft": "زمان باقی‌مانده", - "getConfig": "اتصال دستگاه‌ها", - "autoRenewal": "تمدید خودکار", - "daysBeforeExpiry": "روز قبل از انقضا", - "selectPeriod": "انتخاب دوره", - "selectTraffic": "انتخاب ترافیک", - "selectServers": "انتخاب سرورها", - "selectDevices": "انتخاب دستگاه‌ها", - "perDevice": "/ دستگاه", - "summary": "خلاصه", - "total": "جمع کل", - "purchase": "خرید", - "step": "مرحله {{current}} از {{total}}", - "stepPeriod": "دوره", - "stepTraffic": "ترافیک", - "stepServers": "سرورها", - "stepDevices": "دستگاه‌ها", - "stepConfirm": "تایید", - "trial": { - "title": "دوره آزمایشی رایگان", - "description": "سرویس VPN ما را رایگان امتحان کنید!", - "days": "روز", - "devices": "دستگاه", - "price": "هزینه فعال‌سازی", - "activate": "فعال‌سازی دوره آزمایشی", - "unavailable": "دوره آزمایشی در دسترس نیست" - }, - "connection": { - "title": "اتصال VPN", - "selectDevice": "دستگاه خود را انتخاب کنید", - "selectApp": "برنامه را انتخاب کنید", - "installApp": "۱. نصب برنامه", - "addSubscription": "۲. افزودن اشتراک", - "connectVpn": "۳. اتصال VPN", - "addToApp": "افزودن به {{appName}}", - "connect": "اتصال", - "noApps": "برنامه‌ای برای این پلتفرم موجود نیست", - "noSubscription": "برای اتصال نیاز به اشتراک فعال دارید", - "featured": "پیشنهادی", - "yourDevice": "دستگاه شما", - "copyLink": "کپی لینک اشتراک", - "copied": "لینک کپی شد!", - "openLink": "باز کردن لینک" - } - }, - "balance": { - "title": "موجودی", - "currentBalance": "موجودی فعلی", - "topUp": "شارژ", - "topUpBalance": "شارژ موجودی", - "paymentMethods": { - "yookassa": { - "name": "YooKassa", - "description": "پرداخت از طریق YooKassa" - }, - "cryptobot": { - "name": "CryptoBot", - "description": "پرداخت با ارز دیجیتال" - }, - "telegram_stars": { - "name": "Telegram Stars", - "description": "پرداخت با Telegram Stars" - } - }, - "transactionHistory": "تاریخچه تراکنش‌ها", - "noTransactions": "تراکنشی موجود نیست", - "date": "تاریخ", - "type": "نوع", - "description": "توضیحات", - "amount": "مبلغ", - "deposit": "واریز", - "withdrawal": "برداشت", - "subscriptionPayment": "پرداخت اشتراک", - "referralReward": "پاداش معرفی", - "minAmount": "حداقل", - "maxAmount": "حداکثر", - "notAvailable": "در دسترس نیست", - "useBot": "لطفاً برای شارژ از ربات تلگرام استفاده کنید.", - "page": "صفحه {{current}} از {{total}}", - "invalidAmount": "مبلغ نامعتبر", - "promocode": { - "title": "کد تخفیف", - "placeholder": "کد تخفیف را وارد کنید", - "activate": "فعال‌سازی", - "activating": "در حال فعال‌سازی...", - "success": "کد تخفیف با موفقیت فعال شد!", - "balanceAdded": "موجودی اضافه شده: {{amount}}", - "errors": { - "not_found": "کد تخفیف یافت نشد", - "expired": "کد تخفیف منقضی شده", - "used": "کد تخفیف قبلاً استفاده شده", - "already_used_by_user": "شما قبلاً از این کد استفاده کرده‌اید", - "user_not_found": "کاربر یافت نشد", - "server_error": "خطای سرور" - } - }, - "minAmountError": "حداقل مبلغ: {{amount}}", - "maxAmountError": "حداکثر مبلغ: {{amount}}" - }, - "referral": { - "title": "برنامه معرفی", - "yourLink": "لینک معرفی شما", - "copyLink": "کپی لینک", - "copied": "کپی شد!", - "shareButton": "اشتراک‌گذاری", - "shareMessage": "از طریق لینک من به Cabinet بپیوند و تا {{percent}}٪ پاداش بگیر!", - "shareHint": "این لینک را با دوستان به اشتراک بگذارید. وقتی ثبت نام کنند و خرید کنند، {{percent}}% کمیسیون دریافت می‌کنید!", - "stats": { - "totalReferrals": "کل معرفی‌ها", - "activeReferrals": "فعال", - "totalEarnings": "کل درآمد", - "commissionRate": "نرخ کمیسیون" - }, - "terms": { - "title": "شرایط برنامه", - "commission": "کمیسیون", - "minTopup": "حداقل شارژ", - "newUserBonus": "جایزه کاربر جدید", - "inviterBonus": "جایزه معرف" - }, - "yourReferrals": "معرفی‌های شما", - "noReferrals": "هنوز معرفی ندارید. لینک را به اشتراک بگذارید!", - "user": "کاربر", - "joined": "تاریخ عضویت", - "hasPaid": "پرداخت کرده", - "earningsHistory": "تاریخچه درآمد", - "reason": "دلیل", - "status": { - "pending": "در انتظار", - "paid": "پرداخت شده" - }, - "reasons": { - "referral_registration_pending": "ثبت‌نام کاربر معرفی‌شده", - "referral_registration": "ثبت‌نام کاربر معرفی‌شده", - "referral_first_payment": "اولین پرداخت کاربر معرفی‌شده", - "referral_subscription_renewal": "تمدید اشتراک کاربر معرفی‌شده", - "referral_bonus": "پاداش کاربر معرفی‌شده" - } - }, - "support": { - "title": "پشتیبانی", - "newTicket": "تیکت جدید", - "yourTickets": "تیکت‌های شما", - "noTickets": "تیکتی موجود نیست", - "createTicket": "ایجاد تیکت", - "subject": "موضوع", - "subjectPlaceholder": "مشکل را به طور خلاصه توضیح دهید", - "message": "پیام", - "messagePlaceholder": "مشکل خود را به طور کامل توضیح دهید...", - "send": "ارسال", - "sending": "در حال ارسال...", - "creating": "در حال ایجاد...", - "reply": "پاسخ", - "replyPlaceholder": "پاسخ خود را بنویسید...", - "sendReply": "ارسال پاسخ", - "you": "شما", - "supportTeam": "پشتیبانی", - "selectTicket": "یک تیکت انتخاب کنید یا جدید ایجاد کنید", - "created": "ایجاد شده", - "repliesDisabled": "پاسخ‌گویی به این تیکت غیرفعال است", - "status": { - "open": "باز", - "answered": "پاسخ داده شده", - "pending": "در انتظار", - "closed": "بسته" - }, - "attachImage": "پیوست تصویر", - "invalidFileType": "نوع فایل نامعتبر. از JPEG، PNG، GIF یا WebP استفاده کنید.", - "fileTooLarge": "فایل خیلی بزرگ است. حداکثر 10MB.", - "uploadFailed": "آپلود تصویر ناموفق", - "imageLoadFailed": "بارگذاری تصویر ناموفق" - }, - "wheel": { - "title": "چرخ شانس", - "disabled": "چرخ شانس فعلاً در دسترس نیست", - "spinsRemaining": "تعداد چرخش باقی‌مانده امروز", - "choosePayment": "روش پرداخت را انتخاب کنید", - "stars": "Stars", - "telegramStars": "Telegram Stars", - "days": "روز", - "subscriptionDays": "روز اشتراک", - "day": "روز", - "spin": "بچرخان!", - "spinning": "در حال چرخش...", - "history": "تاریخچه", - "recentSpins": "چرخش‌های اخیر", - "congratulations": "تبریک!", - "noLuck": "شانس نیاوردید!", - "oops": "اوه!", - "yourPromoCode": "کد تخفیف شما:", - "close": "بستن", - "errors": { - "networkError": "خطای شبکه رخ داد", - "loadFailed": "بارگذاری تنظیمات چرخ ناموفق", - "dailyLimitReached": "به محدودیت روزانه رسیدید", - "cannotSpin": "فعلاً امکان چرخش نیست", - "insufficientBalance": "موجودی کافی نیست", - "topUpRequired": "برای پرداخت شارژ کنید" - }, - "payWithStars": "پرداخت {stars} Stars", - "processingPayment": "در حال پردازش...", - "starsPaymentSuccess": "پرداخت موفق! نتیجه به تلگرام ارسال شد.", - "starsPaymentFailed": "پرداخت ناموفق. دوباره تلاش کنید.", - "noHistory": "هنوز تاریخچه‌ای نیست", - "banner": { - "title": "شانس خود را امتحان کنید!", - "description": "چرخ را بچرخانید و جایزه ببرید: روز اشتراک، موجودی، ترافیک و بیشتر!", - "button": "برو به چرخ" - } - }, - "admin": { - "nav": { - "title": "مدیریت", - "dashboard": "آمار", - "tickets": "تیکت‌ها", - "settings": "تنظیمات", - "apps": "برنامه‌ها", - "wheel": "چرخ", - "tariffs": "تعرفه‌ها", - "servers": "سرورها", - "broadcasts": "پیام‌رسانی" - }, - "panel": { - "title": "پنل مدیریت", - "subtitle": "مدیریت سیستم", - "dashboardDesc": "آمار و مانیتورینگ سیستم", - "ticketsDesc": "مدیریت تیکت‌های کاربران", - "settingsDesc": "تنظیمات و پارامترهای سیستم", - "appsDesc": "مدیریت برنامه‌های اتصال", - "wheelDesc": "تنظیم چرخ شانس و جوایز", - "tariffsDesc": "مدیریت طرح‌های تعرفه", - "serversDesc": "تنظیم سرورهای VPN", - "broadcastsDesc": "ارسال پیام گروهی به کاربران" - }, - "wheel": { - "title": "تنظیمات چرخ شانس", - "enabled": "فعال", - "disabled": "غیرفعال", - "tabs": { - "settings": "تنظیمات", - "prizes": "جوایز", - "statistics": "آمار" - }, - "settings": { - "enableWheel": "فعال‌سازی چرخ", - "allowSpins": "اجازه چرخش به کاربران", - "costInStars": "هزینه Stars", - "costInDays": "هزینه روز", - "rtpPercent": "درصد RTP", - "dailyLimit": "محدودیت روزانه (0 = نامحدود)", - "minSubDays": "حداقل روز اشتراک برای پرداخت روزانه", - "promoPrefix": "پیشوند کد تخفیف" - }, - "prizes": { - "addPrize": "افزودن جایزه", - "editPrize": "ویرایش جایزه", - "noPrizes": "جایزه‌ای تنظیم نشده. برای فعال‌سازی چرخ جایزه اضافه کنید.", - "deletePrize": "این جایزه حذف شود؟", - "types": { - "subscription_days": "روز اشتراک", - "balance_bonus": "جایزه موجودی", - "traffic_gb": "ترافیک GB", - "promocode": "کد تخفیف", - "nothing": "هیچی" - }, - "fields": { - "type": "نوع", - "displayName": "نام نمایشی", - "value": "مقدار", - "valueKopeks": "ارزش (کوپک، برای RTP)", - "emoji": "ایموجی", - "color": "رنگ", - "active": "فعال", - "worth": "ارزش" - }, - "promo": { - "title": "تنظیمات کد تخفیف", - "balanceBonus": "جایزه موجودی (کوپک)", - "subscriptionDays": "روز اشتراک" - } - }, - "statistics": { - "totalSpins": "کل چرخش‌ها", - "revenue": "درآمد", - "payouts": "پرداخت‌ها", - "actualRtp": "RTP واقعی", - "targetRtp": "هدف", - "prizeDistribution": "توزیع جوایز", - "times": "بار", - "topWins": "برترین برنده‌ها" - } - }, - "broadcasts": { - "title": "پیام‌رسانی", - "subtitle": "ارسال پیام گروهی به کاربران", - "create": "ایجاد پیام", - "empty": "هنوز پیامی ارسال نشده", - "selectFilter": "انتخاب مخاطبین", - "selectFilterPlaceholder": "انتخاب فیلتر...", - "recipients": "نفر", - "messageText": "متن پیام", - "messageTextPlaceholder": "متن پیام را وارد کنید...", - "media": "فایل رسانه", - "addMedia": "افزودن رسانه", - "uploading": "در حال آپلود...", - "buttons": "دکمه‌ها", - "willBeSent": "ارسال می‌شود به", - "users": "کاربر", - "send": "ارسال", - "stop": "توقف", - "progress": "پیشرفت", - "total": "کل", - "sent": "ارسال شده", - "failed": "ناموفق", - "filter": "فیلتر", - "message": "پیام", - "unknownAdmin": "مدیر ناشناس" - }, - "settings": { - "title": "تنظیمات سیستم", - "allCategories": "همه دسته‌ها", - "noSettings": "تنظیماتی یافت نشد", - "modified": "تغییر یافته", - "readOnly": "فقط خواندنی", - "reset": "بازنشانی", - "categoriesCount": "دسته", - "settingsCount": "تنظیم", - "expandAll": "باز کردن همه", - "collapseAll": "بستن همه", - "searchPlaceholder": "جستجوی تنظیمات...", - "searchCategoriesPlaceholder": "جستجوی دسته‌ها...", - "noSearchResults": "چیزی یافت نشد", - "example": "مثال" - }, - "apps": { - "title": "مدیریت برنامه‌ها", - "addApp": "افزودن برنامه", - "addFirstApp": "افزودن اولین برنامه", - "noApps": "برنامه‌ای برای این پلتفرم نیست", - "createApp": "ایجاد برنامه", - "editApp": "ویرایش برنامه", - "confirmDelete": "آیا مطمئن هستید که می‌خواهید این برنامه را حذف کنید؟", - "copyTo": "کپی به...", - "appId": "شناسه برنامه", - "appName": "نام", - "urlScheme": "URL Scheme", - "featured": "ویژه", - "base64Encoding": "کدگذاری Base64", - "buttons": "دکمه‌ها", - "button": "دکمه", - "addButton": "افزودن دکمه", - "buttonText": "متن دکمه", - "installDescription": "توضیحات نصب", - "subscriptionDescription": "توضیحات افزودن اشتراک", - "connectDescription": "توضیحات اتصال", - "beforeSubscription": "قبل از افزودن اشتراک", - "afterSubscription": "بعد از افزودن اشتراک", - "stepTitle": "عنوان", - "stepDescription": "توضیحات", - "tabs": { - "basic": "اصلی", - "installation": "نصب", - "subscription": "اشتراک", - "connect": "اتصال", - "additional": "اضافی" - } - }, - "tickets": { - "title": "مدیریت تیکت‌ها", - "total": "کل", - "list": "تیکت‌ها", - "noTickets": "تیکتی نیست", - "selectTicket": "یک تیکت از لیست انتخاب کنید", - "allStatuses": "همه وضعیت‌ها", - "statusOpen": "باز", - "statusPending": "در انتظار", - "statusAnswered": "پاسخ داده شده", - "statusClosed": "بسته", - "from": "از", - "created": "ایجاد شده", - "user": "کاربر", - "you": "شما", - "userLabel": "کاربر", - "adminLabel": "مدیر", - "replyPlaceholder": "پاسخ خود را بنویسید...", - "sendReply": "ارسال پاسخ", - "settings": "تنظیمات", - "supportMode": "حالت پشتیبانی", - "supportModeDesc": "انتخاب کنید کاربران چگونه می‌توانند با پشتیبانی تماس بگیرند", - "modeBoth": "تیکت و تماس", - "modeTickets": "فقط تیکت", - "modeContact": "فقط تماس", - "slaSettings": "تنظیمات SLA", - "slaEnabled": "فعال کردن SLA (نظارت بر زمان پاسخ)", - "slaEnabledDesc": "اعلان‌های خودکار برای تیکت‌های معوقه", - "slaMinutes": "زمان پاسخ (دقیقه)", - "slaMinutesDesc": "حداکثر زمان برای پاسخ به تیکت (1-1440 دقیقه)", - "checkInterval": "فاصله بررسی (ثانیه)", - "checkIntervalDesc": "چند وقت یکبار تیکت‌های معوقه را بررسی کنیم (30-600 ثانیه)", - "reminderCooldown": "فاصله یادآوری (دقیقه)", - "reminderCooldownDesc": "حداقل زمان بین یادآوری‌ها (1-120 دقیقه)", - "settingsUpdateError": "خطا در ذخیره تنظیمات" - }, - "tariffs": { - "title": "مدیریت تعرفه‌ها", - "subtitle": "پیکربندی پلن‌های تعرفه", - "create": "ایجاد تعرفه", - "edit": "ویرایش تعرفه", - "noTariffs": "تعرفه‌ای نیست", - "name": "نام", - "namePlaceholder": "نام تعرفه را وارد کنید", - "description": "توضیحات", - "descriptionPlaceholder": "توضیحات تعرفه را وارد کنید", - "trafficLimit": "محدودیت ترافیک", - "trafficHint": "0 = ترافیک نامحدود", - "deviceLimit": "محدودیت دستگاه", - "tierLevel": "سطح تعرفه", - "tierHint": "1-10، روی اولویت ارتقا تأثیر می‌گذارد", - "unlimited": "نامحدود", - "devices": "دستگاه", - "servers": "سرور", - "subscriptions": "اشتراک", - "trial": "آزمایشی", - "inactive": "غیرفعال", - "activate": "فعال‌سازی", - "deactivate": "غیرفعال‌سازی", - "toggleTrial": "تغییر آزمایشی", - "delete": "حذف", - "confirmDelete": "تعرفه حذف شود؟", - "confirmDeleteText": "این عمل قابل بازگشت نیست. تعرفه برای همیشه حذف می‌شود.", - "days": "روز", - "tabs": { - "basic": "اصلی", - "prices": "قیمت‌ها", - "servers": "سرورها" - }, - "pricesHint": "قیمت هر دوره را تنظیم کنید", - "serversHint": "سرورهای موجود برای این تعرفه را انتخاب کنید", - "noServers": "سرور موجود نیست" - }, - "servers": { - "title": "مدیریت سرورها", - "subtitle": "پیکربندی سرورهای VPN", - "sync": "همگام‌سازی", - "syncing": "در حال همگام‌سازی...", - "syncNow": "همگام‌سازی الان", - "noServers": "سروری نیست. با RemnaWave همگام‌سازی کنید.", - "edit": "ویرایش سرور", - "originalName": "نام اصلی", - "displayName": "نام نمایشی", - "displayNamePlaceholder": "نام نمایشی را وارد کنید", - "description": "توضیحات", - "descriptionPlaceholder": "توضیحات سرور را وارد کنید", - "countryCode": "کد کشور", - "price": "قیمت", - "priceHint": "هزینه اضافی سرور", - "maxUsers": "حداکثر کاربران", - "sortOrder": "ترتیب", - "unlimited": "نامحدود", - "stats": "آمار", - "currentUsers": "کاربران فعلی", - "activeSubscriptions": "اشتراک‌های فعال", - "usedByTariffs": "استفاده شده توسط تعرفه‌ها", - "trial": "آزمایشی", - "unavailable": "در دسترس نیست", - "full": "پر", - "enable": "فعال", - "disable": "غیرفعال", - "toggleTrial": "تغییر آزمایشی" - } - }, - "adminDashboard": { - "title": "پنل آمار", - "subtitle": "نمای کلی سیستم در لحظه", - "refresh": "بروزرسانی", - "loadError": "بارگیری آمار ناموفق بود", - "stats": { - "usersOnline": "کاربران آنلاین", - "activeSubscriptions": "اشتراک‌های فعال", - "incomeToday": "درآمد امروز", - "incomeMonth": "درآمد ماهانه", - "incomeTotal": "کل درآمد", - "subscriptionIncome": "درآمد اشتراک", - "total": "کل" - }, - "nodes": { - "title": "نودها", - "online": "آنلاین", - "offline": "آفلاین", - "disabled": "غیرفعال", - "noNodes": "نود موجود نیست", - "usersOnline": "آنلاین", - "traffic": "ترافیک", - "enable": "فعال", - "disable": "غیرفعال" - }, - "revenue": { - "title": "درآمد", - "last7Days": "۷ روز اخیر" - }, - "subscriptions": { - "title": "اشتراک‌ها", - "subtitle": "آمار اشتراک", - "active": "فعال", - "trial": "آزمایشی", - "paid": "پرداخت شده", - "expired": "منقضی شده", - "newSubscriptions": "اشتراک‌های جدید", - "today": "امروز", - "week": "هفته", - "month": "ماه", - "conversion": "تبدیل آزمایشی به پولی" - }, - "servers": { - "title": "سرورها", - "total": "کل سرورها", - "available": "در دسترس", - "withConnections": "با اتصال", - "revenue": "درآمد" - } - }, - "profile": { - "title": "پروفایل", - "accountInfo": "اطلاعات حساب", - "telegramId": "شناسه تلگرام", - "username": "نام کاربری", - "name": "نام", - "registeredAt": "تاریخ ثبت نام", - "emailAuth": "احراز هویت ایمیل", - "linkEmailDescription": "ایمیل خود را متصل کنید تا بدون تلگرام وارد شوید. پس از اتصال، ایمیل تایید دریافت خواهید کرد.", - "linkEmail": "اتصال ایمیل", - "emailRequired": "ایمیل الزامی است", - "passwordMinLength": "رمز عبور باید حداقل 8 کاراکتر باشد", - "passwordsMismatch": "رمزهای عبور مطابقت ندارند", - "passwordPlaceholder": "رمز عبور را وارد کنید", - "confirmPasswordPlaceholder": "رمز عبور را تایید کنید", - "passwordHint": "حداقل 8 کاراکتر", - "emailSent": "ایمیل تایید ارسال شد! صندوق خود را بررسی کنید.", - "verified": "تایید شده", - "notVerified": "تایید نشده", - "verificationRequired": "لطفاً ایمیل خود را تایید کنید تا از ورود با ایمیل استفاده کنید.", - "resendVerification": "ارسال مجدد ایمیل تایید", - "verificationResent": "ایمیل تایید مجدداً ارسال شد!", - "canLoginWithEmail": "اکنون می‌توانید با ایمیل و رمز عبور وارد شوید.", - "notifications": { - "title": "تنظیمات اعلان", - "subscriptionExpiry": "انقضای اشتراک", - "subscriptionExpiryDesc": "اعلان قبل از انقضای اشتراک", - "daysBeforeExpiry": "روز قبل از انقضا", - "trafficWarning": "هشدار ترافیک", - "trafficWarningDesc": "اعلان نزدیک شدن به محدودیت ترافیک", - "atPercent": "در درصد", - "balanceLow": "موجودی کم", - "balanceLowDesc": "اعلان موجودی کم", - "threshold": "آستانه", - "news": "اخبار", - "newsDesc": "دریافت اخبار و به‌روزرسانی‌ها", - "promoOffers": "پیشنهادات تبلیغاتی", - "promoOffersDesc": "دریافت پیشنهادات ویژه و تخفیف‌ها", - "unavailable": "تنظیمات اعلان در دسترس نیست" - } - }, - "theme": { - "colors": "رنگ‌های تم", - "reset": "بازنشانی", - "accent": "رنگ تأکیدی", - "accentDescription": "رنگ اصلی برند برای دکمه‌ها، لینک‌ها و عناصر تعاملی", - "darkTheme": "تم تیره", - "lightTheme": "تم روشن", - "background": "پس‌زمینه", - "surface": "سطح", - "text": "متن", - "textSecondary": "متن ثانویه", - "statusColors": "رنگ‌های وضعیت", - "success": "موفقیت", - "warning": "هشدار", - "error": "خطا", - "preview": "پیش‌نمایش", - "previewButton": "دکمه اصلی", - "previewSecondary": "دکمه ثانویه", - "light": "تم روشن", - "dark": "تم تیره" - }, - "languages": { - "ru": "Русский", - "en": "English", - "zh": "中文", - "fa": "فارسی" - }, - "contests": { - "title": "مسابقات", - "error": "بارگذاری مسابقات ناموفق", - "noContests": "مسابقه‌ای موجود نیست", - "days": "روز", - "play": "شرکت", - "alreadyPlayed": "قبلاً شرکت کردید", - "enterAnswer": "پاسخ خود را وارد کنید", - "submit": "ارسال", - "imHere": "من اینجام!" - }, - "polls": { - "title": "نظرسنجی‌ها", - "error": "بارگذاری نظرسنجی‌ها ناموفق", - "noPolls": "نظرسنجی موجود نیست", - "questions": "سوال", - "question": "سوال", - "of": "از", - "start": "شروع", - "continue": "ادامه", - "completed": "تکمیل شده", - "reward": "تومان" - }, - "info": { - "title": "اطلاعات", - "faq": "سوالات متداول", - "rules": "قوانین", - "privacy": "حریم خصوصی", - "offer": "شرایط خدمات", - "noFaq": "سوال متداولی موجود نیست", - "noContent": "محتوایی موجود نیست", - "updatedAt": "به‌روزرسانی" - }, - "onboarding": { - "skip": "رد کردن", - "finish": "پایان", - "steps": { - "welcome": { - "title": "خوش آمدید!", - "description": "این کابین شخصی شماست. اینجا می‌توانید اشتراک خود را مدیریت کنید، موجودی شارژ کنید و دستگاه‌ها را متصل کنید." - }, - "connectDevices": { - "title": "اتصال دستگاه‌ها", - "description": "این دکمه را بزنید تا راهنمای اتصال VPN روی دستگاه‌هایتان را دریافت کنید." - }, - "balance": { - "title": "موجودی شما", - "description": "موجودی فعلی شما اینجا نمایش داده می‌شود. برای شارژ کلیک کنید." - }, - "subscription": { - "title": "وضعیت اشتراک", - "description": "اینجا می‌توانید روزهای باقی‌مانده تا انقضای اشتراک را ببینید." - }, - "quickActions": { - "title": "دسترسی سریع", - "description": "از این دکمه‌ها برای دسترسی سریع به امکانات اصلی استفاده کنید: شارژ موجودی، تمدید اشتراک و دعوت دوستان." - } - } - } -} \ No newline at end of file + "common": { + "loading": "در حال بارگذاری...", + "error": "خطا", + "success": "موفق", + "save": "ذخیره", + "cancel": "لغو", + "confirm": "تایید", + "back": "بازگشت", + "next": "بعدی", + "close": "بستن", + "search": "جستجو", + "noData": "داده‌ای موجود نیست", + "actions": "عملیات", + "yes": "بله", + "no": "خیر", + "or": "یا", + "and": "و", + "edit": "ویرایش", + "delete": "حذف", + "currency": "تومان" + }, + "nav": { + "dashboard": "داشبورد", + "subscription": "اشتراک", + "balance": "موجودی", + "referral": "معرفی", + "support": "پشتیبانی", + "profile": "پروفایل", + "logout": "خروج", + "contests": "مسابقات", + "polls": "نظرسنجی", + "info": "اطلاعات", + "wheel": "چرخ شانس" + }, + "auth": { + "login": "ورود", + "register": "ثبت نام", + "logout": "خروج", + "email": "ایمیل", + "password": "رمز عبور", + "confirmPassword": "تایید رمز عبور", + "forgotPassword": "رمز عبور را فراموش کردید؟", + "resetPassword": "بازنشانی رمز عبور", + "loginWithTelegram": "ورود با تلگرام", + "loginWithEmail": "ورود با ایمیل", + "noAccount": "حساب کاربری ندارید؟", + "hasAccount": "قبلاً حساب دارید؟", + "registerHint": "برای ثبت نام با ایمیل، ابتدا با تلگرام وارد شوید، سپس ایمیل خود را در تنظیمات متصل کنید.", + "telegramRequired": "نیاز به تایید تلگرام", + "telegramNotConfigured": "ربات تلگرام پیکربندی نشده", + "authenticating": "در حال تایید هویت...", + "orOpenInApp": "یا ربات را در برنامه باز کنید", + "loginFailed": "ورود ناموفق", + "tryAgain": "تلاش مجدد", + "welcomeBack": "خوش آمدید!", + "loginTitle": "ورود به کابین", + "loginSubtitle": "با تلگرام یا ایمیل وارد شوید" + }, + "emailVerification": { + "title": "تایید ایمیل", + "verifying": "در حال تایید ایمیل...", + "pleaseWait": "لطفاً صبر کنید تا ایمیل شما تایید شود.", + "success": "ایمیل تایید شد!", + "successMessage": "ایمیل شما با موفقیت تایید شد. اکنون می‌توانید با ایمیل و رمز عبور وارد شوید.", + "failed": "تایید ناموفق", + "goToLogin": "رفتن به صفحه ورود" + }, + "dashboard": { + "title": "داشبورد", + "welcome": "خوش آمدید، {{name}}!", + "yourSubscription": "اشتراک شما", + "quickActions": "دسترسی سریع", + "viewSubscription": "مدیریت اشتراک", + "topUpBalance": "شارژ موجودی", + "inviteFriends": "دعوت دوستان", + "getSupport": "دریافت پشتیبانی", + "currentBalance": "موجودی فعلی", + "activeUntil": "فعال تا", + "noActiveSubscription": "اشتراک فعال ندارید", + "devicesUsed": "دستگاه‌ها: {{used}} از {{total}}", + "trafficUsed": "ترافیک: {{used}} از {{total}} گیگ", + "unlimitedTraffic": "ترافیک نامحدود" + }, + "subscription": { + "title": "اشتراک", + "currentPlan": "پلن فعلی", + "status": "وضعیت", + "active": "فعال", + "inactive": "غیرفعال", + "trialStatus": "دوره آزمایشی", + "expired": "منقضی شده", + "expiresAt": "تاریخ انقضا", + "daysLeft": "روز باقی‌مانده", + "devices": "دستگاه‌ها", + "servers": "سرورها", + "traffic": "ترافیک", + "unlimited": "نامحدود", + "used": "استفاده شده", + "of": "از", + "renew": "تمدید", + "extend": "تمدید اشتراک", + "buyTraffic": "خرید ترافیک", + "buyDevices": "خرید دستگاه", + "renewalOptions": "گزینه‌های تمدید", + "days": "روز", + "hours": "ساعت", + "minutes": "دقیقه", + "price": "قیمت", + "noSubscription": "اشتراک فعال ندارید", + "getSubscription": "خرید اشتراک", + "connectionInfo": "اطلاعات اتصال", + "copyLink": "کپی لینک", + "copied": "کپی شد!", + "showQR": "نمایش QR کد", + "downloadConfig": "دانلود تنظیمات", + "trafficUsed": "ترافیک استفاده شده", + "timeLeft": "زمان باقی‌مانده", + "getConfig": "اتصال دستگاه‌ها", + "autoRenewal": "تمدید خودکار", + "daysBeforeExpiry": "روز قبل از انقضا", + "selectPeriod": "انتخاب دوره", + "selectTraffic": "انتخاب ترافیک", + "selectServers": "انتخاب سرورها", + "selectDevices": "انتخاب دستگاه‌ها", + "perDevice": "/ دستگاه", + "summary": "خلاصه", + "total": "جمع کل", + "purchase": "خرید", + "step": "مرحله {{current}} از {{total}}", + "stepPeriod": "دوره", + "stepTraffic": "ترافیک", + "stepServers": "سرورها", + "stepDevices": "دستگاه‌ها", + "stepConfirm": "تایید", + "trial": { + "title": "دوره آزمایشی رایگان", + "description": "سرویس VPN ما را رایگان امتحان کنید!", + "days": "روز", + "devices": "دستگاه", + "price": "هزینه فعال‌سازی", + "activate": "فعال‌سازی دوره آزمایشی", + "unavailable": "دوره آزمایشی در دسترس نیست" + }, + "connection": { + "title": "اتصال VPN", + "selectDevice": "دستگاه خود را انتخاب کنید", + "selectApp": "برنامه را انتخاب کنید", + "installApp": "۱. نصب برنامه", + "addSubscription": "۲. افزودن اشتراک", + "connectVpn": "۳. اتصال VPN", + "addToApp": "افزودن به {{appName}}", + "connect": "اتصال", + "noApps": "برنامه‌ای برای این پلتفرم موجود نیست", + "noSubscription": "برای اتصال نیاز به اشتراک فعال دارید", + "featured": "پیشنهادی", + "yourDevice": "دستگاه شما", + "copyLink": "کپی لینک اشتراک", + "copied": "لینک کپی شد!", + "openLink": "باز کردن لینک" + } + }, + "balance": { + "title": "موجودی", + "currentBalance": "موجودی فعلی", + "topUp": "شارژ", + "topUpBalance": "شارژ موجودی", + "paymentMethods": { + "yookassa": { + "name": "YooKassa", + "description": "پرداخت از طریق YooKassa" + }, + "cryptobot": { + "name": "CryptoBot", + "description": "پرداخت با ارز دیجیتال" + }, + "telegram_stars": { + "name": "Telegram Stars", + "description": "پرداخت با Telegram Stars" + } + }, + "transactionHistory": "تاریخچه تراکنش‌ها", + "noTransactions": "تراکنشی موجود نیست", + "date": "تاریخ", + "type": "نوع", + "description": "توضیحات", + "amount": "مبلغ", + "deposit": "واریز", + "withdrawal": "برداشت", + "subscriptionPayment": "پرداخت اشتراک", + "referralReward": "پاداش معرفی", + "minAmount": "حداقل", + "maxAmount": "حداکثر", + "notAvailable": "در دسترس نیست", + "useBot": "لطفاً برای شارژ از ربات تلگرام استفاده کنید.", + "page": "صفحه {{current}} از {{total}}", + "invalidAmount": "مبلغ نامعتبر", + "promocode": { + "title": "کد تخفیف", + "placeholder": "کد تخفیف را وارد کنید", + "activate": "فعال‌سازی", + "activating": "در حال فعال‌سازی...", + "success": "کد تخفیف با موفقیت فعال شد!", + "balanceAdded": "موجودی اضافه شده: {{amount}}", + "errors": { + "not_found": "کد تخفیف یافت نشد", + "expired": "کد تخفیف منقضی شده", + "used": "کد تخفیف قبلاً استفاده شده", + "already_used_by_user": "شما قبلاً از این کد استفاده کرده‌اید", + "user_not_found": "کاربر یافت نشد", + "server_error": "خطای سرور" + } + }, + "minAmountError": "حداقل مبلغ: {{amount}}", + "maxAmountError": "حداکثر مبلغ: {{amount}}" + }, + "referral": { + "title": "برنامه معرفی", + "yourLink": "لینک معرفی شما", + "copyLink": "کپی لینک", + "copied": "کپی شد!", + "shareButton": "اشتراک‌گذاری", + "shareMessage": "از طریق لینک من به {{botName}} بپیوند و تا {{percent}}٪ پاداش بگیر!", + "shareHint": "این لینک را با دوستان به اشتراک بگذارید. وقتی ثبت نام کنند و خرید کنند، {{percent}}% کمیسیون دریافت می‌کنید!", + "stats": { + "totalReferrals": "کل معرفی‌ها", + "activeReferrals": "فعال", + "totalEarnings": "کل درآمد", + "commissionRate": "نرخ کمیسیون" + }, + "terms": { + "title": "شرایط برنامه", + "commission": "کمیسیون", + "minTopup": "حداقل شارژ", + "newUserBonus": "جایزه کاربر جدید", + "inviterBonus": "جایزه معرف" + }, + "yourReferrals": "معرفی‌های شما", + "noReferrals": "هنوز معرفی ندارید. لینک را به اشتراک بگذارید!", + "user": "کاربر", + "joined": "تاریخ عضویت", + "hasPaid": "پرداخت کرده", + "earningsHistory": "تاریخچه درآمد", + "reason": "دلیل", + "status": { + "pending": "در انتظار", + "paid": "پرداخت شده" + }, + "reasons": { + "referral_registration_pending": "ثبت‌نام کاربر معرفی‌شده", + "referral_registration": "ثبت‌نام کاربر معرفی‌شده", + "referral_first_payment": "اولین پرداخت کاربر معرفی‌شده", + "referral_subscription_renewal": "تمدید اشتراک کاربر معرفی‌شده", + "referral_bonus": "پاداش کاربر معرفی‌شده" + } + }, + "support": { + "title": "پشتیبانی", + "newTicket": "تیکت جدید", + "yourTickets": "تیکت‌های شما", + "noTickets": "تیکتی موجود نیست", + "createTicket": "ایجاد تیکت", + "subject": "موضوع", + "subjectPlaceholder": "مشکل را به طور خلاصه توضیح دهید", + "message": "پیام", + "messagePlaceholder": "مشکل خود را به طور کامل توضیح دهید...", + "send": "ارسال", + "sending": "در حال ارسال...", + "creating": "در حال ایجاد...", + "reply": "پاسخ", + "replyPlaceholder": "پاسخ خود را بنویسید...", + "sendReply": "ارسال پاسخ", + "you": "شما", + "supportTeam": "پشتیبانی", + "selectTicket": "یک تیکت انتخاب کنید یا جدید ایجاد کنید", + "created": "ایجاد شده", + "repliesDisabled": "پاسخ‌گویی به این تیکت غیرفعال است", + "status": { + "open": "باز", + "answered": "پاسخ داده شده", + "pending": "در انتظار", + "closed": "بسته" + }, + "attachImage": "پیوست تصویر", + "invalidFileType": "نوع فایل نامعتبر. از JPEG، PNG، GIF یا WebP استفاده کنید.", + "fileTooLarge": "فایل خیلی بزرگ است. حداکثر 10MB.", + "uploadFailed": "آپلود تصویر ناموفق", + "imageLoadFailed": "بارگذاری تصویر ناموفق" + }, + "wheel": { + "title": "چرخ شانس", + "disabled": "چرخ شانس فعلاً در دسترس نیست", + "spinsRemaining": "تعداد چرخش باقی‌مانده امروز", + "choosePayment": "روش پرداخت را انتخاب کنید", + "stars": "Stars", + "telegramStars": "Telegram Stars", + "days": "روز", + "subscriptionDays": "روز اشتراک", + "day": "روز", + "spin": "بچرخان!", + "spinning": "در حال چرخش...", + "history": "تاریخچه", + "recentSpins": "چرخش‌های اخیر", + "congratulations": "تبریک!", + "noLuck": "شانس نیاوردید!", + "oops": "اوه!", + "yourPromoCode": "کد تخفیف شما:", + "close": "بستن", + "errors": { + "networkError": "خطای شبکه رخ داد", + "loadFailed": "بارگذاری تنظیمات چرخ ناموفق", + "dailyLimitReached": "به محدودیت روزانه رسیدید", + "cannotSpin": "فعلاً امکان چرخش نیست", + "insufficientBalance": "موجودی کافی نیست", + "topUpRequired": "برای پرداخت شارژ کنید" + }, + "payWithStars": "پرداخت {stars} Stars", + "processingPayment": "در حال پردازش...", + "starsPaymentSuccess": "پرداخت موفق! نتیجه به تلگرام ارسال شد.", + "starsPaymentFailed": "پرداخت ناموفق. دوباره تلاش کنید.", + "noHistory": "هنوز تاریخچه‌ای نیست", + "banner": { + "title": "شانس خود را امتحان کنید!", + "description": "چرخ را بچرخانید و جایزه ببرید: روز اشتراک، موجودی، ترافیک و بیشتر!", + "button": "برو به چرخ" + } + }, + "admin": { + "nav": { + "title": "مدیریت", + "dashboard": "آمار", + "tickets": "تیکت‌ها", + "settings": "تنظیمات", + "apps": "برنامه‌ها", + "wheel": "چرخ", + "tariffs": "تعرفه‌ها", + "servers": "سرورها", + "broadcasts": "پیام‌رسانی" + }, + "panel": { + "title": "پنل مدیریت", + "subtitle": "مدیریت سیستم", + "dashboardDesc": "آمار و مانیتورینگ سیستم", + "ticketsDesc": "مدیریت تیکت‌های کاربران", + "settingsDesc": "تنظیمات و پارامترهای سیستم", + "appsDesc": "مدیریت برنامه‌های اتصال", + "wheelDesc": "تنظیم چرخ شانس و جوایز", + "tariffsDesc": "مدیریت طرح‌های تعرفه", + "serversDesc": "تنظیم سرورهای VPN", + "broadcastsDesc": "ارسال پیام گروهی به کاربران" + }, + "wheel": { + "title": "تنظیمات چرخ شانس", + "enabled": "فعال", + "disabled": "غیرفعال", + "tabs": { + "settings": "تنظیمات", + "prizes": "جوایز", + "statistics": "آمار" + }, + "settings": { + "enableWheel": "فعال‌سازی چرخ", + "allowSpins": "اجازه چرخش به کاربران", + "costInStars": "هزینه Stars", + "costInDays": "هزینه روز", + "rtpPercent": "درصد RTP", + "dailyLimit": "محدودیت روزانه (0 = نامحدود)", + "minSubDays": "حداقل روز اشتراک برای پرداخت روزانه", + "promoPrefix": "پیشوند کد تخفیف" + }, + "prizes": { + "addPrize": "افزودن جایزه", + "editPrize": "ویرایش جایزه", + "noPrizes": "جایزه‌ای تنظیم نشده. برای فعال‌سازی چرخ جایزه اضافه کنید.", + "deletePrize": "این جایزه حذف شود؟", + "types": { + "subscription_days": "روز اشتراک", + "balance_bonus": "جایزه موجودی", + "traffic_gb": "ترافیک GB", + "promocode": "کد تخفیف", + "nothing": "هیچی" + }, + "fields": { + "type": "نوع", + "displayName": "نام نمایشی", + "value": "مقدار", + "valueKopeks": "ارزش (کوپک، برای RTP)", + "emoji": "ایموجی", + "color": "رنگ", + "active": "فعال", + "worth": "ارزش" + }, + "promo": { + "title": "تنظیمات کد تخفیف", + "balanceBonus": "جایزه موجودی (کوپک)", + "subscriptionDays": "روز اشتراک" + } + }, + "statistics": { + "totalSpins": "کل چرخش‌ها", + "revenue": "درآمد", + "payouts": "پرداخت‌ها", + "actualRtp": "RTP واقعی", + "targetRtp": "هدف", + "prizeDistribution": "توزیع جوایز", + "times": "بار", + "topWins": "برترین برنده‌ها" + } + }, + "broadcasts": { + "title": "پیام‌رسانی", + "subtitle": "ارسال پیام گروهی به کاربران", + "create": "ایجاد پیام", + "empty": "هنوز پیامی ارسال نشده", + "selectFilter": "انتخاب مخاطبین", + "selectFilterPlaceholder": "انتخاب فیلتر...", + "recipients": "نفر", + "messageText": "متن پیام", + "messageTextPlaceholder": "متن پیام را وارد کنید...", + "media": "فایل رسانه", + "addMedia": "افزودن رسانه", + "uploading": "در حال آپلود...", + "buttons": "دکمه‌ها", + "willBeSent": "ارسال می‌شود به", + "users": "کاربر", + "send": "ارسال", + "stop": "توقف", + "progress": "پیشرفت", + "total": "کل", + "sent": "ارسال شده", + "failed": "ناموفق", + "filter": "فیلتر", + "message": "پیام", + "unknownAdmin": "مدیر ناشناس" + }, + "settings": { + "title": "تنظیمات سیستم", + "allCategories": "همه دسته‌ها", + "noSettings": "تنظیماتی یافت نشد", + "modified": "تغییر یافته", + "readOnly": "فقط خواندنی", + "reset": "بازنشانی", + "categoriesCount": "دسته", + "settingsCount": "تنظیم", + "expandAll": "باز کردن همه", + "collapseAll": "بستن همه", + "searchPlaceholder": "جستجوی تنظیمات...", + "searchCategoriesPlaceholder": "جستجوی دسته‌ها...", + "noSearchResults": "چیزی یافت نشد", + "example": "مثال" + }, + "apps": { + "title": "مدیریت برنامه‌ها", + "addApp": "افزودن برنامه", + "addFirstApp": "افزودن اولین برنامه", + "noApps": "برنامه‌ای برای این پلتفرم نیست", + "createApp": "ایجاد برنامه", + "editApp": "ویرایش برنامه", + "confirmDelete": "آیا مطمئن هستید که می‌خواهید این برنامه را حذف کنید؟", + "copyTo": "کپی به...", + "appId": "شناسه برنامه", + "appName": "نام", + "urlScheme": "URL Scheme", + "featured": "ویژه", + "base64Encoding": "کدگذاری Base64", + "buttons": "دکمه‌ها", + "button": "دکمه", + "addButton": "افزودن دکمه", + "buttonText": "متن دکمه", + "installDescription": "توضیحات نصب", + "subscriptionDescription": "توضیحات افزودن اشتراک", + "connectDescription": "توضیحات اتصال", + "beforeSubscription": "قبل از افزودن اشتراک", + "afterSubscription": "بعد از افزودن اشتراک", + "stepTitle": "عنوان", + "stepDescription": "توضیحات", + "tabs": { + "basic": "اصلی", + "installation": "نصب", + "subscription": "اشتراک", + "connect": "اتصال", + "additional": "اضافی" + } + }, + "tickets": { + "title": "مدیریت تیکت‌ها", + "total": "کل", + "list": "تیکت‌ها", + "noTickets": "تیکتی نیست", + "selectTicket": "یک تیکت از لیست انتخاب کنید", + "allStatuses": "همه وضعیت‌ها", + "statusOpen": "باز", + "statusPending": "در انتظار", + "statusAnswered": "پاسخ داده شده", + "statusClosed": "بسته", + "from": "از", + "created": "ایجاد شده", + "user": "کاربر", + "you": "شما", + "userLabel": "کاربر", + "adminLabel": "مدیر", + "replyPlaceholder": "پاسخ خود را بنویسید...", + "sendReply": "ارسال پاسخ", + "settings": "تنظیمات", + "supportMode": "حالت پشتیبانی", + "supportModeDesc": "انتخاب کنید کاربران چگونه می‌توانند با پشتیبانی تماس بگیرند", + "modeBoth": "تیکت و تماس", + "modeTickets": "فقط تیکت", + "modeContact": "فقط تماس", + "slaSettings": "تنظیمات SLA", + "slaEnabled": "فعال کردن SLA (نظارت بر زمان پاسخ)", + "slaEnabledDesc": "اعلان‌های خودکار برای تیکت‌های معوقه", + "slaMinutes": "زمان پاسخ (دقیقه)", + "slaMinutesDesc": "حداکثر زمان برای پاسخ به تیکت (1-1440 دقیقه)", + "checkInterval": "فاصله بررسی (ثانیه)", + "checkIntervalDesc": "چند وقت یکبار تیکت‌های معوقه را بررسی کنیم (30-600 ثانیه)", + "reminderCooldown": "فاصله یادآوری (دقیقه)", + "reminderCooldownDesc": "حداقل زمان بین یادآوری‌ها (1-120 دقیقه)", + "settingsUpdateError": "خطا در ذخیره تنظیمات" + }, + "tariffs": { + "title": "مدیریت تعرفه‌ها", + "subtitle": "پیکربندی پلن‌های تعرفه", + "create": "ایجاد تعرفه", + "edit": "ویرایش تعرفه", + "noTariffs": "تعرفه‌ای نیست", + "name": "نام", + "namePlaceholder": "نام تعرفه را وارد کنید", + "description": "توضیحات", + "descriptionPlaceholder": "توضیحات تعرفه را وارد کنید", + "trafficLimit": "محدودیت ترافیک", + "trafficHint": "0 = ترافیک نامحدود", + "deviceLimit": "محدودیت دستگاه", + "tierLevel": "سطح تعرفه", + "tierHint": "1-10، روی اولویت ارتقا تأثیر می‌گذارد", + "unlimited": "نامحدود", + "devices": "دستگاه", + "servers": "سرور", + "subscriptions": "اشتراک", + "trial": "آزمایشی", + "inactive": "غیرفعال", + "activate": "فعال‌سازی", + "deactivate": "غیرفعال‌سازی", + "toggleTrial": "تغییر آزمایشی", + "delete": "حذف", + "confirmDelete": "تعرفه حذف شود؟", + "confirmDeleteText": "این عمل قابل بازگشت نیست. تعرفه برای همیشه حذف می‌شود.", + "days": "روز", + "tabs": { + "basic": "اصلی", + "prices": "قیمت‌ها", + "servers": "سرورها" + }, + "pricesHint": "قیمت هر دوره را تنظیم کنید", + "serversHint": "سرورهای موجود برای این تعرفه را انتخاب کنید", + "noServers": "سرور موجود نیست" + }, + "servers": { + "title": "مدیریت سرورها", + "subtitle": "پیکربندی سرورهای VPN", + "sync": "همگام‌سازی", + "syncing": "در حال همگام‌سازی...", + "syncNow": "همگام‌سازی الان", + "noServers": "سروری نیست. با RemnaWave همگام‌سازی کنید.", + "edit": "ویرایش سرور", + "originalName": "نام اصلی", + "displayName": "نام نمایشی", + "displayNamePlaceholder": "نام نمایشی را وارد کنید", + "description": "توضیحات", + "descriptionPlaceholder": "توضیحات سرور را وارد کنید", + "countryCode": "کد کشور", + "price": "قیمت", + "priceHint": "هزینه اضافی سرور", + "maxUsers": "حداکثر کاربران", + "sortOrder": "ترتیب", + "unlimited": "نامحدود", + "stats": "آمار", + "currentUsers": "کاربران فعلی", + "activeSubscriptions": "اشتراک‌های فعال", + "usedByTariffs": "استفاده شده توسط تعرفه‌ها", + "trial": "آزمایشی", + "unavailable": "در دسترس نیست", + "full": "پر", + "enable": "فعال", + "disable": "غیرفعال", + "toggleTrial": "تغییر آزمایشی" + } + }, + "adminDashboard": { + "title": "پنل آمار", + "subtitle": "نمای کلی سیستم در لحظه", + "refresh": "بروزرسانی", + "loadError": "بارگیری آمار ناموفق بود", + "stats": { + "usersOnline": "کاربران آنلاین", + "activeSubscriptions": "اشتراک‌های فعال", + "incomeToday": "درآمد امروز", + "incomeMonth": "درآمد ماهانه", + "incomeTotal": "کل درآمد", + "subscriptionIncome": "درآمد اشتراک", + "total": "کل" + }, + "nodes": { + "title": "نودها", + "online": "آنلاین", + "offline": "آفلاین", + "disabled": "غیرفعال", + "noNodes": "نود موجود نیست", + "usersOnline": "آنلاین", + "traffic": "ترافیک", + "enable": "فعال", + "disable": "غیرفعال" + }, + "revenue": { + "title": "درآمد", + "last7Days": "۷ روز اخیر" + }, + "subscriptions": { + "title": "اشتراک‌ها", + "subtitle": "آمار اشتراک", + "active": "فعال", + "trial": "آزمایشی", + "paid": "پرداخت شده", + "expired": "منقضی شده", + "newSubscriptions": "اشتراک‌های جدید", + "today": "امروز", + "week": "هفته", + "month": "ماه", + "conversion": "تبدیل آزمایشی به پولی" + }, + "servers": { + "title": "سرورها", + "total": "کل سرورها", + "available": "در دسترس", + "withConnections": "با اتصال", + "revenue": "درآمد" + } + }, + "profile": { + "title": "پروفایل", + "accountInfo": "اطلاعات حساب", + "telegramId": "شناسه تلگرام", + "username": "نام کاربری", + "name": "نام", + "registeredAt": "تاریخ ثبت نام", + "emailAuth": "احراز هویت ایمیل", + "linkEmailDescription": "ایمیل خود را متصل کنید تا بدون تلگرام وارد شوید. پس از اتصال، ایمیل تایید دریافت خواهید کرد.", + "linkEmail": "اتصال ایمیل", + "emailRequired": "ایمیل الزامی است", + "passwordMinLength": "رمز عبور باید حداقل 8 کاراکتر باشد", + "passwordsMismatch": "رمزهای عبور مطابقت ندارند", + "passwordPlaceholder": "رمز عبور را وارد کنید", + "confirmPasswordPlaceholder": "رمز عبور را تایید کنید", + "passwordHint": "حداقل 8 کاراکتر", + "emailSent": "ایمیل تایید ارسال شد! صندوق خود را بررسی کنید.", + "verified": "تایید شده", + "notVerified": "تایید نشده", + "verificationRequired": "لطفاً ایمیل خود را تایید کنید تا از ورود با ایمیل استفاده کنید.", + "resendVerification": "ارسال مجدد ایمیل تایید", + "verificationResent": "ایمیل تایید مجدداً ارسال شد!", + "canLoginWithEmail": "اکنون می‌توانید با ایمیل و رمز عبور وارد شوید.", + "notifications": { + "title": "تنظیمات اعلان", + "subscriptionExpiry": "انقضای اشتراک", + "subscriptionExpiryDesc": "اعلان قبل از انقضای اشتراک", + "daysBeforeExpiry": "روز قبل از انقضا", + "trafficWarning": "هشدار ترافیک", + "trafficWarningDesc": "اعلان نزدیک شدن به محدودیت ترافیک", + "atPercent": "در درصد", + "balanceLow": "موجودی کم", + "balanceLowDesc": "اعلان موجودی کم", + "threshold": "آستانه", + "news": "اخبار", + "newsDesc": "دریافت اخبار و به‌روزرسانی‌ها", + "promoOffers": "پیشنهادات تبلیغاتی", + "promoOffersDesc": "دریافت پیشنهادات ویژه و تخفیف‌ها", + "unavailable": "تنظیمات اعلان در دسترس نیست" + } + }, + "theme": { + "colors": "رنگ‌های تم", + "reset": "بازنشانی", + "accent": "رنگ تأکیدی", + "accentDescription": "رنگ اصلی برند برای دکمه‌ها، لینک‌ها و عناصر تعاملی", + "darkTheme": "تم تیره", + "lightTheme": "تم روشن", + "background": "پس‌زمینه", + "surface": "سطح", + "text": "متن", + "textSecondary": "متن ثانویه", + "statusColors": "رنگ‌های وضعیت", + "success": "موفقیت", + "warning": "هشدار", + "error": "خطا", + "preview": "پیش‌نمایش", + "previewButton": "دکمه اصلی", + "previewSecondary": "دکمه ثانویه", + "light": "تم روشن", + "dark": "تم تیره" + }, + "languages": { + "ru": "Русский", + "en": "English", + "zh": "中文", + "fa": "فارسی" + }, + "contests": { + "title": "مسابقات", + "error": "بارگذاری مسابقات ناموفق", + "noContests": "مسابقه‌ای موجود نیست", + "days": "روز", + "play": "شرکت", + "alreadyPlayed": "قبلاً شرکت کردید", + "enterAnswer": "پاسخ خود را وارد کنید", + "submit": "ارسال", + "imHere": "من اینجام!" + }, + "polls": { + "title": "نظرسنجی‌ها", + "error": "بارگذاری نظرسنجی‌ها ناموفق", + "noPolls": "نظرسنجی موجود نیست", + "questions": "سوال", + "question": "سوال", + "of": "از", + "start": "شروع", + "continue": "ادامه", + "completed": "تکمیل شده", + "reward": "تومان" + }, + "info": { + "title": "اطلاعات", + "faq": "سوالات متداول", + "rules": "قوانین", + "privacy": "حریم خصوصی", + "offer": "شرایط خدمات", + "noFaq": "سوال متداولی موجود نیست", + "noContent": "محتوایی موجود نیست", + "updatedAt": "به‌روزرسانی" + }, + "onboarding": { + "skip": "رد کردن", + "finish": "پایان", + "steps": { + "welcome": { + "title": "خوش آمدید!", + "description": "این کابین شخصی شماست. اینجا می‌توانید اشتراک خود را مدیریت کنید، موجودی شارژ کنید و دستگاه‌ها را متصل کنید." + }, + "connectDevices": { + "title": "اتصال دستگاه‌ها", + "description": "این دکمه را بزنید تا راهنمای اتصال VPN روی دستگاه‌هایتان را دریافت کنید." + }, + "balance": { + "title": "موجودی شما", + "description": "موجودی فعلی شما اینجا نمایش داده می‌شود. برای شارژ کلیک کنید." + }, + "subscription": { + "title": "وضعیت اشتراک", + "description": "اینجا می‌توانید روزهای باقی‌مانده تا انقضای اشتراک را ببینید." + }, + "quickActions": { + "title": "دسترسی سریع", + "description": "از این دکمه‌ها برای دسترسی سریع به امکانات اصلی استفاده کنید: شارژ موجودی، تمدید اشتراک و دعوت دوستان." + } + } + } +} diff --git a/src/locales/ru.json b/src/locales/ru.json index d67d8ad..52333ed 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1,1147 +1,1147 @@ { - "common": { - "loading": "Загрузка...", - "error": "Ошибка", - "success": "Успешно", - "save": "Сохранить", - "cancel": "Отмена", - "confirm": "Подтвердить", - "back": "Назад", - "next": "Далее", - "close": "Закрыть", - "search": "Поиск", - "noData": "Нет данных", - "actions": "Действия", - "yes": "Да", - "no": "Нет", - "or": "или", - "and": "и", - "edit": "Редактировать", - "delete": "Удалить", - "currency": "₽" - }, - "nav": { - "dashboard": "Главная", - "subscription": "Подписка", - "balance": "Баланс", - "referral": "Рефералы", - "support": "Поддержка", - "profile": "Профиль", - "logout": "Выйти", - "contests": "Конкурсы", - "polls": "Опросы", - "info": "Информация", - "wheel": "Колесо удачи" - }, - "auth": { - "login": "Вход", - "register": "Регистрация", - "logout": "Выход", - "email": "Email", - "password": "Пароль", - "confirmPassword": "Подтвердите пароль", - "forgotPassword": "Забыли пароль?", - "resetPassword": "Сбросить пароль", - "loginWithTelegram": "Войти через Telegram", - "loginWithEmail": "Войти по Email", - "noAccount": "Нет аккаунта?", - "hasAccount": "Уже есть аккаунт?", - "registerHint": "Для регистрации по email сначала авторизуйтесь через Telegram, затем привяжите email в настройках.", - "telegramRequired": "Требуется авторизация через Telegram", - "telegramNotConfigured": "Telegram бот не настроен", - "authenticating": "Авторизация...", - "orOpenInApp": "Или откройте бота в приложении", - "loginFailed": "Ошибка входа", - "tryAgain": "Попробовать снова", - "welcomeBack": "Добро пожаловать!", - "loginTitle": "Вход в личный кабинет", - "loginSubtitle": "Войдите через Telegram или используйте email" - }, - "emailVerification": { - "title": "Подтверждение email", - "verifying": "Проверяем email...", - "pleaseWait": "Пожалуйста, подождите пока мы проверяем ваш email.", - "success": "Email подтверждён!", - "successMessage": "Ваш email успешно подтверждён. Теперь вы можете входить с помощью email и пароля.", - "failed": "Ошибка подтверждения", - "goToLogin": "Перейти к входу" - }, - "dashboard": { - "title": "Личный кабинет", - "welcome": "Добро пожаловать, {{name}}!", - "yourSubscription": "Ваша подписка", - "quickActions": "Быстрые действия", - "viewSubscription": "Управление подпиской", - "topUpBalance": "Пополнить баланс", - "inviteFriends": "Пригласить друзей", - "getSupport": "Получить поддержку", - "currentBalance": "Текущий баланс", - "activeUntil": "Активна до", - "noActiveSubscription": "Нет активной подписки", - "devicesUsed": "Устройств: {{used}} из {{total}}", - "trafficUsed": "Трафик: {{used}} из {{total}} ГБ", - "unlimitedTraffic": "Безлимитный трафик" - }, - "subscription": { - "title": "Подписка", - "currentPlan": "Текущий тариф", - "status": "Статус", - "active": "Активна", - "inactive": "Неактивна", - "trialStatus": "Пробный период", - "expired": "Истекла", - "expiresAt": "Действует до", - "daysLeft": "Осталось дней", - "devices": "Устройства", - "servers": "Серверы", - "traffic": "Трафик", - "unlimited": "Безлимит", - "used": "Использовано", - "of": "из", - "renew": "Продлить", - "extend": "Продлить подписку", - "buyTraffic": "Докупить трафик", - "buyDevices": "Докупить устройства", - "renewalOptions": "Варианты продления", - "days": "дней", - "hours": "ч", - "minutes": "м", - "price": "Цена", - "noSubscription": "У вас нет активной подписки", - "getSubscription": "Оформить подписку", - "connectionInfo": "Данные для подключения", - "copyLink": "Копировать ссылку", - "copied": "Скопировано!", - "showQR": "Показать QR-код", - "downloadConfig": "Скачать конфиг", - "trafficUsed": "Использовано трафика", - "timeLeft": "Осталось времени", - "getConfig": "Подключить устройства", - "autoRenewal": "Автопродление", - "daysBeforeExpiry": "дней до окончания", - "selectPeriod": "Выберите период", - "selectTraffic": "Выберите трафик", - "selectServers": "Выберите серверы", - "selectDevices": "Устройства", - "perDevice": "/ устройство", - "summary": "Итого", - "total": "К оплате", - "purchase": "Купить", - "step": "Шаг {{current}} из {{total}}", - "stepPeriod": "Период", - "stepTraffic": "Трафик", - "stepServers": "Серверы", - "stepDevices": "Устройства", - "stepConfirm": "Подтверждение", - "currentTariff": "Текущий", - "from": "от", - "month": "мес", - "insufficientBalance": "Недостаточно средств. Не хватает {{missing}} ₽", - "trial": { - "title": "Бесплатный пробный период", - "description": "Попробуйте наш VPN сервис бесплатно!", - "days": "дней", - "devices": "устройств", - "price": "Стоимость активации", - "activate": "Активировать пробный период", - "unavailable": "Пробный период недоступен" - }, - "connection": { - "title": "Подключить VPN", - "selectDevice": "Выберите устройство", - "selectApp": "Выберите приложение", - "installApp": "1. Установите приложение", - "addSubscription": "2. Добавьте подписку", - "connectVpn": "3. Подключитесь к VPN", - "addToApp": "Добавить в {{appName}}", - "connect": "Подключить", - "noApps": "Нет приложений для этой платформы", - "noSubscription": "Для подключения нужна активная подписка", - "featured": "Рекомендуем", - "yourDevice": "Ваше устройство", - "copyLink": "Скопировать ссылку", - "copied": "Ссылка скопирована!", - "openLink": "Открыть ссылку" - }, - "myDevices": "Мои устройства", - "noDevices": "Нет подключенных устройств", - "deleteDevice": "Удалить устройство", - "deleteAllDevices": "Удалить все", - "confirmDeleteDevice": "Удалить это устройство?", - "confirmDeleteAllDevices": "Удалить все устройства?", - "deviceDeleted": "Устройство удалено", - "allDevicesDeleted": "Все устройства удалены", - "platform": "Платформа", - "model": "Модель", - "connectedAt": "Подключено", - "pause": { - "title": "Пауза подписки", - "paused": "На паузе", - "active": "Активна", - "pauseBtn": "Приостановить", - "resumeBtn": "Возобновить", - "pausedMessage": "Подписка приостановлена", - "resumedMessage": "Подписка возобновлена", - "dailyOnly": "Пауза доступна только для суточных тарифов", - "pausedInfo": "Подписка приостановлена", - "pausedDescription": "Списания остановлены. Подписка будет действовать до", - "nextCharge": "До следующего списания", - "willBeCharged": "Будет списано", - "days_one": "день", - "days_few": "дня", - "days_many": "дней", - "hours": "ч", - "minutes": "м" - }, - "dailyPurchase": { - "costPerDay": "Стоимость в день", - "chargedDaily": "Оплата списывается ежедневно с баланса", - "canPause": "Можно приостановить в любой момент", - "pausedOnLowBalance": "При недостатке баланса подписка будет приостановлена", - "activate": "Активировать за {{price}}" - }, - "switchTariff": { - "title": "Сменить тариф", - "preview": "Предпросмотр", - "currentTariff": "Текущий тариф", - "newTariff": "Новый тариф", - "remainingDays": "Осталось дней", - "upgradeCost": "Доплата", - "free": "Бесплатно", - "switch": "Перейти", - "switched": "Тариф изменён", - "notEnoughBalance": "Недостаточно средств" - }, - "switchTraffic": { - "title": "Изменить трафик", - "currentPackage": "Текущий пакет", - "newPackage": "Новый пакет", - "switch": "Изменить", - "switched": "Трафик изменён" - }, - "purchasedTraffic": "Докупленный трафик", - "trafficResetAt": "Сброс" - }, - "balance": { - "title": "Баланс", - "currentBalance": "Текущий баланс", - "topUp": "Пополнить", - "topUpBalance": "Пополнение баланса", - "paymentMethods": "Способы оплаты", - "transactionHistory": "История операций", - "noTransactions": "Нет операций", - "date": "Дата", - "type": "Тип", - "description": "Описание", - "amount": "Сумма", - "deposit": "Пополнение", - "withdrawal": "Списание", - "subscriptionPayment": "Оплата подписки", - "referralReward": "Реферальный бонус", - "minAmount": "Мин.", - "maxAmount": "Макс.", - "notAvailable": "Недоступно", - "useBot": "Для пополнения используйте Telegram бота.", - "page": "Страница {{current}} из {{total}}", - "invalidAmount": "Некорректная сумма", - "promocode": { - "title": "Промокод", - "placeholder": "Введите промокод", - "activate": "Активировать", - "activating": "Активация...", - "success": "Промокод успешно активирован!", - "balanceAdded": "На баланс начислено: {{amount}} ₽", - "errors": { - "not_found": "Промокод не найден", - "expired": "Срок действия промокода истёк", - "used": "Промокод уже использован", - "already_used_by_user": "Вы уже использовали этот промокод", - "user_not_found": "Пользователь не найден", - "server_error": "Ошибка сервера" - } - }, - "minAmountError": "Минимальная сумма: {{amount}} ₽", - "maxAmountError": "Максимальная сумма: {{amount}} ₽", - "paymentOption": "Способ оплаты", - "selectPaymentOption": "Выберите способ оплаты", - "paymentMethods": { - "yookassa": { - "name": "ЮKassa", - "description": "Оплата через ЮKassa" - }, - "cryptobot": { - "name": "CryptoBot", - "description": "Оплата криптовалютой через CryptoBot" - }, - "telegram_stars": { - "name": "Telegram Stars", - "description": "Оплата через Telegram Stars" - }, - "heleket": { - "name": "Heleket Crypto", - "description": "Оплата криптовалютой через Heleket" - }, - "mulenpay": { - "name": "MulenPay", - "description": "Оплата через MulenPay" - }, - "pal24": { - "name": "PAL24", - "description": "Оплата через PAL24" - }, - "platega": { - "name": "Platega", - "description": "Оплата через Platega" - }, - "wata": { - "name": "Wata", - "description": "Оплата через Wata" - }, - "cloudpayments": { - "name": "CloudPayments", - "description": "Оплата банковской картой через CloudPayments" - }, - "freekassa": { - "name": "FreeKassa", - "description": "Оплата через FreeKassa" - } - }, - "pendingPayments": { - "title": "Ожидающие платежи", - "pay": "Оплатить", - "checkStatus": "Проверить статус", - "checking": "Проверка..." - } - }, - "referral": { - "title": "Реферальная программа", - "yourLink": "Ваша реферальная ссылка", - "copyLink": "Копировать ссылку", - "copied": "Скопировано!", - "shareButton": "Поделиться", - "shareMessage": "Заходи в Cabinet по моей ссылке и получай до {{percent}}% кешбэка!", - "shareHint": "Поделитесь ссылкой с друзьями. Когда они зарегистрируются и оплатят, вы получите {{percent}}% комиссии!", - "stats": { - "totalReferrals": "Всего рефералов", - "activeReferrals": "Активных", - "totalEarnings": "Общий заработок", - "commissionRate": "Комиссия" - }, - "terms": { - "title": "Условия программы", - "commission": "Комиссия", - "minTopup": "Мин. пополнение", - "newUserBonus": "Бонус новому пользователю", - "inviterBonus": "Бонус пригласившему" - }, - "yourReferrals": "Ваши рефералы", - "noReferrals": "Пока нет рефералов. Поделитесь ссылкой, чтобы пригласить друзей!", - "user": "Пользователь", - "joined": "Присоединился", - "hasPaid": "Оплатил", - "status": { - "pending": "Ожидание", - "paid": "Оплачено" - }, - "earningsHistory": "История начислений", - "reason": "Причина", - "reasons": { - "referral_registration_pending": "Регистрация реферала", - "referral_registration": "Регистрация реферала", - "referral_first_payment": "Первая оплата реферала", - "referral_subscription_renewal": "Продление подписки реферала", - "referral_bonus": "Бонус за реферала" - } - }, - "support": { - "title": "Поддержка", - "newTicket": "Новый тикет", - "yourTickets": "Ваши обращения", - "noTickets": "Нет обращений", - "createTicket": "Создать обращение", - "subject": "Тема", - "subjectPlaceholder": "Кратко опишите проблему", - "message": "Сообщение", - "messagePlaceholder": "Подробно опишите вашу проблему...", - "send": "Отправить", - "sending": "Отправка...", - "creating": "Создание...", - "reply": "Ответить", - "replyPlaceholder": "Введите ваш ответ...", - "sendReply": "Отправить ответ", - "you": "Вы", - "supportTeam": "Поддержка", - "selectTicket": "Выберите обращение или создайте новое", - "created": "Создано", - "repliesDisabled": "Ответы на это обращение отключены", - "status": { - "open": "Открыт", - "answered": "Отвечен", - "pending": "Ожидает", - "closed": "Закрыт" - }, - "attachImage": "Прикрепить изображение", - "invalidFileType": "Неверный тип файла. Используйте JPEG, PNG, GIF или WebP.", - "fileTooLarge": "Файл слишком большой. Максимальный размер 10МБ.", - "uploadFailed": "Не удалось загрузить изображение", - "imageLoadFailed": "Не удалось загрузить изображение", - "ticketsDisabled": "Тикеты отключены", - "useProfile": "Для получения поддержки перейдите в профиль бота", - "goToProfile": "Перейти в профиль", - "useExternalLink": "Для получения поддержки воспользуйтесь внешней ссылкой", - "openSupport": "Открыть поддержку", - "contactSupport": "Для получения поддержки обратитесь к {{username}}", - "contactUs": "Связаться с поддержкой" - }, - "wheel": { - "title": "Колесо удачи", - "disabled": "Колесо удачи временно недоступно", - "spinsRemaining": "Осталось вращений сегодня", - "choosePayment": "Выберите способ оплаты", - "stars": "Stars", - "telegramStars": "Telegram Stars", - "days": "дней", - "subscriptionDays": "Дни подписки", - "day": "День", - "spin": "КРУТИТЬ!", - "spinning": "Крутится...", - "history": "История", - "recentSpins": "Последние вращения", - "congratulations": "Поздравляем!", - "noLuck": "Не повезло!", - "oops": "Упс!", - "yourPromoCode": "Ваш промокод:", - "close": "Закрыть", - "errors": { - "networkError": "Произошла ошибка сети", - "loadFailed": "Не удалось загрузить конфигурацию колеса", - "dailyLimitReached": "Достигнут дневной лимит вращений", - "cannotSpin": "Сейчас нельзя крутить", - "insufficientBalance": "Недостаточно средств на балансе", - "topUpRequired": "Пополните баланс для оплаты спина", - "starsNotAvailable": "Оплата Stars недоступна. Откройте приложение через Telegram." - }, - "payWithStars": "Оплатить Stars", - "payWithDays": "Оплатить днями", - "processingPayment": "Обработка...", - "starsPaymentSuccess": "Оплата прошла! Результат спина отправлен в Telegram.", - "starsPaymentSuccessCheckHistory": "Оплата прошла! Проверьте историю или Telegram для результата.", - "starsPaymentFailed": "Ошибка оплаты. Попробуйте еще раз.", - "youWon": "Вы выиграли", - "noPrize": "В этот раз не повезло...", - "noHistory": "История вращений пуста", - "banner": { - "title": "Испытай удачу!", - "description": "Крути колесо и выигрывай призы: дни подписки, баланс, трафик и многое другое!", - "button": "Перейти к колесу" - } - }, - "admin": { - "nav": { - "title": "Админка", - "dashboard": "Статистика", - "tickets": "Тикеты", - "settings": "Настройки", - "apps": "Приложения", - "wheel": "Колесо", - "tariffs": "Тарифы", - "servers": "Серверы", - "broadcasts": "Рассылки", - "users": "Пользователи", - "payments": "Платежи", - "remnawave": "RemnaWave" - }, - "panel": { - "title": "Панель администратора", - "subtitle": "Управление системой", - "dashboardDesc": "Статистика и мониторинг системы", - "ticketsDesc": "Обработка обращений пользователей", - "settingsDesc": "Настройки системы и параметры", - "appsDesc": "Управление приложениями для подключения", - "wheelDesc": "Настройка колеса удачи и призов", - "tariffsDesc": "Управление тарифными планами", - "serversDesc": "Настройка VPN серверов", - "broadcastsDesc": "Массовая отправка сообщений", - "usersDesc": "Управление пользователями бота", - "paymentsDesc": "Проверка платежей", - "remnawaveDesc": "Управление панелью и статистика" - }, - "payments": { - "title": "Проверка платежей", - "description": "Ожидающие платежи за последние 24 часа", - "totalPending": "Всего ожидает", - "filterByMethod": "Фильтр по методу", - "noPayments": "Нет ожидающих платежей", - "paid": "Оплачено", - "user": "Пользователь", - "openLink": "Открыть ссылку", - "checkStatus": "Проверить статус", - "checking": "Проверка..." - }, - "remnawave": { - "title": "RemnaWave", - "subtitle": "Управление панелью и статистика", - "connected": "Подключено", - "disconnected": "Не настроено", - "noData": "Не удалось загрузить данные", - "tabs": { - "overview": "Обзор", - "nodes": "Ноды", - "squads": "Сквады", - "sync": "Синхронизация" - }, - "overview": { - "system": "Система", - "usersOnline": "Онлайн", - "totalUsers": "Всего пользователей", - "nodesOnline": "Нод онлайн", - "connections": "Подключений", - "bandwidth": "Пропускная способность", - "download": "Загрузка", - "upload": "Отдача", - "total": "Всего", - "server": "Сервер", - "cpu": "CPU", - "memory": "Память", - "uptime": "Аптайм", - "traffic": "Статистика трафика", - "usersByStatus": "Пользователи по статусу" - }, - "nodes": { - "online": "Онлайн", - "offline": "Офлайн", - "disabled": "Отключена", - "noNodes": "Ноды не найдены", - "restart": "Перезапустить", - "enable": "Включить", - "disable": "Отключить", - "restartAll": "Перезапустить все", - "confirmRestartAll": "Вы уверены, что хотите перезапустить все ноды?" - }, - "squads": { - "synced": "Синхронизирован", - "notSynced": "Не синхронизирован", - "noSquads": "Сквады не найдены", - "syncServers": "Синхронизировать серверы" - }, - "sync": { - "autoSync": "Автосинхронизация", - "runNow": "Запустить сейчас", - "manual": "Ручная синхронизация", - "fromPanel": "Синхронизация из панели", - "fromPanelDesc": "Импорт пользователей из RemnaWave панели в базу бота", - "toPanel": "Синхронизация в панель", - "toPanelDesc": "Экспорт пользователей из базы бота в RemnaWave панель", - "subscriptions": "Подписки", - "validate": "Валидация", - "validateDesc": "Проверка и исправление несоответствий подписок", - "cleanup": "Очистка", - "cleanupDesc": "Удаление orphaned подписок без пользователей", - "statuses": "Синхронизация статусов", - "statusesDesc": "Синхронизация статусов подписок с панелью" - } - }, - "wheel": { - "title": "Настройки колеса удачи", - "enabled": "Включено", - "disabled": "Выключено", - "tabs": { - "settings": "Настройки", - "prizes": "Призы", - "statistics": "Статистика" - }, - "settings": { - "enableWheel": "Включить колесо", - "allowSpins": "Разрешить пользователям крутить колесо", - "costInStars": "Стоимость в Stars", - "costInDays": "Стоимость в днях", - "rtpPercent": "RTP (Return to Player) %", - "dailyLimit": "Дневной лимит вращений (0 = безлимит)", - "minSubDays": "Мин. дней подписки для оплаты днями", - "promoPrefix": "Префикс промокодов" - }, - "prizes": { - "addPrize": "Добавить приз", - "editPrize": "Редактировать приз", - "noPrizes": "Призы не настроены. Добавьте призы для активации колеса.", - "deletePrize": "Удалить этот приз?", - "types": { - "subscription_days": "Дни подписки", - "balance_bonus": "Бонус баланса", - "traffic_gb": "Трафик ГБ", - "promocode": "Промокод", - "nothing": "Ничего (пусто)" - }, - "fields": { - "type": "Тип", - "displayName": "Название", - "value": "Значение", - "valueKopeks": "Стоимость в копейках (для RTP)", - "emoji": "Эмодзи", - "color": "Цвет", - "active": "Активен", - "worth": "Стоимость" - }, - "promo": { - "title": "Настройки промокода", - "balanceBonus": "Бонус баланса (копейки)", - "subscriptionDays": "Дни подписки" - } - }, - "statistics": { - "totalSpins": "Всего вращений", - "revenue": "Доход", - "payouts": "Выплаты", - "actualRtp": "Фактический RTP", - "targetRtp": "цель", - "prizeDistribution": "Распределение призов", - "times": "раз", - "topWins": "Топ выигрышей" - } - }, - "broadcasts": { - "title": "Рассылки", - "subtitle": "Массовая отправка сообщений пользователям", - "create": "Создать рассылку", - "empty": "Рассылок пока нет", - "selectFilter": "Выберите аудиторию", - "selectFilterPlaceholder": "Выберите фильтр...", - "recipients": "получ.", - "messageText": "Текст сообщения", - "messageTextPlaceholder": "Введите текст рассылки...", - "media": "Медиафайл", - "addMedia": "Добавить медиа", - "uploading": "Загрузка...", - "buttons": "Кнопки", - "willBeSent": "Будет отправлено", - "users": "пользователям", - "send": "Отправить", - "stop": "Остановить", - "progress": "Прогресс", - "total": "Всего", - "sent": "Отправлено", - "failed": "Ошибки", - "filter": "Фильтр", - "message": "Сообщение", - "unknownAdmin": "Неизвестный админ" - }, - "settings": { - "title": "Настройки системы", - "allCategories": "Все категории", - "noSettings": "Настройки не найдены", - "modified": "Изменено", - "readOnly": "Только чтение", - "reset": "Сбросить", - "categoriesCount": "категорий", - "settingsCount": "настроек", - "expandAll": "Развернуть все", - "collapseAll": "Свернуть все", - "searchPlaceholder": "Поиск настроек...", - "searchCategoriesPlaceholder": "Поиск категорий...", - "noSearchResults": "Ничего не найдено", - "example": "Пример" - }, - "apps": { - "title": "Управление приложениями", - "addApp": "Добавить приложение", - "addFirstApp": "Добавить первое приложение", - "noApps": "Нет приложений для этой платформы", - "createApp": "Создать приложение", - "editApp": "Редактировать приложение", - "confirmDelete": "Вы уверены, что хотите удалить это приложение?", - "copyTo": "Копировать в...", - "appId": "ID приложения", - "appName": "Название", - "urlScheme": "URL схема", - "featured": "Рекомендованное", - "base64Encoding": "Base64 кодирование", - "buttons": "Кнопки", - "button": "Кнопка", - "addButton": "Добавить кнопку", - "buttonText": "Текст кнопки", - "installDescription": "Описание установки", - "subscriptionDescription": "Описание добавления подписки", - "connectDescription": "Описание подключения", - "beforeSubscription": "До добавления подписки", - "afterSubscription": "После добавления подписки", - "stepTitle": "Заголовок", - "stepDescription": "Описание", - "tabs": { - "basic": "Основное", - "installation": "Установка", - "subscription": "Подписка", - "connect": "Подключение", - "additional": "Дополнительно" - }, - "import": "Импорт", - "export": "Экспорт", - "importApps": "Импорт приложений из JSON", - "exportApps": "Экспорт приложений в JSON", - "importPreview": "Предпросмотр импорта", - "confirmImport": "Импортировать", - "importError": "Неверный формат JSON файла", - "importCreateError": "Ошибка при создании приложений", - "noAppsToImport": "Нет приложений для импорта", - "remnaWaveToggle": "Переключить источник RemnaWave", - "refreshRemnaWave": "Обновить данные из RemnaWave", - "remnaWaveMode": "Отображаются приложения из панели RemnaWave. Режим только для чтения.", - "remnaWaveSettings": "Настройки RemnaWave", - "remnaWaveConfigUuid": "UUID конфигурации", - "remnaWaveConfigUuidHint": "UUID конфигурации страницы подписки из панели RemnaWave", - "availableConfigs": "Доступные конфигурации" - }, - "tickets": { - "title": "Управление тикетами", - "total": "Всего", - "list": "Тикеты", - "noTickets": "Нет тикетов", - "selectTicket": "Выберите тикет из списка", - "allStatuses": "Все статусы", - "statusOpen": "Открыт", - "statusPending": "Ожидает", - "statusAnswered": "Отвечен", - "statusClosed": "Закрыт", - "from": "От", - "created": "Создан", - "user": "Пользователь", - "you": "Вы", - "userLabel": "Пользователь", - "adminLabel": "Админ", - "replyPlaceholder": "Введите ваш ответ...", - "sendReply": "Отправить", - "settings": "Настройки", - "supportMode": "Режим поддержки", - "supportModeDesc": "Выберите, как пользователи могут связаться с поддержкой", - "modeBoth": "Тикеты и контакт", - "modeTickets": "Только тикеты", - "modeContact": "Только контакт", - "slaSettings": "Настройки SLA", - "slaEnabled": "Включить SLA (мониторинг времени ответа)", - "slaEnabledDesc": "Автоматические уведомления о просроченных тикетах", - "slaMinutes": "Время ответа (минуты)", - "slaMinutesDesc": "Максимальное время для ответа на тикет (1-1440 минут)", - "checkInterval": "Интервал проверки (секунды)", - "checkIntervalDesc": "Как часто проверять просроченные тикеты (30-600 секунд)", - "reminderCooldown": "Интервал напоминаний (минуты)", - "reminderCooldownDesc": "Минимальное время между напоминаниями (1-120 минут)", - "settingsUpdateError": "Ошибка сохранения настроек" - }, - "tariffs": { - "title": "Управление тарифами", - "subtitle": "Настройка тарифных планов", - "create": "Создать тариф", - "edit": "Редактировать тариф", - "noTariffs": "Нет тарифов", - "name": "Название", - "namePlaceholder": "Введите название тарифа", - "description": "Описание", - "descriptionPlaceholder": "Введите описание тарифа", - "trafficLimit": "Лимит трафика", - "trafficHint": "0 = безлимитный трафик", - "deviceLimit": "Лимит устройств", - "tierLevel": "Уровень тарифа", - "tierHint": "1-10, влияет на приоритет при переходе", - "unlimited": "Безлимит", - "devices": "устр.", - "servers": "серверов", - "subscriptions": "подписок", - "trial": "Триал", - "inactive": "Неактивен", - "activate": "Активировать", - "deactivate": "Деактивировать", - "toggleTrial": "Переключить триал", - "delete": "Удалить", - "confirmDelete": "Удалить тариф?", - "confirmDeleteText": "Это действие нельзя отменить. Тариф будет удален навсегда.", - "days": "дней", - "tabs": { - "basic": "Основное", - "prices": "Цены", - "servers": "Серверы" - }, - "pricesHint": "Включите нужные периоды и установите цены (в рублях)", - "periodDisabled": "Отключено", - "serversHint": "Выберите серверы, доступные для этого тарифа. Для каждого сервера можно указать индивидуальный лимит трафика.", - "noServers": "Нет доступных серверов", - "serverTrafficLimit": "Лимит трафика", - "useDefault": "по умолчанию" - }, - "servers": { - "title": "Управление серверами", - "subtitle": "Настройка серверов VPN", - "sync": "Синхронизировать", - "syncing": "Синхронизация...", - "syncNow": "Синхронизировать сейчас", - "noServers": "Нет серверов. Синхронизируйте с RemnaWave.", - "edit": "Редактировать сервер", - "originalName": "Оригинальное название", - "displayName": "Отображаемое название", - "displayNamePlaceholder": "Введите название", - "description": "Описание", - "descriptionPlaceholder": "Введите описание сервера", - "countryCode": "Код страны", - "price": "Цена", - "priceHint": "Дополнительная стоимость сервера", - "maxUsers": "Максимум пользователей", - "sortOrder": "Порядок сортировки", - "unlimited": "Без лимита", - "stats": "Статистика", - "currentUsers": "Текущих пользователей", - "activeSubscriptions": "Активных подписок", - "usedByTariffs": "Используется в тарифах", - "trial": "Триал", - "unavailable": "Недоступен", - "full": "Заполнен", - "enable": "Включить", - "disable": "Отключить", - "toggleTrial": "Переключить триал", - "loadError": "Не удалось загрузить сервер" - } - }, - "adminDashboard": { - "title": "Панель статистики", - "subtitle": "Обзор системы в реальном времени", - "refresh": "Обновить", - "loadError": "Не удалось загрузить статистику", - "stats": { - "usersOnline": "Пользователей онлайн", - "activeSubscriptions": "Активных подписок", - "incomeToday": "Доход за сегодня", - "incomeMonth": "Доход за месяц", - "incomeTotal": "Общий доход", - "subscriptionIncome": "Доход от подписок", - "total": "всего" - }, - "nodes": { - "title": "Ноды", - "online": "Онлайн", - "offline": "Оффлайн", - "disabled": "Отключена", - "noNodes": "Нет доступных нод", - "usersOnline": "Онлайн", - "traffic": "Трафик", - "enable": "Включить", - "disable": "Отключить" - }, - "revenue": { - "title": "Доходы", - "last7Days": "За последние 7 дней" - }, - "subscriptions": { - "title": "Подписки", - "subtitle": "Статистика подписок", - "active": "Активных", - "trial": "Пробных", - "paid": "Оплаченных", - "expired": "Истекших", - "newSubscriptions": "Новые подписки", - "today": "Сегодня", - "week": "Неделя", - "month": "Месяц", - "conversion": "Конверсия триал→платные" - }, - "servers": { - "title": "Серверы", - "total": "Всего серверов", - "available": "Доступных", - "withConnections": "С подключениями", - "revenue": "Доход" - }, - "tariffs": { - "title": "Статистика по тарифам", - "subtitle": "Распределение подписок по тарифам", - "tariffName": "Тариф", - "activeSubscriptions": "Активных", - "trialSubscriptions": "Триал", - "purchasedToday": "Сегодня", - "purchasedWeek": "Неделя", - "purchasedMonth": "Месяц", - "noTariffs": "Нет тарифов" - } - }, - "adminUsers": { - "title": "Пользователи", - "subtitle": "Управление пользователями", - "searchPlaceholder": "Поиск по ID, username, имени...", - "filters": { - "all": "Все", - "active": "Активные", - "blocked": "Заблокированные", - "deleted": "Удалённые" - }, - "sort": { - "created_at": "Дата регистрации", - "balance": "Баланс", - "traffic": "Трафик", - "last_activity": "Активность", - "total_spent": "Потрачено", - "purchase_count": "Покупки" - }, - "stats": { - "totalUsers": "Всего пользователей", - "activeUsers": "Активных", - "blockedUsers": "Заблокировано", - "withSubscription": "С подпиской", - "newToday": "Новых сегодня", - "newWeek": "За неделю", - "newMonth": "За месяц", - "totalBalance": "Общий баланс", - "activeToday": "Активны сегодня", - "activeWeek": "За неделю", - "activeMonth": "За месяц" - }, - "table": { - "user": "Пользователь", - "status": "Статус", - "balance": "Баланс", - "subscription": "Подписка", - "spent": "Потрачено", - "registered": "Регистрация", - "activity": "Активность", - "noUsers": "Пользователи не найдены" - }, - "userStatus": { - "active": "Активен", - "blocked": "Заблокирован", - "deleted": "Удалён" - }, - "subscriptionStatus": { - "active": "Активна", - "trial": "Триал", - "expired": "Истекла", - "none": "Нет подписки" - }, - "detail": { - "title": "Информация о пользователе", - "tabs": { - "info": "Инфо", - "subscription": "Подписка", - "balance": "Баланс", - "sync": "Синхронизация" - }, - "telegramId": "Telegram ID", - "username": "Username", - "fullName": "Имя", - "email": "Email", - "emailVerified": "Подтверждён", - "emailNotVerified": "Не подтверждён", - "language": "Язык", - "registeredAt": "Регистрация", - "lastActivity": "Последняя активность", - "cabinetLogin": "Вход в кабинет", - "referralCode": "Реферальный код", - "referralsCount": "Рефералов", - "referralEarnings": "Заработано", - "referredBy": "Приглашён", - "promoGroup": "Промо-группа", - "noPromoGroup": "Не задана", - "restrictions": "Ограничения", - "restrictionTopup": "Пополнение баланса", - "restrictionSubscription": "Покупка подписки", - "restrictionReason": "Причина", - "noRestrictions": "Нет ограничений", - "totalSpent": "Всего потрачено", - "purchaseCount": "Покупок", - "usedPromocodes": "Использовано промокодов", - "lifetimeTraffic": "Трафик за всё время", - "recentTransactions": "Последние транзакции", - "noTransactions": "Нет транзакций" - }, - "subscription": { - "noSubscription": "Подписка отсутствует", - "currentTariff": "Текущий тариф", - "status": "Статус", - "endDate": "Окончание", - "daysRemaining": "Осталось дней", - "trafficUsed": "Использовано трафика", - "deviceLimit": "Лимит устройств", - "autopay": "Автоплатёж", - "enabled": "Включён", - "disabled": "Отключён", - "actions": { - "extend": "Продлить", - "changeTariff": "Сменить тариф", - "setTraffic": "Установить трафик", - "toggleAutopay": "Вкл/выкл автоплатёж", - "cancel": "Отменить подписку", - "create": "Создать подписку" - }, - "extendDays": "Дней", - "selectTariff": "Выберите тариф", - "trafficLimitGb": "Лимит ГБ", - "trafficUsedGb": "Использовано ГБ", - "isTrial": "Пробный период" - }, - "balance": { - "currentBalance": "Текущий баланс", - "addFunds": "Пополнить", - "deductFunds": "Списать", - "amount": "Сумма", - "description": "Описание", - "createTransaction": "Создать транзакцию", - "transactionHistory": "История транзакций" - }, - "sync": { - "title": "Синхронизация с панелью", - "status": "Статус синхронизации", - "lastSync": "Последняя синхронизация", - "neverSynced": "Никогда", - "botData": "Данные бота", - "panelData": "Данные панели", - "notFound": "Не найден в панели", - "differences": "Различия", - "noDifferences": "Различий нет", - "syncFromPanel": "Синхронизировать из панели", - "syncToPanel": "Синхронизировать в панель", - "remawave_uuid": "Remnawave UUID", - "notLinked": "Не привязан" - }, - "actions": { - "block": "Заблокировать", - "unblock": "Разблокировать", - "delete": "Удалить", - "blockReason": "Причина блокировки", - "confirmBlock": "Подтвердить блокировку", - "confirmDelete": "Подтвердить удаление" - }, - "messages": { - "loadError": "Не удалось загрузить пользователей", - "userLoadError": "Не удалось загрузить пользователя", - "balanceUpdated": "Баланс обновлён", - "balanceError": "Ошибка обновления баланса", - "subscriptionUpdated": "Подписка обновлена", - "subscriptionError": "Ошибка обновления подписки", - "statusUpdated": "Статус обновлён", - "statusError": "Ошибка обновления статуса", - "syncSuccess": "Синхронизация выполнена", - "syncError": "Ошибка синхронизации" - } - }, - "profile": { - "title": "Профиль", - "accountInfo": "Информация об аккаунте", - "telegramId": "Telegram ID", - "username": "Имя пользователя", - "name": "Имя", - "registeredAt": "Дата регистрации", - "emailAuth": "Авторизация по Email", - "linkEmailDescription": "Привяжите email для входа без Telegram. После привязки на ваш email придёт письмо для подтверждения.", - "linkEmail": "Привязать Email", - "emailRequired": "Введите email", - "passwordMinLength": "Пароль должен быть минимум 8 символов", - "passwordsMismatch": "Пароли не совпадают", - "passwordPlaceholder": "Введите пароль", - "confirmPasswordPlaceholder": "Подтвердите пароль", - "passwordHint": "Минимум 8 символов", - "emailSent": "Письмо для подтверждения отправлено! Проверьте почту.", - "verified": "Подтверждён", - "notVerified": "Не подтверждён", - "verificationRequired": "Подтвердите email для использования входа по почте.", - "resendVerification": "Отправить письмо повторно", - "verificationResent": "Письмо отправлено повторно!", - "canLoginWithEmail": "Теперь вы можете входить с помощью email и пароля.", - "notifications": { - "title": "Настройки уведомлений", - "subscriptionExpiry": "Окончание подписки", - "subscriptionExpiryDesc": "Уведомлять о скором истечении подписки", - "daysBeforeExpiry": "Дней до окончания", - "trafficWarning": "Предупреждение о трафике", - "trafficWarningDesc": "Уведомлять при достижении лимита трафика", - "atPercent": "При использовании", - "balanceLow": "Низкий баланс", - "balanceLowDesc": "Уведомлять о низком балансе", - "threshold": "Порог", - "news": "Новости", - "newsDesc": "Получать новости и обновления сервиса", - "promoOffers": "Промо-предложения", - "promoOffersDesc": "Получать специальные предложения и скидки", - "unavailable": "Настройки уведомлений недоступны" - } - }, - "theme": { - "colors": "Цвета темы", - "reset": "Сбросить", - "accent": "Акцентный цвет", - "accentDescription": "Основной цвет бренда для кнопок, ссылок и интерактивных элементов", - "darkTheme": "Тёмная тема", - "lightTheme": "Светлая тема", - "background": "Фон", - "surface": "Поверхность", - "text": "Текст", - "textSecondary": "Вторичный текст", - "statusColors": "Статусные цвета", - "success": "Успех", - "warning": "Предупреждение", - "error": "Ошибка", - "preview": "Предпросмотр", - "previewButton": "Основная кнопка", - "previewSecondary": "Вторичная кнопка", - "light": "Светлая тема", - "dark": "Тёмная тема" - }, - "languages": { - "ru": "Русский", - "en": "English", - "zh": "中文", - "fa": "فارسی" - }, - "contests": { - "title": "Конкурсы", - "error": "Ошибка загрузки конкурсов", - "noContests": "Нет доступных конкурсов", - "days": "дней", - "play": "Участвовать", - "alreadyPlayed": "Уже участвовали", - "enterAnswer": "Введите ответ", - "submit": "Отправить", - "imHere": "Я здесь!" - }, - "polls": { - "title": "Опросы", - "error": "Ошибка загрузки опросов", - "noPolls": "Нет доступных опросов", - "questions": "вопросов", - "question": "Вопрос", - "of": "из", - "start": "Начать", - "continue": "Продолжить", - "completed": "Завершён", - "reward": "₽" - }, - "info": { - "title": "Информация", - "faq": "FAQ", - "rules": "Правила", - "privacy": "Конфиденциальность", - "offer": "Оферта", - "noFaq": "Нет вопросов и ответов", - "noContent": "Нет контента", - "updatedAt": "Обновлено" - }, - "onboarding": { - "skip": "Пропустить", - "finish": "Готово", - "steps": { - "welcome": { - "title": "Добро пожаловать!", - "description": "Это ваш личный кабинет. Здесь вы можете управлять подпиской, пополнять баланс и подключать устройства." - }, - "connectDevices": { - "title": "Подключите устройства", - "description": "Нажмите эту кнопку, чтобы получить инструкции по подключению VPN на ваших устройствах." - }, - "balance": { - "title": "Ваш баланс", - "description": "Здесь отображается ваш текущий баланс. Нажмите, чтобы пополнить его." - }, - "subscription": { - "title": "Статус подписки", - "description": "Здесь вы видите сколько дней осталось до окончания подписки." - }, - "quickActions": { - "title": "Быстрые действия", - "description": "Используйте эти кнопки для быстрого доступа к основным функциям: пополнению баланса, продлению подписки и приглашению друзей." - } - } - } + "common": { + "loading": "Загрузка...", + "error": "Ошибка", + "success": "Успешно", + "save": "Сохранить", + "cancel": "Отмена", + "confirm": "Подтвердить", + "back": "Назад", + "next": "Далее", + "close": "Закрыть", + "search": "Поиск", + "noData": "Нет данных", + "actions": "Действия", + "yes": "Да", + "no": "Нет", + "or": "или", + "and": "и", + "edit": "Редактировать", + "delete": "Удалить", + "currency": "₽" + }, + "nav": { + "dashboard": "Главная", + "subscription": "Подписка", + "balance": "Баланс", + "referral": "Рефералы", + "support": "Поддержка", + "profile": "Профиль", + "logout": "Выйти", + "contests": "Конкурсы", + "polls": "Опросы", + "info": "Информация", + "wheel": "Колесо удачи" + }, + "auth": { + "login": "Вход", + "register": "Регистрация", + "logout": "Выход", + "email": "Email", + "password": "Пароль", + "confirmPassword": "Подтвердите пароль", + "forgotPassword": "Забыли пароль?", + "resetPassword": "Сбросить пароль", + "loginWithTelegram": "Войти через Telegram", + "loginWithEmail": "Войти по Email", + "noAccount": "Нет аккаунта?", + "hasAccount": "Уже есть аккаунт?", + "registerHint": "Для регистрации по email сначала авторизуйтесь через Telegram, затем привяжите email в настройках.", + "telegramRequired": "Требуется авторизация через Telegram", + "telegramNotConfigured": "Telegram бот не настроен", + "authenticating": "Авторизация...", + "orOpenInApp": "Или откройте бота в приложении", + "loginFailed": "Ошибка входа", + "tryAgain": "Попробовать снова", + "welcomeBack": "Добро пожаловать!", + "loginTitle": "Вход в личный кабинет", + "loginSubtitle": "Войдите через Telegram или используйте email" + }, + "emailVerification": { + "title": "Подтверждение email", + "verifying": "Проверяем email...", + "pleaseWait": "Пожалуйста, подождите пока мы проверяем ваш email.", + "success": "Email подтверждён!", + "successMessage": "Ваш email успешно подтверждён. Теперь вы можете входить с помощью email и пароля.", + "failed": "Ошибка подтверждения", + "goToLogin": "Перейти к входу" + }, + "dashboard": { + "title": "Личный кабинет", + "welcome": "Добро пожаловать, {{name}}!", + "yourSubscription": "Ваша подписка", + "quickActions": "Быстрые действия", + "viewSubscription": "Управление подпиской", + "topUpBalance": "Пополнить баланс", + "inviteFriends": "Пригласить друзей", + "getSupport": "Получить поддержку", + "currentBalance": "Текущий баланс", + "activeUntil": "Активна до", + "noActiveSubscription": "Нет активной подписки", + "devicesUsed": "Устройств: {{used}} из {{total}}", + "trafficUsed": "Трафик: {{used}} из {{total}} ГБ", + "unlimitedTraffic": "Безлимитный трафик" + }, + "subscription": { + "title": "Подписка", + "currentPlan": "Текущий тариф", + "status": "Статус", + "active": "Активна", + "inactive": "Неактивна", + "trialStatus": "Пробный период", + "expired": "Истекла", + "expiresAt": "Действует до", + "daysLeft": "Осталось дней", + "devices": "Устройства", + "servers": "Серверы", + "traffic": "Трафик", + "unlimited": "Безлимит", + "used": "Использовано", + "of": "из", + "renew": "Продлить", + "extend": "Продлить подписку", + "buyTraffic": "Докупить трафик", + "buyDevices": "Докупить устройства", + "renewalOptions": "Варианты продления", + "days": "дней", + "hours": "ч", + "minutes": "м", + "price": "Цена", + "noSubscription": "У вас нет активной подписки", + "getSubscription": "Оформить подписку", + "connectionInfo": "Данные для подключения", + "copyLink": "Копировать ссылку", + "copied": "Скопировано!", + "showQR": "Показать QR-код", + "downloadConfig": "Скачать конфиг", + "trafficUsed": "Использовано трафика", + "timeLeft": "Осталось времени", + "getConfig": "Подключить устройства", + "autoRenewal": "Автопродление", + "daysBeforeExpiry": "дней до окончания", + "selectPeriod": "Выберите период", + "selectTraffic": "Выберите трафик", + "selectServers": "Выберите серверы", + "selectDevices": "Устройства", + "perDevice": "/ устройство", + "summary": "Итого", + "total": "К оплате", + "purchase": "Купить", + "step": "Шаг {{current}} из {{total}}", + "stepPeriod": "Период", + "stepTraffic": "Трафик", + "stepServers": "Серверы", + "stepDevices": "Устройства", + "stepConfirm": "Подтверждение", + "currentTariff": "Текущий", + "from": "от", + "month": "мес", + "insufficientBalance": "Недостаточно средств. Не хватает {{missing}} ₽", + "trial": { + "title": "Бесплатный пробный период", + "description": "Попробуйте наш VPN сервис бесплатно!", + "days": "дней", + "devices": "устройств", + "price": "Стоимость активации", + "activate": "Активировать пробный период", + "unavailable": "Пробный период недоступен" + }, + "connection": { + "title": "Подключить VPN", + "selectDevice": "Выберите устройство", + "selectApp": "Выберите приложение", + "installApp": "1. Установите приложение", + "addSubscription": "2. Добавьте подписку", + "connectVpn": "3. Подключитесь к VPN", + "addToApp": "Добавить в {{appName}}", + "connect": "Подключить", + "noApps": "Нет приложений для этой платформы", + "noSubscription": "Для подключения нужна активная подписка", + "featured": "Рекомендуем", + "yourDevice": "Ваше устройство", + "copyLink": "Скопировать ссылку", + "copied": "Ссылка скопирована!", + "openLink": "Открыть ссылку" + }, + "myDevices": "Мои устройства", + "noDevices": "Нет подключенных устройств", + "deleteDevice": "Удалить устройство", + "deleteAllDevices": "Удалить все", + "confirmDeleteDevice": "Удалить это устройство?", + "confirmDeleteAllDevices": "Удалить все устройства?", + "deviceDeleted": "Устройство удалено", + "allDevicesDeleted": "Все устройства удалены", + "platform": "Платформа", + "model": "Модель", + "connectedAt": "Подключено", + "pause": { + "title": "Пауза подписки", + "paused": "На паузе", + "active": "Активна", + "pauseBtn": "Приостановить", + "resumeBtn": "Возобновить", + "pausedMessage": "Подписка приостановлена", + "resumedMessage": "Подписка возобновлена", + "dailyOnly": "Пауза доступна только для суточных тарифов", + "pausedInfo": "Подписка приостановлена", + "pausedDescription": "Списания остановлены. Подписка будет действовать до", + "nextCharge": "До следующего списания", + "willBeCharged": "Будет списано", + "days_one": "день", + "days_few": "дня", + "days_many": "дней", + "hours": "ч", + "minutes": "м" + }, + "dailyPurchase": { + "costPerDay": "Стоимость в день", + "chargedDaily": "Оплата списывается ежедневно с баланса", + "canPause": "Можно приостановить в любой момент", + "pausedOnLowBalance": "При недостатке баланса подписка будет приостановлена", + "activate": "Активировать за {{price}}" + }, + "switchTariff": { + "title": "Сменить тариф", + "preview": "Предпросмотр", + "currentTariff": "Текущий тариф", + "newTariff": "Новый тариф", + "remainingDays": "Осталось дней", + "upgradeCost": "Доплата", + "free": "Бесплатно", + "switch": "Перейти", + "switched": "Тариф изменён", + "notEnoughBalance": "Недостаточно средств" + }, + "switchTraffic": { + "title": "Изменить трафик", + "currentPackage": "Текущий пакет", + "newPackage": "Новый пакет", + "switch": "Изменить", + "switched": "Трафик изменён" + }, + "purchasedTraffic": "Докупленный трафик", + "trafficResetAt": "Сброс" + }, + "balance": { + "title": "Баланс", + "currentBalance": "Текущий баланс", + "topUp": "Пополнить", + "topUpBalance": "Пополнение баланса", + "paymentMethods": "Способы оплаты", + "transactionHistory": "История операций", + "noTransactions": "Нет операций", + "date": "Дата", + "type": "Тип", + "description": "Описание", + "amount": "Сумма", + "deposit": "Пополнение", + "withdrawal": "Списание", + "subscriptionPayment": "Оплата подписки", + "referralReward": "Реферальный бонус", + "minAmount": "Мин.", + "maxAmount": "Макс.", + "notAvailable": "Недоступно", + "useBot": "Для пополнения используйте Telegram бота.", + "page": "Страница {{current}} из {{total}}", + "invalidAmount": "Некорректная сумма", + "promocode": { + "title": "Промокод", + "placeholder": "Введите промокод", + "activate": "Активировать", + "activating": "Активация...", + "success": "Промокод успешно активирован!", + "balanceAdded": "На баланс начислено: {{amount}} ₽", + "errors": { + "not_found": "Промокод не найден", + "expired": "Срок действия промокода истёк", + "used": "Промокод уже использован", + "already_used_by_user": "Вы уже использовали этот промокод", + "user_not_found": "Пользователь не найден", + "server_error": "Ошибка сервера" + } + }, + "minAmountError": "Минимальная сумма: {{amount}} ₽", + "maxAmountError": "Максимальная сумма: {{amount}} ₽", + "paymentOption": "Способ оплаты", + "selectPaymentOption": "Выберите способ оплаты", + "paymentMethods": { + "yookassa": { + "name": "ЮKassa", + "description": "Оплата через ЮKassa" + }, + "cryptobot": { + "name": "CryptoBot", + "description": "Оплата криптовалютой через CryptoBot" + }, + "telegram_stars": { + "name": "Telegram Stars", + "description": "Оплата через Telegram Stars" + }, + "heleket": { + "name": "Heleket Crypto", + "description": "Оплата криптовалютой через Heleket" + }, + "mulenpay": { + "name": "MulenPay", + "description": "Оплата через MulenPay" + }, + "pal24": { + "name": "PAL24", + "description": "Оплата через PAL24" + }, + "platega": { + "name": "Platega", + "description": "Оплата через Platega" + }, + "wata": { + "name": "Wata", + "description": "Оплата через Wata" + }, + "cloudpayments": { + "name": "CloudPayments", + "description": "Оплата банковской картой через CloudPayments" + }, + "freekassa": { + "name": "FreeKassa", + "description": "Оплата через FreeKassa" + } + }, + "pendingPayments": { + "title": "Ожидающие платежи", + "pay": "Оплатить", + "checkStatus": "Проверить статус", + "checking": "Проверка..." + } + }, + "referral": { + "title": "Реферальная программа", + "yourLink": "Ваша реферальная ссылка", + "copyLink": "Копировать ссылку", + "copied": "Скопировано!", + "shareButton": "Поделиться", + "shareMessage": "Заходи в {{botName}} по моей ссылке и получай до {{percent}}% кешбэка!", + "shareHint": "Поделитесь ссылкой с друзьями. Когда они зарегистрируются и оплатят, вы получите {{percent}}% комиссии!", + "stats": { + "totalReferrals": "Всего рефералов", + "activeReferrals": "Активных", + "totalEarnings": "Общий заработок", + "commissionRate": "Комиссия" + }, + "terms": { + "title": "Условия программы", + "commission": "Комиссия", + "minTopup": "Мин. пополнение", + "newUserBonus": "Бонус новому пользователю", + "inviterBonus": "Бонус пригласившему" + }, + "yourReferrals": "Ваши рефералы", + "noReferrals": "Пока нет рефералов. Поделитесь ссылкой, чтобы пригласить друзей!", + "user": "Пользователь", + "joined": "Присоединился", + "hasPaid": "Оплатил", + "status": { + "pending": "Ожидание", + "paid": "Оплачено" + }, + "earningsHistory": "История начислений", + "reason": "Причина", + "reasons": { + "referral_registration_pending": "Регистрация реферала", + "referral_registration": "Регистрация реферала", + "referral_first_payment": "Первая оплата реферала", + "referral_subscription_renewal": "Продление подписки реферала", + "referral_bonus": "Бонус за реферала" + } + }, + "support": { + "title": "Поддержка", + "newTicket": "Новый тикет", + "yourTickets": "Ваши обращения", + "noTickets": "Нет обращений", + "createTicket": "Создать обращение", + "subject": "Тема", + "subjectPlaceholder": "Кратко опишите проблему", + "message": "Сообщение", + "messagePlaceholder": "Подробно опишите вашу проблему...", + "send": "Отправить", + "sending": "Отправка...", + "creating": "Создание...", + "reply": "Ответить", + "replyPlaceholder": "Введите ваш ответ...", + "sendReply": "Отправить ответ", + "you": "Вы", + "supportTeam": "Поддержка", + "selectTicket": "Выберите обращение или создайте новое", + "created": "Создано", + "repliesDisabled": "Ответы на это обращение отключены", + "status": { + "open": "Открыт", + "answered": "Отвечен", + "pending": "Ожидает", + "closed": "Закрыт" + }, + "attachImage": "Прикрепить изображение", + "invalidFileType": "Неверный тип файла. Используйте JPEG, PNG, GIF или WebP.", + "fileTooLarge": "Файл слишком большой. Максимальный размер 10МБ.", + "uploadFailed": "Не удалось загрузить изображение", + "imageLoadFailed": "Не удалось загрузить изображение", + "ticketsDisabled": "Тикеты отключены", + "useProfile": "Для получения поддержки перейдите в профиль бота", + "goToProfile": "Перейти в профиль", + "useExternalLink": "Для получения поддержки воспользуйтесь внешней ссылкой", + "openSupport": "Открыть поддержку", + "contactSupport": "Для получения поддержки обратитесь к {{username}}", + "contactUs": "Связаться с поддержкой" + }, + "wheel": { + "title": "Колесо удачи", + "disabled": "Колесо удачи временно недоступно", + "spinsRemaining": "Осталось вращений сегодня", + "choosePayment": "Выберите способ оплаты", + "stars": "Stars", + "telegramStars": "Telegram Stars", + "days": "дней", + "subscriptionDays": "Дни подписки", + "day": "День", + "spin": "КРУТИТЬ!", + "spinning": "Крутится...", + "history": "История", + "recentSpins": "Последние вращения", + "congratulations": "Поздравляем!", + "noLuck": "Не повезло!", + "oops": "Упс!", + "yourPromoCode": "Ваш промокод:", + "close": "Закрыть", + "errors": { + "networkError": "Произошла ошибка сети", + "loadFailed": "Не удалось загрузить конфигурацию колеса", + "dailyLimitReached": "Достигнут дневной лимит вращений", + "cannotSpin": "Сейчас нельзя крутить", + "insufficientBalance": "Недостаточно средств на балансе", + "topUpRequired": "Пополните баланс для оплаты спина", + "starsNotAvailable": "Оплата Stars недоступна. Откройте приложение через Telegram." + }, + "payWithStars": "Оплатить Stars", + "payWithDays": "Оплатить днями", + "processingPayment": "Обработка...", + "starsPaymentSuccess": "Оплата прошла! Результат спина отправлен в Telegram.", + "starsPaymentSuccessCheckHistory": "Оплата прошла! Проверьте историю или Telegram для результата.", + "starsPaymentFailed": "Ошибка оплаты. Попробуйте еще раз.", + "youWon": "Вы выиграли", + "noPrize": "В этот раз не повезло...", + "noHistory": "История вращений пуста", + "banner": { + "title": "Испытай удачу!", + "description": "Крути колесо и выигрывай призы: дни подписки, баланс, трафик и многое другое!", + "button": "Перейти к колесу" + } + }, + "admin": { + "nav": { + "title": "Админка", + "dashboard": "Статистика", + "tickets": "Тикеты", + "settings": "Настройки", + "apps": "Приложения", + "wheel": "Колесо", + "tariffs": "Тарифы", + "servers": "Серверы", + "broadcasts": "Рассылки", + "users": "Пользователи", + "payments": "Платежи", + "remnawave": "RemnaWave" + }, + "panel": { + "title": "Панель администратора", + "subtitle": "Управление системой", + "dashboardDesc": "Статистика и мониторинг системы", + "ticketsDesc": "Обработка обращений пользователей", + "settingsDesc": "Настройки системы и параметры", + "appsDesc": "Управление приложениями для подключения", + "wheelDesc": "Настройка колеса удачи и призов", + "tariffsDesc": "Управление тарифными планами", + "serversDesc": "Настройка VPN серверов", + "broadcastsDesc": "Массовая отправка сообщений", + "usersDesc": "Управление пользователями бота", + "paymentsDesc": "Проверка платежей", + "remnawaveDesc": "Управление панелью и статистика" + }, + "payments": { + "title": "Проверка платежей", + "description": "Ожидающие платежи за последние 24 часа", + "totalPending": "Всего ожидает", + "filterByMethod": "Фильтр по методу", + "noPayments": "Нет ожидающих платежей", + "paid": "Оплачено", + "user": "Пользователь", + "openLink": "Открыть ссылку", + "checkStatus": "Проверить статус", + "checking": "Проверка..." + }, + "remnawave": { + "title": "RemnaWave", + "subtitle": "Управление панелью и статистика", + "connected": "Подключено", + "disconnected": "Не настроено", + "noData": "Не удалось загрузить данные", + "tabs": { + "overview": "Обзор", + "nodes": "Ноды", + "squads": "Сквады", + "sync": "Синхронизация" + }, + "overview": { + "system": "Система", + "usersOnline": "Онлайн", + "totalUsers": "Всего пользователей", + "nodesOnline": "Нод онлайн", + "connections": "Подключений", + "bandwidth": "Пропускная способность", + "download": "Загрузка", + "upload": "Отдача", + "total": "Всего", + "server": "Сервер", + "cpu": "CPU", + "memory": "Память", + "uptime": "Аптайм", + "traffic": "Статистика трафика", + "usersByStatus": "Пользователи по статусу" + }, + "nodes": { + "online": "Онлайн", + "offline": "Офлайн", + "disabled": "Отключена", + "noNodes": "Ноды не найдены", + "restart": "Перезапустить", + "enable": "Включить", + "disable": "Отключить", + "restartAll": "Перезапустить все", + "confirmRestartAll": "Вы уверены, что хотите перезапустить все ноды?" + }, + "squads": { + "synced": "Синхронизирован", + "notSynced": "Не синхронизирован", + "noSquads": "Сквады не найдены", + "syncServers": "Синхронизировать серверы" + }, + "sync": { + "autoSync": "Автосинхронизация", + "runNow": "Запустить сейчас", + "manual": "Ручная синхронизация", + "fromPanel": "Синхронизация из панели", + "fromPanelDesc": "Импорт пользователей из RemnaWave панели в базу бота", + "toPanel": "Синхронизация в панель", + "toPanelDesc": "Экспорт пользователей из базы бота в RemnaWave панель", + "subscriptions": "Подписки", + "validate": "Валидация", + "validateDesc": "Проверка и исправление несоответствий подписок", + "cleanup": "Очистка", + "cleanupDesc": "Удаление orphaned подписок без пользователей", + "statuses": "Синхронизация статусов", + "statusesDesc": "Синхронизация статусов подписок с панелью" + } + }, + "wheel": { + "title": "Настройки колеса удачи", + "enabled": "Включено", + "disabled": "Выключено", + "tabs": { + "settings": "Настройки", + "prizes": "Призы", + "statistics": "Статистика" + }, + "settings": { + "enableWheel": "Включить колесо", + "allowSpins": "Разрешить пользователям крутить колесо", + "costInStars": "Стоимость в Stars", + "costInDays": "Стоимость в днях", + "rtpPercent": "RTP (Return to Player) %", + "dailyLimit": "Дневной лимит вращений (0 = безлимит)", + "minSubDays": "Мин. дней подписки для оплаты днями", + "promoPrefix": "Префикс промокодов" + }, + "prizes": { + "addPrize": "Добавить приз", + "editPrize": "Редактировать приз", + "noPrizes": "Призы не настроены. Добавьте призы для активации колеса.", + "deletePrize": "Удалить этот приз?", + "types": { + "subscription_days": "Дни подписки", + "balance_bonus": "Бонус баланса", + "traffic_gb": "Трафик ГБ", + "promocode": "Промокод", + "nothing": "Ничего (пусто)" + }, + "fields": { + "type": "Тип", + "displayName": "Название", + "value": "Значение", + "valueKopeks": "Стоимость в копейках (для RTP)", + "emoji": "Эмодзи", + "color": "Цвет", + "active": "Активен", + "worth": "Стоимость" + }, + "promo": { + "title": "Настройки промокода", + "balanceBonus": "Бонус баланса (копейки)", + "subscriptionDays": "Дни подписки" + } + }, + "statistics": { + "totalSpins": "Всего вращений", + "revenue": "Доход", + "payouts": "Выплаты", + "actualRtp": "Фактический RTP", + "targetRtp": "цель", + "prizeDistribution": "Распределение призов", + "times": "раз", + "topWins": "Топ выигрышей" + } + }, + "broadcasts": { + "title": "Рассылки", + "subtitle": "Массовая отправка сообщений пользователям", + "create": "Создать рассылку", + "empty": "Рассылок пока нет", + "selectFilter": "Выберите аудиторию", + "selectFilterPlaceholder": "Выберите фильтр...", + "recipients": "получ.", + "messageText": "Текст сообщения", + "messageTextPlaceholder": "Введите текст рассылки...", + "media": "Медиафайл", + "addMedia": "Добавить медиа", + "uploading": "Загрузка...", + "buttons": "Кнопки", + "willBeSent": "Будет отправлено", + "users": "пользователям", + "send": "Отправить", + "stop": "Остановить", + "progress": "Прогресс", + "total": "Всего", + "sent": "Отправлено", + "failed": "Ошибки", + "filter": "Фильтр", + "message": "Сообщение", + "unknownAdmin": "Неизвестный админ" + }, + "settings": { + "title": "Настройки системы", + "allCategories": "Все категории", + "noSettings": "Настройки не найдены", + "modified": "Изменено", + "readOnly": "Только чтение", + "reset": "Сбросить", + "categoriesCount": "категорий", + "settingsCount": "настроек", + "expandAll": "Развернуть все", + "collapseAll": "Свернуть все", + "searchPlaceholder": "Поиск настроек...", + "searchCategoriesPlaceholder": "Поиск категорий...", + "noSearchResults": "Ничего не найдено", + "example": "Пример" + }, + "apps": { + "title": "Управление приложениями", + "addApp": "Добавить приложение", + "addFirstApp": "Добавить первое приложение", + "noApps": "Нет приложений для этой платформы", + "createApp": "Создать приложение", + "editApp": "Редактировать приложение", + "confirmDelete": "Вы уверены, что хотите удалить это приложение?", + "copyTo": "Копировать в...", + "appId": "ID приложения", + "appName": "Название", + "urlScheme": "URL схема", + "featured": "Рекомендованное", + "base64Encoding": "Base64 кодирование", + "buttons": "Кнопки", + "button": "Кнопка", + "addButton": "Добавить кнопку", + "buttonText": "Текст кнопки", + "installDescription": "Описание установки", + "subscriptionDescription": "Описание добавления подписки", + "connectDescription": "Описание подключения", + "beforeSubscription": "До добавления подписки", + "afterSubscription": "После добавления подписки", + "stepTitle": "Заголовок", + "stepDescription": "Описание", + "tabs": { + "basic": "Основное", + "installation": "Установка", + "subscription": "Подписка", + "connect": "Подключение", + "additional": "Дополнительно" + }, + "import": "Импорт", + "export": "Экспорт", + "importApps": "Импорт приложений из JSON", + "exportApps": "Экспорт приложений в JSON", + "importPreview": "Предпросмотр импорта", + "confirmImport": "Импортировать", + "importError": "Неверный формат JSON файла", + "importCreateError": "Ошибка при создании приложений", + "noAppsToImport": "Нет приложений для импорта", + "remnaWaveToggle": "Переключить источник RemnaWave", + "refreshRemnaWave": "Обновить данные из RemnaWave", + "remnaWaveMode": "Отображаются приложения из панели RemnaWave. Режим только для чтения.", + "remnaWaveSettings": "Настройки RemnaWave", + "remnaWaveConfigUuid": "UUID конфигурации", + "remnaWaveConfigUuidHint": "UUID конфигурации страницы подписки из панели RemnaWave", + "availableConfigs": "Доступные конфигурации" + }, + "tickets": { + "title": "Управление тикетами", + "total": "Всего", + "list": "Тикеты", + "noTickets": "Нет тикетов", + "selectTicket": "Выберите тикет из списка", + "allStatuses": "Все статусы", + "statusOpen": "Открыт", + "statusPending": "Ожидает", + "statusAnswered": "Отвечен", + "statusClosed": "Закрыт", + "from": "От", + "created": "Создан", + "user": "Пользователь", + "you": "Вы", + "userLabel": "Пользователь", + "adminLabel": "Админ", + "replyPlaceholder": "Введите ваш ответ...", + "sendReply": "Отправить", + "settings": "Настройки", + "supportMode": "Режим поддержки", + "supportModeDesc": "Выберите, как пользователи могут связаться с поддержкой", + "modeBoth": "Тикеты и контакт", + "modeTickets": "Только тикеты", + "modeContact": "Только контакт", + "slaSettings": "Настройки SLA", + "slaEnabled": "Включить SLA (мониторинг времени ответа)", + "slaEnabledDesc": "Автоматические уведомления о просроченных тикетах", + "slaMinutes": "Время ответа (минуты)", + "slaMinutesDesc": "Максимальное время для ответа на тикет (1-1440 минут)", + "checkInterval": "Интервал проверки (секунды)", + "checkIntervalDesc": "Как часто проверять просроченные тикеты (30-600 секунд)", + "reminderCooldown": "Интервал напоминаний (минуты)", + "reminderCooldownDesc": "Минимальное время между напоминаниями (1-120 минут)", + "settingsUpdateError": "Ошибка сохранения настроек" + }, + "tariffs": { + "title": "Управление тарифами", + "subtitle": "Настройка тарифных планов", + "create": "Создать тариф", + "edit": "Редактировать тариф", + "noTariffs": "Нет тарифов", + "name": "Название", + "namePlaceholder": "Введите название тарифа", + "description": "Описание", + "descriptionPlaceholder": "Введите описание тарифа", + "trafficLimit": "Лимит трафика", + "trafficHint": "0 = безлимитный трафик", + "deviceLimit": "Лимит устройств", + "tierLevel": "Уровень тарифа", + "tierHint": "1-10, влияет на приоритет при переходе", + "unlimited": "Безлимит", + "devices": "устр.", + "servers": "серверов", + "subscriptions": "подписок", + "trial": "Триал", + "inactive": "Неактивен", + "activate": "Активировать", + "deactivate": "Деактивировать", + "toggleTrial": "Переключить триал", + "delete": "Удалить", + "confirmDelete": "Удалить тариф?", + "confirmDeleteText": "Это действие нельзя отменить. Тариф будет удален навсегда.", + "days": "дней", + "tabs": { + "basic": "Основное", + "prices": "Цены", + "servers": "Серверы" + }, + "pricesHint": "Включите нужные периоды и установите цены (в рублях)", + "periodDisabled": "Отключено", + "serversHint": "Выберите серверы, доступные для этого тарифа. Для каждого сервера можно указать индивидуальный лимит трафика.", + "noServers": "Нет доступных серверов", + "serverTrafficLimit": "Лимит трафика", + "useDefault": "по умолчанию" + }, + "servers": { + "title": "Управление серверами", + "subtitle": "Настройка серверов VPN", + "sync": "Синхронизировать", + "syncing": "Синхронизация...", + "syncNow": "Синхронизировать сейчас", + "noServers": "Нет серверов. Синхронизируйте с RemnaWave.", + "edit": "Редактировать сервер", + "originalName": "Оригинальное название", + "displayName": "Отображаемое название", + "displayNamePlaceholder": "Введите название", + "description": "Описание", + "descriptionPlaceholder": "Введите описание сервера", + "countryCode": "Код страны", + "price": "Цена", + "priceHint": "Дополнительная стоимость сервера", + "maxUsers": "Максимум пользователей", + "sortOrder": "Порядок сортировки", + "unlimited": "Без лимита", + "stats": "Статистика", + "currentUsers": "Текущих пользователей", + "activeSubscriptions": "Активных подписок", + "usedByTariffs": "Используется в тарифах", + "trial": "Триал", + "unavailable": "Недоступен", + "full": "Заполнен", + "enable": "Включить", + "disable": "Отключить", + "toggleTrial": "Переключить триал", + "loadError": "Не удалось загрузить сервер" + } + }, + "adminDashboard": { + "title": "Панель статистики", + "subtitle": "Обзор системы в реальном времени", + "refresh": "Обновить", + "loadError": "Не удалось загрузить статистику", + "stats": { + "usersOnline": "Пользователей онлайн", + "activeSubscriptions": "Активных подписок", + "incomeToday": "Доход за сегодня", + "incomeMonth": "Доход за месяц", + "incomeTotal": "Общий доход", + "subscriptionIncome": "Доход от подписок", + "total": "всего" + }, + "nodes": { + "title": "Ноды", + "online": "Онлайн", + "offline": "Оффлайн", + "disabled": "Отключена", + "noNodes": "Нет доступных нод", + "usersOnline": "Онлайн", + "traffic": "Трафик", + "enable": "Включить", + "disable": "Отключить" + }, + "revenue": { + "title": "Доходы", + "last7Days": "За последние 7 дней" + }, + "subscriptions": { + "title": "Подписки", + "subtitle": "Статистика подписок", + "active": "Активных", + "trial": "Пробных", + "paid": "Оплаченных", + "expired": "Истекших", + "newSubscriptions": "Новые подписки", + "today": "Сегодня", + "week": "Неделя", + "month": "Месяц", + "conversion": "Конверсия триал→платные" + }, + "servers": { + "title": "Серверы", + "total": "Всего серверов", + "available": "Доступных", + "withConnections": "С подключениями", + "revenue": "Доход" + }, + "tariffs": { + "title": "Статистика по тарифам", + "subtitle": "Распределение подписок по тарифам", + "tariffName": "Тариф", + "activeSubscriptions": "Активных", + "trialSubscriptions": "Триал", + "purchasedToday": "Сегодня", + "purchasedWeek": "Неделя", + "purchasedMonth": "Месяц", + "noTariffs": "Нет тарифов" + } + }, + "adminUsers": { + "title": "Пользователи", + "subtitle": "Управление пользователями", + "searchPlaceholder": "Поиск по ID, username, имени...", + "filters": { + "all": "Все", + "active": "Активные", + "blocked": "Заблокированные", + "deleted": "Удалённые" + }, + "sort": { + "created_at": "Дата регистрации", + "balance": "Баланс", + "traffic": "Трафик", + "last_activity": "Активность", + "total_spent": "Потрачено", + "purchase_count": "Покупки" + }, + "stats": { + "totalUsers": "Всего пользователей", + "activeUsers": "Активных", + "blockedUsers": "Заблокировано", + "withSubscription": "С подпиской", + "newToday": "Новых сегодня", + "newWeek": "За неделю", + "newMonth": "За месяц", + "totalBalance": "Общий баланс", + "activeToday": "Активны сегодня", + "activeWeek": "За неделю", + "activeMonth": "За месяц" + }, + "table": { + "user": "Пользователь", + "status": "Статус", + "balance": "Баланс", + "subscription": "Подписка", + "spent": "Потрачено", + "registered": "Регистрация", + "activity": "Активность", + "noUsers": "Пользователи не найдены" + }, + "userStatus": { + "active": "Активен", + "blocked": "Заблокирован", + "deleted": "Удалён" + }, + "subscriptionStatus": { + "active": "Активна", + "trial": "Триал", + "expired": "Истекла", + "none": "Нет подписки" + }, + "detail": { + "title": "Информация о пользователе", + "tabs": { + "info": "Инфо", + "subscription": "Подписка", + "balance": "Баланс", + "sync": "Синхронизация" + }, + "telegramId": "Telegram ID", + "username": "Username", + "fullName": "Имя", + "email": "Email", + "emailVerified": "Подтверждён", + "emailNotVerified": "Не подтверждён", + "language": "Язык", + "registeredAt": "Регистрация", + "lastActivity": "Последняя активность", + "cabinetLogin": "Вход в кабинет", + "referralCode": "Реферальный код", + "referralsCount": "Рефералов", + "referralEarnings": "Заработано", + "referredBy": "Приглашён", + "promoGroup": "Промо-группа", + "noPromoGroup": "Не задана", + "restrictions": "Ограничения", + "restrictionTopup": "Пополнение баланса", + "restrictionSubscription": "Покупка подписки", + "restrictionReason": "Причина", + "noRestrictions": "Нет ограничений", + "totalSpent": "Всего потрачено", + "purchaseCount": "Покупок", + "usedPromocodes": "Использовано промокодов", + "lifetimeTraffic": "Трафик за всё время", + "recentTransactions": "Последние транзакции", + "noTransactions": "Нет транзакций" + }, + "subscription": { + "noSubscription": "Подписка отсутствует", + "currentTariff": "Текущий тариф", + "status": "Статус", + "endDate": "Окончание", + "daysRemaining": "Осталось дней", + "trafficUsed": "Использовано трафика", + "deviceLimit": "Лимит устройств", + "autopay": "Автоплатёж", + "enabled": "Включён", + "disabled": "Отключён", + "actions": { + "extend": "Продлить", + "changeTariff": "Сменить тариф", + "setTraffic": "Установить трафик", + "toggleAutopay": "Вкл/выкл автоплатёж", + "cancel": "Отменить подписку", + "create": "Создать подписку" + }, + "extendDays": "Дней", + "selectTariff": "Выберите тариф", + "trafficLimitGb": "Лимит ГБ", + "trafficUsedGb": "Использовано ГБ", + "isTrial": "Пробный период" + }, + "balance": { + "currentBalance": "Текущий баланс", + "addFunds": "Пополнить", + "deductFunds": "Списать", + "amount": "Сумма", + "description": "Описание", + "createTransaction": "Создать транзакцию", + "transactionHistory": "История транзакций" + }, + "sync": { + "title": "Синхронизация с панелью", + "status": "Статус синхронизации", + "lastSync": "Последняя синхронизация", + "neverSynced": "Никогда", + "botData": "Данные бота", + "panelData": "Данные панели", + "notFound": "Не найден в панели", + "differences": "Различия", + "noDifferences": "Различий нет", + "syncFromPanel": "Синхронизировать из панели", + "syncToPanel": "Синхронизировать в панель", + "remawave_uuid": "Remnawave UUID", + "notLinked": "Не привязан" + }, + "actions": { + "block": "Заблокировать", + "unblock": "Разблокировать", + "delete": "Удалить", + "blockReason": "Причина блокировки", + "confirmBlock": "Подтвердить блокировку", + "confirmDelete": "Подтвердить удаление" + }, + "messages": { + "loadError": "Не удалось загрузить пользователей", + "userLoadError": "Не удалось загрузить пользователя", + "balanceUpdated": "Баланс обновлён", + "balanceError": "Ошибка обновления баланса", + "subscriptionUpdated": "Подписка обновлена", + "subscriptionError": "Ошибка обновления подписки", + "statusUpdated": "Статус обновлён", + "statusError": "Ошибка обновления статуса", + "syncSuccess": "Синхронизация выполнена", + "syncError": "Ошибка синхронизации" + } + }, + "profile": { + "title": "Профиль", + "accountInfo": "Информация об аккаунте", + "telegramId": "Telegram ID", + "username": "Имя пользователя", + "name": "Имя", + "registeredAt": "Дата регистрации", + "emailAuth": "Авторизация по Email", + "linkEmailDescription": "Привяжите email для входа без Telegram. После привязки на ваш email придёт письмо для подтверждения.", + "linkEmail": "Привязать Email", + "emailRequired": "Введите email", + "passwordMinLength": "Пароль должен быть минимум 8 символов", + "passwordsMismatch": "Пароли не совпадают", + "passwordPlaceholder": "Введите пароль", + "confirmPasswordPlaceholder": "Подтвердите пароль", + "passwordHint": "Минимум 8 символов", + "emailSent": "Письмо для подтверждения отправлено! Проверьте почту.", + "verified": "Подтверждён", + "notVerified": "Не подтверждён", + "verificationRequired": "Подтвердите email для использования входа по почте.", + "resendVerification": "Отправить письмо повторно", + "verificationResent": "Письмо отправлено повторно!", + "canLoginWithEmail": "Теперь вы можете входить с помощью email и пароля.", + "notifications": { + "title": "Настройки уведомлений", + "subscriptionExpiry": "Окончание подписки", + "subscriptionExpiryDesc": "Уведомлять о скором истечении подписки", + "daysBeforeExpiry": "Дней до окончания", + "trafficWarning": "Предупреждение о трафике", + "trafficWarningDesc": "Уведомлять при достижении лимита трафика", + "atPercent": "При использовании", + "balanceLow": "Низкий баланс", + "balanceLowDesc": "Уведомлять о низком балансе", + "threshold": "Порог", + "news": "Новости", + "newsDesc": "Получать новости и обновления сервиса", + "promoOffers": "Промо-предложения", + "promoOffersDesc": "Получать специальные предложения и скидки", + "unavailable": "Настройки уведомлений недоступны" + } + }, + "theme": { + "colors": "Цвета темы", + "reset": "Сбросить", + "accent": "Акцентный цвет", + "accentDescription": "Основной цвет бренда для кнопок, ссылок и интерактивных элементов", + "darkTheme": "Тёмная тема", + "lightTheme": "Светлая тема", + "background": "Фон", + "surface": "Поверхность", + "text": "Текст", + "textSecondary": "Вторичный текст", + "statusColors": "Статусные цвета", + "success": "Успех", + "warning": "Предупреждение", + "error": "Ошибка", + "preview": "Предпросмотр", + "previewButton": "Основная кнопка", + "previewSecondary": "Вторичная кнопка", + "light": "Светлая тема", + "dark": "Тёмная тема" + }, + "languages": { + "ru": "Русский", + "en": "English", + "zh": "中文", + "fa": "فارسی" + }, + "contests": { + "title": "Конкурсы", + "error": "Ошибка загрузки конкурсов", + "noContests": "Нет доступных конкурсов", + "days": "дней", + "play": "Участвовать", + "alreadyPlayed": "Уже участвовали", + "enterAnswer": "Введите ответ", + "submit": "Отправить", + "imHere": "Я здесь!" + }, + "polls": { + "title": "Опросы", + "error": "Ошибка загрузки опросов", + "noPolls": "Нет доступных опросов", + "questions": "вопросов", + "question": "Вопрос", + "of": "из", + "start": "Начать", + "continue": "Продолжить", + "completed": "Завершён", + "reward": "₽" + }, + "info": { + "title": "Информация", + "faq": "FAQ", + "rules": "Правила", + "privacy": "Конфиденциальность", + "offer": "Оферта", + "noFaq": "Нет вопросов и ответов", + "noContent": "Нет контента", + "updatedAt": "Обновлено" + }, + "onboarding": { + "skip": "Пропустить", + "finish": "Готово", + "steps": { + "welcome": { + "title": "Добро пожаловать!", + "description": "Это ваш личный кабинет. Здесь вы можете управлять подпиской, пополнять баланс и подключать устройства." + }, + "connectDevices": { + "title": "Подключите устройства", + "description": "Нажмите эту кнопку, чтобы получить инструкции по подключению VPN на ваших устройствах." + }, + "balance": { + "title": "Ваш баланс", + "description": "Здесь отображается ваш текущий баланс. Нажмите, чтобы пополнить его." + }, + "subscription": { + "title": "Статус подписки", + "description": "Здесь вы видите сколько дней осталось до окончания подписки." + }, + "quickActions": { + "title": "Быстрые действия", + "description": "Используйте эти кнопки для быстрого доступа к основным функциям: пополнению баланса, продлению подписки и приглашению друзей." + } + } + } } diff --git a/src/locales/zh.json b/src/locales/zh.json index b25e45d..edebd43 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -1,766 +1,766 @@ { - "common": { - "loading": "加载中...", - "error": "错误", - "success": "成功", - "save": "保存", - "cancel": "取消", - "confirm": "确认", - "back": "返回", - "next": "下一步", - "close": "关闭", - "search": "搜索", - "noData": "暂无数据", - "actions": "操作", - "yes": "是", - "no": "否", - "or": "或", - "and": "和", - "edit": "编辑", - "delete": "删除", - "currency": "¥" - }, - "nav": { - "dashboard": "首页", - "subscription": "订阅", - "balance": "余额", - "referral": "推荐", - "support": "支持", - "profile": "个人资料", - "logout": "退出", - "contests": "活动", - "polls": "问卷", - "info": "信息", - "wheel": "幸运转盘" - }, - "auth": { - "login": "登录", - "register": "注册", - "logout": "退出", - "email": "邮箱", - "password": "密码", - "confirmPassword": "确认密码", - "forgotPassword": "忘记密码?", - "resetPassword": "重置密码", - "loginWithTelegram": "通过Telegram登录", - "loginWithEmail": "通过邮箱登录", - "noAccount": "没有账户?", - "hasAccount": "已有账户?", - "registerHint": "要通过邮箱注册,请先通过Telegram登录,然后在设置中绑定邮箱。", - "telegramRequired": "需要Telegram授权", - "telegramNotConfigured": "Telegram机器人未配置", - "authenticating": "正在验证...", - "orOpenInApp": "或在应用中打开机器人", - "loginFailed": "登录失败", - "tryAgain": "重试", - "welcomeBack": "欢迎回来!", - "loginTitle": "登录个人中心", - "loginSubtitle": "通过Telegram或邮箱登录" - }, - "emailVerification": { - "title": "邮箱验证", - "verifying": "正在验证邮箱...", - "pleaseWait": "请稍候,我们正在验证您的邮箱。", - "success": "邮箱已验证!", - "successMessage": "您的邮箱已成功验证。现在您可以使用邮箱和密码登录。", - "failed": "验证失败", - "goToLogin": "前往登录" - }, - "dashboard": { - "title": "个人中心", - "welcome": "欢迎,{{name}}!", - "yourSubscription": "您的订阅", - "quickActions": "快捷操作", - "viewSubscription": "管理订阅", - "topUpBalance": "充值余额", - "inviteFriends": "邀请好友", - "getSupport": "获取支持", - "currentBalance": "当前余额", - "activeUntil": "有效期至", - "noActiveSubscription": "无有效订阅", - "devicesUsed": "设备:{{used}} / {{total}}", - "trafficUsed": "流量:{{used}} / {{total}} GB", - "unlimitedTraffic": "无限流量" - }, - "subscription": { - "title": "订阅", - "currentPlan": "当前套餐", - "status": "状态", - "active": "有效", - "inactive": "无效", - "trialStatus": "试用期", - "expired": "已过期", - "expiresAt": "到期时间", - "daysLeft": "剩余天数", - "devices": "设备", - "servers": "服务器", - "traffic": "流量", - "unlimited": "无限", - "used": "已使用", - "of": "/", - "renew": "续费", - "extend": "延长订阅", - "buyTraffic": "购买流量", - "buyDevices": "增加设备", - "renewalOptions": "续费选项", - "days": "天", - "hours": "小时", - "minutes": "分钟", - "price": "价格", - "noSubscription": "您没有有效订阅", - "getSubscription": "获取订阅", - "connectionInfo": "连接信息", - "copyLink": "复制链接", - "copied": "已复制!", - "showQR": "显示二维码", - "downloadConfig": "下载配置", - "trafficUsed": "已用流量", - "timeLeft": "剩余时间", - "getConfig": "连接设备", - "autoRenewal": "自动续费", - "daysBeforeExpiry": "到期前天数", - "selectPeriod": "选择时长", - "selectTraffic": "选择流量", - "selectServers": "选择服务器", - "selectDevices": "选择设备", - "perDevice": "/ 设备", - "summary": "摘要", - "total": "总计", - "purchase": "购买", - "step": "第 {{current}} 步,共 {{total}} 步", - "stepPeriod": "时长", - "stepTraffic": "流量", - "stepServers": "服务器", - "stepDevices": "设备", - "stepConfirm": "确认", - "trial": { - "title": "免费试用", - "description": "免费试用我们的VPN服务!", - "days": "天", - "devices": "设备", - "price": "激活费用", - "activate": "激活免费试用", - "unavailable": "试用不可用" - }, - "connection": { - "title": "连接VPN", - "selectDevice": "选择您的设备", - "selectApp": "选择应用", - "installApp": "1. 安装应用", - "addSubscription": "2. 添加订阅", - "connectVpn": "3. 连接VPN", - "addToApp": "添加到 {{appName}}", - "connect": "连接", - "noApps": "此平台暂无可用应用", - "noSubscription": "需要有效订阅才能连接", - "featured": "推荐", - "yourDevice": "您的设备", - "copyLink": "复制订阅链接", - "copied": "链接已复制!", - "openLink": "打开链接" - } - }, - "balance": { - "title": "余额", - "currentBalance": "当前余额", - "topUp": "充值", - "topUpBalance": "充值余额", - "paymentMethods": { - "yookassa": { - "name": "YooKassa", - "description": "通过YooKassa支付" - }, - "cryptobot": { - "name": "CryptoBot", - "description": "通过CryptoBot加密货币支付" - }, - "telegram_stars": { - "name": "Telegram Stars", - "description": "通过Telegram Stars支付" - } - }, - "transactionHistory": "交易记录", - "noTransactions": "暂无交易", - "date": "日期", - "type": "类型", - "description": "描述", - "amount": "金额", - "deposit": "充值", - "withdrawal": "支出", - "subscriptionPayment": "订阅付款", - "referralReward": "推荐奖励", - "minAmount": "最小", - "maxAmount": "最大", - "notAvailable": "不可用", - "useBot": "请使用Telegram机器人充值。", - "page": "第 {{current}} 页,共 {{total}} 页", - "invalidAmount": "金额无效", - "promocode": { - "title": "优惠码", - "placeholder": "输入优惠码", - "activate": "激活", - "activating": "激活中...", - "success": "优惠码激活成功!", - "balanceAdded": "已添加余额:{{amount}}", - "errors": { - "not_found": "优惠码不存在", - "expired": "优惠码已过期", - "used": "优惠码已被使用", - "already_used_by_user": "您已使用过此优惠码", - "user_not_found": "用户不存在", - "server_error": "服务器错误" - } - }, - "minAmountError": "最小金额:{{amount}}", - "maxAmountError": "最大金额:{{amount}}" - }, - "referral": { - "title": "推荐计划", - "yourLink": "您的推荐链接", - "copyLink": "复制链接", - "copied": "已复制!", - "shareButton": "分享", - "shareMessage": "通过我的链接加入 Cabinet,获取高达 {{percent}}% 返现!", - "shareHint": "分享链接给朋友。当他们注册并付款后,您将获得 {{percent}}% 佣金!", - "stats": { - "totalReferrals": "总推荐数", - "activeReferrals": "活跃", - "totalEarnings": "总收益", - "commissionRate": "佣金比例" - }, - "terms": { - "title": "计划条款", - "commission": "佣金", - "minTopup": "最低充值", - "newUserBonus": "新用户奖励", - "inviterBonus": "邀请人奖励" - }, - "yourReferrals": "您的推荐", - "noReferrals": "暂无推荐。分享链接邀请好友!", - "user": "用户", - "joined": "加入时间", - "hasPaid": "已付款", - "earningsHistory": "收益记录", - "reason": "原因", - "status": { - "pending": "待定", - "paid": "已支付" - }, - "reasons": { - "referral_registration_pending": "推荐用户注册", - "referral_registration": "推荐用户注册", - "referral_first_payment": "推荐用户首次付款", - "referral_subscription_renewal": "推荐用户续订", - "referral_bonus": "推荐奖金" - } - }, - "support": { - "title": "支持", - "newTicket": "新工单", - "yourTickets": "您的工单", - "noTickets": "暂无工单", - "createTicket": "创建工单", - "subject": "主题", - "subjectPlaceholder": "简要描述问题", - "message": "消息", - "messagePlaceholder": "详细描述您的问题...", - "send": "发送", - "sending": "发送中...", - "creating": "创建中...", - "reply": "回复", - "replyPlaceholder": "输入您的回复...", - "sendReply": "发送回复", - "you": "您", - "supportTeam": "客服", - "selectTicket": "选择工单或创建新工单", - "created": "创建时间", - "repliesDisabled": "此工单已禁止回复", - "status": { - "open": "待处理", - "answered": "已回复", - "pending": "等待中", - "closed": "已关闭" - }, - "attachImage": "附加图片", - "invalidFileType": "文件类型无效。请使用JPEG、PNG、GIF或WebP。", - "fileTooLarge": "文件过大。最大10MB。", - "uploadFailed": "图片上传失败", - "imageLoadFailed": "图片加载失败" - }, - "wheel": { - "title": "幸运转盘", - "disabled": "幸运转盘暂时不可用", - "spinsRemaining": "今日剩余次数", - "choosePayment": "选择支付方式", - "stars": "Stars", - "telegramStars": "Telegram Stars", - "days": "天", - "subscriptionDays": "订阅天数", - "day": "天", - "spin": "开始抽奖!", - "spinning": "抽奖中...", - "history": "历史", - "recentSpins": "最近抽奖", - "congratulations": "恭喜!", - "noLuck": "未中奖!", - "oops": "哎呀!", - "yourPromoCode": "您的优惠码:", - "close": "关闭", - "errors": { - "networkError": "网络错误", - "loadFailed": "加载转盘配置失败", - "dailyLimitReached": "已达每日限制", - "cannotSpin": "当前无法抽奖", - "insufficientBalance": "余额不足", - "topUpRequired": "请充值以支付抽奖费用" - }, - "payWithStars": "支付 {stars} Stars", - "processingPayment": "处理中...", - "starsPaymentSuccess": "支付成功!抽奖结果已发送到Telegram。", - "starsPaymentFailed": "支付失败。请重试。", - "noHistory": "暂无抽奖记录", - "banner": { - "title": "试试运气!", - "description": "转动转盘赢取奖品:订阅天数、余额、流量等!", - "button": "前往转盘" - } - }, - "admin": { - "nav": { - "title": "管理", - "dashboard": "统计", - "tickets": "工单", - "settings": "设置", - "apps": "应用", - "wheel": "转盘", - "tariffs": "套餐", - "servers": "服务器", - "broadcasts": "群发" - }, - "panel": { - "title": "管理面板", - "subtitle": "系统管理", - "dashboardDesc": "统计和系统监控", - "ticketsDesc": "处理用户工单", - "settingsDesc": "系统设置和参数", - "appsDesc": "管理连接应用", - "wheelDesc": "配置幸运转盘和奖品", - "tariffsDesc": "管理套餐计划", - "serversDesc": "配置VPN服务器", - "broadcastsDesc": "向用户群发消息" - }, - "wheel": { - "title": "幸运转盘设置", - "enabled": "已启用", - "disabled": "已禁用", - "tabs": { - "settings": "设置", - "prizes": "奖品", - "statistics": "统计" - }, - "settings": { - "enableWheel": "启用转盘", - "allowSpins": "允许用户抽奖", - "costInStars": "Stars费用", - "costInDays": "天数费用", - "rtpPercent": "RTP (返还率) %", - "dailyLimit": "每日限制 (0 = 无限)", - "minSubDays": "天数支付最低订阅天数", - "promoPrefix": "优惠码前缀" - }, - "prizes": { - "addPrize": "添加奖品", - "editPrize": "编辑奖品", - "noPrizes": "未配置奖品。添加奖品以启用转盘。", - "deletePrize": "删除此奖品?", - "types": { - "subscription_days": "订阅天数", - "balance_bonus": "余额奖励", - "traffic_gb": "流量 GB", - "promocode": "优惠码", - "nothing": "无奖品" - }, - "fields": { - "type": "类型", - "displayName": "显示名称", - "value": "数值", - "valueKopeks": "价值(戈比,用于RTP)", - "emoji": "表情", - "color": "颜色", - "active": "启用", - "worth": "价值" - }, - "promo": { - "title": "优惠码设置", - "balanceBonus": "余额奖励(戈比)", - "subscriptionDays": "订阅天数" - } - }, - "statistics": { - "totalSpins": "总抽奖次数", - "revenue": "收入", - "payouts": "支出", - "actualRtp": "实际RTP", - "targetRtp": "目标", - "prizeDistribution": "奖品分布", - "times": "次", - "topWins": "最高奖品" - } - }, - "broadcasts": { - "title": "群发", - "subtitle": "向用户群发消息", - "create": "创建群发", - "empty": "暂无群发", - "selectFilter": "选择受众", - "selectFilterPlaceholder": "选择筛选条件...", - "recipients": "人", - "messageText": "消息内容", - "messageTextPlaceholder": "输入群发消息...", - "media": "媒体文件", - "addMedia": "添加媒体", - "uploading": "上传中...", - "buttons": "按钮", - "willBeSent": "将发送给", - "users": "用户", - "send": "发送", - "stop": "停止", - "progress": "进度", - "total": "总计", - "sent": "已发送", - "failed": "失败", - "filter": "筛选", - "message": "消息", - "unknownAdmin": "未知管理员" - }, - "settings": { - "title": "系统设置", - "allCategories": "所有分类", - "noSettings": "未找到设置", - "modified": "已修改", - "readOnly": "只读", - "reset": "重置", - "categoriesCount": "个分类", - "settingsCount": "个设置", - "expandAll": "展开全部", - "collapseAll": "折叠全部", - "searchPlaceholder": "搜索设置...", - "searchCategoriesPlaceholder": "搜索分类...", - "noSearchResults": "未找到结果", - "example": "示例" - }, - "apps": { - "title": "应用管理", - "addApp": "添加应用", - "addFirstApp": "添加第一个应用", - "noApps": "此平台暂无应用", - "createApp": "创建应用", - "editApp": "编辑应用", - "confirmDelete": "确定要删除此应用吗?", - "copyTo": "复制到...", - "appId": "应用ID", - "appName": "名称", - "urlScheme": "URL协议", - "featured": "推荐", - "base64Encoding": "Base64编码", - "buttons": "按钮", - "button": "按钮", - "addButton": "添加按钮", - "buttonText": "按钮文本", - "installDescription": "安装说明", - "subscriptionDescription": "添加订阅说明", - "connectDescription": "连接说明", - "beforeSubscription": "添加订阅前", - "afterSubscription": "添加订阅后", - "stepTitle": "标题", - "stepDescription": "描述", - "tabs": { - "basic": "基本", - "installation": "安装", - "subscription": "订阅", - "connect": "连接", - "additional": "附加" - } - }, - "tickets": { - "title": "工单管理", - "total": "总计", - "list": "工单", - "noTickets": "暂无工单", - "selectTicket": "从列表中选择工单", - "allStatuses": "所有状态", - "statusOpen": "待处理", - "statusPending": "等待中", - "statusAnswered": "已回复", - "statusClosed": "已关闭", - "from": "来自", - "created": "创建时间", - "user": "用户", - "you": "您", - "userLabel": "用户", - "adminLabel": "管理员", - "replyPlaceholder": "输入您的回复...", - "sendReply": "发送回复", - "settings": "设置", - "supportMode": "支持模式", - "supportModeDesc": "选择用户如何联系支持", - "modeBoth": "工单和联系方式", - "modeTickets": "仅工单", - "modeContact": "仅联系方式", - "slaSettings": "SLA设置", - "slaEnabled": "启用 SLA(响应时间监控)", - "slaEnabledDesc": "自动通知过期工单", - "slaMinutes": "响应时间(分钟)", - "slaMinutesDesc": "回复工单的最长时间(1-1440分钟)", - "checkInterval": "检查间隔(秒)", - "checkIntervalDesc": "检查过期工单的频率(30-600秒)", - "reminderCooldown": "提醒间隔(分钟)", - "reminderCooldownDesc": "提醒之间的最小时间(1-120分钟)", - "settingsUpdateError": "保存设置时出错" - }, - "tariffs": { - "title": "套餐管理", - "subtitle": "配置套餐计划", - "create": "创建套餐", - "edit": "编辑套餐", - "noTariffs": "暂无套餐", - "name": "名称", - "namePlaceholder": "输入套餐名称", - "description": "描述", - "descriptionPlaceholder": "输入套餐描述", - "trafficLimit": "流量限制", - "trafficHint": "0 = 无限流量", - "deviceLimit": "设备限制", - "tierLevel": "套餐等级", - "tierHint": "1-10,影响升级优先级", - "unlimited": "无限", - "devices": "设备", - "servers": "服务器", - "subscriptions": "订阅", - "trial": "试用", - "inactive": "未激活", - "activate": "激活", - "deactivate": "停用", - "toggleTrial": "切换试用", - "delete": "删除", - "confirmDelete": "删除套餐?", - "confirmDeleteText": "此操作不可撤销。套餐将被永久删除。", - "days": "天", - "tabs": { - "basic": "基本", - "prices": "价格", - "servers": "服务器" - }, - "pricesHint": "设置每个周期的价格", - "serversHint": "选择此套餐可用的服务器", - "noServers": "暂无可用服务器" - }, - "servers": { - "title": "服务器管理", - "subtitle": "配置VPN服务器", - "sync": "同步", - "syncing": "同步中...", - "syncNow": "立即同步", - "noServers": "暂无服务器。请与RemnaWave同步。", - "edit": "编辑服务器", - "originalName": "原始名称", - "displayName": "显示名称", - "displayNamePlaceholder": "输入显示名称", - "description": "描述", - "descriptionPlaceholder": "输入服务器描述", - "countryCode": "国家代码", - "price": "价格", - "priceHint": "服务器附加费用", - "maxUsers": "最大用户数", - "sortOrder": "排序", - "unlimited": "无限制", - "stats": "统计", - "currentUsers": "当前用户", - "activeSubscriptions": "活跃订阅", - "usedByTariffs": "套餐使用", - "trial": "试用", - "unavailable": "不可用", - "full": "已满", - "enable": "启用", - "disable": "禁用", - "toggleTrial": "切换试用" - } - }, - "adminDashboard": { - "title": "统计面板", - "subtitle": "实时系统概览", - "refresh": "刷新", - "loadError": "加载统计失败", - "stats": { - "usersOnline": "在线用户", - "activeSubscriptions": "活跃订阅", - "incomeToday": "今日收入", - "incomeMonth": "本月收入", - "incomeTotal": "总收入", - "subscriptionIncome": "订阅收入", - "total": "总计" - }, - "nodes": { - "title": "节点", - "online": "在线", - "offline": "离线", - "disabled": "已禁用", - "noNodes": "暂无可用节点", - "usersOnline": "在线", - "traffic": "流量", - "enable": "启用", - "disable": "禁用" - }, - "revenue": { - "title": "收入", - "last7Days": "最近7天" - }, - "subscriptions": { - "title": "订阅", - "subtitle": "订阅统计", - "active": "活跃", - "trial": "试用", - "paid": "付费", - "expired": "过期", - "newSubscriptions": "新订阅", - "today": "今日", - "week": "本周", - "month": "本月", - "conversion": "试用转付费率" - }, - "servers": { - "title": "服务器", - "total": "服务器总数", - "available": "可用", - "withConnections": "有连接", - "revenue": "收入" - } - }, - "profile": { - "title": "个人资料", - "accountInfo": "账户信息", - "telegramId": "Telegram ID", - "username": "用户名", - "name": "姓名", - "registeredAt": "注册时间", - "emailAuth": "邮箱认证", - "linkEmailDescription": "绑定邮箱以便无需Telegram登录。绑定后将收到验证邮件。", - "linkEmail": "绑定邮箱", - "emailRequired": "请输入邮箱", - "passwordMinLength": "密码至少8个字符", - "passwordsMismatch": "密码不匹配", - "passwordPlaceholder": "输入密码", - "confirmPasswordPlaceholder": "确认密码", - "passwordHint": "至少8个字符", - "emailSent": "验证邮件已发送!请查收。", - "verified": "已验证", - "notVerified": "未验证", - "verificationRequired": "请验证邮箱以使用邮箱登录。", - "resendVerification": "重新发送验证邮件", - "verificationResent": "验证邮件已重新发送!", - "canLoginWithEmail": "现在您可以使用邮箱和密码登录。", - "notifications": { - "title": "通知设置", - "subscriptionExpiry": "订阅到期", - "subscriptionExpiryDesc": "订阅即将到期时通知", - "daysBeforeExpiry": "到期前天数", - "trafficWarning": "流量警告", - "trafficWarningDesc": "接近流量限制时通知", - "atPercent": "使用率", - "balanceLow": "余额不足", - "balanceLowDesc": "余额不足时通知", - "threshold": "阈值", - "news": "新闻", - "newsDesc": "接收新闻和服务更新", - "promoOffers": "促销活动", - "promoOffersDesc": "接收特别优惠和折扣", - "unavailable": "通知设置不可用" - } - }, - "theme": { - "colors": "主题颜色", - "reset": "重置", - "accent": "主题色", - "accentDescription": "用于按钮、链接和交互元素的主品牌颜色", - "darkTheme": "深色主题", - "lightTheme": "浅色主题", - "background": "背景", - "surface": "表面", - "text": "文字", - "textSecondary": "次要文字", - "statusColors": "状态颜色", - "success": "成功", - "warning": "警告", - "error": "错误", - "preview": "预览", - "previewButton": "主要按钮", - "previewSecondary": "次要按钮", - "light": "浅色主题", - "dark": "深色主题" - }, - "languages": { - "ru": "Русский", - "en": "English", - "zh": "中文", - "fa": "فارسی" - }, - "contests": { - "title": "活动", - "error": "加载活动失败", - "noContests": "暂无活动", - "days": "天", - "play": "参与", - "alreadyPlayed": "已参与", - "enterAnswer": "输入答案", - "submit": "提交", - "imHere": "我在这里!" - }, - "polls": { - "title": "问卷", - "error": "加载问卷失败", - "noPolls": "暂无问卷", - "questions": "个问题", - "question": "问题", - "of": "/", - "start": "开始", - "continue": "继续", - "completed": "已完成", - "reward": "¥" - }, - "info": { - "title": "信息", - "faq": "常见问题", - "rules": "规则", - "privacy": "隐私政策", - "offer": "服务条款", - "noFaq": "暂无常见问题", - "noContent": "暂无内容", - "updatedAt": "更新时间" - }, - "onboarding": { - "skip": "跳过", - "finish": "完成", - "steps": { - "welcome": { - "title": "欢迎!", - "description": "这是您的个人中心。在这里您可以管理订阅、充值余额和连接设备。" - }, - "connectDevices": { - "title": "连接设备", - "description": "点击此按钮获取在您的设备上连接VPN的说明。" - }, - "balance": { - "title": "您的余额", - "description": "这里显示您的当前余额。点击可充值。" - }, - "subscription": { - "title": "订阅状态", - "description": "在这里您可以看到订阅的剩余天数。" - }, - "quickActions": { - "title": "快捷操作", - "description": "使用这些按钮快速访问主要功能:充值余额、延长订阅和邀请好友。" - } - } - } -} \ No newline at end of file + "common": { + "loading": "加载中...", + "error": "错误", + "success": "成功", + "save": "保存", + "cancel": "取消", + "confirm": "确认", + "back": "返回", + "next": "下一步", + "close": "关闭", + "search": "搜索", + "noData": "暂无数据", + "actions": "操作", + "yes": "是", + "no": "否", + "or": "或", + "and": "和", + "edit": "编辑", + "delete": "删除", + "currency": "¥" + }, + "nav": { + "dashboard": "首页", + "subscription": "订阅", + "balance": "余额", + "referral": "推荐", + "support": "支持", + "profile": "个人资料", + "logout": "退出", + "contests": "活动", + "polls": "问卷", + "info": "信息", + "wheel": "幸运转盘" + }, + "auth": { + "login": "登录", + "register": "注册", + "logout": "退出", + "email": "邮箱", + "password": "密码", + "confirmPassword": "确认密码", + "forgotPassword": "忘记密码?", + "resetPassword": "重置密码", + "loginWithTelegram": "通过Telegram登录", + "loginWithEmail": "通过邮箱登录", + "noAccount": "没有账户?", + "hasAccount": "已有账户?", + "registerHint": "要通过邮箱注册,请先通过Telegram登录,然后在设置中绑定邮箱。", + "telegramRequired": "需要Telegram授权", + "telegramNotConfigured": "Telegram机器人未配置", + "authenticating": "正在验证...", + "orOpenInApp": "或在应用中打开机器人", + "loginFailed": "登录失败", + "tryAgain": "重试", + "welcomeBack": "欢迎回来!", + "loginTitle": "登录个人中心", + "loginSubtitle": "通过Telegram或邮箱登录" + }, + "emailVerification": { + "title": "邮箱验证", + "verifying": "正在验证邮箱...", + "pleaseWait": "请稍候,我们正在验证您的邮箱。", + "success": "邮箱已验证!", + "successMessage": "您的邮箱已成功验证。现在您可以使用邮箱和密码登录。", + "failed": "验证失败", + "goToLogin": "前往登录" + }, + "dashboard": { + "title": "个人中心", + "welcome": "欢迎,{{name}}!", + "yourSubscription": "您的订阅", + "quickActions": "快捷操作", + "viewSubscription": "管理订阅", + "topUpBalance": "充值余额", + "inviteFriends": "邀请好友", + "getSupport": "获取支持", + "currentBalance": "当前余额", + "activeUntil": "有效期至", + "noActiveSubscription": "无有效订阅", + "devicesUsed": "设备:{{used}} / {{total}}", + "trafficUsed": "流量:{{used}} / {{total}} GB", + "unlimitedTraffic": "无限流量" + }, + "subscription": { + "title": "订阅", + "currentPlan": "当前套餐", + "status": "状态", + "active": "有效", + "inactive": "无效", + "trialStatus": "试用期", + "expired": "已过期", + "expiresAt": "到期时间", + "daysLeft": "剩余天数", + "devices": "设备", + "servers": "服务器", + "traffic": "流量", + "unlimited": "无限", + "used": "已使用", + "of": "/", + "renew": "续费", + "extend": "延长订阅", + "buyTraffic": "购买流量", + "buyDevices": "增加设备", + "renewalOptions": "续费选项", + "days": "天", + "hours": "小时", + "minutes": "分钟", + "price": "价格", + "noSubscription": "您没有有效订阅", + "getSubscription": "获取订阅", + "connectionInfo": "连接信息", + "copyLink": "复制链接", + "copied": "已复制!", + "showQR": "显示二维码", + "downloadConfig": "下载配置", + "trafficUsed": "已用流量", + "timeLeft": "剩余时间", + "getConfig": "连接设备", + "autoRenewal": "自动续费", + "daysBeforeExpiry": "到期前天数", + "selectPeriod": "选择时长", + "selectTraffic": "选择流量", + "selectServers": "选择服务器", + "selectDevices": "选择设备", + "perDevice": "/ 设备", + "summary": "摘要", + "total": "总计", + "purchase": "购买", + "step": "第 {{current}} 步,共 {{total}} 步", + "stepPeriod": "时长", + "stepTraffic": "流量", + "stepServers": "服务器", + "stepDevices": "设备", + "stepConfirm": "确认", + "trial": { + "title": "免费试用", + "description": "免费试用我们的VPN服务!", + "days": "天", + "devices": "设备", + "price": "激活费用", + "activate": "激活免费试用", + "unavailable": "试用不可用" + }, + "connection": { + "title": "连接VPN", + "selectDevice": "选择您的设备", + "selectApp": "选择应用", + "installApp": "1. 安装应用", + "addSubscription": "2. 添加订阅", + "connectVpn": "3. 连接VPN", + "addToApp": "添加到 {{appName}}", + "connect": "连接", + "noApps": "此平台暂无可用应用", + "noSubscription": "需要有效订阅才能连接", + "featured": "推荐", + "yourDevice": "您的设备", + "copyLink": "复制订阅链接", + "copied": "链接已复制!", + "openLink": "打开链接" + } + }, + "balance": { + "title": "余额", + "currentBalance": "当前余额", + "topUp": "充值", + "topUpBalance": "充值余额", + "paymentMethods": { + "yookassa": { + "name": "YooKassa", + "description": "通过YooKassa支付" + }, + "cryptobot": { + "name": "CryptoBot", + "description": "通过CryptoBot加密货币支付" + }, + "telegram_stars": { + "name": "Telegram Stars", + "description": "通过Telegram Stars支付" + } + }, + "transactionHistory": "交易记录", + "noTransactions": "暂无交易", + "date": "日期", + "type": "类型", + "description": "描述", + "amount": "金额", + "deposit": "充值", + "withdrawal": "支出", + "subscriptionPayment": "订阅付款", + "referralReward": "推荐奖励", + "minAmount": "最小", + "maxAmount": "最大", + "notAvailable": "不可用", + "useBot": "请使用Telegram机器人充值。", + "page": "第 {{current}} 页,共 {{total}} 页", + "invalidAmount": "金额无效", + "promocode": { + "title": "优惠码", + "placeholder": "输入优惠码", + "activate": "激活", + "activating": "激活中...", + "success": "优惠码激活成功!", + "balanceAdded": "已添加余额:{{amount}}", + "errors": { + "not_found": "优惠码不存在", + "expired": "优惠码已过期", + "used": "优惠码已被使用", + "already_used_by_user": "您已使用过此优惠码", + "user_not_found": "用户不存在", + "server_error": "服务器错误" + } + }, + "minAmountError": "最小金额:{{amount}}", + "maxAmountError": "最大金额:{{amount}}" + }, + "referral": { + "title": "推荐计划", + "yourLink": "您的推荐链接", + "copyLink": "复制链接", + "copied": "已复制!", + "shareButton": "分享", + "shareMessage": "通过我的链接加入 {{botName}},获取高达 {{percent}}% 返现!", + "shareHint": "分享链接给朋友。当他们注册并付款后,您将获得 {{percent}}% 佣金!", + "stats": { + "totalReferrals": "总推荐数", + "activeReferrals": "活跃", + "totalEarnings": "总收益", + "commissionRate": "佣金比例" + }, + "terms": { + "title": "计划条款", + "commission": "佣金", + "minTopup": "最低充值", + "newUserBonus": "新用户奖励", + "inviterBonus": "邀请人奖励" + }, + "yourReferrals": "您的推荐", + "noReferrals": "暂无推荐。分享链接邀请好友!", + "user": "用户", + "joined": "加入时间", + "hasPaid": "已付款", + "earningsHistory": "收益记录", + "reason": "原因", + "status": { + "pending": "待定", + "paid": "已支付" + }, + "reasons": { + "referral_registration_pending": "推荐用户注册", + "referral_registration": "推荐用户注册", + "referral_first_payment": "推荐用户首次付款", + "referral_subscription_renewal": "推荐用户续订", + "referral_bonus": "推荐奖金" + } + }, + "support": { + "title": "支持", + "newTicket": "新工单", + "yourTickets": "您的工单", + "noTickets": "暂无工单", + "createTicket": "创建工单", + "subject": "主题", + "subjectPlaceholder": "简要描述问题", + "message": "消息", + "messagePlaceholder": "详细描述您的问题...", + "send": "发送", + "sending": "发送中...", + "creating": "创建中...", + "reply": "回复", + "replyPlaceholder": "输入您的回复...", + "sendReply": "发送回复", + "you": "您", + "supportTeam": "客服", + "selectTicket": "选择工单或创建新工单", + "created": "创建时间", + "repliesDisabled": "此工单已禁止回复", + "status": { + "open": "待处理", + "answered": "已回复", + "pending": "等待中", + "closed": "已关闭" + }, + "attachImage": "附加图片", + "invalidFileType": "文件类型无效。请使用JPEG、PNG、GIF或WebP。", + "fileTooLarge": "文件过大。最大10MB。", + "uploadFailed": "图片上传失败", + "imageLoadFailed": "图片加载失败" + }, + "wheel": { + "title": "幸运转盘", + "disabled": "幸运转盘暂时不可用", + "spinsRemaining": "今日剩余次数", + "choosePayment": "选择支付方式", + "stars": "Stars", + "telegramStars": "Telegram Stars", + "days": "天", + "subscriptionDays": "订阅天数", + "day": "天", + "spin": "开始抽奖!", + "spinning": "抽奖中...", + "history": "历史", + "recentSpins": "最近抽奖", + "congratulations": "恭喜!", + "noLuck": "未中奖!", + "oops": "哎呀!", + "yourPromoCode": "您的优惠码:", + "close": "关闭", + "errors": { + "networkError": "网络错误", + "loadFailed": "加载转盘配置失败", + "dailyLimitReached": "已达每日限制", + "cannotSpin": "当前无法抽奖", + "insufficientBalance": "余额不足", + "topUpRequired": "请充值以支付抽奖费用" + }, + "payWithStars": "支付 {stars} Stars", + "processingPayment": "处理中...", + "starsPaymentSuccess": "支付成功!抽奖结果已发送到Telegram。", + "starsPaymentFailed": "支付失败。请重试。", + "noHistory": "暂无抽奖记录", + "banner": { + "title": "试试运气!", + "description": "转动转盘赢取奖品:订阅天数、余额、流量等!", + "button": "前往转盘" + } + }, + "admin": { + "nav": { + "title": "管理", + "dashboard": "统计", + "tickets": "工单", + "settings": "设置", + "apps": "应用", + "wheel": "转盘", + "tariffs": "套餐", + "servers": "服务器", + "broadcasts": "群发" + }, + "panel": { + "title": "管理面板", + "subtitle": "系统管理", + "dashboardDesc": "统计和系统监控", + "ticketsDesc": "处理用户工单", + "settingsDesc": "系统设置和参数", + "appsDesc": "管理连接应用", + "wheelDesc": "配置幸运转盘和奖品", + "tariffsDesc": "管理套餐计划", + "serversDesc": "配置VPN服务器", + "broadcastsDesc": "向用户群发消息" + }, + "wheel": { + "title": "幸运转盘设置", + "enabled": "已启用", + "disabled": "已禁用", + "tabs": { + "settings": "设置", + "prizes": "奖品", + "statistics": "统计" + }, + "settings": { + "enableWheel": "启用转盘", + "allowSpins": "允许用户抽奖", + "costInStars": "Stars费用", + "costInDays": "天数费用", + "rtpPercent": "RTP (返还率) %", + "dailyLimit": "每日限制 (0 = 无限)", + "minSubDays": "天数支付最低订阅天数", + "promoPrefix": "优惠码前缀" + }, + "prizes": { + "addPrize": "添加奖品", + "editPrize": "编辑奖品", + "noPrizes": "未配置奖品。添加奖品以启用转盘。", + "deletePrize": "删除此奖品?", + "types": { + "subscription_days": "订阅天数", + "balance_bonus": "余额奖励", + "traffic_gb": "流量 GB", + "promocode": "优惠码", + "nothing": "无奖品" + }, + "fields": { + "type": "类型", + "displayName": "显示名称", + "value": "数值", + "valueKopeks": "价值(戈比,用于RTP)", + "emoji": "表情", + "color": "颜色", + "active": "启用", + "worth": "价值" + }, + "promo": { + "title": "优惠码设置", + "balanceBonus": "余额奖励(戈比)", + "subscriptionDays": "订阅天数" + } + }, + "statistics": { + "totalSpins": "总抽奖次数", + "revenue": "收入", + "payouts": "支出", + "actualRtp": "实际RTP", + "targetRtp": "目标", + "prizeDistribution": "奖品分布", + "times": "次", + "topWins": "最高奖品" + } + }, + "broadcasts": { + "title": "群发", + "subtitle": "向用户群发消息", + "create": "创建群发", + "empty": "暂无群发", + "selectFilter": "选择受众", + "selectFilterPlaceholder": "选择筛选条件...", + "recipients": "人", + "messageText": "消息内容", + "messageTextPlaceholder": "输入群发消息...", + "media": "媒体文件", + "addMedia": "添加媒体", + "uploading": "上传中...", + "buttons": "按钮", + "willBeSent": "将发送给", + "users": "用户", + "send": "发送", + "stop": "停止", + "progress": "进度", + "total": "总计", + "sent": "已发送", + "failed": "失败", + "filter": "筛选", + "message": "消息", + "unknownAdmin": "未知管理员" + }, + "settings": { + "title": "系统设置", + "allCategories": "所有分类", + "noSettings": "未找到设置", + "modified": "已修改", + "readOnly": "只读", + "reset": "重置", + "categoriesCount": "个分类", + "settingsCount": "个设置", + "expandAll": "展开全部", + "collapseAll": "折叠全部", + "searchPlaceholder": "搜索设置...", + "searchCategoriesPlaceholder": "搜索分类...", + "noSearchResults": "未找到结果", + "example": "示例" + }, + "apps": { + "title": "应用管理", + "addApp": "添加应用", + "addFirstApp": "添加第一个应用", + "noApps": "此平台暂无应用", + "createApp": "创建应用", + "editApp": "编辑应用", + "confirmDelete": "确定要删除此应用吗?", + "copyTo": "复制到...", + "appId": "应用ID", + "appName": "名称", + "urlScheme": "URL协议", + "featured": "推荐", + "base64Encoding": "Base64编码", + "buttons": "按钮", + "button": "按钮", + "addButton": "添加按钮", + "buttonText": "按钮文本", + "installDescription": "安装说明", + "subscriptionDescription": "添加订阅说明", + "connectDescription": "连接说明", + "beforeSubscription": "添加订阅前", + "afterSubscription": "添加订阅后", + "stepTitle": "标题", + "stepDescription": "描述", + "tabs": { + "basic": "基本", + "installation": "安装", + "subscription": "订阅", + "connect": "连接", + "additional": "附加" + } + }, + "tickets": { + "title": "工单管理", + "total": "总计", + "list": "工单", + "noTickets": "暂无工单", + "selectTicket": "从列表中选择工单", + "allStatuses": "所有状态", + "statusOpen": "待处理", + "statusPending": "等待中", + "statusAnswered": "已回复", + "statusClosed": "已关闭", + "from": "来自", + "created": "创建时间", + "user": "用户", + "you": "您", + "userLabel": "用户", + "adminLabel": "管理员", + "replyPlaceholder": "输入您的回复...", + "sendReply": "发送回复", + "settings": "设置", + "supportMode": "支持模式", + "supportModeDesc": "选择用户如何联系支持", + "modeBoth": "工单和联系方式", + "modeTickets": "仅工单", + "modeContact": "仅联系方式", + "slaSettings": "SLA设置", + "slaEnabled": "启用 SLA(响应时间监控)", + "slaEnabledDesc": "自动通知过期工单", + "slaMinutes": "响应时间(分钟)", + "slaMinutesDesc": "回复工单的最长时间(1-1440分钟)", + "checkInterval": "检查间隔(秒)", + "checkIntervalDesc": "检查过期工单的频率(30-600秒)", + "reminderCooldown": "提醒间隔(分钟)", + "reminderCooldownDesc": "提醒之间的最小时间(1-120分钟)", + "settingsUpdateError": "保存设置时出错" + }, + "tariffs": { + "title": "套餐管理", + "subtitle": "配置套餐计划", + "create": "创建套餐", + "edit": "编辑套餐", + "noTariffs": "暂无套餐", + "name": "名称", + "namePlaceholder": "输入套餐名称", + "description": "描述", + "descriptionPlaceholder": "输入套餐描述", + "trafficLimit": "流量限制", + "trafficHint": "0 = 无限流量", + "deviceLimit": "设备限制", + "tierLevel": "套餐等级", + "tierHint": "1-10,影响升级优先级", + "unlimited": "无限", + "devices": "设备", + "servers": "服务器", + "subscriptions": "订阅", + "trial": "试用", + "inactive": "未激活", + "activate": "激活", + "deactivate": "停用", + "toggleTrial": "切换试用", + "delete": "删除", + "confirmDelete": "删除套餐?", + "confirmDeleteText": "此操作不可撤销。套餐将被永久删除。", + "days": "天", + "tabs": { + "basic": "基本", + "prices": "价格", + "servers": "服务器" + }, + "pricesHint": "设置每个周期的价格", + "serversHint": "选择此套餐可用的服务器", + "noServers": "暂无可用服务器" + }, + "servers": { + "title": "服务器管理", + "subtitle": "配置VPN服务器", + "sync": "同步", + "syncing": "同步中...", + "syncNow": "立即同步", + "noServers": "暂无服务器。请与RemnaWave同步。", + "edit": "编辑服务器", + "originalName": "原始名称", + "displayName": "显示名称", + "displayNamePlaceholder": "输入显示名称", + "description": "描述", + "descriptionPlaceholder": "输入服务器描述", + "countryCode": "国家代码", + "price": "价格", + "priceHint": "服务器附加费用", + "maxUsers": "最大用户数", + "sortOrder": "排序", + "unlimited": "无限制", + "stats": "统计", + "currentUsers": "当前用户", + "activeSubscriptions": "活跃订阅", + "usedByTariffs": "套餐使用", + "trial": "试用", + "unavailable": "不可用", + "full": "已满", + "enable": "启用", + "disable": "禁用", + "toggleTrial": "切换试用" + } + }, + "adminDashboard": { + "title": "统计面板", + "subtitle": "实时系统概览", + "refresh": "刷新", + "loadError": "加载统计失败", + "stats": { + "usersOnline": "在线用户", + "activeSubscriptions": "活跃订阅", + "incomeToday": "今日收入", + "incomeMonth": "本月收入", + "incomeTotal": "总收入", + "subscriptionIncome": "订阅收入", + "total": "总计" + }, + "nodes": { + "title": "节点", + "online": "在线", + "offline": "离线", + "disabled": "已禁用", + "noNodes": "暂无可用节点", + "usersOnline": "在线", + "traffic": "流量", + "enable": "启用", + "disable": "禁用" + }, + "revenue": { + "title": "收入", + "last7Days": "最近7天" + }, + "subscriptions": { + "title": "订阅", + "subtitle": "订阅统计", + "active": "活跃", + "trial": "试用", + "paid": "付费", + "expired": "过期", + "newSubscriptions": "新订阅", + "today": "今日", + "week": "本周", + "month": "本月", + "conversion": "试用转付费率" + }, + "servers": { + "title": "服务器", + "total": "服务器总数", + "available": "可用", + "withConnections": "有连接", + "revenue": "收入" + } + }, + "profile": { + "title": "个人资料", + "accountInfo": "账户信息", + "telegramId": "Telegram ID", + "username": "用户名", + "name": "姓名", + "registeredAt": "注册时间", + "emailAuth": "邮箱认证", + "linkEmailDescription": "绑定邮箱以便无需Telegram登录。绑定后将收到验证邮件。", + "linkEmail": "绑定邮箱", + "emailRequired": "请输入邮箱", + "passwordMinLength": "密码至少8个字符", + "passwordsMismatch": "密码不匹配", + "passwordPlaceholder": "输入密码", + "confirmPasswordPlaceholder": "确认密码", + "passwordHint": "至少8个字符", + "emailSent": "验证邮件已发送!请查收。", + "verified": "已验证", + "notVerified": "未验证", + "verificationRequired": "请验证邮箱以使用邮箱登录。", + "resendVerification": "重新发送验证邮件", + "verificationResent": "验证邮件已重新发送!", + "canLoginWithEmail": "现在您可以使用邮箱和密码登录。", + "notifications": { + "title": "通知设置", + "subscriptionExpiry": "订阅到期", + "subscriptionExpiryDesc": "订阅即将到期时通知", + "daysBeforeExpiry": "到期前天数", + "trafficWarning": "流量警告", + "trafficWarningDesc": "接近流量限制时通知", + "atPercent": "使用率", + "balanceLow": "余额不足", + "balanceLowDesc": "余额不足时通知", + "threshold": "阈值", + "news": "新闻", + "newsDesc": "接收新闻和服务更新", + "promoOffers": "促销活动", + "promoOffersDesc": "接收特别优惠和折扣", + "unavailable": "通知设置不可用" + } + }, + "theme": { + "colors": "主题颜色", + "reset": "重置", + "accent": "主题色", + "accentDescription": "用于按钮、链接和交互元素的主品牌颜色", + "darkTheme": "深色主题", + "lightTheme": "浅色主题", + "background": "背景", + "surface": "表面", + "text": "文字", + "textSecondary": "次要文字", + "statusColors": "状态颜色", + "success": "成功", + "warning": "警告", + "error": "错误", + "preview": "预览", + "previewButton": "主要按钮", + "previewSecondary": "次要按钮", + "light": "浅色主题", + "dark": "深色主题" + }, + "languages": { + "ru": "Русский", + "en": "English", + "zh": "中文", + "fa": "فارسی" + }, + "contests": { + "title": "活动", + "error": "加载活动失败", + "noContests": "暂无活动", + "days": "天", + "play": "参与", + "alreadyPlayed": "已参与", + "enterAnswer": "输入答案", + "submit": "提交", + "imHere": "我在这里!" + }, + "polls": { + "title": "问卷", + "error": "加载问卷失败", + "noPolls": "暂无问卷", + "questions": "个问题", + "question": "问题", + "of": "/", + "start": "开始", + "continue": "继续", + "completed": "已完成", + "reward": "¥" + }, + "info": { + "title": "信息", + "faq": "常见问题", + "rules": "规则", + "privacy": "隐私政策", + "offer": "服务条款", + "noFaq": "暂无常见问题", + "noContent": "暂无内容", + "updatedAt": "更新时间" + }, + "onboarding": { + "skip": "跳过", + "finish": "完成", + "steps": { + "welcome": { + "title": "欢迎!", + "description": "这是您的个人中心。在这里您可以管理订阅、充值余额和连接设备。" + }, + "connectDevices": { + "title": "连接设备", + "description": "点击此按钮获取在您的设备上连接VPN的说明。" + }, + "balance": { + "title": "您的余额", + "description": "这里显示您的当前余额。点击可充值。" + }, + "subscription": { + "title": "订阅状态", + "description": "在这里您可以看到订阅的剩余天数。" + }, + "quickActions": { + "title": "快捷操作", + "description": "使用这些按钮快速访问主要功能:充值余额、延长订阅和邀请好友。" + } + } + } +} diff --git a/src/pages/Referral.tsx b/src/pages/Referral.tsx index 88fb757..4526fd2 100644 --- a/src/pages/Referral.tsx +++ b/src/pages/Referral.tsx @@ -2,247 +2,341 @@ import { useState } from 'react' import { useQuery } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { referralApi } from '../api/referral' +import { brandingApi } from '../api/branding' import { useCurrency } from '../hooks/useCurrency' const CopyIcon = () => ( - - - + + + ) const CheckIcon = () => ( - - - + + + ) const ShareIcon = () => ( - - - - + + + + ) export default function Referral() { - const { t } = useTranslation() - const { formatAmount, currencySymbol, formatPositive } = useCurrency() - const [copied, setCopied] = useState(false) + const { t } = useTranslation() + const { formatAmount, currencySymbol, formatPositive } = useCurrency() + const [copied, setCopied] = useState(false) - const { data: info, isLoading } = useQuery({ - queryKey: ['referral-info'], - queryFn: referralApi.getReferralInfo, - }) + const { data: info, isLoading } = useQuery({ + queryKey: ['referral-info'], + queryFn: referralApi.getReferralInfo, + }) - const { data: terms } = useQuery({ - queryKey: ['referral-terms'], - queryFn: referralApi.getReferralTerms, - }) + const { data: terms } = useQuery({ + queryKey: ['referral-terms'], + queryFn: referralApi.getReferralTerms, + }) - const { data: referralList } = useQuery({ - queryKey: ['referral-list'], - queryFn: () => referralApi.getReferralList({ per_page: 10 }), - }) + const { data: referralList } = useQuery({ + queryKey: ['referral-list'], + queryFn: () => referralApi.getReferralList({ per_page: 10 }), + }) - const { data: earnings } = useQuery({ - queryKey: ['referral-earnings'], - queryFn: () => referralApi.getReferralEarnings({ per_page: 10 }), - }) + const { data: earnings } = useQuery({ + queryKey: ['referral-earnings'], + queryFn: () => referralApi.getReferralEarnings({ per_page: 10 }), + }) - const copyLink = () => { - if (info?.referral_link) { - navigator.clipboard.writeText(info.referral_link) - setCopied(true) - setTimeout(() => setCopied(false), 2000) - } - } + const { data: branding } = useQuery({ + queryKey: ['branding'], + queryFn: brandingApi.getBranding, + staleTime: 60000, + }) - const shareLink = () => { - if (!info?.referral_link) return - const shareText = t('referral.shareMessage', { - percent: info?.commission_percent || 0, - }) + const copyLink = () => { + if (info?.referral_link) { + navigator.clipboard.writeText(info.referral_link) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } + } - if (navigator.share) { - navigator - .share({ - title: t('referral.title'), - text: shareText, - url: info.referral_link, - }) - .catch(() => { - // ignore cancellation errors - }) - return - } + const shareLink = () => { + if (!info?.referral_link) return + const shareText = t('referral.shareMessage', { + percent: info?.commission_percent || 0, + botName: branding?.name || import.meta.env.VITE_APP_NAME || 'Cabinet', + }) - const telegramUrl = `https://t.me/share/url?url=${encodeURIComponent( - info.referral_link - )}&text=${encodeURIComponent(shareText)}` - window.open(telegramUrl, '_blank', 'noopener,noreferrer') - } + if (navigator.share) { + navigator + .share({ + title: t('referral.title'), + text: shareText, + url: info.referral_link, + }) + .catch(() => { + // ignore cancellation errors + }) + return + } - if (isLoading) { - return ( -
-
-
- ) - } + const telegramUrl = `https://t.me/share/url?url=${encodeURIComponent( + info.referral_link + )}&text=${encodeURIComponent(shareText)}` + window.open(telegramUrl, '_blank', 'noopener,noreferrer') + } - return ( -
-

{t('referral.title')}

+ if (isLoading) { + return ( +
+
+
+ ) + } - {/* Stats Cards */} -
-
-
{t('referral.stats.totalReferrals')}
-
{info?.total_referrals || 0}
-
- {info?.active_referrals || 0} {t('referral.stats.activeReferrals').toLowerCase()} -
-
-
-
{t('referral.stats.totalEarnings')}
-
- {formatPositive(info?.total_earnings_rubles || 0)} -
-
-
-
{t('referral.stats.commissionRate')}
-
- {info?.commission_percent || 0}% -
-
-
+ return ( +
+

+ {t('referral.title')} +

- {/* Referral Link */} -
-

{t('referral.yourLink')}

-
- -
- - -
-
-

- {t('referral.shareHint', { percent: info?.commission_percent || 0 })} -

-
+ {/* Stats Cards */} +
+
+
+ {t('referral.stats.totalReferrals')} +
+
{info?.total_referrals || 0}
+
+ {info?.active_referrals || 0}{' '} + {t('referral.stats.activeReferrals').toLowerCase()} +
+
+
+
+ {t('referral.stats.totalEarnings')} +
+
+ {formatPositive(info?.total_earnings_rubles || 0)} +
+
+
+
+ {t('referral.stats.commissionRate')} +
+
+ {info?.commission_percent || 0}% +
+
+
- {/* Program Terms */} - {terms && ( -
-

{t('referral.terms.title')}

-
-
-
{t('referral.terms.commission')}
-
{terms.commission_percent}%
-
-
-
{t('referral.terms.minTopup')}
-
{formatAmount(terms.minimum_topup_rubles)} {currencySymbol}
-
-
-
{t('referral.terms.newUserBonus')}
-
{formatPositive(terms.first_topup_bonus_rubles)}
-
-
-
{t('referral.terms.inviterBonus')}
-
{formatPositive(terms.inviter_bonus_rubles)}
-
-
-
- )} + {/* Referral Link */} +
+

+ {t('referral.yourLink')} +

+
+ +
+ + +
+
+

+ {t('referral.shareHint', { percent: info?.commission_percent || 0 })} +

+
- {/* Referrals List */} -
-

{t('referral.yourReferrals')}

- {referralList?.items && referralList.items.length > 0 ? ( -
- {referralList.items.map((ref) => ( -
-
-
- {ref.first_name || ref.username || `User #${ref.id}`} -
-
- {new Date(ref.created_at).toLocaleDateString()} -
-
- {ref.has_paid ? ( - {t('referral.status.paid')} - ) : ( - {t('referral.status.pending')} - )} -
- ))} -
- ) : ( -
-
- - - -
-
{t('referral.noReferrals')}
-
- )} -
+ {/* Program Terms */} + {terms && ( +
+

+ {t('referral.terms.title')} +

+
+
+
+ {t('referral.terms.commission')} +
+
+ {terms.commission_percent}% +
+
+
+
+ {t('referral.terms.minTopup')} +
+
+ {formatAmount(terms.minimum_topup_rubles)} {currencySymbol} +
+
+
+
+ {t('referral.terms.newUserBonus')} +
+
+ {formatPositive(terms.first_topup_bonus_rubles)} +
+
+
+
+ {t('referral.terms.inviterBonus')} +
+
+ {formatPositive(terms.inviter_bonus_rubles)} +
+
+
+
+ )} - {/* Earnings History */} - {earnings?.items && earnings.items.length > 0 && ( -
-

{t('referral.earningsHistory')}

-
- {earnings.items.map((earning) => ( -
-
-
- {earning.referral_first_name || earning.referral_username || 'Referral'} -
-
- {t(`referral.reasons.${earning.reason}`, earning.reason)} • {new Date(earning.created_at).toLocaleDateString()} -
-
-
- {formatPositive(earning.amount_rubles)} -
-
- ))} -
-
- )} -
- ) + {/* Referrals List */} +
+

+ {t('referral.yourReferrals')} +

+ {referralList?.items && referralList.items.length > 0 ? ( +
+ {referralList.items.map(ref => ( +
+
+
+ {ref.first_name || ref.username || `User #${ref.id}`} +
+
+ {new Date(ref.created_at).toLocaleDateString()} +
+
+ {ref.has_paid ? ( + + {t('referral.status.paid')} + + ) : ( + + {t('referral.status.pending')} + + )} +
+ ))} +
+ ) : ( +
+
+ + + +
+
{t('referral.noReferrals')}
+
+ )} +
+ + {/* Earnings History */} + {earnings?.items && earnings.items.length > 0 && ( +
+

+ {t('referral.earningsHistory')} +

+
+ {earnings.items.map(earning => ( +
+
+
+ {earning.referral_first_name || + earning.referral_username || + 'Referral'} +
+
+ {t(`referral.reasons.${earning.reason}`, earning.reason)} •{' '} + {new Date(earning.created_at).toLocaleDateString()} +
+
+
+ {formatPositive(earning.amount_rubles)} +
+
+ ))} +
+
+ )} +
+ ) }