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
+56 -2
View File
@@ -108,11 +108,13 @@
"Adaugă imagine": "Add image",
"Adaugă manopere și piese care se aplică împreună când selectezi acest șablon pe o fișă.": "Add labors and parts applied together when selecting this template on an order.",
"Adaugă mașini manual sau importă din CSV. Folosește VIN-căutare pentru decoder rapid și completare automată brand/model/an.": "Add vehicles manually or import from CSV. Use VIN search for quick decode and auto-fill of brand/model/year.",
"Adaugă mașină": "Add vehicle",
"Adaugă notă": "Add note",
"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.": "Add parts usually installed with this labor — they are auto-added to the order when you select this labor.",
"Adaugă piesă": "Add part",
"Adaugă piesă implicită": "Add default part",
"Adaugă piesă în catalog": "Add part to catalog",
"Adaugă plată": "Add payment",
"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": "Add vehicle",
"Address": "Address",
"Admin tenant (la creare)": "Admin tenant (la creare)",
"Administrare": "Administration",
"Administrator": "Administrator",
"Adresă": "Address",
"Adresă IP": "IP address",
@@ -141,11 +144,13 @@
"Ai uitat parola?": "Forgot password?",
"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).": "Customers who register in the online shop (/shop/register) appear here.",
"Ajustează stocul manual": "Adjust stock manually",
"Ale mele": "Mine",
"Aleatoriu": "Random",
"Alege categorie": "Choose category",
"Alege client": "Choose client",
"Alege dată": "Choose date",
"Alege dreptul concret pe care vrei să-l acorzi (GRANT) sau să-l refuzi (DENY) pentru acest utilizator, indiferent de rolul lui.": "Choose the specific permission you want to grant (GRANT) or deny (DENY) for this user, regardless of their role.",
"Alege limbă": "Choose language",
"Alege maistru": "Choose master",
"Alege mecanic": "Choose mechanic",
@@ -172,6 +177,7 @@
"An fabricație": "Production year",
"An model": "Model year",
"An model (estimat)": "Model year (est.)",
"Analitică": "Analytics",
"Angajat din": "Employed since",
"Ani": "Years",
"Anonim": "Anonymous",
@@ -205,6 +211,9 @@
"Aprobat de": "Approved by",
"Aprobat de client": "Approved by client",
"Aprobă": "Approve",
"Aprobă discount fără limită": "Approve discount without limit",
"Aprobă discount ≤ 20%": "Approve discount ≤ 20%",
"Aprobă discount ≤ 5%": "Approve discount ≤ 5%",
"Arată": "Show",
"Arhivat": "Archived",
"Arhivează": "Archive",
@@ -266,7 +275,7 @@
"Beneficiar:": "Beneficiar:",
"Benzină": "Petrol",
"Berlină": "Sedan",
"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.": "Check what this role can do. Changes take effect immediately.",
"Bifă": "Check",
"Bine ai venit": "Welcome",
"Blocat": "Blocked",
@@ -307,6 +316,7 @@
"Calculat salariul {$period} pentru {$count} utilizatori": "Calculat salariul {$period} pentru {$count} utilizatori",
"Calculație": "Quote",
"Calculează luna curentă": "Calculate current month",
"Calculează salarii": "Calculate salaries",
"Calendar": "Calendar",
"Calendar vizual": "Visual calendar",
"Camion": "Truck",
@@ -435,6 +445,8 @@
"Condition": "Condition",
"Condiții (toate trebuie îndeplinite)": "Conditions (all must match)",
"Configurare:": "Setup:",
"Configurează chei API pentru AI": "Configure AI API keys",
"Configurează integrări externe": "Configure external integrations",
"Configurează procentele pentru calcul salariu. Marja internă (nu TVA) se scade din prețul de manoperă pentru a determina baza salariului.": "Configure percentages for salary calculation. The internal margin (not VAT) is deducted from the labor price to determine salary base.",
"Configurări": "Configuration",
"Configurări avansate": "Advanced settings",
@@ -494,6 +506,7 @@
"Credit": "Credit",
"Creează automat articolele noi în nomenclatură": "Auto-create new items in catalog",
"Creează cerere": "Create lead",
"Creează comandă de aprovizionare": "Create purchase order",
"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": "Ascending",
@@ -597,6 +610,7 @@
"Descarcă": "Download",
"Descarcă PDF": "Download PDF",
"Descarcă QR (SVG)": "Download QR (SVG)",
"Descarcă backup": "Download backup",
"Descarcă factura": "Download invoice",
"Descarcă template": "Download template",
"Deschide": "Open",
@@ -604,6 +618,7 @@
"Deschide deal": "Open deal",
"Deschide fișa": "Open order",
"Deschide fișa pentru aprobare lucrare/piesă.": "Open the order to approve work/part.",
"Deschide fișă nouă": "Open new order",
"Deschide tenantul": "Deschide tenantul",
"Deschide →": "Open →",
"Deschis": "Opened",
@@ -677,12 +692,19 @@
"Edit": "Edit",
"Editare": "Edit",
"Editează": "Edit",
"Editează client": "Edit client",
"Editează cod echivalent": "Edit equivalent code",
"Editează drepturi": "Edit permissions",
"Editează excepția": "Edit override",
"Editează fișă": "Edit order",
"Editează furnizor": "Edit supplier",
"Editează mașină": "Edit vehicle",
"Editează piesă": "Edit part",
"Editează piesă implicită": "Edit default part",
"Editează produs": "Edit product",
"Editează roluri & drepturi": "Edit roles & permissions",
"Editează rând": "Edit row",
"Editează setările companiei": "Edit company settings",
"Efectuat": "Outgoing",
"Eficiență": "Efficiency",
"Electric": "Electric",
@@ -735,6 +757,8 @@
"Expiră la (opțional)": "Expires at (optional)",
"Export": "Export",
"Export CSV": "Export CSV",
"Exportă clienți (CSV)": "Export clients (CSV)",
"Exportă rapoarte financiare": "Export financial reports",
"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": "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ă": "Linked order",
"Fișă de lucru": "Work order",
"Fișă lucru": "Work order",
"Folosește AI Assistant": "Use AI Assistant",
"Folosește „Check-in depozit": "Use \"Check-in storage\"",
"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.": "Used when markup = 0.",
@@ -830,6 +855,8 @@
"Generează raport": "Generate report",
"Generează token": "Generate token",
"Generez ZIP...": "Generez ZIP...",
"Gestionează tokene API": "Manage API tokens",
"Gestionează utilizatori (creează/blochează)": "Manage users (create/block)",
"Global": "Global",
"Gol — trage un card aici": "Empty — drop a card here",
"Grafic": "Chart",
@@ -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": "Mark as cancelled",
"Marchează plătit": "Mark as paid",
"Marchează salariul ca plătit": "Mark salary as paid",
"Marchează setul ca ridicat de client.": "Mark set as picked up by client.",
"Marchează terminat": "Mark as done",
"Marcă": "Brand",
@@ -1531,6 +1559,7 @@
"Recepționată parțial": "Partially received",
"Recepționată total": "Fully received",
"Recepționează": "Receive",
"Recepționează marfă": "Receive goods",
"Recomandat": "Recommended",
"Recomandate": "Recommended",
"Recomandă": "Recommend",
@@ -1601,7 +1630,7 @@
"Rolul principal — sincronizat automat cu drepturile RBAC.": "Primary role — automatically synced with RBAC permissions.",
"Roluri suplimentare": "Additional roles",
"Roluri suplimentare peste rolul primar — drepturile se cumulează.": "Additional roles on top of the primary — permissions accumulate.",
"Rolurile sistem (owner/admin/etc.) au numele blocat": "Rolurile sistem (owner/admin/etc.) au numele blocat",
"Rolurile sistem (owner/admin/etc.) au numele blocat": "System roles (owner/admin/etc.) have locked names",
"Română": "Romanian",
"Rotire": "Rotate",
"Roți": "Wheels",
@@ -1643,6 +1672,7 @@
"Scaner cod QR / Bare": "Scaner cod QR / Bare",
"Scheduled at": "Scheduled at",
"Schimb ulei + filtru": "Oil + filter change",
"Schimbă statusul fișei": "Change order status",
"Scoate din magazin": "Scoate din magazin",
"Scrie mesajul tău...": "Type your message...",
"Scule / consumabile": "Tools / consumables",
@@ -1849,6 +1879,7 @@
"Tip implicit": "Default type",
"Tip jante": "Rim type",
"Tipărește": "Print",
"Tipărește / PDF fișă": "Print / PDF order",
"Tipărește etichete QR": "Print QR labels",
"Title": "Title",
"To": "To",
@@ -1998,9 +2029,24 @@
"Verificat": "Verified",
"Verifică emailul": "Check your email",
"Verifică și amintește": "Verify and remind",
"Vezi doar clienții proprii": "View only own clients",
"Vezi doar fișele proprii asignate": "View only own assigned orders",
"Vezi furnizori": "View suppliers",
"Vezi imagine": "View image",
"Vezi jurnalul de audit": "View audit log",
"Vezi mai mult": "View more",
"Vezi marja internă (baza de salariu)": "View internal margin (salary base)",
"Vezi panou finanțe": "View finance overview",
"Vezi profit & pierdere (P&L)": "View P&L",
"Vezi propriul salariu": "View own salary",
"Vezi rapoarte & analitică": "View reports & analytics",
"Vezi salariile tuturor": "View all salaries",
"Vezi stoc (piese)": "View stock (parts)",
"Vezi toate fișele": "View all orders",
"Vezi toate mașinile": "View all vehicles",
"Vezi tot": "View all",
"Vezi toți clienții": "View all clients",
"Vezi utilizatori": "View users",
"Viber": "Viber",
"View": "View",
"Viitoare": "Viitoare",
@@ -2339,8 +2385,10 @@
"Încărcare service": "Workshop load",
"Înregistrare": "Register",
"Înregistrat": "Registered",
"Înregistrează cheltuială": "Record expense",
"Î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.": "Register jobs sent to external workshops (turbo, gearboxes, paint). Subcontractor cost + markup automatically add up in the linked order total.",
"Înregistrează plată": "Record payment",
"Înregistrează seturile de anvelope ale clienților și gestionează depozitarea sezonieră (tire hotel). Urmărește uzura, TPMS și locația în depozit.": "Register clients' tire sets and manage seasonal storage (tire hotel). Track wear, TPMS and warehouse location.",
"Întreabă-mă orice — diagnostic, sumar, sugestii, redactare mesaje către clienți...": "Ask me anything — diagnostics, summary, suggestions, drafting client messages...",
"Șabloane servicii": "Service templates",
@@ -2349,8 +2397,14 @@
"Șablon serviciu": "Service template",
"Șablonul nu are rânduri": "Template has no rows",
"Șterge": "Delete",
"Șterge client": "Delete client",
"Șterge conversația?": "Delete conversation?",
"Șterge fișă": "Delete order",
"Șterge furnizor": "Delete supplier",
"Șterge imagine": "Delete image",
"Șterge mașină": "Delete vehicle",
"Șterge piesă": "Delete part",
"Șterge plată": "Delete payment",
"Șterge produs": "Delete product",
"Șterge rând": "Delete row",
"Șterge selectate": "Delete selected",