feat(rbac): human labels + descriptions for all 50 permissions

- Add Permissions::permissionLabels() mapping every slug to a
  human-readable RO label (e.g. 'clients.view_all' → 'Vezi toți
  clienții').
- RoleResource permission checkboxes now show translated labels
  as titles + technical slug as description (so admins see both
  the meaning and the key).
- PermissionOverridesRelationManager Select 'permission_id' now
  shows 'Human label (technical.slug)' format, plus helper text
  explaining GRANT/DENY. Same format on the display column.
- +57 translations (50 permission labels in RU/EN + role page
  supporting keys + module labels).

All 306 tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-18 11:16:21 +00:00
parent af0327d27d
commit 49b491a7bd
4 changed files with 185 additions and 7 deletions
+57 -3
View File
@@ -108,11 +108,13 @@
"Adaugă imagine": "Добавить изображение",
"Adaugă manopere și piese care se aplică împreună când selectezi acest șablon pe o fișă.": "Добавьте работы и запчасти, которые применяются вместе при выборе этого шаблона в наряде.",
"Adaugă mașini manual sau importă din CSV. Folosește VIN-căutare pentru decoder rapid și completare automată brand/model/an.": "Добавляйте авто вручную или импортируйте из CSV. Используйте поиск VIN для быстрого декодера и авто-заполнения марка/модель/год.",
"Adaugă mașină": "Добавить авто",
"Adaugă notă": "Добавить заметку",
"Adaugă piese manual, sau folosește Achiziții ca să le adaugi prin recepție de la furnizor (cu prețuri și stoc auto). Procentaj poate seta automat prețul de vânzare.": "Adaugă piese manual, sau folosește Achiziții ca să le adaugi prin recepție de la furnizor (cu prețuri și stoc auto). Procentaj poate seta automat prețul de vânzare.",
"Adaugă piesele care se montează de obicei la această manoperă — se adaugă automat în fișă când selectezi manopera.": "Добавьте запчасти, которые обычно устанавливаются в этой работе — они автоматически добавятся в наряд при выборе работы.",
"Adaugă piesă": "Добавить запчасть",
"Adaugă piesă implicită": "Добавить запчасть по умолчанию",
"Adaugă piesă în catalog": "Добавить запчасть в каталог",
"Adaugă plată": "Добавить платёж",
"Adaugă primul client SaaS folosind butonul „Adaugă companie\" — se va crea un tenant nou cu admin pe `<slug>.service.mir.md/app`.": "Adaugă primul client SaaS folosind butonul „Adaugă companie\" — se va crea un tenant nou cu admin pe `<slug>.service.mir.md/app`.",
"Adaugă primul tău client manual sau importă din CSV. Toate mașinile, fișele și plățile se vor lega automat de el.": "Adaugă primul tău client manual sau importă din CSV. Toate mașinile, fișele și plățile se vor lega automat de el.",
@@ -128,6 +130,7 @@
"Adaugă vehicul": "Добавить транспорт",
"Address": "Адрес",
"Admin tenant (la creare)": "Admin tenant (la creare)",
"Administrare": "Администрирование",
"Administrator": "Администратор",
"Adresă": "Адрес",
"Adresă IP": "IP-адрес",
@@ -141,11 +144,13 @@
"Ai uitat parola?": "Забыли пароль?",
"Aici apar cererile clienților potențiali. Convertește-le în deal-uri sau direct în programări de la butonul „Convertește\".": "Aici apar cererile clienților potențiali. Convertește-le în deal-uri sau direct în programări de la butonul „Convertește\".",
"Aici apar clienții care și-au creat cont în magazinul online (/shop/register).": "Здесь появляются клиенты, зарегистрировавшиеся в интернет-магазине (/shop/register).",
"Ajustează stocul manual": "Ручная корректировка остатка",
"Ale mele": "Мои",
"Aleatoriu": "Случайно",
"Alege categorie": "Выбрать категорию",
"Alege client": "Выбрать клиента",
"Alege dată": "Выбрать дату",
"Alege dreptul concret pe care vrei să-l acorzi (GRANT) sau să-l refuzi (DENY) pentru acest utilizator, indiferent de rolul lui.": "Выберите конкретное право, которое хотите предоставить (GRANT) или запретить (DENY) для этого пользователя, независимо от его роли.",
"Alege limbă": "Выбрать язык",
"Alege maistru": "Выбрать мастера",
"Alege mecanic": "Выбрать механика",
@@ -172,6 +177,7 @@
"An fabricație": "Год выпуска",
"An model": "Модельный год",
"An model (estimat)": "Модельный год (оценка)",
"Analitică": "Аналитика",
"Angajat din": "Работает с",
"Ani": "Годы",
"Anonim": "Аноним",
@@ -205,6 +211,9 @@
"Aprobat de": "Утверждено",
"Aprobat de client": "Одобрено клиентом",
"Aprobă": "Утвердить",
"Aprobă discount fără limită": "Одобрить скидку без лимита",
"Aprobă discount ≤ 20%": "Одобрить скидку ≤ 20%",
"Aprobă discount ≤ 5%": "Одобрить скидку ≤ 5%",
"Arată": "Показать",
"Arhivat": "В архиве",
"Arhivează": "В архив",
@@ -266,7 +275,7 @@
"Beneficiar:": "Beneficiar:",
"Benzină": "Бензин",
"Berlină": "Седан",
"Bifează ce poate face acest rol. Modificările au efect imediat.": "Bifează ce poate face acest rol. Modificările au efect imediat.",
"Bifează ce poate face acest rol. Modificările au efect imediat.": "Отметьте, что может делать эта роль. Изменения вступают в силу сразу.",
"Bifă": "Флажок",
"Bine ai venit": "Добро пожаловать",
"Blocat": "Заблокировано",
@@ -307,6 +316,7 @@
"Calculat salariul {$period} pentru {$count} utilizatori": "Calculat salariul {$period} pentru {$count} utilizatori",
"Calculație": "Расчёт",
"Calculează luna curentă": "Рассчитать текущий месяц",
"Calculează salarii": "Расчёт зарплат",
"Calendar": "Календарь",
"Calendar vizual": "Визуальный календарь",
"Camion": "Грузовик",
@@ -435,6 +445,8 @@
"Condition": "Состояние",
"Condiții (toate trebuie îndeplinite)": "Условия (все должны выполняться)",
"Configurare:": "Настройка:",
"Configurează chei API pentru AI": "Настройка API-ключей для AI",
"Configurează integrări externe": "Настройка внешних интеграций",
"Configurează procentele pentru calcul salariu. Marja internă (nu TVA) se scade din prețul de manoperă pentru a determina baza salariului.": "Настройте проценты для расчёта зарплаты. Внутренняя маржа (не НДС) вычитается из цены работы для базы зарплаты.",
"Configurări": "Конфигурация",
"Configurări avansate": "Расширенная конфигурация",
@@ -494,6 +506,7 @@
"Credit": "Кредит",
"Creează automat articolele noi în nomenclatură": "Автоматически создавать новые артикулы",
"Creează cerere": "Создать заявку",
"Creează comandă de aprovizionare": "Создать заказ на закупку",
"Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.": "Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.",
"Creează un bot la @BotFather, lipește token-ul aici și apasă „Setează webhook\". Clienții îți scriu la bot, partajează telefonul, iar codul se leagă automat de fișa lor.": "Creează un bot la @BotFather, lipește token-ul aici și apasă „Setează webhook\". Clienții îți scriu la bot, partajează telefonul, iar codul se leagă automat de fișa lor.",
"Crescător": "По возрастанию",
@@ -597,6 +610,7 @@
"Descarcă": "Скачать",
"Descarcă PDF": "Скачать PDF",
"Descarcă QR (SVG)": "Скачать QR (SVG)",
"Descarcă backup": "Скачать бэкап",
"Descarcă factura": "Скачать счёт",
"Descarcă template": "Скачать шаблон",
"Deschide": "Открыть",
@@ -604,6 +618,7 @@
"Deschide deal": "Открыть сделку",
"Deschide fișa": "Открыть наряд",
"Deschide fișa pentru aprobare lucrare/piesă.": "Откройте наряд для одобрения работы/запчасти.",
"Deschide fișă nouă": "Открыть новый наряд",
"Deschide tenantul": "Deschide tenantul",
"Deschide →": "Открыть →",
"Deschis": "Открыт",
@@ -677,12 +692,19 @@
"Edit": "Изменить",
"Editare": "Изменить",
"Editează": "Изменить",
"Editează client": "Изменить клиента",
"Editează cod echivalent": "Изменить эквивалентный код",
"Editează drepturi": "Изменить права",
"Editează excepția": "Изменить исключение",
"Editează fișă": "Изменить наряд",
"Editează furnizor": "Изменить поставщика",
"Editează mașină": "Изменить авто",
"Editează piesă": "Изменить запчасть",
"Editează piesă implicită": "Изменить запчасть по умолчанию",
"Editează produs": "Изменить товар",
"Editează roluri & drepturi": "Изменение ролей и прав",
"Editează rând": "Изменить строку",
"Editează setările companiei": "Изменение настроек компании",
"Efectuat": "Исходящий",
"Eficiență": "Эффективность",
"Electric": "Электро",
@@ -735,6 +757,8 @@
"Expiră la (opțional)": "Истекает (опционально)",
"Export": "Экспорт",
"Export CSV": "Экспорт CSV",
"Exportă clienți (CSV)": "Экспорт клиентов (CSV)",
"Exportă rapoarte financiare": "Экспорт финансовых отчётов",
"Exportă toate datele companiei tale într-un fișier ZIP. Util pentru:": "Exportă toate datele companiei tale într-un fișier ZIP. Util pentru:",
"Express": "Экспресс",
"Extrage datele din această factură. Răspunde DOAR cu obiectul JSON, fără text suplimentar și fără ```.": "Extrage datele din această factură. Răspunde DOAR cu obiectul JSON, fără text suplimentar și fără ```.",
@@ -781,6 +805,7 @@
"Fișă asociată": "Связанный наряд",
"Fișă de lucru": "Заказ-наряд",
"Fișă lucru": "Заказ-наряд",
"Folosește AI Assistant": "Использовать AI Assistant",
"Folosește „Check-in depozit": "Используйте «Приёмка на склад»",
"Folosește „Check-in depozit\" pe set pentru a înregistra prima depozitare.": "Folosește „Check-in depozit\" pe set pentru a înregistra prima depozitare.",
"Folosit dacă markup = 0.": "Используется если наценка = 0.",
@@ -830,6 +855,8 @@
"Generează raport": "Сгенерировать отчёт",
"Generează token": "Создать токен",
"Generez ZIP...": "Generez ZIP...",
"Gestionează tokene API": "Управление API-токенами",
"Gestionează utilizatori (creează/blochează)": "Управление пользователями (создание/блокировка)",
"Global": "Глобально",
"Gol — trage un card aici": "Пусто — перетащите карточку сюда",
"Grafic": "График",
@@ -1029,6 +1056,7 @@
"Marchează acest tenant ca demo (datele pot fi resetate periodic).": "Marchează acest tenant ca demo (datele pot fi resetate periodic).",
"Marchează anulat": "Отметить как отменено",
"Marchează plătit": "Отметить как оплачено",
"Marchează salariul ca plătit": "Отметить зарплату оплаченной",
"Marchează setul ca ridicat de client.": "Отметить комплект как выданный клиенту.",
"Marchează terminat": "Отметить как готовое",
"Marcă": "Марка",
@@ -1531,6 +1559,7 @@
"Recepționată parțial": "Частично принята",
"Recepționată total": "Полностью принята",
"Recepționează": "Принять",
"Recepționează marfă": "Приёмка товара",
"Recomandat": "Рекомендуется",
"Recomandate": "Рекомендуемые",
"Recomandă": "Рекомендуется",
@@ -1601,7 +1630,7 @@
"Rolul principal — sincronizat automat cu drepturile RBAC.": "Основная роль — автоматически синхронизирована с правами RBAC.",
"Roluri suplimentare": "Доп. роли",
"Roluri suplimentare peste rolul primar — drepturile se cumulează.": "Дополнительные роли поверх основной — права суммируются.",
"Rolurile sistem (owner/admin/etc.) au numele blocat": "Rolurile sistem (owner/admin/etc.) au numele blocat",
"Rolurile sistem (owner/admin/etc.) au numele blocat": "Системные роли (owner/admin/и т.д.) имеют заблокированное имя",
"Română": "Румынский",
"Rotire": "Поворот",
"Roți": "Колёса",
@@ -1643,6 +1672,7 @@
"Scaner cod QR / Bare": "Scaner cod QR / Bare",
"Scheduled at": "Запланировано",
"Schimb ulei + filtru": "Замена масла + фильтр",
"Schimbă statusul fișei": "Изменить статус наряда",
"Scoate din magazin": "Scoate din magazin",
"Scrie mesajul tău...": "Введите ваше сообщение...",
"Scule / consumabile": "Инструменты / расходники",
@@ -1742,7 +1772,7 @@
"Status dosar": "Status dosar",
"Status implicit": "Статус по умолчанию",
"Status:": "Статус:",
"Stoc": "Остаток",
"Stoc": "Склад",
"Stoc adăugat": "Stoc adăugat",
"Stoc minim": "Stoc minim",
"Stoc minim atins": "Достигнут мин. остаток",
@@ -1849,6 +1879,7 @@
"Tip implicit": "Тип по умолчанию",
"Tip jante": "Тип дисков",
"Tipărește": "Печать",
"Tipărește / PDF fișă": "Печать / PDF наряда",
"Tipărește etichete QR": "Печать QR-этикеток",
"Title": "Название",
"To": "До",
@@ -1998,9 +2029,24 @@
"Verificat": "Проверено",
"Verifică emailul": "Проверьте email",
"Verifică și amintește": "Проверить и напомнить",
"Vezi doar clienții proprii": "Просмотр только своих клиентов",
"Vezi doar fișele proprii asignate": "Просмотр только своих нарядов",
"Vezi furnizori": "Просмотр поставщиков",
"Vezi imagine": "Просмотр изображения",
"Vezi jurnalul de audit": "Просмотр журнала аудита",
"Vezi mai mult": "Смотреть больше",
"Vezi marja internă (baza de salariu)": "Просмотр внутренней маржи (базы зарплаты)",
"Vezi panou finanțe": "Просмотр финансов",
"Vezi profit & pierdere (P&L)": "Просмотр P&L",
"Vezi propriul salariu": "Просмотр своей зарплаты",
"Vezi rapoarte & analitică": "Просмотр отчётов и аналитики",
"Vezi salariile tuturor": "Просмотр зарплат всех",
"Vezi stoc (piese)": "Просмотр склада (запчасти)",
"Vezi toate fișele": "Просмотр всех нарядов",
"Vezi toate mașinile": "Просмотр всех авто",
"Vezi tot": "Смотреть все",
"Vezi toți clienții": "Просмотр всех клиентов",
"Vezi utilizatori": "Просмотр пользователей",
"Viber": "Viber",
"View": "Просмотр",
"Viitoare": "Viitoare",
@@ -2339,8 +2385,10 @@
"Încărcare service": "Загрузка сервиса",
"Înregistrare": "Регистрация",
"Înregistrat": "Зарегистрирован",
"Înregistrează cheltuială": "Регистрация расхода",
"Înregistrează lucrări de tinichigerie, vopsitorie, PDR, detailing, ceramică, PPF sau polish. Hartă daune, dosar asigurare și arhivă foto înainte/după.": "Înregistrează lucrări de tinichigerie, vopsitorie, PDR, detailing, ceramică, PPF sau polish. Hartă daune, dosar asigurare și arhivă foto înainte/după.",
"Înregistrează lucrările trimise la ateliere externe (turbo, cutii, vopsitorie). Costul terțului + markup intră automat în totalul fișei asociate.": "Регистрируйте работы, отправленные в сторонние мастерские (турбина, коробки, покраска). Стоимость субподрядчика + наценка автоматически входят в сумму связанного наряда.",
"Înregistrează plată": "Регистрация платежа",
"Înregistrează seturile de anvelope ale clienților și gestionează depozitarea sezonieră (tire hotel). Urmărește uzura, TPMS și locația în depozit.": "Регистрируйте комплекты шин клиентов и управляйте сезонным хранением (tire hotel). Отслеживайте износ, TPMS и локацию на складе.",
"Întreabă-mă orice — diagnostic, sumar, sugestii, redactare mesaje către clienți...": "Спросите что угодно — диагноз, резюме, подсказки, тексты клиентам...",
"Șabloane servicii": "Шаблоны услуг",
@@ -2349,8 +2397,14 @@
"Șablon serviciu": "Шаблон услуги",
"Șablonul nu are rânduri": "В шаблоне пока нет строк",
"Șterge": "Удалить",
"Șterge client": "Удалить клиента",
"Șterge conversația?": "Удалить диалог?",
"Șterge fișă": "Удалить наряд",
"Șterge furnizor": "Удалить поставщика",
"Șterge imagine": "Удалить изображение",
"Șterge mașină": "Удалить авто",
"Șterge piesă": "Удалить запчасть",
"Șterge plată": "Удаление платежа",
"Șterge produs": "Удалить товар",
"Șterge rând": "Удалить строку",
"Șterge selectate": "Удалить выбранные",