i18n: fix widget heading, translate Select options from model consts, +40 keys

- LowStockTable: rename getHeading → getTableHeading (correct Filament API)
- Global I18n::opts() helper wraps Model::CONST values in __() so
  Select dropdowns show translated status/type/season/etc. labels
- Sed-transform ->options(X::CONST), ->options(array_combine(X::A,X::A)),
  and formatStateUsing(fn($s)=>X::CONST[$s]??$s) → wrap with __()
  (58 options + 10 combines + 7 formatStateUsing across 28 files)
- CalendarBoard: all 7 day names now via __() (was missing 4)
- calendar-board.blade: fix untranslated 'săptămâna curentă', 'capacitate',
  'rata confirmare', 'mediu', 'plin', 'Pod / Zi' / 'Mecanic / Zi'
- +40 RU/EN translations (Client & Auto, Maistru / Mecanic, Programat,
  Sosit, Finalizat, Anulat, Neprezentat, days of week, calendar KPIs)

All 306 tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-16 06:42:16 +00:00
parent 272080b274
commit 95aeecb932
33 changed files with 159 additions and 123 deletions
+40 -22
View File
@@ -250,7 +250,7 @@
"Blochez": "Блокировать",
"Blochez lucrarea": "Заблокировать работу",
"Boală": "Больничный",
"Body type": "Кузов",
"Body type": "Тип кузова",
"Bon": "Чек",
"Bonuri": "Чеки",
"Bot OK: @{$name}": "Bot OK: @{$name}",
@@ -259,6 +259,7 @@
"Brand": "Бренд",
"Brand & contact": "Бренд и контакты",
"Break": "Универсал",
"Budget": "Бюджет",
"Buget": "Бюджет",
"Buget & rezultate (luna curentă)": "Бюджет и результаты (текущий месяц)",
"Bulk actions": "Массовые действия",
@@ -327,9 +328,9 @@
"Class": "Класс",
"Clasă (pentru pricing)": "Класс (для тарификации)",
"Claude API Key": "Claude API Key",
"Click pentru a redenumi": "Click pentru a redenumi",
"Click pentru a redenumi": "Кликните для переименования",
"Client": "Клиент",
"Client & Auto": "Client & Auto",
"Client & Auto": "Клиент и авто",
"Client (nume, semnătură):": "Клиент (имя, подпись):",
"Client / Auto": "Client / Auto",
"Client CRM": "Клиент CRM",
@@ -371,6 +372,7 @@
"Comandat": "Comandat",
"Comandată": "Заказана",
"Comandă": "Заказ",
"Comandă emisă": "Заказ создан",
"Comandă nouă #": "Новый заказ #",
"Comandă primită": "Заказ получен",
"Combustibil": "Топливо",
@@ -458,6 +460,8 @@
"Culoare brand": "Цвет бренда",
"Culoare în calendar": "Цвет в календаре",
"Cum folosești API-ul:": "Как использовать API:",
"Cum funcționează": "Как работает",
"Cum funcționează:": "Как работает:",
"Cumul.": "Cumul.",
"Cumulabil": "Cumulabil",
"Cumulabil = se înmulțește cu alți coeficienți. Necumulabil = doar cel mai mare necumulabil se aplică.": "Cumulabil = se înmulțește cu alți coeficienți. Necumulabil = doar cel mai mare necumulabil se aplică.",
@@ -688,7 +692,7 @@
"Filters": "Фильтры",
"Filtre": "Фильтры",
"Filtru": "Фильтр",
"Filtru:": "Filtru:",
"Filtru:": "Фильтр:",
"Finalizat": "Завершено",
"Financiar": "Financiar",
"Finanțe": "Финансы",
@@ -756,7 +760,7 @@
"Gol — trage un card aici": "Пусто — перетащите карточку сюда",
"Grafic": "График",
"Gravitate": "Gravitate",
"Grupare:": "Grupare:",
"Grupare:": "Группировка:",
"Grupează manopere + piese frecvente într-un șablon (ex: „Schimb ulei complet": "Grupează manopere + piese frecvente într-un șablon (ex: „Schimb ulei complet",
"Grupează manopere + piese frecvente într-un șablon (ex: „Schimb ulei complet\") și aplică-l pe o fișă cu un click.": "Grupează manopere + piese frecvente într-un șablon (ex: „Schimb ulei complet\") și aplică-l pe o fișă cu un click.",
"Găsite (cu articol existent)": "Найдено (с существующим артикулом)",
@@ -898,6 +902,8 @@
"Logout": "Выход",
"Loturi": "Loturi",
"Loturi (FIFO)": "Loturi (FIFO)",
"Low Stock Table": "Остаток ниже минимума",
"Low stock": "Ниже минимума",
"Lucrare": "Lucrare",
"Lucrare blocată": "Работа заблокирована",
"Lucrări": "Работы",
@@ -908,7 +914,7 @@
"Luna trecută": "Прошлый месяц",
"Luna următoare ▶": "Следующий месяц ▶",
"Lunar": "Lunar",
"Luni": "Месяцы",
"Luni": "Понедельник",
"Luni (zi)": "Понедельник",
"Luni Vineri: 08:00 18:00": "Luni Vineri: 08:00 18:00",
"Lună": "Месяц",
@@ -924,7 +930,7 @@
"Mai": "Май",
"Mai mic = aplicat primul.": "Mai mic = aplicat primul.",
"Maistru": "Мастер",
"Maistru / Mecanic": "Maistru / Mecanic",
"Maistru / Mecanic": "Мастер / Механик",
"Maistru / Recepție:": "Мастер / Ресепшн:",
"Make": "Марка",
"Manager": "Менеджер",
@@ -960,7 +966,7 @@
"Marți": "Вторник",
"Master": "Мастер",
"Master name": "Мастер",
"Matricea": "Matricea",
"Matricea": "Матрица",
"Max clienți": "Макс. клиентов",
"Max fișe/lună": "Макс. нарядов/мес",
"Max mașini": "Макс. авто",
@@ -969,6 +975,7 @@
"Mașina e gata de ridicat": "Авто готово к выдаче",
"Mașini": "Автомобили",
"Mecanic": "Механик",
"Mecanic / Zi": "Механик / День",
"Mecanic implicit": "Механик по умолчанию",
"Mecanici": "Механики",
"Medie": "Среднее",
@@ -995,7 +1002,7 @@
"Mod": "Режим",
"Mod stub:": "Mod stub:",
"Mod tarifare": "Mod tarifare",
"Mod:": "Mod:",
"Mod:": "Режим:",
"Model": "Модель",
"Model Claude": "Model Claude",
"Model Gemini": "Model Gemini",
@@ -1029,6 +1036,7 @@
"Neconfirmate": "Не подтверждено",
"Necunoscut": "Неизвестно",
"Neplătit": "Не оплачено",
"Neprezentat": "Не явился",
"Nepublicat": "Не опубликовано",
"Nesemnat": "Не подписано",
"Nesincronizat": "Не синхронизировано",
@@ -1077,7 +1085,7 @@
"Niciun tenant încă": "Пока нет арендаторов",
"Niciun șablon": "Нет шаблонов",
"No": "Нет",
"No-show alert": "No-show alert",
"No-show alert": "No-show предупр.",
"Noiembrie": "Ноябрь",
"Norm hours": "Норма часов",
"Norma ore": "Норма часов",
@@ -1169,7 +1177,7 @@
"Ore (normă)": "Часы (норма)",
"Ore disponibile / zi": "Доступные часы / день",
"Ore lucrate": "Отработанные часы",
"Ore programate": "Ore programate",
"Ore programate": "Запланированные часы",
"Ore total": "Ore total",
"Ore/zi": "Часов/день",
"Owner": "Владелец",
@@ -1264,7 +1272,9 @@
"Plăți internaționale. Mai potrivit pentru clienți din afara MD.": "Plăți internaționale. Mai potrivit pentru clienți din afara MD.",
"Pod": "Пост",
"Pod / Spațiu lucru": "Пост / рабочее место",
"Pod / Zi": "Пост / День",
"Pod / spațiu": "Пост / место",
"Pod × Zile": "Пост × Дни",
"Politica de confidențialitate": "Политика конфиденциальности",
"Politici": "Политики",
"Pontaj": "Табель",
@@ -1397,6 +1407,8 @@
"Recepționat": "Принято",
"Recepționat — batch creat": "Recepționat — batch creat",
"Recepționată": "Принято",
"Recepționată parțial": "Частично принято",
"Recepționată total": "Полностью принято",
"Recepționează": "Принять",
"Recomandat": "Рекомендуется",
"Recomandate": "Рекомендуемые",
@@ -1637,7 +1649,7 @@
"Suspensie": "Подвеска",
"Sâmbătă": "Суббота",
"Sâmbătă: 09:00 14:00": "Sâmbătă: 09:00 14:00",
"Săpt": "Săpt",
"Săpt": "Нед",
"Săpt. lucrătoare": "Раб. дни",
"Săpt. următoare →": "Săpt. următoare →",
"Săptămâna aceasta": "На этой неделе",
@@ -1744,9 +1756,10 @@
"Total în baza de date": "Всего в базе",
"Total încasat": "Total încasat",
"Total înregistrate": "Всего зарегистрировано",
"Toți": "Все",
"Toți VIP-ii sunt în contact recent.": "Toți VIP-ii sunt în contact recent.",
"Toți clienții": "Все клиенты",
"Toți mecanicii": "Toți mecanicii",
"Toți mecanicii": "Все механики",
"Toți utilizatorii": "Все пользователи",
"Tracking & ETA": "Отслеживание и ETA",
"Tracțiune": "Привод",
@@ -1827,7 +1840,7 @@
"Vehicle class": "Класс авто",
"Vehicle make": "Марка авто",
"Vehicle model": "Модель авто",
"Vehicle plate": "Гос. номер авто",
"Vehicle plate": "Гос. номер",
"Vehicul": "Транспорт",
"Vehicul existent": "Существующий транспорт",
"Vehicul nou": "Новый транспорт",
@@ -1887,7 +1900,7 @@
"Yes": "Да",
"ZIP": "ZIP",
"ZIP cu fișiere JSON (1 per tabel) + media + manifest.json.": "ZIP cu fișiere JSON (1 per tabel) + media + manifest.json.",
"Zi": "Zi",
"Zi": "День",
"Zile": "Дни",
"Zile libere": "Выходные",
"Zile livrare": "Zile livrare",
@@ -1914,6 +1927,7 @@
"call": "Звонок",
"canal": "канал",
"canale marketing": "canale marketing",
"capacitate": "загрузка",
"cerere": "заявка",
"cereri": "заявки",
"cheltuială": "cheltuială",
@@ -1958,7 +1972,7 @@
"instagram": "Instagram",
"jurnal": "журнал",
"la fiecare request": "la fiecare request",
"liber/ușor": "liber/ușor",
"liber/ușor": "свободно/легко",
"linii neîncasate.": "linii neîncasate.",
"lucrare caroserie": "кузовная работа",
"lucrare terți": "работа субподрядчика",
@@ -1966,6 +1980,7 @@
"lucrări terți": "работы субподрядчиков",
"mașini": "машины",
"mașină": "машина",
"mediu": "средняя",
"mergi la Setări → Asistent AI și adaugă cheia API (Claude / GPT / Gemini).": "mergi la Setări → Asistent AI și adaugă cheia API (Claude / GPT / Gemini).",
"new": "новый",
"niciodată": "niciodată",
@@ -1980,6 +1995,7 @@
"plan": "plan",
"planuri": "planuri",
"plată": "plată",
"plin": "полная",
"plăți": "plăți",
"pod": "пост",
"portal.common.currency_mdl": "portal.common.currency_mdl",
@@ -2098,8 +2114,9 @@
"posturi de lucru": "posturi de lucru",
"programare": "запись",
"programări": "записи",
"programări active": "programări active",
"programări neconfirmate &lt; 24h": "programări neconfirmate &lt; 24h",
"programări active": "активные записи",
"programări neconfirmate &lt; 24h": "неподтверждённые записи < 24ч",
"rata confirmare": "коэф. подтверждения",
"referral": "Рекомендация",
"reguli markup": "reguli markup",
"regulă": "regulă",
@@ -2113,6 +2130,7 @@
"site": "Сайт",
"subcontractor": "субподрядчик",
"subcontractori": "субподрядчики",
"săptămâna curentă": "текущая неделя",
"tehnician": "техник",
"tehnicieni": "техники",
"telegram": "Telegram",
@@ -2149,11 +2167,11 @@
"Închide": "Закрыть",
"Închide fișa": "Закрыть наряд",
"Închis": "Закрыт",
"Închis (Duminică/sărbătoare)": "Închis (Duminică/sărbătoare)",
"Închis (Duminică/sărbătoare)": "Закрыто (Воскр./праздник)",
"Închis la": "Закрыт",
"Închise azi": "Закрыто сегодня",
"Încărcare STO": "Загрузка СТО",
"Încărcare celulă": "Încărcare celulă",
"Încărcare celulă": "Загрузка ячейки",
"Încărcare service": "Загрузка сервиса",
"Înregistrare": "Регистрация",
"Înregistrat": "Зарегистрирован",
@@ -2193,13 +2211,13 @@
"↗ Deschide Purchase": "↗ Deschide Purchase",
"↗ Deschide comanda în Filament": "↗ Deschide comanda în Filament",
"↗ Editare": "↗ Editare",
"≥9h/10": "≥9h/10",
"≥9h/10": "≥9ч/10",
"⏰ Abonament expirat": "⏰ Abonament expirat",
"⏹ Oprește": "⏹ Oprește",
"◀ Luna precedentă": "◀ Предыдущий месяц",
"⚖️ Balanță": "⚖️ Balanță",
"⚙ Configurare tenant": "⚙ Configurare tenant",
"⚙ Cum funcționează:": "⚙ Cum funcționează:",
"⚙ Cum funcționează:": "⚙ Как работает:",
"⚠ Acțiune necesară": "⚠ Требуется действие",
"⚠ Backup-urile pot conține date sensibile (telefoane, emailuri, plăți). Stochează-le în siguranță.": "⚠ Backup-urile pot conține date sensibile (telefoane, emailuri, plăți). Stochează-le în siguranță.",
"⚠ Fără plan": "⚠ Fără plan",