feat: add translations for permission sections and actions

Translate all permission section names (users, tickets, etc.) and
action names (read, edit, delete, etc.) in ru/en/zh/fa locales.
Apply translations in PermissionMatrix, PolicyEdit, and Policies list.
This commit is contained in:
Fringg
2026-02-25 04:33:35 +03:00
parent bc5d832e0d
commit 80bfaca457
7 changed files with 211 additions and 8 deletions

View File

@@ -2571,6 +2571,55 @@
"color": "Color",
"presets": "Permission presets",
"permissions": "Permissions",
"permissionSections": {
"users": "Users",
"tickets": "Tickets",
"stats": "Statistics",
"broadcasts": "Broadcasts",
"tariffs": "Tariffs",
"promocodes": "Promo codes",
"promo_groups": "Promo groups",
"promo_offers": "Promo offers",
"campaigns": "Campaigns",
"partners": "Partners",
"withdrawals": "Withdrawals",
"payments": "Payments",
"payment_methods": "Payment methods",
"servers": "Servers",
"remnawave": "Remnawave",
"traffic": "Traffic",
"settings": "Settings",
"roles": "Roles",
"audit_log": "Audit log",
"channels": "Channels",
"ban_system": "Ban system",
"wheel": "Lucky wheel",
"apps": "Apps",
"email_templates": "Email templates",
"pinned_messages": "Pinned messages",
"updates": "Updates"
},
"permissionActions": {
"read": "Read",
"edit": "Edit",
"create": "Create",
"delete": "Delete",
"block": "Block",
"sync": "Sync",
"reply": "Reply",
"close": "Close",
"settings": "Settings",
"export": "Export",
"send": "Send",
"stats": "Stats",
"approve": "Approve",
"revoke": "Revoke",
"reject": "Reject",
"manage": "Manage",
"ban": "Ban",
"unban": "Unban",
"assign": "Assign"
},
"toggleSection": "Toggle all {{section}} permissions",
"selectedPermissions_one": "{{count}} permission selected",
"selectedPermissions_other": "{{count}} permissions selected",

View File

@@ -2360,6 +2360,55 @@
"color": "رنگ",
"presets": "الگوهای مجوز",
"permissions": "مجوزها",
"permissionSections": {
"users": "کاربران",
"tickets": "تیکت‌ها",
"stats": "آمار",
"broadcasts": "پیام‌های همگانی",
"tariffs": "تعرفه‌ها",
"promocodes": "کدهای تخفیف",
"promo_groups": "گروه‌های تبلیغاتی",
"promo_offers": "پیشنهادات تبلیغاتی",
"campaigns": "کمپین‌ها",
"partners": "شرکا",
"withdrawals": "برداشت‌ها",
"payments": "پرداخت‌ها",
"payment_methods": "روش‌های پرداخت",
"servers": "سرورها",
"remnawave": "Remnawave",
"traffic": "ترافیک",
"settings": "تنظیمات",
"roles": "نقش‌ها",
"audit_log": "گزارش حسابرسی",
"channels": "کانال‌ها",
"ban_system": "سیستم مسدودسازی",
"wheel": "چرخ شانس",
"apps": "برنامه‌ها",
"email_templates": "قالب‌های ایمیل",
"pinned_messages": "پیام‌های سنجاق‌شده",
"updates": "به‌روزرسانی‌ها"
},
"permissionActions": {
"read": "خواندن",
"edit": "ویرایش",
"create": "ایجاد",
"delete": "حذف",
"block": "مسدودسازی",
"sync": "همگام‌سازی",
"reply": "پاسخ",
"close": "بستن",
"settings": "تنظیمات",
"export": "خروجی",
"send": "ارسال",
"stats": "آمار",
"approve": "تأیید",
"revoke": "لغو",
"reject": "رد",
"manage": "مدیریت",
"ban": "مسدود کردن",
"unban": "رفع مسدودیت",
"assign": "اختصاص"
},
"toggleSection": "تغییر وضعیت تمام مجوزهای {{section}}",
"selectedPermissions_other": "{{count}} مجوز انتخاب شده",
"cancel": "لغو",

View File

