From 9df834ffa171326d40b98916e6a296bd4db91081 Mon Sep 17 00:00:00 2001 From: Vasyka Date: Sun, 6 Sep 2026 12:14:54 +0000 Subject: [PATCH] Fix PDF locale and missing translations for ru/en - Set app locale from user preference in PDF route before rendering - Wrap hardcoded strings (TOTAL, Subtotal, Achitat etc.) with __() - Translate status values via __() in blade - Add ru/en translations: statuses, totals, payment lines Co-Authored-By: Claude Sonnet 4.6 --- lang/en.json | 9 +++++++-- lang/ru.json | 17 +++++++++++------ resources/views/pdf/work-order.blade.php | 12 ++++++------ routes/web.php | 2 ++ 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lang/en.json b/lang/en.json index 38b7acd..1394534 100644 --- a/lang/en.json +++ b/lang/en.json @@ -60,6 +60,7 @@ "Acest email a fost generat automat. Vă rugăm nu răspundeți.": "This email was auto-generated. Please do not reply.", "Achitat": "Paid", "Achitat azi": "Paid today", + "Achitat:": "Paid:", "Achiziție piese": "Parts purchase", "Achiziții": "Purchases", "Acord": "Agreed", @@ -225,7 +226,7 @@ "Approved at": "Approved at", "Aprilie": "April", "Aprobare": "Approval", - "Aprobare client": "Client agreement", + "Aprobare client": "Awaiting approval", "Aprobat": "Approved", "Aprobat de": "Approved by", "Aprobat de client": "Approved by client", @@ -705,7 +706,7 @@ "Diagnosis": "Diagnosis", "Diagnostic": "Diagnostic", "Diagnostic AI bazat pe plângerea clientului": "AI diagnosis based on the client complaint", - "Diagnosticare": "Diagnostics", + "Diagnosticare": "Diagnosis", "Diagnoza": "Diagnosis", "Diagnoză": "Diagnosis", "Diametru R": "Diameter R", @@ -715,6 +716,7 @@ "Disabled": "Disabled", "Discount": "Discount", "Discount %": "Discount %", + "Discount:": "Discount:", "Distribuie": "Distribute", "Distribuție": "Timing", "Doar active": "Active only", @@ -1754,6 +1756,7 @@ "Respins": "Rejected", "Respins de": "Rejected by", "Responsabil": "Assignee", + "Rest de achitat:": "Balance due:", "Rest de plată": "Balance due", "Restanță": "Debt", "Restaurează": "Restore", @@ -1956,6 +1959,7 @@ "Subtotal": "Subtotal", "Subtotal manopere:": "Labor subtotal:", "Subtotal piese:": "Parts subtotal:", + "Subtotal:": "Subtotal:", "Succes": "Success", "Sugerează revizie / piese de uzură.": "Suggest service / wear parts.", "Sugestii pe pagini:": "In-page hints:", @@ -1984,6 +1988,7 @@ "Săptămâna curentă": "Current week", "Săptămâna trecută": "Last week", "Săptămâni": "Weeks", + "TOTAL DE PLATĂ:": "TOTAL DUE:", "TPMS": "TPMS", "TPMS & foto": "TPMS & photos", "TVA": "VAT", diff --git a/lang/ru.json b/lang/ru.json index c0c656e..5b0e1db 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -60,6 +60,7 @@ "Acest email a fost generat automat. Vă rugăm nu răspundeți.": "Это письмо сгенерировано автоматически. Пожалуйста, не отвечайте.", "Achitat": "Оплачено", "Achitat azi": "Оплачено сегодня", + "Achitat:": "Оплачено:", "Achiziție piese": "Закупка запчастей", "Achiziții": "Закупки", "Acord": "Согласовано", @@ -206,7 +207,7 @@ "Anul acesta": "В этом году", "Anul curent": "Текущий год", "Anul trecut": "Прошлый год", - "Anulat": "Отменён", + "Anulat": "Отменено", "Anulată": "Отменена", "Anulează": "Отмена", "Anulează fișa": "Отменить наряд", @@ -225,8 +226,8 @@ "Approved at": "Утверждено", "Aprilie": "Апрель", "Aprobare": "Утверждение", - "Aprobare client": "Согласование клиента", - "Aprobat": "Утверждено", + "Aprobare client": "Ожидает одобрения", + "Aprobat": "Одобрено", "Aprobat de": "Утверждено", "Aprobat de client": "Одобрено клиентом", "Aprobă": "Утвердить", @@ -282,7 +283,7 @@ "Avg zile": "Ср. дней", "Azi": "Сегодня", "Așteaptă client": "Ожидают клиента", - "Așteaptă piese": "Ждёт запчасти", + "Așteaptă piese": "Ожидает запчасти", "Așteaptă piesele": "Ждёт запчасти", "Aștept aprobare client": "Ожидание одобрения клиента", "Așteptată": "Ожидается", @@ -715,6 +716,7 @@ "Disabled": "Выключен", "Discount": "Скидка", "Discount %": "Скидка %", + "Discount:": "Скидка:", "Distribuie": "Распределить", "Distribuție": "ГРМ", "Doar active": "Только активные", @@ -930,7 +932,7 @@ "GRANT — adaugă dreptul": "GRANT — добавить право", "Galerie de până la 8 imagini. Prima e afișată în catalog. Max 2 MB / imagine.": "Галерея до 8 изображений. Первое отображается в каталоге. Максимум 2 МБ / изображение.", "Gata": "Готов", - "Gata de ridicare": "Готов к выдаче", + "Gata de ridicare": "Готово к выдаче", "Gata estimat (ETA)": "Gata estimat (ETA)", "Gearbox": "КПП", "Gemini API Key": "Gemini API Key", @@ -1571,7 +1573,7 @@ "Prag S": "Порог Л", "Pre-completat automat la programări noi pe acest pod.": "Pre-completat automat la programări noi pe acest pod.", "Precedent": "Предыдущий", - "Predat": "Выдан", + "Predat": "Выдано", "Prefix facturi": "Prefix facturi", "Pregătită": "Готова", "Premium": "Премиум", @@ -1754,6 +1756,7 @@ "Respins": "Отклонено", "Respins de": "Отклонено", "Responsabil": "Ответственный", + "Rest de achitat:": "Остаток к оплате:", "Rest de plată": "К оплате", "Restanță": "Задолженность", "Restaurează": "Восстановить", @@ -1956,6 +1959,7 @@ "Subtotal": "Промежуточный итог", "Subtotal manopere:": "Итого работы:", "Subtotal piese:": "Итого запчасти:", + "Subtotal:": "Подытог:", "Succes": "Успех", "Sugerează revizie / piese de uzură.": "Предложите ТО / расходники.", "Sugestii pe pagini:": "Подсказки на страницах:", @@ -1984,6 +1988,7 @@ "Săptămâna curentă": "Текущая неделя", "Săptămâna trecută": "Прошлая неделя", "Săptămâni": "Недели", + "TOTAL DE PLATĂ:": "ИТОГО К ОПЛАТЕ:", "TPMS": "TPMS", "TPMS & foto": "TPMS и фото", "TVA": "НДС", diff --git a/resources/views/pdf/work-order.blade.php b/resources/views/pdf/work-order.blade.php index 59c6da2..070db95 100644 --- a/resources/views/pdf/work-order.blade.php +++ b/resources/views/pdf/work-order.blade.php @@ -140,7 +140,7 @@
{{ __('Data închiderii:') }} {{ $wo->closed_at->format('d.m.Y') }}
@endif
- {{ __('Status:') }} {{ \App\Models\Tenant\WorkOrder::STATUSES[$wo->status] ?? $wo->status }} + {{ __('Status:') }} {{ __(\App\Models\Tenant\WorkOrder::STATUSES[$wo->status] ?? $wo->status) }}
@@ -254,15 +254,15 @@
@if ($wo->discount_pct > 0) -
Subtotal: {{ number_format((float) ($worksTotal + $partsTotal), 2, '.', ' ') }} {{ $currency }}
-
Discount: -{{ $wo->discount_pct }}%
+
{{ __('Subtotal:') }} {{ number_format((float) ($worksTotal + $partsTotal), 2, '.', ' ') }} {{ $currency }}
+
{{ __('Discount:') }} -{{ $wo->discount_pct }}%
@endif
- TOTAL DE PLATĂ: {{ number_format((float) $wo->total, 2, '.', ' ') }} {{ $currency }} + {{ __('TOTAL DE PLATĂ:') }} {{ number_format((float) $wo->total, 2, '.', ' ') }} {{ $currency }}
@if ($paid > 0) -
Achitat: {{ number_format($paid, 2, '.', ' ') }} {{ $currency }}
-
Rest de achitat: {{ number_format($balance, 2, '.', ' ') }} {{ $currency }}
+
{{ __('Achitat:') }} {{ number_format($paid, 2, '.', ' ') }} {{ $currency }}
+
{{ __('Rest de achitat:') }} {{ number_format($balance, 2, '.', ' ') }} {{ $currency }}
@endif
diff --git a/routes/web.php b/routes/web.php index 78e806d..67658f2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -85,6 +85,8 @@ Route::get('/app/appointments/pdf', function (Request $request) { // so user can print/save); forced download with ?download=1. Route::get('/app/work-orders/{workOrder}/pdf', function (Request $request, int $workOrder) { abort_unless(auth('web')->check(), 403); + $locale = auth('web')->user()?->locale ?? config('app.locale'); + app()->setLocale($locale); $wo = \App\Models\Tenant\WorkOrder::findOrFail($workOrder); $svc = app(\App\Services\WorkOrderPdfService::class); $pdf = $svc->generate($wo);