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",