i18n(scanner): translate full page (13 keys) + wrap inline blade + JS errors

- Wrap inline blade text ('Mod recepție'), placeholder, and JS error
  messages (via @json(__(...)) so they land as JS strings).
- +13 translations covering all UI text on /app/scanner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-16 11:15:12 +00:00
parent b937bc8e1d
commit 2831dbd1c1
3 changed files with 29 additions and 19 deletions
+12 -7
View File
@@ -174,6 +174,7 @@
"Anulează fișa": "Cancel order", "Anulează fișa": "Cancel order",
"Anvelope": "Tires", "Anvelope": "Tires",
"Apare în magazinul online public.": "Appears in the public online shop.", "Apare în magazinul online public.": "Appears in the public online shop.",
"Apasă „Pornește\" pentru a deschide camera.": "Click \"Start\" to open the camera.",
"Apasă „Recepție\" pe lista de piese pentru a înregistra prima intrare în depozit.": "Click \"Receive\" on the parts list to record the first stock intake.", "Apasă „Recepție\" pe lista de piese pentru a înregistra prima intrare în depozit.": "Click \"Receive\" on the parts list to record the first stock intake.",
"Apel": "Apel", "Apel": "Apel",
"Aplicat": "Aplicat", "Aplicat": "Aplicat",
@@ -1031,6 +1032,7 @@
"Minim": "Minim", "Minim": "Minim",
"Minute": "Minutes", "Minute": "Minutes",
"Mod": "Mode", "Mod": "Mode",
"Mod recepție": "Receive mode",
"Mod stub:": "Mod stub:", "Mod stub:": "Mod stub:",
"Mod tarifare": "Pricing mode", "Mod tarifare": "Pricing mode",
"Mod:": "Mode:", "Mod:": "Mode:",
@@ -1077,6 +1079,7 @@
"Neverificat": "Not verified", "Neverificat": "Not verified",
"New client": "New client", "New client": "New client",
"New mașină": "New vehicle", "New mașină": "New vehicle",
"Nicio cameră detectată.": "No camera detected.",
"Nicio cheltuială.": "No expenses.", "Nicio cheltuială.": "No expenses.",
"Nicio comandă încă": "No orders yet", "Nicio comandă încă": "No orders yet",
"Nicio conversație": "No conversations", "Nicio conversație": "No conversations",
@@ -1150,6 +1153,7 @@
"Nu am găsit linii valide — verifică maparea coloanelor": "No valid rows found — check column mapping", "Nu am găsit linii valide — verifică maparea coloanelor": "No valid rows found — check column mapping",
"Nu există date": "No data", "Nu există date": "No data",
"Nu există rezultate": "No results", "Nu există rezultate": "No results",
"Nu pot porni camera: ": "Cannot start camera: ",
"Nu re-trimite mai des de X zile": "Nu re-trimite mai des de X zile", "Nu re-trimite mai des de X zile": "Nu re-trimite mai des de X zile",
"Nu te poți șterge pe tine!": "You can't delete yourself!", "Nu te poți șterge pe tine!": "You can't delete yourself!",
"Nu, renunță": "No, cancel", "Nu, renunță": "No, cancel",
@@ -1442,7 +1446,7 @@
"Recente": "Recent", "Recente": "Recent",
"Recente / restul": "Recente / restul", "Recente / restul": "Recente / restul",
"Recepție": "Receive", "Recepție": "Receive",
"Recepție acum:": "Recepție acum:", "Recepție acum:": "Received now:",
"Recepție completă — batch-uri create": "Recepție completă — batch-uri create", "Recepție completă — batch-uri create": "Recepție completă — batch-uri create",
"Recepție totală": "Full receipt", "Recepție totală": "Full receipt",
"Recepționat": "Received", "Recepționat": "Received",
@@ -1550,12 +1554,13 @@
"Sarcini restante": "Overdue tasks", "Sarcini restante": "Overdue tasks",
"Sarcină": "Task", "Sarcină": "Task",
"Sau generează unul aici (recomandat pentru integrări permanente)": "Sau generează unul aici (recomandat pentru integrări permanente)", "Sau generează unul aici (recomandat pentru integrări permanente)": "Sau generează unul aici (recomandat pentru integrări permanente)",
"Sau introdu manual (cod articol / barcode)…": "Or enter manually (article / barcode)…",
"Save": "Save", "Save": "Save",
"Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.": "Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.", "Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.": "Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.",
"Scadent": "Scadent", "Scadent": "Scadent",
"Scadent la": "Scadent la", "Scadent la": "Scadent la",
"Scadență": "Due date", "Scadență": "Due date",
"Scanează codurile pieselor pentru a marca ca recepționate.": "Scanează codurile pieselor pentru a marca ca recepționate.", "Scanează codurile pieselor pentru a marca ca recepționate.": "Scan part codes to mark as received.",
"Scaner cod QR / Bare": "Scaner cod QR / Bare", "Scaner cod QR / Bare": "Scaner cod QR / Bare",
"Scheduled at": "Scheduled at", "Scheduled at": "Scheduled at",
"Schimb ulei + filtru": "Oil + filter change", "Schimb ulei + filtru": "Oil + filter change",
@@ -1848,7 +1853,7 @@
"Ultima logare": "Ultima logare", "Ultima logare": "Ultima logare",
"Ultima modificare": "Last modified", "Ultima modificare": "Last modified",
"Ultima sincronizare": "Last synced", "Ultima sincronizare": "Last synced",
"Ultimul cod citit:": "Ultimul cod citit:", "Ultimul cod citit:": "Last code read:",
"Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).": "Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).", "Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).": "Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).",
"Updated at": "Updated at", "Updated at": "Updated at",
"Upgrade": "Upgrade", "Upgrade": "Upgrade",
@@ -2030,7 +2035,7 @@
"jurnal": "log", "jurnal": "log",
"la fiecare request": "la fiecare request", "la fiecare request": "la fiecare request",
"liber/ușor": "free/light", "liber/ușor": "free/light",
"linii neîncasate.": "linii neîncasate.", "linii neîncasate.": "unreceived lines.",
"lucrare caroserie": "bodyshop job", "lucrare caroserie": "bodyshop job",
"lucrare terți": "subcontract job", "lucrare terți": "subcontract job",
"lucrări caroserie": "bodyshop jobs", "lucrări caroserie": "bodyshop jobs",
@@ -2270,11 +2275,11 @@
"→ creează aplicație live → ia credentials": "→ creează aplicație live → ia credentials", "→ creează aplicație live → ia credentials": "→ creează aplicație live → ia credentials",
"→ ia keys → setează webhook la URL-ul de mai sus": "→ ia keys → setează webhook la URL-ul de mai sus", "→ ia keys → setează webhook la URL-ul de mai sus": "→ ia keys → setează webhook la URL-ul de mai sus",
"↗ Deschide Purchase": "↗ Deschide Purchase", "↗ Deschide Purchase": "↗ Deschide Purchase",
"↗ Deschide comanda în Filament": "↗ Deschide comanda în Filament", "↗ Deschide comanda în Filament": "↗ Open order in Filament",
"↗ Editare": "↗ Editare", "↗ Editare": "↗ Editare",
"≥9h/10": "≥9h/10", "≥9h/10": "≥9h/10",
"⏰ Abonament expirat": "⏰ Abonament expirat", "⏰ Abonament expirat": "⏰ Abonament expirat",
"⏹ Oprește": "⏹ Oprește", "⏹ Oprește": "⏹ Stop",
"◀ Luna precedentă": "◀ Previous month", "◀ Luna precedentă": "◀ Previous month",
"⚖️ Balanță": "⚖️ Balanță", "⚖️ Balanță": "⚖️ Balanță",
"⚙ Configurare tenant": "⚙ Configurare tenant", "⚙ Configurare tenant": "⚙ Configurare tenant",
@@ -2323,7 +2328,7 @@
"📚 Cum se face plata în sistem:": "📚 Cum se face plata în sistem:", "📚 Cum se face plata în sistem:": "📚 Cum se face plata în sistem:",
"📦 Caută piesă în catalog": "📦 Caută piesă în catalog", "📦 Caută piesă în catalog": "📦 Caută piesă în catalog",
"📦 Export complet date tenant": "📦 Export complet date tenant", "📦 Export complet date tenant": "📦 Export complet date tenant",
"📷 Pornește scanner": "📷 Pornește scanner", "📷 Pornește scanner": "📷 Start scanner",
"🔎 Decode VIN": "🔎 Decode VIN", "🔎 Decode VIN": "🔎 Decode VIN",
"🕒 Program de lucru": "🕒 Program de lucru", "🕒 Program de lucru": "🕒 Program de lucru",
"🖨 PDF programări": "🖨 PDF programări", "🖨 PDF programări": "🖨 PDF programări",
+13 -8
View File
@@ -174,6 +174,7 @@
"Anulează fișa": "Отменить наряд", "Anulează fișa": "Отменить наряд",
"Anvelope": "Шины", "Anvelope": "Шины",
"Apare în magazinul online public.": "Отображается в публичном интернет-магазине.", "Apare în magazinul online public.": "Отображается в публичном интернет-магазине.",
"Apasă „Pornește\" pentru a deschide camera.": "Нажмите «Старт», чтобы включить камеру.",
"Apasă „Recepție\" pe lista de piese pentru a înregistra prima intrare în depozit.": "Нажмите «Приёмка» в списке запчастей, чтобы зарегистрировать первое поступление на склад.", "Apasă „Recepție\" pe lista de piese pentru a înregistra prima intrare în depozit.": "Нажмите «Приёмка» в списке запчастей, чтобы зарегистрировать первое поступление на склад.",
"Apel": "Apel", "Apel": "Apel",
"Aplicat": "Aplicat", "Aplicat": "Aplicat",
@@ -307,7 +308,7 @@
"Categorie implicită": "Категория по умолчанию", "Categorie implicită": "Категория по умолчанию",
"Categorii": "Categorii", "Categorii": "Categorii",
"Category": "Категория", "Category": "Категория",
"Caută": "Поиск", "Caută": "Найти",
"Caută client, mașină, număr...": "Поиск клиента, авто, номера...", "Caută client, mașină, număr...": "Поиск клиента, авто, номера...",
"Caută în tabel": "Поиск в таблице", "Caută în tabel": "Поиск в таблице",
"Caz asigurare": "Caz asigurare", "Caz asigurare": "Caz asigurare",
@@ -1031,6 +1032,7 @@
"Minim": "Minim", "Minim": "Minim",
"Minute": "Минуты", "Minute": "Минуты",
"Mod": "Режим", "Mod": "Режим",
"Mod recepție": "Режим приёмки",
"Mod stub:": "Mod stub:", "Mod stub:": "Mod stub:",
"Mod tarifare": "Тип тарифа", "Mod tarifare": "Тип тарифа",
"Mod:": "Режим:", "Mod:": "Режим:",
@@ -1077,6 +1079,7 @@
"Neverificat": "Не проверено", "Neverificat": "Не проверено",
"New client": "Новый клиент", "New client": "Новый клиент",
"New mașină": "Новое авто", "New mașină": "Новое авто",
"Nicio cameră detectată.": "Камера не обнаружена.",
"Nicio cheltuială.": "Нет расходов.", "Nicio cheltuială.": "Нет расходов.",
"Nicio comandă încă": "Пока нет заказов", "Nicio comandă încă": "Пока нет заказов",
"Nicio conversație": "Нет диалогов", "Nicio conversație": "Нет диалогов",
@@ -1150,6 +1153,7 @@
"Nu am găsit linii valide — verifică maparea coloanelor": "Не найдено валидных строк — проверьте маппинг колонок", "Nu am găsit linii valide — verifică maparea coloanelor": "Не найдено валидных строк — проверьте маппинг колонок",
"Nu există date": "Нет данных", "Nu există date": "Нет данных",
"Nu există rezultate": "Нет результатов", "Nu există rezultate": "Нет результатов",
"Nu pot porni camera: ": "Не удалось запустить камеру: ",
"Nu re-trimite mai des de X zile": "Nu re-trimite mai des de X zile", "Nu re-trimite mai des de X zile": "Nu re-trimite mai des de X zile",
"Nu te poți șterge pe tine!": "Нельзя удалить себя!", "Nu te poți șterge pe tine!": "Нельзя удалить себя!",
"Nu, renunță": "Нет, отменить", "Nu, renunță": "Нет, отменить",
@@ -1442,7 +1446,7 @@
"Recente": "Недавние", "Recente": "Недавние",
"Recente / restul": "Recente / restul", "Recente / restul": "Recente / restul",
"Recepție": "Приёмка", "Recepție": "Приёмка",
"Recepție acum:": "Recepție acum:", "Recepție acum:": "Приёмка сейчас:",
"Recepție completă — batch-uri create": "Recepție completă — batch-uri create", "Recepție completă — batch-uri create": "Recepție completă — batch-uri create",
"Recepție totală": "Полная приёмка", "Recepție totală": "Полная приёмка",
"Recepționat": "Принято", "Recepționat": "Принято",
@@ -1550,12 +1554,13 @@
"Sarcini restante": "Просроченные задачи", "Sarcini restante": "Просроченные задачи",
"Sarcină": "Задача", "Sarcină": "Задача",
"Sau generează unul aici (recomandat pentru integrări permanente)": "Sau generează unul aici (recomandat pentru integrări permanente)", "Sau generează unul aici (recomandat pentru integrări permanente)": "Sau generează unul aici (recomandat pentru integrări permanente)",
"Sau introdu manual (cod articol / barcode)…": "Или введите вручную (артикул / штрих-код)…",
"Save": "Сохранить", "Save": "Сохранить",
"Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.": "Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.", "Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.": "Scade din stoc piesele legate de catalog (FIFO) și marchează comanda confirmată.",
"Scadent": "Scadent", "Scadent": "Scadent",
"Scadent la": "Scadent la", "Scadent la": "Scadent la",
"Scadență": "Срок оплаты", "Scadență": "Срок оплаты",
"Scanează codurile pieselor pentru a marca ca recepționate.": "Scanează codurile pieselor pentru a marca ca recepționate.", "Scanează codurile pieselor pentru a marca ca recepționate.": "Сканируйте коды запчастей, чтобы отметить как принятые.",
"Scaner cod QR / Bare": "Scaner cod QR / Bare", "Scaner cod QR / Bare": "Scaner cod QR / Bare",
"Scheduled at": "Запланировано", "Scheduled at": "Запланировано",
"Schimb ulei + filtru": "Замена масла + фильтр", "Schimb ulei + filtru": "Замена масла + фильтр",
@@ -1848,7 +1853,7 @@
"Ultima logare": "Ultima logare", "Ultima logare": "Ultima logare",
"Ultima modificare": "Последнее изменение", "Ultima modificare": "Последнее изменение",
"Ultima sincronizare": "Последняя синхронизация", "Ultima sincronizare": "Последняя синхронизация",
"Ultimul cod citit:": "Ultimul cod citit:", "Ultimul cod citit:": "Последний код:",
"Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).": "Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).", "Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).": "Un depozit implicit a fost creat la migrare. Adaugă altele dacă ai locații fizice separate (sucursală, hală, mobil).",
"Updated at": "Обновлён", "Updated at": "Обновлён",
"Upgrade": "Обновление", "Upgrade": "Обновление",
@@ -2030,7 +2035,7 @@
"jurnal": "журнал", "jurnal": "журнал",
"la fiecare request": "la fiecare request", "la fiecare request": "la fiecare request",
"liber/ușor": "свободно/легко", "liber/ușor": "свободно/легко",
"linii neîncasate.": "linii neîncasate.", "linii neîncasate.": "непринятых строк.",
"lucrare caroserie": "кузовная работа", "lucrare caroserie": "кузовная работа",
"lucrare terți": "работа субподрядчика", "lucrare terți": "работа субподрядчика",
"lucrări caroserie": "кузовные работы", "lucrări caroserie": "кузовные работы",
@@ -2270,11 +2275,11 @@
"→ creează aplicație live → ia credentials": "→ creează aplicație live → ia credentials", "→ creează aplicație live → ia credentials": "→ creează aplicație live → ia credentials",
"→ ia keys → setează webhook la URL-ul de mai sus": "→ ia keys → setează webhook la URL-ul de mai sus", "→ ia keys → setează webhook la URL-ul de mai sus": "→ ia keys → setează webhook la URL-ul de mai sus",
"↗ Deschide Purchase": "↗ Deschide Purchase", "↗ Deschide Purchase": "↗ Deschide Purchase",
"↗ Deschide comanda în Filament": "↗ Deschide comanda în Filament", "↗ Deschide comanda în Filament": "↗ Открыть заказ в Filament",
"↗ Editare": "↗ Editare", "↗ Editare": "↗ Editare",
"≥9h/10": "≥9ч/10", "≥9h/10": "≥9ч/10",
"⏰ Abonament expirat": "⏰ Abonament expirat", "⏰ Abonament expirat": "⏰ Abonament expirat",
"⏹ Oprește": "⏹ Oprește", "⏹ Oprește": "⏹ Остановить",
"◀ Luna precedentă": "◀ Предыдущий месяц", "◀ Luna precedentă": "◀ Предыдущий месяц",
"⚖️ Balanță": "⚖️ Balanță", "⚖️ Balanță": "⚖️ Balanță",
"⚙ Configurare tenant": "⚙ Configurare tenant", "⚙ Configurare tenant": "⚙ Configurare tenant",
@@ -2323,7 +2328,7 @@
"📚 Cum se face plata în sistem:": "📚 Cum se face plata în sistem:", "📚 Cum se face plata în sistem:": "📚 Cum se face plata în sistem:",
"📦 Caută piesă în catalog": "📦 Caută piesă în catalog", "📦 Caută piesă în catalog": "📦 Caută piesă în catalog",
"📦 Export complet date tenant": "📦 Export complet date tenant", "📦 Export complet date tenant": "📦 Export complet date tenant",
"📷 Pornește scanner": "📷 Pornește scanner", "📷 Pornește scanner": "📷 Запустить сканер",
"🔎 Decode VIN": "🔎 Decode VIN", "🔎 Decode VIN": "🔎 Decode VIN",
"🕒 Program de lucru": "🕒 Program de lucru", "🕒 Program de lucru": "🕒 Program de lucru",
"🖨 PDF programări": "🖨 PDF programări", "🖨 PDF programări": "🖨 PDF programări",
@@ -37,7 +37,7 @@
@if ($purchase = $this->getActivePurchase()) @if ($purchase = $this->getActivePurchase())
@php $pending = $this->getPendingItems(); @endphp @php $pending = $this->getPendingItems(); @endphp
<div style="background:#ecfdf5;border-left:3px solid #10b981;padding:12px 14px;margin-bottom:12px;border-radius:6px;font-size:13px;"> <div style="background:#ecfdf5;border-left:3px solid #10b981;padding:12px 14px;margin-bottom:12px;border-radius:6px;font-size:13px;">
<div style="font-weight:600;color:#065f46;margin-bottom:4px;">📦 Mod recepție {{ $purchase->number }}</div> <div style="font-weight:600;color:#065f46;margin-bottom:4px;">📦 {{ __('Mod recepție') }} {{ $purchase->number }}</div>
<div style="color:#047857;">{{ __('Scanează codurile pieselor pentru a marca ca recepționate.') }} <strong>{{ count($pending) }}</strong> {{ __('linii neîncasate.') }}</div> <div style="color:#047857;">{{ __('Scanează codurile pieselor pentru a marca ca recepționate.') }} <strong>{{ count($pending) }}</strong> {{ __('linii neîncasate.') }}</div>
@if (! empty($receivedToasts)) @if (! empty($receivedToasts))
<div style="margin-top:8px;font-size:12px;color:#065f46;"> <div style="margin-top:8px;font-size:12px;color:#065f46;">
@@ -75,7 +75,7 @@
<div class="sc-manual"> <div class="sc-manual">
<form wire:submit="submitManual" style="display:flex;gap:8px;align-items:stretch;"> <form wire:submit="submitManual" style="display:flex;gap:8px;align-items:stretch;">
<input type="text" wire:model="manual" placeholder="Sau introdu manual (cod articol / barcode)…" /> <input type="text" wire:model="manual" placeholder="{{ __('Sau introdu manual (cod articol / barcode)…') }}" />
<button type="submit" class="sc-btn">{{ __('Caută') }}</button> <button type="submit" class="sc-btn">{{ __('Caută') }}</button>
</form> </form>
</div> </div>
@@ -99,7 +99,7 @@
try { try {
this.scanner = new Html5Qrcode('reader'); this.scanner = new Html5Qrcode('reader');
const cams = await Html5Qrcode.getCameras(); const cams = await Html5Qrcode.getCameras();
if (!cams.length) { this.error = 'Nicio cameră detectată.'; return; } if (!cams.length) { this.error = @json(__('Nicio cameră detectată.')); return; }
const camId = cams.find(c => /back|rear|environment/i.test(c.label))?.id || cams[0].id; const camId = cams.find(c => /back|rear|environment/i.test(c.label))?.id || cams[0].id;
await this.scanner.start( await this.scanner.start(
camId, camId,
@@ -109,7 +109,7 @@
); );
this.running = true; this.running = true;
} catch (e) { } catch (e) {
this.error = 'Nu pot porni camera: ' + (e.message || e); this.error = @json(__('Nu pot porni camera: ')) + (e.message || e);
} }
}, },