fix(i18n): backfill 120 missing keys + close 2 typo regressions from purchase refactor

Surface: users (and especially Серёжа в bugs topic) were seeing raw i18n keys
like `subscription.promoGroup.title` rendered as literal text on the renewal
screen. Audit found 118 keys referenced in code that were absent from all 4
locale files, plus 140 keys missing only in zh/fa (silently falling back to
Russian for those users).

Root causes:
- cf52999 (extract TariffPickerGrid) introduced `subscription.promoGroup.title`
  that never existed — should have been `subscription.promoGroup.yourGroup`.
- Subscription.tsx used `subscription.autopay.title` (object path) while
  SubscriptionListCard.tsx used `subscription.autopay` (leaf) — i18next can't
  hold both shapes for the same key.
- Many user-flow keys (subscription.notFound, subscriptions.empty, common.ok,
  successNotification.*, etc.) were never added when their components landed.
- Historical drift had ~140 keys in ru/en that never got zh/fa translations.

Fix:
- Rename TariffPickerGrid usage `promoGroup.title` → `promoGroup.yourGroup`.
- Rename Subscription.tsx usage `autopay.title` → `autopay`.
- Add 116 brand-new keys across ru/en/zh/fa (464 entries).
- Add 8 partially-missing keys (en+ru gaps) for landing periods, dashboard
  campaign/referrer stats, and promo offer failure counts.
- Translate 280 entries to close the zh/fa drift.

Final state: 0 keys missing in any of the 4 locale files for any code-referenced
translation key. Build + tsc green.
This commit is contained in:
c0mrade
2026-05-28 18:47:58 +03:00
parent 574da67ca0
commit e1f401c333
6 changed files with 1026 additions and 182 deletions

View File

