feat(i18n): mega-wrap 494 raw RO strings + 269 lang entries + 161 human RU/163 EN

Broad sweep across the whole codebase:
- Blade views (39 files, 315 wraps): tag-text and title/placeholder/alt
  attributes wrapped with {{ __() }}. Excludes scripts, styles, @php,
  @verbatim, {{ }}, {!! !!}, comments to avoid touching interpolations.
- PHP (54 files, 179 wraps): array 'key' => 'RO value' patterns and
  list items with diacritics wrapped with __(). Reverted __() inside
  const arrays (PHP disallows non-constant expressions).
- Added 269 new keys to lang/{ru,en}.json (identity fallback for
  unknowns → 161 human RU + 163 EN translations added for the most
  common enums, stages, roles, statuses, payment methods, vehicle
  categories, warehouse, portal, form actions.

Missing translations fall back to RO so the UI never breaks. All 306
tests pass; view cache compiles cleanly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 05:53:22 +00:00
parent 2d447e6294
commit 3911012c65
68 changed files with 1211 additions and 429 deletions
@@ -155,26 +155,26 @@
<div class="cv-shell" x-data="{ dragEventId: null }">
<div class="cv-head">
<div>
<div class="cv-breadcrumb">CRM Programări <strong style="color:var(--cv-text);">Calendar vizual</strong></div>
<div class="cv-breadcrumb">{{ __('CRM Programări ') }} <strong style="color:var(--cv-text);">Calendar vizual</strong></div>
<h1>Calendar vizual</h1>
</div>
<div class="cv-btn-group">
<button class="cv-btn" wire:click="exportPdf">🖨 PDF programări</button>
<button class="cv-btn" wire:click="exportPdf">{{ __('🖨 PDF programări') }}</button>
<button class="cv-btn" wire:click="openNewPostForm">+ Pod nou</button>
<button class="cv-btn cv-btn-primary" wire:click="openNewForm">+ Programare nouă</button>
<button class="cv-btn cv-btn-primary" wire:click="openNewForm">{{ __('+ Programare nouă') }}</button>
</div>
</div>
<div class="cv-kpi-bar">
<div class="cv-kpi">
<div class="cv-kpi-label">Ore programate</div>
<div class="cv-kpi-label">{{ __('Ore programate') }}</div>
<div class="cv-kpi-value">{{ $stats['scheduled_hours'] }} / {{ $stats['capacity_hours'] }}</div>
<div class="cv-kpi-sub">săptămâna curentă · {{ $stats['utilization_pct'] }}% capacitate</div>
</div>
<div class="cv-kpi">
<div class="cv-kpi-label">Fișe deschise</div>
<div class="cv-kpi-label">{{ __('Fișe deschise') }}</div>
<div class="cv-kpi-value orange">{{ $stats['open_count'] }}</div>
<div class="cv-kpi-sub">programări active</div>
<div class="cv-kpi-sub">{{ __('programări active') }}</div>
</div>
<div class="cv-kpi">
<div class="cv-kpi-label">Confirmate</div>
@@ -184,7 +184,7 @@
<div class="cv-kpi">
<div class="cv-kpi-label">No-show alert</div>
<div class="cv-kpi-value red">{{ $stats['no_show_alert'] }}</div>
<div class="cv-kpi-sub">programări neconfirmate &lt; 24h</div>
<div class="cv-kpi-sub">{{ __('programări neconfirmate &lt; 24h') }}</div>
</div>
</div>
@@ -193,16 +193,16 @@
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(-1)"></button>
<div class="cv-date">{{ $this->getWeekLabel() }}</div>
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(1)"></button>
<button class="cv-btn" wire:click="setWeekToday">Astăzi</button>
<button class="cv-btn" wire:click="setWeekToday">{{ __('Astăzi') }}</button>
</div>
<div class="cv-toolbar-group">
<span class="cv-toolbar-label">Mod:</span>
<div class="cv-view-switcher">
<button class="{{ $viewMode === 'day' ? 'active' : '' }}" wire:click="setViewMode('day')">Zi</button>
<button class="{{ $viewMode === 'week' ? 'active' : '' }}" wire:click="setViewMode('week')">Săpt</button>
<button class="{{ $viewMode === 'month' ? 'active' : '' }}" wire:click="setViewMode('month')">Lună</button>
<button class="{{ $viewMode === 'week' ? 'active' : '' }}" wire:click="setViewMode('week')">{{ __('Săpt') }}</button>
<button class="{{ $viewMode === 'month' ? 'active' : '' }}" wire:click="setViewMode('month')">{{ __('Lună') }}</button>
<button class="{{ $viewMode === 'custom' ? 'active' : '' }}" wire:click="setViewMode('custom')">Custom</button>
<button class="{{ $viewMode === 'list' ? 'active' : '' }}" wire:click="setViewMode('list')">Listă</button>
<button class="{{ $viewMode === 'list' ? 'active' : '' }}" wire:click="setViewMode('list')">{{ __('Listă') }}</button>
</div>
</div>
<div class="cv-toolbar-group">
@@ -216,37 +216,37 @@
<div class="cv-toolbar-group">
<span class="cv-toolbar-label">De la:</span>
<input type="date" class="cv-select" wire:model.live="customStart">
<span class="cv-toolbar-label">Până la:</span>
<span class="cv-toolbar-label">{{ __('Până la:') }}</span>
<input type="date" class="cv-select" wire:model.live="customEnd">
</div>
@endif
<div class="cv-toolbar-group" style="margin-left:auto;">
<span class="cv-toolbar-label">Filtru:</span>
<select class="cv-select" wire:change="setMasterFilter($event.target.value)">
<option value="">Toți mecanicii</option>
<option value="">{{ __('Toți mecanicii') }}</option>
@foreach ($this->getMasterOptions() as $id => $name)
<option value="{{ $id }}" {{ $masterFilter == $id ? 'selected' : '' }}>{{ $name }}</option>
@endforeach
</select>
<select class="cv-select" wire:change="setStatusFilter($event.target.value)">
<option value="all">Toate statusurile</option>
<option value="all">{{ __('Toate statusurile') }}</option>
<option value="confirmed" @if($statusFilter==='confirmed')selected @endif>Confirmate</option>
<option value="unconfirmed" @if($statusFilter==='unconfirmed')selected @endif>Neconfirmate</option>
<option value="in_work" @if($statusFilter==='in_work')selected @endif>În lucru</option>
<option value="in_work" @if($statusFilter==='in_work')selected @endif>{{ __('În lucru') }}</option>
</select>
</div>
</div>
<div class="cv-notes">
<strong> Cum funcționează:</strong>
Matricea <strong>{{ $groupBy === 'post' ? 'Pod' : 'Mecanic' }} × Zile</strong>. Drag-and-drop între celule pentru a reprograma. Indicator de încărcare pe fiecare celulă (ore_planificate / capacitate). Click pe celulă goală programare rapidă. Click pe eveniment detalii.
<strong>{{ __('⚙ Cum funcționează:') }}</strong>
Matricea <strong>{{ $groupBy === 'post' ? 'Pod' : 'Mecanic' }} × Zile</strong>{{ __('. Drag-and-drop între celule pentru a reprograma. Indicator de încărcare pe fiecare celulă (ore_planificate / capacitate). Click pe celulă goală → programare rapidă. Click pe eveniment → detalii.') }}
</div>
@if ($viewMode === 'list')
@php $list = $this->getListAppointments(); @endphp
<div class="cv-matrix-wrap">
@if (empty($list))
<div style="padding:32px; text-align:center; color:#718096;">Nicio programare în perioada selectată.</div>
<div style="padding:32px; text-align:center; color:#718096;">{{ __('Nicio programare în perioada selectată.') }}</div>
@else
<table style="width:100%; border-collapse:collapse; font-size:13px;">
<thead>
@@ -335,7 +335,7 @@
@endif
<div class="cv-legend">
<h3>Legendă</h3>
<h3>{{ __('Legendă') }}</h3>
<div class="cv-legend-row">
<div>
<div class="cv-legend-col">Mecanici</div>
@@ -351,9 +351,9 @@
</div>
</div>
<div>
<div class="cv-legend-col">Încărcare celulă</div>
<div class="cv-legend-col">{{ __('Încărcare celulă') }}</div>
<div class="cv-legend-items">
<div class="cv-legend-item"><span class="cv-load" style="position:static;">05h/10</span> liber/ușor</div>
<div class="cv-legend-item"><span class="cv-load" style="position:static;">05h/10</span> {{ __('liber/ușor') }}</div>
<div class="cv-legend-item"><span class="cv-load warn" style="position:static;">58.5h/10</span> mediu</div>
<div class="cv-legend-item"><span class="cv-load full" style="position:static;">≥9h/10</span> plin</div>
</div>
@@ -362,8 +362,8 @@
<div class="cv-legend-col">Stare zi</div>
<div class="cv-legend-items">
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:#FAFAFA; border:1px solid var(--cv-border);"></span> Weekend</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:repeating-linear-gradient(45deg,#FAFAFA,#FAFAFA 2px,#F1F5F9 2px,#F1F5F9 4px); border:1px solid var(--cv-border);"></span> Închis (Duminică/sărbătoare)</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:var(--cv-blue-bg); border:1px solid var(--cv-blue);"></span> Astăzi</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:repeating-linear-gradient(45deg,#FAFAFA,#FAFAFA 2px,#F1F5F9 2px,#F1F5F9 4px); border:1px solid var(--cv-border);"></span> {{ __('Închis (Duminică/sărbătoare)') }}</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:var(--cv-blue-bg); border:1px solid var(--cv-blue);"></span> {{ __('Astăzi') }}</div>
</div>
</div>
</div>
@@ -381,19 +381,19 @@
</div>
<div class="cv-panel-body">
<div class="cv-two-cols">
@if ($openEvent['client_name'])<div class="cv-pfield"><label>Client</label><div class="cv-pfield-val">{{ $openEvent['client_name'] }}</div></div>@endif
@if ($openEvent['client_name'])<div class="cv-pfield"><label>{{ __('Client') }}</label><div class="cv-pfield-val">{{ $openEvent['client_name'] }}</div></div>@endif
@if ($openEvent['client_phone'])<div class="cv-pfield"><label>Telefon</label><div class="cv-pfield-val" style="color:var(--cv-blue);">{{ $openEvent['client_phone'] }}</div></div>@endif
@if ($openEvent['vehicle'])<div class="cv-pfield"><label>Auto</label><div class="cv-pfield-val">{{ $openEvent['vehicle'] }}</div></div>@endif
@if ($openEvent['vehicle'])<div class="cv-pfield"><label>{{ __('Auto') }}</label><div class="cv-pfield-val">{{ $openEvent['vehicle'] }}</div></div>@endif
@if ($openEvent['plate'])<div class="cv-pfield"><label>Numar</label><div class="cv-pfield-val">{{ $openEvent['plate'] }}</div></div>@endif
@if ($openEvent['master_name'])<div class="cv-pfield"><label>Maistru</label><div class="cv-pfield-val">{{ $openEvent['master_name'] }}</div></div>@endif
@if ($openEvent['post_name'])<div class="cv-pfield"><label>Pod</label><div class="cv-pfield-val">{{ $openEvent['post_name'] }}</div></div>@endif
</div>
@if ($openEvent['notes'])
<div class="cv-pfield"><label>Notițe</label><div class="cv-pfield-val" style="white-space:pre-wrap;">{{ $openEvent['notes'] }}</div></div>
<div class="cv-pfield"><label>{{ __('Notițe') }}</label><div class="cv-pfield-val" style="white-space:pre-wrap;">{{ $openEvent['notes'] }}</div></div>
@endif
</div>
<div class="cv-panel-actions">
<button class="cv-btn" wire:click="deleteEvent({{ $openEvent['id'] }})" onclick="return confirm('Ștergi această programare?')">🗑 Șterge</button>
<button class="cv-btn" wire:click="deleteEvent({{ $openEvent['id'] }})" onclick="return confirm('Ștergi această programare?')">{{ __('🗑 Șterge') }}</button>
<a class="cv-btn cv-btn-primary" href="{{ route('filament.tenant.resources.appointments.edit', ['record' => $openEvent['id']]) }}"> Editare</a>
</div>
@endif
@@ -404,7 +404,7 @@
@if ($showNewForm)
<div class="cv-panel-head">
<div>
<div class="cv-panel-title">Programare nouă</div>
<div class="cv-panel-title">{{ __('Programare nouă') }}</div>
<div class="cv-panel-sub">{{ $newAppt['date'] ?? '' }}</div>
</div>
<div class="cv-close" wire:click="$set('showNewForm', false)"></div>
@@ -412,7 +412,7 @@
<div class="cv-panel-body">
<div class="cv-pfield"><label>Subiect *</label><input wire:model="newAppt.title" type="text" placeholder="Schimb ulei + filtru"></div>
<div class="cv-two-cols">
<div class="cv-pfield"><label>Data *</label><input wire:model="newAppt.date" type="date"></div>
<div class="cv-pfield"><label>{{ __('Data *') }}</label><input wire:model="newAppt.date" type="date"></div>
<div class="cv-pfield"><label>Pod</label>
<select wire:model="newAppt.post_id">
<option value=""></option>
@@ -422,9 +422,9 @@
</select>
</div>
<div class="cv-pfield"><label>De la</label><input wire:model="newAppt.time_start" type="time"></div>
<div class="cv-pfield"><label>Până la</label><input wire:model="newAppt.time_end" type="time"></div>
<div class="cv-pfield"><label>{{ __('Până la') }}</label><input wire:model="newAppt.time_end" type="time"></div>
</div>
<div class="cv-pfield"><label>Client</label>
<div class="cv-pfield"><label>{{ __('Client') }}</label>
<select wire:model.live="newAppt.client_id">
<option value=""></option>
@foreach ($this->getClientOptions() as $id => $name)
@@ -440,11 +440,11 @@
@endforeach
</select>
</div>
<div class="cv-pfield"><label>Notițe</label><textarea wire:model="newAppt.notes" rows="3"></textarea></div>
<div class="cv-pfield"><label>{{ __('Notițe') }}</label><textarea wire:model="newAppt.notes" rows="3"></textarea></div>
</div>
<div class="cv-panel-actions">
<button class="cv-btn" wire:click="$set('showNewForm', false)">Anulează</button>
<button class="cv-btn cv-btn-primary" wire:click="createAppt">Salvează</button>
<button class="cv-btn" wire:click="$set('showNewForm', false)">{{ __('Anulează') }}</button>
<button class="cv-btn cv-btn-primary" wire:click="createAppt">{{ __('Salvează') }}</button>
</div>
@endif
</div>
@@ -453,10 +453,10 @@
@if ($showNewPostForm)
<div style="position:fixed; inset:0; background:rgba(0,0,0,0.4); z-index:9999; display:flex; align-items:center; justify-content:center;" wire:click="$set('showNewPostForm', false)">
<div style="background:white; border-radius:12px; padding:20px; max-width:420px; width:92%;" wire:click.stop>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;">+ Pod / spațiu nou</h2>
<p style="font-size:13px; color:#4a5568; margin-bottom:16px;">Poți adăuga un loc de muncă (cu lift sau fără ex: curte, atelier electric).</p>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;">{{ __('+ Pod / spațiu nou') }}</h2>
<p style="font-size:13px; color:#4a5568; margin-bottom:16px;">{{ __('Poți adăuga un loc de muncă (cu lift sau fără — ex: curte, atelier electric).') }}</p>
<div class="cv-pfield">
<label>Nume *</label>
<label>{{ __('Nume *') }}</label>
<input type="text" wire:model="newPost.name" placeholder="Ex: Curte 1, Pod 4, Atelier electric" autofocus>
</div>
<div class="cv-two-cols">
@@ -465,17 +465,17 @@
<input type="color" wire:model="newPost.color" style="height:40px; padding:4px;">
</div>
<div class="cv-pfield">
<label>Ore/zi</label>
<label>{{ __('Ore/zi') }}</label>
<input type="number" wire:model="newPost.hours_per_day" min="1" step="0.5">
</div>
</div>
<div class="cv-pfield">
<label>Descriere (opțional)</label>
<input type="text" wire:model="newPost.description" placeholder="Ex: fără lift, doar diagnoză...">
<label>{{ __('Descriere (opțional)') }}</label>
<input type="text" wire:model="newPost.description" placeholder="{{ __('Ex: fără lift, doar diagnoză...') }}">
</div>
<div style="display:flex; gap:8px; margin-top:16px;">
<button class="cv-btn" wire:click="$set('showNewPostForm', false)" style="flex:1;">Anulează</button>
<button class="cv-btn cv-btn-primary" wire:click="createPost" style="flex:1;">Adaugă</button>
<button class="cv-btn" wire:click="$set('showNewPostForm', false)" style="flex:1;">{{ __('Anulează') }}</button>
<button class="cv-btn cv-btn-primary" wire:click="createPost" style="flex:1;">{{ __('Adaugă') }}</button>
</div>
</div>
</div>
@@ -485,9 +485,9 @@
@if ($renamingPostId)
<div style="position:fixed; inset:0; background:rgba(0,0,0,0.4); z-index:9999; display:flex; align-items:center; justify-content:center;" wire:click="$set('renamingPostId', null)">
<div style="background:white; border-radius:12px; padding:20px; max-width:420px; width:92%;" wire:click.stop>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;"> Editează pod</h2>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;">{{ __('✏ Editează pod') }}</h2>
<div class="cv-pfield">
<label>Nume *</label>
<label>{{ __('Nume *') }}</label>
<input type="text" wire:model="renamingPostName" autofocus>
</div>
<div class="cv-pfield">
@@ -498,11 +498,11 @@
<option value="{{ $id }}">{{ $name }}</option>
@endforeach
</select>
<p style="font-size:11px; color:#718096; margin-top:4px;">Pre-completat automat la programări noi pe acest pod.</p>
<p style="font-size:11px; color:#718096; margin-top:4px;">{{ __('Pre-completat automat la programări noi pe acest pod.') }}</p>
</div>
<div style="display:flex; gap:8px; margin-top:16px;">
<button class="cv-btn" wire:click="$set('renamingPostId', null)" style="flex:1;">Anulează</button>
<button class="cv-btn cv-btn-primary" wire:click="saveRenamePost" style="flex:1;">Salvează</button>
<button class="cv-btn" wire:click="$set('renamingPostId', null)" style="flex:1;">{{ __('Anulează') }}</button>
<button class="cv-btn cv-btn-primary" wire:click="saveRenamePost" style="flex:1;">{{ __('Salvează') }}</button>
</div>
</div>
</div>