@@ -3119,6 +3119,55 @@
"color": "Цвет",
"presets": "Шаблоны прав",
"permissions": "Разрешения",
"permissionSections": {
"users": "Пользователи",
"tickets": "Тикеты",
"stats": "Статистика",
"broadcasts": "Рассылки",
"tariffs": "Тарифы",
"promocodes": "Промокоды",
"promo_groups": "Промо-группы",
"promo_offers": "Промо-предложения",
"campaigns": "Кампании",
"partners": "Партнёры",
"withdrawals": "Выводы средств",
"payments": "Платежи",
"payment_methods": "Методы оплаты",
"servers": "Серверы",
"remnawave": "Remnawave",
"traffic": "Трафик",
"settings": "Настройки",
"roles": "Роли",
"audit_log": "Журнал аудита",
"channels": "Каналы",
"ban_system": "Система банов",
"wheel": "Колесо фортуны",
"apps": "Приложения",
"email_templates": "Шаблоны писем",
"pinned_messages": "Закреплённые сообщения",
"updates": "Обновления"
},
"permissionActions": {
"read": "Чтение",
"edit": "Редактирование",
"create": "Создание",
"delete": "Удаление",
"block": "Блокировка",
"sync": "Синхронизация",
"reply": "Ответ",
"close": "Закрытие",
"settings": "Настройки",
"export": "Экспорт",
"send": "Отправка",
"stats": "Статистика",
"approve": "Одобрение",
"revoke": "Отзыв",
"reject": "Отклонение",
"manage": "Управление",
"ban": "Бан",
"unban": "Разбан",
"assign": "Назначение"
},
"toggleSection": "Переключить все права {{section}}",
"selectedPermissions_one": "{{count}} разрешение выбрано",
"selectedPermissions_few": "{{count}} разрешения выбрано",

View File

@@ -2359,6 +2359,55 @@
"color": "颜色",
"presets": "权限预设",
"permissions": "权限",
"permissionSections": {
"users": "用户",
"tickets": "工单",
"stats": "统计",
"broadcasts": "广播",
"tariffs": "套餐",
"promocodes": "促销码",
"promo_groups": "促销组",
"promo_offers": "促销优惠",
"campaigns": "推广活动",
"partners": "合作伙伴",
"withdrawals": "提现",
"payments": "支付",
"payment_methods": "支付方式",
"servers": "服务器",
"remnawave": "Remnawave",
"traffic": "流量",
"settings": "设置",
"roles": "角色",
"audit_log": "审计日志",
"channels": "频道",
"ban_system": "封禁系统",
"wheel": "幸运转盘",
"apps": "应用",
"email_templates": "邮件模板",
"pinned_messages": "置顶消息",
"updates": "更新"
},
"permissionActions": {
"read": "读取",
"edit": "编辑",
"create": "创建",
"delete": "删除",
"block": "封锁",
"sync": "同步",
"reply": "回复",
"close": "关闭",
"settings": "设置",
"export": "导出",
"send": "发送",
"stats": "统计",
"approve": "批准",
"revoke": "撤销",
"reject": "拒绝",
"manage": "管理",
"ban": "封禁",
"unban": "解封",
"assign": "分配"
},
"toggleSection": "切换所有 {{section}} 权限",
"selectedPermissions_other": "已选择 {{count}} 个权限",
"cancel": "取消",

View File

@@ -360,12 +360,17 @@ export default function AdminPolicies() {
{/* Resource + actions */}
<div className="mb-2 flex flex-wrap items-center gap-2 text-sm">
<span className="rounded bg-dark-700 px-2 py-0.5 font-mono text-xs text-accent-400">
{policy.resource}
<span className="rounded bg-dark-700 px-2 py-0.5 text-xs text-accent-400">
{t(
`admin.roles.form.permissionSections.${policy.resource}`,
policy.resource,
)}
</span>
<span className="text-dark-500">:</span>
<span className="font-mono text-xs text-dark-300">
{(policy.actions ?? []).join(', ')}
<span className="text-xs text-dark-300">
{(policy.actions ?? [])
.map((a) => t(`admin.roles.form.permissionActions.${a}`, a))
.join(', ')}
</span>
</div>

View File

@@ -473,7 +473,7 @@ export default function AdminPolicyEdit() {
<option value="">{t('admin.policies.form.selectResource')}</option>
{permissionRegistry?.map((section) => (
<option key={section.section} value={section.section}>
{section.section}
{t(`admin.roles.form.permissionSections.${section.section}`, section.section)}
</option>
))}
</select>
@@ -500,7 +500,7 @@ export default function AdminPolicyEdit() {
}`}
aria-pressed={selected}
>
{action}
{t(`admin.roles.form.permissionActions.${action}`, action)}
</button>
);
})}

View File

@@ -174,7 +174,9 @@ function PermissionMatrix({
onClick={() => toggleExpand(section.section)}
className="flex flex-1 items-center justify-between"
>
<span className="text-sm font-medium text-dark-200">{section.section}</span>
<span className="text-sm font-medium text-dark-200">
{t(`admin.roles.form.permissionSections.${section.section}`, section.section)}
</span>
<div className="flex items-center gap-2">
<span className="text-xs text-dark-500">
{section.actions.filter((a) => isPermSelected(section.section, a)).length}/
@@ -208,7 +210,7 @@ function PermissionMatrix({
}`}
aria-pressed={selected}
>
{action}
{t(`admin.roles.form.permissionActions.${action}`, action)}
</button>
);
})}