fix(i18n): починка плейсхолдеров и переводов в zh/fa/en локалях кабинета

Аудит локалей кабинета с русским в качестве эталона.

Битые {{плейсхолдеры}} в zh/fa (рендерились как литеральные скобки,
теряли значение или дублировали то, что и так выводится в JSX):
- gift.sentTo / gift.activatedBy: неверное имя переменной
  ({{name}} → {{recipient}} / {{username}})
- dashboard.devicesConnectedUnlimited: {{count}} → {{used}} (+ «без лимита»)
- dashboard.maxUsage, gift.deviceCount, gift.activateSuccessDesc: потерянные
  значения возвращены
- dashboard.expired.activeUntil, subscription.trialInfo.remaining: убран
  {{date}}/{{count}} — значение выводится отдельным элементом
- trialInfo.description, trialOffer.freeDesc/paidDesc, gift.shareText:
  переписаны без {{days}}/{{price}}/{{code}}, которые код не передаёт
- wheel.payWithStars: одинарные {stars} (i18next их не подставляет) убраны

Мисперводы zh/fa (разошлись по смыслу с ru/en):
- subscription.cta.*Hint, expiredBanner.selectTariff, trialUpgrade.description,
  reduceDevicesDescription, menuEditor.customLabelsHint, myGiftsEmptyDesc,
  partners.settingsFields.*, remnawave.overview.bandwidth, shareModalActivateVia

fa admin.pinnedMessages: 40 строк были на английском → переведены на фарси.
zh common.all: 'All' → '全部'.
en admin.broadcasts.subtitle: устаревшее «History and management» →
соответствует ru «Массовая отправка сообщений пользователям».

Плейсхолдеры и синхронность en/ru проверены (locales.test.ts).
This commit is contained in:
kewldan
2026-07-26 02:09:24 +03:00
parent 51d0f0431a
commit fb1f5cf3a7
3 changed files with 94 additions and 94 deletions

View File