@@ -23,14 +23,22 @@
"copy": "کپی",
"units": {
"gb": "GB",
"perGb": "/GB"
"perGb": "/GB",
"days": "روز",
"mo": "ماه"
},
"add": "افزودن",
"refresh": "بازخوانی",
"retry": "تلاش مجدد",
"saving": "در حال ذخیره...",
"understand": "متوجه شدم",
"collapse": "جمع کردن"
"collapse": "جمع کردن",
"balance": "موجودی",
"copied": "کپی شد",
"no_results": "نتیجه‌ای یافت نشد",
"ok": "تأیید",
"processing": "در حال پردازش…",
"rangeTo": "تا"
},
"nav": {
"dashboard": "داشبورد",
@@ -45,7 +53,8 @@
"info": "اطلاعات",
"wheel": "چرخ شانس",
"menu": "منو",
"gift": "هدیه"
"gift": "هدیه",
"navigation": "ناوبری"
},
"notifications": {
"ticketNotifications": "اعلان‌های تیکت",
@@ -142,7 +151,17 @@
"tariff": "تعرفه",
"validUntil": "معتبر تا",
"goToSubscription": "رفتن به اشتراک",
"goToBalance": "رفتن به موجودی"
"goToBalance": "رفتن به موجودی",
"devicesAdded": "+{{count}} دستگاه",
"devicesPurchased": {
"title": "دستگاه‌ها افزوده شدند"
},
"totalDevices": "مجموع دستگاه‌ها: {{count}}",
"totalTraffic": "مجموع ترافیک: {{value}}",
"trafficAdded": "+{{value}} ترافیک",
"trafficPurchased": {
"title": "ترافیک افزوده شد"
}
},
"auth": {
"login": "ورود",
@@ -243,13 +262,38 @@
"tariffs": "تعرفه‌ها",
"traffic": "ترافیک",
"devices": "دستگاه‌ها",
"expiredDate": "منقضی شده"
"expiredDate": "منقضی شده",
"activeUntil": "منقضی شده — تا {{date}}"
},
"deviceLimitReached": "برای افزودن دستگاه جدید، دستگاه‌های فعلی را قطع کنید",
"suspended": {
"title": "اشتراک معلق شده",
"resume": "از سرگیری"
}
},
"manageAll": "مدیریت همه",
"showAll": "نمایش همه",
"subscriptions": "اشتراک‌ها",
"connectDevice": "اتصال دستگاه",
"devicesConnectedUnlimited": "{{count}} دستگاه متصل",
"devicesOfMax": "{{used}} از {{max}}",
"maxUsage": "حداکثر",
"remaining": "باقی‌مانده",
"stats": {
"balance": "موجودی",
"referrals": "معرفی‌شده‌ها"
},
"tariff": "تعرفه",
"trafficUsageTitle": "مصرف ترافیک",
"trialOffer": {
"freeDesc": "{{days}} روز رایگان آزمایش کنید — بدون پرداخت",
"freeTitle": "دوره آزمایشی رایگان",
"paidDesc": "{{days}} روز آزمایشی فقط با {{price}}",
"paidTitle": "دوره آزمایشی پرداختی"
},
"unlimited": "نامحدود",
"usageLast14Days": "مصرف ۱۴ روز اخیر",
"usedSuffix": "مصرف شده",
"validUntil": "معتبر تا {{date}}"
},
"subscription": {
"title": "اشتراک",
@@ -339,7 +383,10 @@
"devices_other": "{{count}} دستگاه",
"price": "هزینه فعال‌سازی",
"activate": "فعال‌سازی دوره آزمایشی",
"unavailable": "دوره آزمایشی در دسترس نیست"
"unavailable": "دوره آزمایشی در دسترس نیست",
"insufficientBalance": "موجودی برای فعال‌سازی دوره آزمایشی کافی نیست",
"payAndActivate": "پرداخت و فعال‌سازی",
"topUpToActivate": "برای فعال‌سازی دوره آزمایشی موجودی را افزایش دهید"
},
"connection": {
"title": "اتصال VPN",
@@ -368,7 +415,8 @@
"goToApps": "رفتن به تنظیمات برنامه‌ها",
"qrTitle": "کد QR اشتراک",
"qrScanHint": "برای اتصال با دوربین اسکن کنید",
"qrButton": "کد QR"
"qrButton": "کد QR",
"openQr": "باز کردن کد QR"
},
"additionalOptions": {
"title": "گزینه‌های اضافی",
@@ -387,7 +435,20 @@
"buyTrafficGb": "خرید {{gb}} GB",
"buyUnlimited": "خرید نامحدود",
"manageServers": "مدیریت اسکوادها",
"manageServersTitle": "مدیریت اسکوادها"
"manageServersTitle": "مدیریت اسکوادها",
"connectedDevices": "دستگاه‌های متصل",
"currentDeviceLimit": "محدودیت فعلی دستگاه",
"decrementDevices": "کاهش تعداد دستگاه‌ها",
"disconnectDevicesFirst": "ابتدا دستگاه‌های اضافی را قطع کنید",
"incrementDevices": "افزایش تعداد دستگاه‌ها",
"minDeviceLimit": "حداقل محدودیت دستگاه",
"newDeviceLimit": "محدودیت جدید دستگاه",
"reduce": "کاهش",
"reduceDevices": "کاهش تعداد دستگاه‌ها",
"reduceDevicesDescription": "محدودیت دستگاه‌های خود را تنظیم کنید. در صورت لزوم ابتدا دستگاه‌های اضافه را قطع کنید",
"reduceDevicesTitle": "کاهش تعداد دستگاه‌ها",
"reduceUnavailable": "در حال حاضر کاهش تعداد دستگاه‌ها امکان‌پذیر نیست",
"reducing": "در حال کاهش…"
},
"serverManagement": {
"statusLegend": "✅ — متصل • — اضافه خواهد شد (پولی) • — قطع خواهد شد",
@@ -499,6 +560,46 @@
"stopScan": "بستن دوربین",
"noCamera": "دسترسی به دوربین امکان‌پذیر نیست",
"codeFound": "کد پیدا شد"
},
"allTariffsPurchased": "همه تعرفه‌ها قبلاً خریداری شده‌اند",
"autopay": "تمدید خودکار",
"backToList": "بازگشت به فهرست اشتراک‌ها",
"confirmDelete": "اشتراک حذف شود؟",
"cta": {
"renewHint": "اشتراک منقضی شده — برای ادامه استفاده تمدید کنید",
"activeHint": "اشتراک فعال است — می‌توانید دستگاه‌ها را متصل کرده و از VPN استفاده کنید",
"expiredHint": "اشتراک منقضی شده — برای ادامه استفاده تمدید کنید",
"trialHint": "شما در دوره آزمایشی هستید — برای دسترسی به همه امکانات به تعرفه پرداختی ارتقا دهید"
},
"dailyAutoCharge": "برداشت خودکار روزانه",
"defaultName": "اشتراک",
"delete": "حذف",
"deleteTitle": "حذف اشتراک",
"get_config": "دریافت پیکربندی",
"loadError": "بارگذاری اشتراک ناموفق بود",
"newTariff": "تعرفه جدید",
"noOptionsAvailable": "گزینه‌ای در دسترس نیست",
"noRenewalOptions": "گزینه‌ای برای تمدید وجود ندارد",
"notFound": "اشتراک یافت نشد",
"notFoundDesc": "ممکن است حذف شده یا هنوز فعال نشده باشد",
"servers": "سرورها",
"statusActive": "فعال",
"statusExpired": "منقضی شده",
"statusLimited": "محدود",
"statusTrial": "آزمایشی",
"daysShort": "روز",
"expiredBanner": {
"selectTariff": "تعرفه را انتخاب کنید",
"title": "اشتراک منقضی شده است"
},
"trialInfo": {
"description": "{{days}} روز سرویس ما را رایگان امتحان کنید",
"remaining": "{{count}} روز باقی‌مانده",
"title": "دوره آزمایشی"
},
"trialUpgrade": {
"description": "برای دسترسی به همه امکانات و ادامه استفاده به اشتراک پرداختی ارتقا دهید",
"title": "ارتقای اشتراک"
}
},
"balance": {
@@ -575,7 +676,9 @@
"already_used_by_user": "شما قبلاً از این کد استفاده کرده‌اید",
"user_not_found": "کاربر یافت نشد",
"server_error": "خطای سرور"
}
},
"daysLeft": "روزهای باقی‌مانده: {{count}}",
"selectSubscription": "اشتراک را انتخاب کنید"
},
"minAmountError": "حداقل مبلغ: {{amount}}",
"maxAmountError": "حداکثر مبلغ: {{amount}}",
@@ -633,7 +736,8 @@
"timeoutDesc": "پردازش پرداخت بیشتر از حد معمول طول می‌کشد. می‌توانید دوباره وضعیت را بررسی کنید.",
"goToBalance": "مشاهده موجودی",
"tryAgain": "تلاش مجدد"
}
},
"top_up": "افزایش موجودی"
},
"referral": {
"title": "برنامه معرفی",
@@ -817,7 +921,8 @@
"contactUs": "تماس با پشتیبانی",
"openSupport": "باز کردن پشتیبانی",
"ticketsDisabled": "تیکت‌ها غیرفعال است",
"useExternalLink": "لطفاً از لینک خارجی برای دریافت پشتیبانی استفاده کنید"
"useExternalLink": "لطفاً از لینک خارجی برای دریافت پشتیبانی استفاده کنید",
"create_ticket": "ایجاد تیکت"
},
"wheel": {
"title": "چرخ شانس",
@@ -849,7 +954,8 @@
"insufficientBalance": "موجودی کافی نیست",
"topUpRequired": "برای پرداخت شارژ کنید",
"starsNotAvailable": "پرداخت Stars در دسترس نیست. برنامه را از طریق تلگرام باز کنید.",
"noSubscription": "برای چرخاندن گردونه نیاز به اشتراک فعال دارید. ابتدا اشتراک خود را فعال کنید."
"noSubscription": "برای چرخاندن گردونه نیاز به اشتراک فعال دارید. ابتدا اشتراک خود را فعال کنید.",
"selectSubscription": "ابتدا یک اشتراک انتخاب کنید"
},
"payWithStars": "پرداخت {stars} Stars",
"processingPayment": "در حال پردازش...",
@@ -868,7 +974,8 @@
"noPrize": "این بار شانس نیاوردید...",
"payWithDays": "پرداخت با روز",
"starsPaymentSuccessCheckHistory": "پرداخت موفق! تاریخچه یا تلگرام را بررسی کنید.",
"youWon": "شما برنده شدید"
"youWon": "شما برنده شدید",
"selectSubscription": "اشتراک را انتخاب کنید"
},
"admin": {
"backgrounds": {
@@ -1422,7 +1529,32 @@
"customButtonTypeCallback": "Callback",
"customButtonTypeUrl": "لینک",
"customButtonCallbackPlaceholder": "callback_data (مثلاً back_to_menu)",
"customButtonUrlPlaceholder": "https://example.com"
"customButtonUrlPlaceholder": "https://example.com",
"category": "دسته‌بندی",
"categoryNews": "اخبار",
"categoryPromo": "تبلیغاتی",
"categorySystem": "سیستمی",
"stopping": "در حال توقف…",
"btnBalance": "افزایش موجودی",
"btnConnect": "اتصال",
"btnHome": "صفحه اصلی",
"btnPartners": "برنامه معرفی",
"btnPromocode": "کد تخفیف",
"btnSubscription": "اشتراک",
"btnSupport": "پشتیبانی",
"emailContent": "محتوای ایمیل",
"emailContentHint": "پشتیبانی از HTML",
"emailContentPlaceholder": "<p>سلام، {{user_name}}!</p>\n<p>پیام شما اینجا...</p>",
"emailSection": "ارسال انبوه ایمیل",
"emailSubject": "موضوع ایمیل",
"emailSubjectPlaceholder": "موضوع ایمیل را وارد کنید...",
"emailVariables": "متغیرهای موجود",
"preview": "پیش‌نمایش",
"previewEmpty": "— خالی —",
"selectChannel": "کانال ارسال",
"selectEmailFilter": "مخاطبان ایمیل را انتخاب کنید",
"selectEmailFilterPlaceholder": "فیلتر را انتخاب کنید...",
"telegramSection": "ارسال انبوه تلگرام"
},
"pinnedMessages": {
"title": "Pinned Messages",
@@ -1723,8 +1855,8 @@
"telegramOidcClientId": "Client ID (شناسه ربات)",
"telegramOidcClientSecret": "Client Secret"
},
"offlineConv": "\u062a\u0628\u062f\u06cc\u0644\u200c\u0647\u0627\u06cc \u0622\u0641\u0644\u0627\u06cc\u0646",
"apiKey": "\u06a9\u0644\u06cc\u062f API"
"offlineConv": "تبدیل‌های آفلاین",
"apiKey": "کلید API"
},
"buttons": {
"color": "رنگ دکمه",
@@ -1830,7 +1962,10 @@
"remnaWaveConfigUuidHint": "UUID پیکربندی صفحه اشتراک از پنل RemnaWave",
"remnaWaveMode": "نمایش برنامه‌ها از پنل RemnaWave. حالت فقط خواندنی.",
"remnaWaveSettings": "تنظیمات RemnaWave",
"remnaWaveToggle": "تغییر منبع RemnaWave"
"remnaWaveToggle": "تغییر منبع RemnaWave",
"noConfigs": "هیچ تنظیماتی وجود ندارد",
"remnaWaveConnected": "RemnaWave متصل است",
"remnaWaveDisconnected": "RemnaWave قطع است"
},
"tickets": {
"title": "مدیریت تیکت‌ها",
@@ -1881,7 +2016,13 @@
"copyTelegramId": "برای کپی شناسه تلگرام کلیک کنید",
"viewUser": "کاربر",
"userNotificationsEnabled": "اعلان‌های کاربر",
"userNotificationsEnabledDesc": "ارسال اعلان به کاربران درباره پاسخ‌های مدیر"
"userNotificationsEnabledDesc": "ارسال اعلان به کاربران درباره پاسخ‌های مدیر",
"replyFailed": "ارسال پاسخ ناموفق بود",
"validation": {
"checkIntervalRange": "بازه بررسی باید بین ۱ تا ۱۴۴۰ دقیقه باشد",
"reminderCooldownRange": "زمان تأخیر یادآوری باید بین ۰ تا ۱۴۴۰ دقیقه باشد",
"slaMinutesRange": "SLA باید بین ۱ تا ۱۰۰۸۰ دقیقه باشد"
}
},
"tariffs": {
"title": "مدیریت تعرفه‌ها",
@@ -2111,7 +2252,8 @@
"promoGroupsShort": "گروه",
"noPromoGroups": "هیچ گروه تبلیغاتی نیست",
"cancelButton": "لغو",
"saveButton": "ذخیره"
"saveButton": "ذخیره",
"notFound": "روش پرداخت یافت نشد"
},
"campaigns": {
"title": "کمپین‌های تبلیغاتی",
@@ -2139,7 +2281,8 @@
"deactivate": "غیرفعال کردن",
"activate": "فعال کردن",
"edit": "ویرایش",
"delete": "حذف"
"delete": "حذف",
"registrations": "ثبت‌نام‌ها"
},
"modal": {
"editTitle": "ویرایش کمپین",
@@ -2207,7 +2350,9 @@
"totalSpending": "هزینه اشتراک",
"periodComparison": "مقایسه دوره‌ها",
"vsLastWeek": "نسبت به هفته قبل",
"topRegistrations": "بالاترین ثبت‌نام‌ها"
"topRegistrations": "بالاترین ثبت‌نام‌ها",
"subscriptionsIssued": "اشتراک‌های صادر شده",
"tariffsIssued": "تعرفه‌های صادر شده"
},
"users": {
"title": "کاربران کمپین",
@@ -2231,7 +2376,11 @@
"delete": "حذف"
},
"loadError": "بارگذاری کمپین ناموفق بود",
"updateError": "ذخیره تغییرات ناموفق بود"
"updateError": "ذخیره تغییرات ناموفق بود",
"validation": {
"nameRequired": "نام الزامی است"
},
"loadMore": "بارگذاری بیشتر"
},
"withdrawals": {
"title": "برداشت‌ها",
@@ -2338,7 +2487,30 @@
"description": "رد درخواست شراکت از {{name}}",
"commentLabel": "نظر (اختیاری)",
"commentPlaceholder": "دلیل رد..."
}
},
"settings": "تنظیمات",
"settingsFields": {
"cooldownDays": "فاصله بین برداشت‌ها (روز)",
"cooldownDaysDesc": "چند روز باید بین درخواست‌های برداشت بگذرد",
"minAmount": "حداقل مبلغ برداشت (کوپک)",
"minAmountDesc": "حداقل مبلغ برای درخواست برداشت (۱۰۰ کوپک = ۱ ₽)",
"partnerVisible": "بخش همکاران در کابین قابل مشاهده باشد",
"partnerVisibleDesc": "نمایش/مخفی کردن بخش‌های درخواست همکاری و برداشت برای کاربران",
"programEnabled": "برنامه معرفی فعال است",
"programEnabledDesc": "تمام عملکرد ارجاع را فعال می‌کند",
"requisitesText": "متن اطلاعات حساب",
"requisitesTextDesc": "در فرم درخواست همکاری به کاربر نمایش داده می‌شود",
"requisitesTextPlaceholder": "اطلاعات حساب خود را وارد کنید...",
"withdrawalEnabled": "برداشت مجاز است",
"withdrawalEnabledDesc": "به کاربران اجازه می‌دهد درخواست برداشت بدهند"
},
"settingsLoadError": "بارگذاری تنظیمات همکاری ناموفق بود",
"settingsSection": {
"referralProgram": "برنامه معرفی",
"withdrawalSettings": "تنظیمات برداشت"
},
"settingsSubtitle": "تنظیمات برنامه معرفی و برداشت همکاران",
"settingsUpdateError": "ذخیره تنظیمات همکاری ناموفق بود"
},
"partnerDetail": {
"title": "جزئیات شریک",
@@ -2379,7 +2551,10 @@
"createTitle": "ایجاد کمپین",
"createSubtitle": "کمپین به‌طور خودکار به شریک اختصاص می‌یابد",
"autoAssignNote": "کمپین به‌طور خودکار به شریک {{name}} اختصاص می‌یابد",
"createAndAssign": "ایجاد و اختصاص"
"createAndAssign": "ایجاد و اختصاص",
"earnings": "درآمد",
"referrals": "معرفی‌شده‌ها",
"registrations": "ثبت‌نام‌ها"
},
"dangerZone": {
"title": "منطقه خطر",
@@ -2452,7 +2627,10 @@
"firstPurchaseOnly": "فقط برای اولین خرید",
"cancel": "لغو",
"saving": "در حال ذخیره...",
"save": "ذخیره"
"save": "ذخیره",
"defaultTrialTariff": "تعرفه پیش‌فرض آزمایشی",
"selectTariff": "تعرفه را انتخاب کنید",
"tariff": "تعرفه"
},
"stats": {
"title": "آمار کد تخفیف",
@@ -2481,7 +2659,8 @@
"totalPromocodes": "کل کدهای تخفیف",
"activeCount": "فعال",
"usagesCount": "استفاده‌ها",
"exhausted": "تمام شده"
"exhausted": "تمام شده",
"hoursValue": "{{count}} ساعت"
},
"actions": {
"stats": "آمار",
@@ -2736,7 +2915,9 @@
"expired": "منقضی شده",
"daysLeft": "روز باقیمانده",
"deviceLimitUpdated": "محدودیت دستگاه به‌روز شد",
"invalidDays": "لطفاً تعداد روز معتبر وارد کنید (بیشتر از ۰)"
"invalidDays": "لطفاً تعداد روز معتبر وارد کنید (بیشتر از ۰)",
"backToList": "بازگشت به فهرست اشتراک‌ها",
"createNew": "ایجاد جدید"
},
"balance": {
"current": "موجودی فعلی",
@@ -2819,6 +3000,26 @@
"searchPlaceholder": "جستجو بر اساس نام، ایمیل یا شناسه تلگرام...",
"alreadyReferred": "قبلاً معرفی شده",
"noUsersFound": "کاربری یافت نشد"
},
"actions": {
"areYouSure": "آیا مطمئنید می‌خواهید ادامه دهید؟",
"title": "عملیات"
},
"noVpnData": "داده‌ای از VPN وجود ندارد"
},
"notFound": "کاربر یافت نشد",
"purchaseCount": "تعداد خرید: {{count}}",
"userActions": {
"delete": "حذف کاربر",
"disable": "غیرفعال‌سازی",
"error": "انجام عملیات ناموفق بود",
"resetSubscription": "بازنشانی اشتراک",
"resetTrial": "بازنشانی دوره آزمایشی",
"success": {
"delete": "کاربر حذف شد",
"disable": "کاربر غیرفعال شد",
"resetSubscription": "اشتراک بازنشانی شد",
"resetTrial": "دوره آزمایشی بازنشانی شد"
}
}
},
@@ -2828,7 +3029,8 @@
"sendButton": "ارسال",
"tabs": {
"templates_other": "قالب‌ها ({{count}})",
"logs": "گزارش‌ها"
"logs": "گزارش‌ها",
"templates": "قالب‌ها"
},
"noData": {
"templates": "قالبی وجود ندارد",
@@ -2858,7 +3060,9 @@
"activeDiscountHours": "اعتبار تخفیف (ساعت)",
"discountDurationHint": "مدت زمان اعتبار تخفیف پس از فعال‌سازی",
"templateActive": "قالب فعال",
"saving": "در حال ذخیره..."
"saving": "در حال ذخیره...",
"noServers": "هیچ سروری وجود ندارد",
"testSquads": "تیم‌های آزمایشی"
},
"send": {
"title": "ارسال پیشنهاد تبلیغاتی",
@@ -2881,7 +3085,9 @@
"offersCreated_other": "پیشنهادات ایجاد شده: {{count}}",
"notificationsSent_other": "اعلان‌های ارسال شده: {{count}}",
"notificationsFailed": "(ناموفق: {{count}})",
"sendError": "ارسال پیشنهاد ناموفق بود"
"sendError": "ارسال پیشنهاد ناموفق بود",
"notificationsSent": "اعلان‌های ارسال شده",
"offersCreated": "پیشنهادهای ایجاد شده"
},
"notFound": "قالب یافت نشد",
"noActiveTemplates": "قالب فعالی وجود ندارد",
@@ -2970,7 +3176,8 @@
"offline": "آفلاین",
"disabled": "غیرفعال",
"users": "کاربران"
}
},
"usersOnlineCount": "{{count}} آنلاین"
},
"overview": {
"bandwidth": "پهنای باند لحظه‌ای",
@@ -3021,7 +3228,9 @@
"localSettings": "تنظیمات محلی",
"trialEligible": "واجد شرایط آزمایشی",
"price": "قیمت",
"users": "کاربران"
"users": "کاربران",
"inboundsCount": "{{count}} ورودی",
"membersCount": "{{count}} عضو"
},
"sync": {
"autoSync": "همگام‌سازی خودکار",
@@ -3146,7 +3355,8 @@
"selectedPermissions_other": "{{count}} مجوز انتخاب شده",
"cancel": "لغو",
"saving": "در حال ذخیره...",
"save": "ذخیره"
"save": "ذخیره",
"selectedPermissions": "مجوزهای انتخاب‌شده"
},
"presets": {
"moderator": "مدیر محتوا",
@@ -3166,7 +3376,9 @@
"updateFailed": "به‌روزرسانی نقش ناموفق بود",
"nameRequired": "نام نقش الزامی است",
"deleteFailed": "حذف نقش ناموفق بود"
}
},
"permissionsCount": "{{count}} مجوز",
"usersCount": "{{count}} کاربر"
},
"roleAssign": {
"title": "تخصیص نقش",
@@ -3218,7 +3430,8 @@
"roleRequired": "لطفاً یک نقش انتخاب کنید",
"assignFailed": "تخصیص نقش ناموفق بود",
"revokeFailed": "لغو نقش ناموفق بود"
}
},
"totalAssignments": "مجموع انتساب‌ها: {{count}}"
},
"policies": {
"title": "سیاست‌های دسترسی",
@@ -3285,7 +3498,8 @@
"day3": "چهارشنبه",
"day4": "پنجشنبه",
"day5": "جمعه",
"day6": "شنبه"
"day6": "شنبه",
"ipCount": "تعداد آی‌پی"
},
"confirm": {
"title": "حذف سیاست؟",
@@ -3367,7 +3581,10 @@
"justNow": "همین الان",
"minutesAgo_other": "{{count}} دقیقه پیش",
"hoursAgo_other": "{{count}} ساعت پیش",
"daysAgo_other": "{{count}} روز پیش"
"daysAgo_other": "{{count}} روز پیش",
"daysAgo": "{{count}} روز پیش",
"hoursAgo": "{{count}} ساعت پیش",
"minutesAgo": "{{count}} دقیقه پیش"
},
"pagination": {
"pageSize": "در هر صفحه:",
@@ -3380,7 +3597,8 @@
"errors": {
"loadFailed": "بارگذاری گزارش بازرسی ناموفق بود",
"retry": "تلاش مجدد"
}
},
"totalEntries": "مجموع موارد: {{count}}"
},
"landings": {
"title": "صفحات فرود",
@@ -3474,7 +3692,8 @@
"funnel": "قیف",
"loadError": "بارگذاری آمار ناموفق بود",
"noPurchases": "خریدی وجود ندارد",
"paid": "پرداخت شده"
"paid": "پرداخت شده",
"dailyPurchases": "خریدهای روزانه"
},
"purchases": {
"title": "خریدها",
@@ -3500,7 +3719,16 @@
"page": "صفحه {{current}} از {{total}}",
"prev": "قبلی",
"next": "بعدی"
}
},
"methodCurrency": "ارز",
"methodDescPlaceholder": "توضیح کوتاه برای کاربر",
"methodDescription": "توضیحات روش",
"methodDisplayName": "نام نمایشی",
"methodIconUrl": "آدرس نماد",
"methodMaxAmount": "حداکثر مبلغ",
"methodMinAmount": "حداقل مبلغ",
"methodReturnUrl": "آدرس بازگشت",
"stickyPayButton": "دکمه پرداخت ثابت"
},
"infoPages": {
"title": "صفحات اطلاعات",
@@ -3597,7 +3825,9 @@
},
"deleteSubscription": {
"warning": "اشتراک‌های انتخاب شده برای همیشه از ربات و پنل RemnaWave حذف خواهند شد!",
"hint": "کاربران دسترسی VPN اشتراک‌های حذف شده را از دست خواهند داد. این عملیات قابل بازگشت نیست."
"hint": "کاربران دسترسی VPN اشتراک‌های حذف شده را از دست خواهند داد. این عملیات قابل بازگشت نیست.",
"activePaidWarning": "{{count}} از {{total}} اشتراک انتخاب‌شده اشتراک‌های فعال پرداختی هستند",
"forceDeleteConfirm": "حذف اشتراک‌های فعال پرداختی را تأیید می‌کنم"
},
"deleteUser": {
"warning": "کاربران انتخاب شده برای همیشه از ربات حذف خواهند شد! تمام اشتراک‌ها، موجودی و داده‌های آن‌ها از بین خواهد رفت!",
@@ -3718,7 +3948,8 @@
"enable": "فعال",
"disable": "غیرفعال",
"hide": "پنهان کردن ({{count}})",
"showMore_other": "نمایش {{count}} گره بیشتر"
"showMore_other": "نمایش {{count}} گره بیشتر",
"showMore": "نمایش بیشتر"
},
"revenue": {
"title": "درآمد",
@@ -3782,6 +4013,16 @@
"uptime": "آپتایم",
"users": "کاربران",
"activeSubs": "اشتراک‌ها"
},
"tariffs": {
"activeSubscriptions": "اشتراک‌های فعال",
"purchasedMonth": "فروش ماه",
"purchasedToday": "فروش امروز",
"purchasedWeek": "فروش هفته",
"subtitle": "آمار به تفکیک تعرفه",
"tariffName": "نام تعرفه",
"title": "آمار تعرفه‌ها",
"trialSubscriptions": "اشتراک‌های آزمایشی"
}
},
"profile": {
@@ -3879,7 +4120,8 @@
"yandex": "یاندکس",
"discord": "دیسکورد",
"vk": "VK"
}
},
"backToAccounts": "بازگشت به فهرست حساب‌ها"
}
},
"theme": {
@@ -4030,7 +4272,8 @@
"warning": "کد تخفیف لغو شده قابل استفاده مجدد نیست. تخفیف بلافاصله متوقف می‌شود.",
"confirm": "لغو تخفیف",
"deactivating": "در حال لغو...",
"error": "لغو کد تخفیف ناموفق بود. لطفاً بعداً دوباره امتحان کنید."
"error": "لغو کد تخفیف ناموفق بود. لطفاً بعداً دوباره امتحان کنید.",
"success": "پیشنهاد غیرفعال شد"
}
},
"telegramRedirect": {
@@ -4318,6 +4561,12 @@
"d456": "۱ سال و ۳ ماه",
"nDays": "{{count}} روز",
"nMonths": "{{count}} ماه"
},
"discount": {
"days": "روز",
"hours": "ساعت",
"minutes": "دقیقه",
"seconds": "ثانیه"
}
},
"gift": {
@@ -4376,7 +4625,43 @@
},
"warning": {
"telegram_unresolvable": "نام کاربری تلگرام قابل تأیید نبود. ممکن است گیرنده اعلان هدیه را دریافت نکند."
}
},
"activateButton": "فعال‌سازی",
"activateCodePlaceholder": "کد هدیه را وارد کنید",
"activatedBy": "توسط {{name}} فعال شد",
"activateDescription": "برای فعال‌سازی اشتراک، کد هدیه دریافتی را وارد کنید",
"activatedGiftsTitle": "هدایای فعال‌شده",
"activateError": "فعال‌سازی هدیه ناموفق بود",
"activateSelfError": "نمی‌توانید هدیه خودتان را فعال کنید",
"activateSuccess": "هدیه فعال شد!",
"activateSuccessDesc": "اشتراک به حساب شما افزوده شد",
"activateTitle": "فعال‌سازی هدیه",
"activeGiftsTitle": "هدایای فعال",
"codeLabel": "کد هدیه",
"codeReadyTitle": "کد هدیه شما آماده است",
"copyMessage": "کپی پیام",
"daysShort": "روز",
"deviceCount": "تعداد دستگاه‌ها",
"devicesShort": "دستگاه",
"gbShort": "گیگابایت",
"myGiftsEmpty": "هنوز هدیه‌ای ندارید",
"myGiftsEmptyDesc": "هدایایی که ارسال یا دریافت می‌کنید اینجا نمایش داده می‌شوند",
"pageTitle": "هدایا",
"receivedGiftsTitle": "هدایای دریافت‌شده",
"selectPeriod": "دوره را انتخاب کنید",
"selectTariff": "تعرفه را انتخاب کنید",
"sentTo": "به {{name}} ارسال شد",
"shareGift": "به اشتراک گذاشتن هدیه",
"shareModalActivateVia": "از طریق فعال‌سازی",
"shareModalActivateViaCabinet": "از طریق کابین",
"shareText": "برای شما هدیه‌ای از Bedolaga VPN دارم: {{code}}",
"shareToastCopied": "لینک کپی شد",
"statusActivated": "فعال شده",
"statusAvailable": "قابل فعال‌سازی",
"tabActivate": "فعال‌سازی",
"tabBuy": "خرید",
"tabMyGifts": "هدایای من",
"unlimitedTraffic": "ترافیک نامحدود"
},
"news": {
"title": "اخبار و به‌روزرسانی‌ها",
@@ -4437,5 +4722,12 @@
"linkUrlPrompt": "آدرس پیوند:"
}
}
},
"subscriptions": {
"buy": "خرید اشتراک",
"buyAnother": "خرید اشتراک دیگر",
"empty": "هنوز اشتراکی ندارید",
"emptyDesc": "برای شروع تعرفه‌ای انتخاب کنید",
"title": "اشتراک‌های من"
}
}