Add proper plural forms for all localized strings

- Russian: add _one/_few/_many forms for proper declension
- English: add _one/_other forms for singular/plural
- Chinese: add _other form (no plural changes in Chinese)
- Farsi: add _other form (no plural changes in Farsi)

Fixed plural forms for:
- purchaseCount, registrations, subscriptions, tariffs
- device limits, members, hours, templates
- offers, notifications, promocodes, groups
- showMore and other count-based strings
This commit is contained in:
c0mrade
2026-02-03 23:15:37 +03:00
parent d826277247
commit b24f5083d0
4 changed files with 122 additions and 64 deletions

View File

@@ -413,7 +413,8 @@
"additionalOptions": {
"title": "Additional options",
"buyDevices": "Buy more devices",
"currentDeviceLimit": "Current limit: {{count}} devices",
"currentDeviceLimit_one": "Current limit: {{count}} device",
"currentDeviceLimit_other": "Current limit: {{count}} devices",
"maxDevices": "max {{count}}",
"devicesUnavailable": "Device purchase is not available",
"devicesUnit": "devices",
@@ -421,14 +422,18 @@
"reduceDevices": "Reduce devices",
"reduceDevicesTitle": "Reduce device limit",
"reduceDevicesDescription": "You can reduce the number of devices to the tariff minimum",
"minDeviceLimit": "Tariff minimum: {{count}} devices",
"connectedDevices": "Connected devices: {{count}}",
"disconnectDevicesFirst": "Disconnect devices first to reduce the limit below {{count}}",
"minDeviceLimit_one": "Tariff minimum: {{count}} device",
"minDeviceLimit_other": "Tariff minimum: {{count}} devices",
"connectedDevices_one": "Connected devices: {{count}}",
"connectedDevices_other": "Connected devices: {{count}}",
"disconnectDevicesFirst_one": "Disconnect devices first to reduce the limit below {{count}} device",
"disconnectDevicesFirst_other": "Disconnect devices first to reduce the limit below {{count}} devices",
"reduceUnavailable": "Device reduction is not available",
"alreadyAtMinDeviceLimit": "Already at minimum device limit for your tariff",
"reduce": "Reduce",
"reducing": "Reducing...",
"newDeviceLimit": "New limit: {{count}} devices",
"newDeviceLimit_one": "New limit: {{count}} device",
"newDeviceLimit_other": "New limit: {{count}} devices",
"buyTraffic": "Buy more traffic",
"currentTrafficLimit": "Current limit: {{limit}} GB (used {{used}} GB)",
"buyTrafficTitle": "Buy more traffic",
@@ -1461,7 +1466,8 @@
},
"table": {
"inactive": "Inactive",
"registrations": "{{count}} registrations",
"registrations_one": "{{count}} registration",
"registrations_other": "{{count}} registrations",
"revenue": "{{amount}} revenue",
"conversion": "{{rate}}% conversion",
"statistics": "Statistics",
@@ -1507,8 +1513,10 @@
"paidUsers": "Paid",
"conversion": "Conversion",
"bonusesIssued": "Bonuses issued",
"subscriptionsIssued": "{{count}} subscriptions",
"tariffsIssued": "{{count}} tariffs",
"subscriptionsIssued_one": "{{count}} subscription",
"subscriptionsIssued_other": "{{count}} subscriptions",
"tariffsIssued_one": "{{count}} tariff",
"tariffsIssued_other": "{{count}} tariffs",
"avgRevenuePerUser": "Avg revenue per user",
"avgFirstPayment": "Avg first payment",
"trialSubscriptions": "Trial subscriptions",
@@ -1560,8 +1568,10 @@
"until": "Until",
"discountForHours": "-{{percent}}% for {{hours}}h",
"tabs": {
"promocodes": "Promo codes ({{count}})",
"groups": "Discount groups ({{count}})"
"promocodes_one": "Promo codes ({{count}} code)",
"promocodes_other": "Promo codes ({{count}} codes)",
"groups_one": "Discount groups ({{count}} group)",
"groups_other": "Discount groups ({{count}} groups)"
},
"type": {
"balance": "Balance",
@@ -1619,7 +1629,8 @@
"daysLabel": "Days",
"discountLabel": "Discount",
"validFor": "Valid for",
"hoursValue": "{{count}} hours",
"hoursValue_one": "{{count}} hour",
"hoursValue_other": "{{count}} hours",
"limit": "Limit",
"status": "Status",
"active": "Active",
@@ -1660,7 +1671,8 @@
"default": "Default",
"daysShort": "{{days}} d.",
"autoFrom": "Auto from {{amount}} RUB",
"members": "{{count}} members"
"members_one": "{{count}} member",
"members_other": "{{count}} members"
},
"confirm": {
"deletePromocode": "Delete promo code?",
@@ -1732,7 +1744,8 @@
"search": "Search by ID, name, username...",
"searchEmail": "Search by email...",
"noData": "No users found",
"purchaseCount": "{{count}} purchases",
"purchaseCount_one": "{{count}} purchase",
"purchaseCount_other": "{{count}} purchases",
"noPurchases": "No purchases",
"stats": {
"total": "Total",
@@ -1872,7 +1885,8 @@
"subtitle": "Templates, broadcasts and offer logs",
"sendButton": "Send",
"tabs": {
"templates": "Templates ({{count}})",
"templates_one": "Templates ({{count}} template)",
"templates_other": "Templates ({{count}} templates)",
"logs": "Logs"
},
"noData": {
@@ -1923,9 +1937,12 @@
},
"result": {
"sentTitle": "Sent!",
"offersCreated": "Offers created: {{count}}",
"notificationsSent": "Notifications sent: {{count}}",
"notificationsFailed": "(failed: {{count}})",
"offersCreated_one": "Offer created: {{count}}",
"offersCreated_other": "Offers created: {{count}}",
"notificationsSent_one": "Notification sent: {{count}}",
"notificationsSent_other": "Notifications sent: {{count}}",
"notificationsFailed_one": "(failed: {{count}})",
"notificationsFailed_other": "(failed: {{count}})",
"sendError": "Failed to send offer"
},
"notFound": "Template not found",
@@ -1991,7 +2008,8 @@
"enable": "Enable",
"disable": "Disable",
"hide": "Hide ({{count}})",
"showMore": "Show {{count}} more nodes"
"showMore_one": "Show {{count}} more node",
"showMore_other": "Show {{count}} more nodes"
},
"topReferrers": {
"title": "Top referrers",

View File

@@ -303,7 +303,7 @@
"additionalOptions": {
"title": "گزینه‌های اضافی",
"buyDevices": "خرید دستگاه بیشتر",
"currentDeviceLimit": "محدودیت فعلی: {{count}} دستگاه",
"currentDeviceLimit_other": "محدودیت فعلی: {{count}} دستگاه",
"maxDevices": "حداکثر {{count}}",
"devicesUnavailable": "خرید دستگاه در دسترس نیست",
"devicesUnit": "دستگاه",
@@ -1206,7 +1206,7 @@
},
"table": {
"inactive": "غیرفعال",
"registrations": "{{count}} ثبت‌نام",
"registrations_other": "{{count}} ثبت‌نام",
"revenue": "{{amount}} درآمد",
"conversion": "{{rate}}% تبدیل",
"statistics": "آمار",
@@ -1252,8 +1252,8 @@
"paidUsers": "پرداخت کرده",
"conversion": "نرخ تبدیل",
"bonusesIssued": "پاداش‌های صادر شده",
"subscriptionsIssued": "{{count}} اشتراک",
"tariffsIssued": "{{count}} تعرفه",
"subscriptionsIssued_other": "{{count}} اشتراک",
"tariffsIssued_other": "{{count}} تعرفه",
"avgRevenuePerUser": "میانگین درآمد هر کاربر",
"avgFirstPayment": "میانگین اولین پرداخت",
"trialSubscriptions": "اشتراک‌های آزمایشی",
@@ -1305,8 +1305,8 @@
"until": "تا",
"discountForHours": "-{{percent}}% برای {{hours}} ساعت",
"tabs": {
"promocodes": "کدهای تخفیف ({{count}})",
"groups": "گروه‌های تخفیف ({{count}})"
"promocodes_other": "کدهای تخفیف ({{count}})",
"groups_other": "گروه‌های تخفیف ({{count}})"
},
"type": {
"balance": "موجودی",
@@ -1364,7 +1364,7 @@
"daysLabel": "روزها",
"discountLabel": "تخفیف",
"validFor": "معتبر برای",
"hoursValue": "{{count}} ساعت",
"hoursValue_other": "{{count}} ساعت",
"limit": "محدودیت",
"status": "وضعیت",
"active": "فعال",
@@ -1405,7 +1405,7 @@
"default": "پیش‌فرض",
"daysShort": "{{days}} روز",
"autoFrom": "خودکار از {{amount}} روبل",
"members": "{{count}} عضو"
"members_other": "{{count}} عضو"
},
"confirm": {
"deletePromocode": "کد تخفیف حذف شود؟",
@@ -1477,7 +1477,7 @@
"search": "جستجو بر اساس شناسه، نام، نام کاربری...",
"searchEmail": "جستجو بر اساس ایمیل...",
"noData": "کاربری یافت نشد",
"purchaseCount": "{{count}} خرید",
"purchaseCount_other": "{{count}} خرید",
"noPurchases": "بدون خرید",
"stats": {
"total": "کل",
@@ -1588,7 +1588,7 @@
"subtitle": "قالب‌ها، ارسال گروهی و گزارش پیشنهادات",
"sendButton": "ارسال",
"tabs": {
"templates": "قالب‌ها ({{count}})",
"templates_other": "قالب‌ها ({{count}})",
"logs": "گزارش‌ها"
},
"noData": {
@@ -1639,8 +1639,8 @@
},
"result": {
"sentTitle": "ارسال شد!",
"offersCreated": "پیشنهادات ایجاد شده: {{count}}",
"notificationsSent": "اعلان‌های ارسال شده: {{count}}",
"offersCreated_other": "پیشنهادات ایجاد شده: {{count}}",
"notificationsSent_other": "اعلان‌های ارسال شده: {{count}}",
"notificationsFailed": "(ناموفق: {{count}})",
"sendError": "ارسال پیشنهاد ناموفق بود"
},
@@ -1827,7 +1827,7 @@
"enable": "فعال",
"disable": "غیرفعال",
"hide": "پنهان کردن ({{count}})",
"showMore": "نمایش {{count}} گره بیشتر"
"showMore_other": "نمایش {{count}} گره بیشتر"
},
"revenue": {
"title": "درآمد",

View File

@@ -435,7 +435,9 @@
"additionalOptions": {
"title": "Дополнительные опции",
"buyDevices": "Докупить устройства",
"currentDeviceLimit": "Текущий лимит: {{count}} устройств",
"currentDeviceLimit_one": "Текущий лимит: {{count}} устройство",
"currentDeviceLimit_few": "Текущий лимит: {{count}} устройства",
"currentDeviceLimit_many": "Текущий лимит: {{count}} устройств",
"maxDevices": "максимум {{count}}",
"devicesUnavailable": "Докупка устройств недоступна",
"devicesUnit": "устройств",
@@ -443,14 +445,22 @@
"reduceDevices": "Уменьшить устройства",
"reduceDevicesTitle": "Уменьшить лимит устройств",
"reduceDevicesDescription": "Вы можете уменьшить количество устройств до минимального на тарифе",
"minDeviceLimit": "Минимум на тарифе: {{count}} устройств",
"connectedDevices": "Подключено устройств: {{count}}",
"disconnectDevicesFirst": "Сначала отключите устройства, чтобы уменьшить лимит ниже {{count}}",
"minDeviceLimit_one": "Минимум на тарифе: {{count}} устройство",
"minDeviceLimit_few": "Минимум на тарифе: {{count}} устройства",
"minDeviceLimit_many": "Минимум на тарифе: {{count}} устройств",
"connectedDevices_one": "Подключено устройств: {{count}}",
"connectedDevices_few": "Подключено устройств: {{count}}",
"connectedDevices_many": "Подключено устройств: {{count}}",
"disconnectDevicesFirst_one": "Сначала отключите устройства, чтобы уменьшить лимит ниже {{count}} устройства",
"disconnectDevicesFirst_few": "Сначала отключите устройства, чтобы уменьшить лимит ниже {{count}} устройств",
"disconnectDevicesFirst_many": "Сначала отключите устройства, чтобы уменьшить лимит ниже {{count}} устройств",
"reduceUnavailable": "Уменьшение устройств недоступно",
"alreadyAtMinDeviceLimit": "Уже достигнут минимальный лимит устройств для вашего тарифа",
"reduce": "Уменьшить",
"reducing": "Уменьшение...",
"newDeviceLimit": "Новый лимит: {{count}} устройств",
"newDeviceLimit_one": "Новый лимит: {{count}} устройство",
"newDeviceLimit_few": "Новый лимит: {{count}} устройства",
"newDeviceLimit_many": "Новый лимит: {{count}} устройств",
"buyTraffic": "Докупить трафик",
"currentTrafficLimit": "Текущий лимит: {{limit}} ГБ (использовано {{used}} ГБ)",
"buyTrafficTitle": "Докупить трафик",
@@ -1975,7 +1985,9 @@
},
"table": {
"inactive": "Неактивна",
"registrations": "{{count}} регистраций",
"registrations_one": "{{count}} регистрация",
"registrations_few": "{{count}} регистрации",
"registrations_many": "{{count}} регистраций",
"revenue": "{{amount}} доход",
"conversion": "{{rate}}% конверсия",
"statistics": "Статистика",
@@ -2021,8 +2033,12 @@
"paidUsers": "Оплатили",
"conversion": "Конверсия",
"bonusesIssued": "Бонусы выданы",
"subscriptionsIssued": "{{count}} подписок",
"tariffsIssued": "{{count}} тарифов",
"subscriptionsIssued_one": "{{count}} подписка",
"subscriptionsIssued_few": "{{count}} подписки",
"subscriptionsIssued_many": "{{count}} подписок",
"tariffsIssued_one": "{{count}} тариф",
"tariffsIssued_few": "{{count}} тарифа",
"tariffsIssued_many": "{{count}} тарифов",
"avgRevenuePerUser": "Средний доход с пользователя",
"avgFirstPayment": "Средний первый платёж",
"trialSubscriptions": "Пробных подписок",
@@ -2074,8 +2090,12 @@
"until": "До",
"discountForHours": "-{{percent}}% на {{hours}}ч",
"tabs": {
"promocodes": "Промокоды ({{count}})",
"groups": "Группы скидок ({{count}})"
"promocodes_one": "Промокоды ({{count}} промокод)",
"promocodes_few": "Промокоды ({{count}} промокода)",
"promocodes_many": "Промокоды ({{count}} промокодов)",
"groups_one": "Группы скидок ({{count}} группа)",
"groups_few": "Группы скидок ({{count}} группы)",
"groups_many": "Группы скидок ({{count}} групп)"
},
"type": {
"balance": "Баланс",
@@ -2133,7 +2153,9 @@
"daysLabel": "Дней",
"discountLabel": "Скидка",
"validFor": "Действует",
"hoursValue": "{{count}} часов",
"hoursValue_one": "{{count}} час",
"hoursValue_few": "{{count}} часа",
"hoursValue_many": "{{count}} часов",
"limit": "Лимит",
"status": "Статус",
"active": "Активен",
@@ -2174,7 +2196,9 @@
"default": "По умолчанию",
"daysShort": "{{days}} дн.",
"autoFrom": "Авто от {{amount}} руб.",
"members": "{{count}} участников"
"members_one": "{{count}} участник",
"members_few": "{{count}} участника",
"members_many": "{{count}} участников"
},
"confirm": {
"deletePromocode": "Удалить промокод?",
@@ -2246,7 +2270,9 @@
"search": "Поиск по ID, имени, username...",
"searchEmail": "Поиск по email...",
"noData": "Пользователи не найдены",
"purchaseCount": "{{count}} покупок",
"purchaseCount_one": "{{count}} покупка",
"purchaseCount_few": "{{count}} покупки",
"purchaseCount_many": "{{count}} покупок",
"noPurchases": "Нет покупок",
"stats": {
"total": "Всего",
@@ -2386,7 +2412,9 @@
"subtitle": "Шаблоны, рассылка и логи предложений",
"sendButton": "Отправить",
"tabs": {
"templates": "Шаблоны ({{count}})",
"templates_one": "Шаблоны ({{count}} шаблон)",
"templates_few": "Шаблоны ({{count}} шаблона)",
"templates_many": "Шаблоны ({{count}} шаблонов)",
"logs": "Логи"
},
"noData": {
@@ -2437,9 +2465,15 @@
},
"result": {
"sentTitle": "Отправлено!",
"offersCreated": "Создано предложений: {{count}}",
"notificationsSent": "Уведомлений отправлено: {{count}}",
"notificationsFailed": "(не доставлено: {{count}})",
"offersCreated_one": "Создано предложение: {{count}}",
"offersCreated_few": "Создано предложения: {{count}}",
"offersCreated_many": "Создано предложений: {{count}}",
"notificationsSent_one": "Уведомление отправлено: {{count}}",
"notificationsSent_few": "Уведомления отправлено: {{count}}",
"notificationsSent_many": "Уведомлений отправлено: {{count}}",
"notificationsFailed_one": "(не доставлено: {{count}})",
"notificationsFailed_few": "(не доставлено: {{count}})",
"notificationsFailed_many": "(не доставлено: {{count}})",
"sendError": "Не удалось отправить предложение"
},
"notFound": "Шаблон не найден",
@@ -2521,7 +2555,9 @@
"enable": "Включить",
"disable": "Отключить",
"hide": "Скрыть ({{count}})",
"showMore": "Показать еще {{count}} нод"
"showMore_one": "Показать еще {{count}} ноду",
"showMore_few": "Показать еще {{count}} ноды",
"showMore_many": "Показать еще {{count}} нод"
},
"revenue": {
"title": "Доходы",
@@ -2560,7 +2596,9 @@
},
"topReferrers": {
"title": "Топ рефералов",
"stats": "реф., {{count}} пригл.",
"stats_one": "реф., {{count}} пригл.",
"stats_few": "реф., {{count}} пригл.",
"stats_many": "реф., {{count}} пригл.",
"byEarnings": "По доходу",
"byInvited": "По пригл.",
"invites": "пригл.",
@@ -2573,7 +2611,9 @@
},
"topCampaigns": {
"title": "Топ РК ссылок",
"stats": "камп., {{count}} рег.",
"stats_one": "камп., {{count}} рег.",
"stats_few": "камп., {{count}} рег.",
"stats_many": "камп., {{count}} рег.",
"total": "Всего от РК"
},
"recentPayments": {

View File

@@ -303,7 +303,7 @@
"additionalOptions": {
"title": "附加选项",
"buyDevices": "购买更多设备",
"currentDeviceLimit": "当前限制:{{count}} 台设备",
"currentDeviceLimit_other": "当前限制:{{count}} 台设备",
"maxDevices": "最多 {{count}} 台",
"devicesUnavailable": "设备购买不可用",
"devicesUnit": "台设备",
@@ -1205,7 +1205,7 @@
},
"table": {
"inactive": "未激活",
"registrations": "{{count}} 次注册",
"registrations_other": "{{count}} 次注册",
"revenue": "{{amount}} 收入",
"conversion": "{{rate}}% 转化",
"statistics": "统计",
@@ -1251,8 +1251,8 @@
"paidUsers": "已付费",
"conversion": "转化率",
"bonusesIssued": "已发放奖励",
"subscriptionsIssued": "{{count}} 个订阅",
"tariffsIssued": "{{count}} 个套餐",
"subscriptionsIssued_other": "{{count}} 个订阅",
"tariffsIssued_other": "{{count}} 个套餐",
"avgRevenuePerUser": "每用户平均收入",
"avgFirstPayment": "平均首次付款",
"trialSubscriptions": "试用订阅",
@@ -1304,8 +1304,8 @@
"until": "有效期至",
"discountForHours": "-{{percent}}% {{hours}}小时",
"tabs": {
"promocodes": "促销码 ({{count}})",
"groups": "折扣组 ({{count}})"
"promocodes_other": "促销码 ({{count}})",
"groups_other": "折扣组 ({{count}})"
},
"type": {
"balance": "余额",
@@ -1363,7 +1363,7 @@
"daysLabel": "天数",
"discountLabel": "折扣",
"validFor": "有效期",
"hoursValue": "{{count}} 小时",
"hoursValue_other": "{{count}} 小时",
"limit": "限制",
"status": "状态",
"active": "活跃",
@@ -1404,7 +1404,7 @@
"default": "默认",
"daysShort": "{{days}} 天",
"autoFrom": "自动 从 {{amount}} 卢布",
"members": "{{count}} 名成员"
"members_other": "{{count}} 名成员"
},
"confirm": {
"deletePromocode": "删除促销码?",
@@ -1476,7 +1476,7 @@
"search": "按ID、姓名、用户名搜索...",
"searchEmail": "按邮箱搜索...",
"noData": "未找到用户",
"purchaseCount": "{{count}} 次购买",
"purchaseCount_other": "{{count}} 次购买",
"noPurchases": "无购买记录",
"stats": {
"total": "总计",
@@ -1587,7 +1587,7 @@
"subtitle": "模板、群发和优惠日志",
"sendButton": "发送",
"tabs": {
"templates": "模板 ({{count}})",
"templates_other": "模板 ({{count}})",
"logs": "日志"
},
"noData": {
@@ -1638,8 +1638,8 @@
},
"result": {
"sentTitle": "已发送!",
"offersCreated": "已创建优惠: {{count}}",
"notificationsSent": "已发送通知: {{count}}",
"offersCreated_other": "已创建优惠: {{count}}",
"notificationsSent_other": "已发送通知: {{count}}",
"notificationsFailed": "(失败: {{count}}",
"sendError": "发送优惠失败"
},
@@ -1826,7 +1826,7 @@
"enable": "启用",
"disable": "禁用",
"hide": "隐藏 ({{count}})",
"showMore": "显示更多 {{count}} 个节点"
"showMore_other": "显示更多 {{count}} 个节点"
},
"revenue": {
"title": "收入",