@@ -276,7 +276,7 @@
"traffic": "ترافیک",
"devices": "دستگاه‌ها",
"expiredDate": "منقضی شده",
"activeUntil": "منقضی شده — تا {{date}}"
"activeUntil": "فعال تا"
},
"deviceLimitReached": "برای افزودن دستگاه جدید، دستگاه‌های فعلی را قطع کنید",
"suspended": {
@@ -287,9 +287,9 @@
"showAll": "نمایش همه",
"subscriptions": "اشتراک‌ها",
"connectDevice": "اتصال دستگاه",
"devicesConnectedUnlimited": "{{count}} دستگاه متصل",
"devicesConnectedUnlimited": "{{used}} دستگاه متصل · نامحدود",
"devicesOfMax": "{{used}} از {{max}}",
"maxUsage": "حداکثر",
"maxUsage": "حداکثر {{amount}}",
"remaining": "باقی‌مانده",
"stats": {
"balance": "موجودی",
@@ -298,9 +298,9 @@
"tariff": "تعرفه",
"trafficUsageTitle": "مصرف ترافیک",
"trialOffer": {
"freeDesc": "{{days}} روز رایگان آزمایش کنید بدون پرداخت",
"freeDesc": "وی‌پی‌ان ما را رایگان امتحان کنید: بدون هیچ تعهدی",
"freeTitle": "دوره آزمایشی رایگان",
"paidDesc": "{{days}} روز آزمایشی فقط با {{price}}",
"paidDesc": "با یک اشتراک آزمایشی شروع کنید",
"paidTitle": "دوره آزمایشی پرداختی"
},
"unlimited": "نامحدود",
@@ -458,7 +458,7 @@
"newDeviceLimit": "محدودیت جدید دستگاه",
"reduce": "کاهش",
"reduceDevices": "کاهش تعداد دستگاه‌ها",
"reduceDevicesDescription": حدودیت دستگاه‌های خود را تنظیم کنید. در صورت لزوم ابتدا دستگاه‌های اضافه را قطع کنید",
"reduceDevicesDescription": ی‌توانید تعداد دستگاه‌ها را تا حداقل مجاز در تعرفه کاهش دهید",
"reduceDevicesTitle": "کاهش تعداد دستگاه‌ها",
"reduceUnavailable": "در حال حاضر کاهش تعداد دستگاه‌ها امکان‌پذیر نیست",
"reducing": "در حال کاهش…"
@@ -604,9 +604,9 @@
"confirmDelete": "اشتراک حذف شود؟",
"cta": {
"renewHint": "اشتراک منقضی شده — برای ادامه استفاده تمدید کنید",
"activeHint": "اشتراک فعال است — می‌توانید دستگاه‌ها را متصل کرده و از VPN استفاده کنید",
"expiredHint": "اشتراک منقضی شده — برای ادامه استفاده تمدید کنید",
"trialHint": "شما در دوره آزمایشی هستید — برای دسترسی به همه امکانات به تعرفه پرداختی ارتقا دهید"
"activeHint": "تمدید و تغییر تعرفه",
"expiredHint": "یک تعرفه انتخاب و پرداخت کنید",
"trialHint": "ترافیک و دستگاه بیشتر"
},
"dailyAutoCharge": "برداشت خودکار روزانه",
"defaultName": "اشتراک",
@@ -626,16 +626,16 @@
"statusTrial": "آزمایشی",
"daysShort": "روز",
"expiredBanner": {
"selectTariff": "تعرفه را انتخاب کنید",
"selectTariff": "اشتراک شما منقضی شده است. برای بازیابی دسترسی به VPN، یک تعرفه را از پایین انتخاب کنید.",
"title": "اشتراک منقضی شده است"
},
"trialInfo": {
"description": "{{days}} روز سرویس ما را رایگان امتحان کنید",
"remaining": "{{count}} روز باقی‌مانده",
"description": "شما در حال استفاده از نسخهٔ آزمایشی سرویس هستید. برای دسترسی کامل، یک تعرفه را در پایین انتخاب کنید.",
"remaining": "باقی‌مانده",
"title": "دوره آزمایشی"
},
"trialUpgrade": {
"description": "برای دسترسی به همه امکانات و ادامه استفاده به اشتراک پرداختی ارتقا دهید",
"description": "دوره آزمایشی شما به‌زودی به پایان می‌رسد. برای ادامه استفاده از VPN بدون محدودیت، یک تعرفه مناسب انتخاب کنید.",
"title": "ارتقای اشتراک"
}
},
@@ -1008,7 +1008,7 @@
"noSubscription": "برای چرخاندن گردونه نیاز به اشتراک فعال دارید. ابتدا اشتراک خود را فعال کنید.",
"selectSubscription": "ابتدا یک اشتراک انتخاب کنید"
},
"payWithStars": "پرداخت {stars} Stars",
"payWithStars": "پرداخت Stars",
"processingPayment": "در حال پردازش...",
"starsPaymentSuccess": "پرداخت موفق! نتیجه به تلگرام ارسال شد.",
"starsPaymentFailed": "پرداخت ناموفق. دوباره تلاش کنید.",
@@ -1564,7 +1564,7 @@
},
"broadcasts": {
"title": "نشریات",
"subtitle": "تاریخچه و مدیریت",
"subtitle": "ارسال گروهی پیام به کاربران",
"create": "ایجاد پیام",
"empty": "هیچ نشریه‌ای نیست",
"selectFilter": "انتخاب مخاطبین",
@@ -1652,46 +1652,46 @@
"telegramSection": "ارسال انبوه تلگرام"
},
"pinnedMessages": {
"title": "Pinned Messages",
"subtitle": "Manage pinned messages for users",
"create": "Create",
"empty": "No pinned messages",
"content": "Message text",
"contentPlaceholder": "Enter pinned message text...",
"noContent": "No text",
"media": "Media file",
"addMedia": "Add media",
"uploading": "Uploading...",
"settings": "Settings",
"sendBeforeMenu": "Send before menu",
"sendOnEveryStart": "Send on every start",
"broadcast": "Broadcast",
"broadcastOnCreate": "Broadcast on create",
"broadcastConfirm": "Broadcast pinned message to all active users?",
"broadcastToAll": "Broadcast to all",
"activate": "Activate",
"deactivate": "Deactivate",
"unpin": "Unpin",
"unpinAll": "Unpin for everyone",
"unpinConfirm": "Unpin message for all users?",
"delete": "Delete",
"deleteConfirm": "Delete this pinned message?",
"active": "Active",
"inactive": "Inactive",
"prev": "Previous",
"next": "Next",
"createSuccess": "Pinned message created",
"updateSuccess": "Message updated",
"deleteSuccess": "Message deleted",
"activateSuccess": "Message activated",
"deactivateSuccess": "Message deactivated",
"broadcastSuccess": "Broadcast completed",
"unpinSuccess": "Messages unpinned",
"sentCount": "Sent",
"failedCount": "Failed",
"unpinnedCount": "Unpinned",
"editMessage": "Edit",
"cantDeleteActive": "Cannot delete active message"
"title": "پیام‌های سنجاق‌شده",
"subtitle": "مدیریت پیام‌های سنجاق‌شده برای کاربران",
"create": "ایجاد",
"empty": "هیچ پیام سنجاق‌شده‌ای وجود ندارد",
"content": "متن پیام",
"contentPlaceholder": "متن پیام سنجاق‌شده را وارد کنید...",
"noContent": "بدون متن",
"media": "فایل رسانه",
"addMedia": "افزودن رسانه",
"uploading": "در حال بارگذاری...",
"settings": "تنظیمات",
"sendBeforeMenu": "ارسال قبل از منو",
"sendOnEveryStart": "ارسال در هر بار شروع",
"broadcast": "ارسال همگانی",
"broadcastOnCreate": "ارسال همگانی هنگام ایجاد",
"broadcastConfirm": "پیام سنجاق‌شده برای همه کاربران فعال ارسال شود؟",
"broadcastToAll": "ارسال به همه",
"activate": "فعال‌سازی",
"deactivate": "غیرفعال‌سازی",
"unpin": "برداشتن سنجاق",
"unpinAll": "برداشتن سنجاق برای همه",
"unpinConfirm": "سنجاق پیام برای همه کاربران برداشته شود؟",
"delete": "حذف",
"deleteConfirm": "این پیام سنجاق‌شده حذف شود؟",
"active": "فعال",
"inactive": "غیرفعال",
"prev": "قبلی",
"next": "بعدی",
"createSuccess": "پیام سنجاق‌شده ایجاد شد",
"updateSuccess": "پیام به‌روزرسانی شد",
"deleteSuccess": "پیام حذف شد",
"activateSuccess": "پیام فعال شد",
"deactivateSuccess": "پیام غیرفعال شد",
"broadcastSuccess": "ارسال همگانی تکمیل شد",
"unpinSuccess": "سنجاق پیام‌ها برداشته شد",
"sentCount": "ارسال‌شده",
"failedCount": "ناموفق",
"unpinnedCount": "سنجاق‌برداشته",
"editMessage": "ویرایش",
"cantDeleteActive": "نمی‌توان پیام فعال را حذف کرد"
},
"channelSubscriptions": {
"title": "کانال‌های اجباری",
@@ -2005,7 +2005,7 @@
"builtinButtons": "بخش‌های داخلی",
"resetConfirm": "منو به تنظیمات پیش‌فرض بازنشانی شود؟ تمام تغییرات از بین می‌رود.",
"buttonTextPlaceholder": "متن دکمه",
"customLabelsHint": "متن دکمه برای هر زبان ربات",
"customLabelsHint": "خالی = عنوان پیش‌فرض",
"moveUp": "انتقال به بالا",
"moveDown": "انتقال به پایین",
"openIn": "باز کردن در",
@@ -2625,10 +2625,10 @@
"programEnabled": "برنامه معرفی فعال است",
"programEnabledDesc": "تمام عملکرد ارجاع را فعال می‌کند",
"requisitesText": "متن اطلاعات حساب",
"requisitesTextDesc": "در فرم درخواست همکاری به کاربر نمایش داده می‌شود",
"requisitesTextDesc": "متن سفارشی برای توضیح به کاربران که هنگام برداشت چه اطلاعات پرداختی را وارد کنند",
"requisitesTextPlaceholder": "اطلاعات حساب خود را وارد کنید...",
"withdrawalEnabled": "برداشت مجاز است",
"withdrawalEnabledDesc": "به کاربران اجازه می‌دهد درخواست برداشت بدهند"
"withdrawalEnabledDesc": "اجازه دادن به همکاران برای درخواست برداشت موجودی معرفی"
},
"settingsLoadError": "بارگذاری تنظیمات همکاری ناموفق بود",
"settingsSection": {
@@ -3398,7 +3398,7 @@
"usersOnlineCount": "{{count}} آنلاین"
},
"overview": {
"bandwidth": "پهنای باند لحظه‌ای",
"bandwidth": "ترافیک ورودی‌ها",
"connections": "اتصالات",
"cpu": "هسته‌های CPU",
"download": "دانلود",
@@ -4940,33 +4940,33 @@
},
"activateButton": "فعال‌سازی",
"activateCodePlaceholder": "کد هدیه را وارد کنید",
"activatedBy": "توسط {{name}} فعال شد",
"activatedBy": "توسط {{username}} فعال شد",
"activateDescription": "برای فعال‌سازی اشتراک، کد هدیه دریافتی را وارد کنید",
"activatedGiftsTitle": "هدایای فعال‌شده",
"activateError": "فعال‌سازی هدیه ناموفق بود",
"activateSelfError": "نمی‌توانید هدیه خودتان را فعال کنید",
"activateSuccess": "هدیه فعال شد!",
"activateSuccessDesc": "اشتراک به حساب شما افزوده شد",
"activateSuccessDesc": "{{tariff}}: {{days}} روز به اشتراک شما اضافه شد",
"activateTitle": "فعال‌سازی هدیه",
"activeGiftsTitle": "هدایای فعال",
"codeLabel": "کد هدیه",
"codeReadyTitle": "کد هدیه شما آماده است",
"copyMessage": "کپی پیام",
"daysShort": "روز",
"deviceCount": "تعداد دستگاهها",
"deviceCount": "{{count}} دستگاه",
"devicesShort": "دستگاه",
"gbShort": "گیگابایت",
"myGiftsEmpty": "هنوز هدیه‌ای ندارید",
"myGiftsEmptyDesc": "هدایایی که ارسال یا دریافت می‌کنید اینجا نمایش داده می‌شوند",
"myGiftsEmptyDesc": "برای یک دوست هدیه بخرید یا کد دریافتی را فعال کنید",
"pageTitle": "هدایا",
"receivedGiftsTitle": "هدایای دریافت‌شده",
"selectPeriod": "دوره را انتخاب کنید",
"selectTariff": "تعرفه را انتخاب کنید",
"sentTo": "به {{name}} ارسال شد",
"sentTo": "به {{recipient}} ارسال شد",
"shareGift": "به اشتراک گذاشتن هدیه",
"shareModalActivateVia": "از طریق فعال‌سازی",
"shareModalActivateVia": "فعال‌سازی از طریق ربات:",
"shareModalActivateViaCabinet": "از طریق کابین",
"shareText": "برای شما هدیه‌ای از Bedolaga VPN دارم: {{code}}",
"shareText": "برای تو یک هدیهٔ Bedolaga VPN دارم، از همین‌جا فعالش کن:",
"shareToastCopied": "لینک کپی شد",
"statusActivated": "فعال شده",
"statusAvailable": "قابل فعال‌سازی",