Full page translation across all 4 steps (upload / map columns / preview /
done), including form labels, buttons, helper text, empty state, and
final result summary. Notification 'N poziții importate' now built via
__(':n')-placeholder so it translates on RU/EN.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Complete coverage for /app/tire-sets + create + storage history tab.
Includes Specificații/TPMS/Uzură sections, all field labels
(Sezon/Stare/Cu jante/Tip jante/Senzori TPMS/Dimensiune/Diametru R),
Check-in depozit action + result notifications, empty state (heading
+ description), placeholder examples, storage history relation
manager, and remaining CONDITIONS enum values (Bun/Critic/All-season).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Descriptions for Telegram/SMS/Message-templates/Webhook integration
cards + the placeholder-note info banner + Status: label.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds RU/EN for Call::DIRECTIONS (Primit/Efectuat/Pierdut),
Call::STATUSES (Răspuns/Ocupat/Fără răspuns), the 'Pierdute'
missed-calls quick filter, and Filament's auto-generated
'Direction' label from the direction field.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds RU/EN for feminine STATUSES enum values used by online-orders
(Nouă/Confirmată/Pregătită/Expediată/Livrată/Anulată), lowercase
model labels for plural/create titles, Livrare (delivery method
column), and the confirm-order helper.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Model labels (ajustare, bonusuri/avansuri) drive the plural title
'Bonusuri/avansuri' and 'Create Ajustare' text; TYPES enum
(Bonus/Penalizare/Avans) drives the type select; column 'Aplicat'
and auto-generated 'Period' for the period field.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Notification 'Calculat salariul YYYY-MM pentru N utilizatori' was
built via string interpolation → couldn't translate. Now uses __()
with :period / :count placeholders. Adds 7 more translations for
section titles and column labels.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Section titles (Profil, Salariu & comisioane), commission column
headers (% Manopere / % marja piese), plural model label, hire date
label, and both commission helper texts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Model labels used lowercase (Expense::getModelLabel returns __('cheltuială'))
but dict only had capitalised keys. Filament rendered 'Создать
Cheltuială' as fallback. Now RU shows 'Создать расход' / EN 'Create
expense'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- All 4 tabs (Overview/Cashflow/P&L/Balanță) built with __() around
the text portion, emoji stays in code
- 4 period presets wrapped with __()
- P&L table Marjă/Marjă piese footer wrapped
- Expense::CATEGORIES values look up through __() in the expensesByCat
loop so categories show translated (Salariu → Зарплата etc.)
- +25 translations covering all UI copy on /app/finance
306 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The two CheckboxList options passed raw Vehicle::BODY_TYPES and
Vehicle::TRANSMISSION_TYPES arrays — now they run through I18n::opts()
so the RO values translate at display. +6 translations for the enum
values that weren't yet in dict (Crossover, Pickup, Minivan, DSG,
DCT, AMT).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wrapped the dynamic Select 'key' label (Brand/Categorie) with __(),
switched the category options to I18n::opts(). Notification 'Recalculat
preț pentru N piese' now uses __(:n) placeholder.
+11 keys: regulă, reguli markup, Cheie, Mai mic = aplicat primul.,
'Va recalcula sell_price…' confirm text, notification, 'Interval preț'
enum, and missing Part.CATEGORIES (Ulei, Filtre, Lichide, Distribuție).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Migration: create `units` table + nullable unit_id FK on
parts / wo_parts / purchase_items / labor_parts. Seeds ~11 standard
units (buc/set/l/ml/kg/g/m/cm/m²/oră/pack) for every existing
tenant and backfills unit_id by matching the legacy string `unit`
column. Keeps `unit` string as fallback so old code paths keep
rendering.
- Unit model: label(locale), forSelect(locale), labelFor(id, code)
helpers. All 4 owner models get unitModel() relation + unitLabel()
accessor.
- UnitResource under Depozit group with Filament UI: code, sort,
is_active + separate name_ro/name_ru/name_en fields.
- Filament forms/tables updated: Part / PurchaseItem / LaborPart /
WorkOrderPart now use Select('unit_id')->options(Unit::forSelect())
for input and TextColumn->getStateUsing(unitLabel()) for display.
Selecting a part auto-fills unit_id when the source has one.
- +10 translations for the new resource + defaults; nav.label
'Unități de măsură' added to all 3 lang files.
All 306 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Supplier form: Categorii, Zile livrare, Net 30 / Avans placeholder,
Rerating action, Date insuficiente + helper.
Purchase form auto-generated headlines: Contact name, Pay terms,
Delivery days, Categories, Order date, Expected at, Received at.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wrapped 3 remaining raw RO strings ('An model (estimat)', WMI error
fallback, 'Niciun rezultat pentru') and added human RU/EN for all
15 keys used on /app/vin-search.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 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>
'piesă' (lowercase, Part::getModelLabel()) was identity-fallback so
Filament rendered 'Редактирование Piesă' instead of 'Редактирование
запчасть'. Also 'piese' was translated to genitive ('запчастей') from
an earlier pass where it was used as a count suffix — reverted to
nominative since it's the model label proper.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Filament's default empty state used the model class name ('service
template items') and default 'Create service template item' modal
heading. Both are now explicit __() calls.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 'Nou tehnician' button label is auto-generated by Filament as
'New ' + getModelLabel() = 'New ' + __('tehnician'). It picks up the
translation already in dict — on EN it shows 'New technician',
on RU 'Новый техник'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The RelationManager Create modal was showing 'Create Labor Part' from
the model class name. Override CreateAction/EditAction with explicit
->label() + ->modalHeading() so RU/EN see translated titles.
'buc' unit default is stored in DB (raw string); added mapping so it
displays 'шт' on RU / 'pcs' on EN.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Previous sed pass only matched \$state; missed \$s and other arg-name
variants. This time the regex is arg-name-agnostic and touches 21
files across Filament resources & relation managers.
Also wraps two special cases: UserResource role-labels lookup and
LaborResource pricing_mode ternary ('Fix' | 'Pe oră').
+27 human translations for the enum values that were still identity
fallback: WorkOrderWork.STATUSES (De făcut), Purchase.STATUSES,
OnlineOrder.STATUSES, Call.DIRECTIONS/STATUSES, BodyshopJob.TYPES/
STATUSES, TireSet.SEASONS, MessageTemplate.CHANNELS,
DamagePoint.SEVERITIES, ServiceTemplateItem.KINDS.
All 306 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- getContentTabLabel: 'ⓘ Info & antet' now goes through __()
- Tracking-client modal heading translated ('Tracking client — WO #…')
- Both 'Închide' cancel labels wrapped in __()
- Tracking modal widened to 'lg' so the QR + link input fit without overlap
- Notification 'Șablon aplicat' template built with __() so RU/EN see
translated pieces
- +16 translations covering the QR modal, Info tab, Închide etc.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+ Pod nou, Programare nouă (title), Subiect *, Data *, Schimb ulei + filtru
(placeholder), Ex: Curte 1, Pod 4, Atelier electric (placeholder).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds RU/EN for the strings still showing raw RO on /app/clients/*/edit:
Date generale, Persoană fizică, Persoană juridică, Contacte, Telefon
alternativ, Se completează automat…, Whatsapp, Viber, Telegram, Canal
marketing, Financiar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Post/mechanic meta 'h/zi' → __('h/zi') so RU shows 'ч/день', EN 'h/day'
- Wrap the 3 load-legend labels (0–5h/10, 5–8.5h/10, ≥9h/10) so 'h' → 'ч' on RU
- Split the long howto sentence so 'Pod'/'Mecanic' + 'Zile' translate
- Default fallback 'Pod 1 (default)' now uses __('Pod') + __('implicit')
Adds 5 new translations. Post NAMES themselves are DB rows (user data)
and are shown as-is — they're not translated by the app.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Batch pass covering the labels the user reported (Tarifare, Preț fix,
Piese impl., Specializare, Tarif/h) plus 270+ other short RO strings
that were still identity-fallback: Filament section titles, form-field
labels, table columns with explicit ->label(__()), buttons, notifications,
placeholders, helper texts, empty-state messages.
Down from ~514 to ~253 remaining identity-fallback RO strings — the rest
are mostly long help-text paragraphs which are lower priority.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Root cause of untranslated table headers: Filament's HasLabel::getLabel()
auto-generates a label from the field name (e.g. `name` → "Name") but only
calls __() on it if you also invoke ->translateLabel(). Without that, the
auto-generated label always renders in English regardless of app locale.
Fix: configureUsing() in AppServiceProvider makes translateLabel() the
default for every Column, BaseFilter, Field, Action and BulkAction.
Then added 175 human RU/EN translations for Filament's auto-generated
keys (Name, Phone, Email, Status, Balance, Created at, Plate, Make,
Model, Year, VIN, Mileage, Owner, Client, Vehicle, Amount, Total, Qty,
Actions, Search, Filter, Export, Import, plus enums/relationships).
All 306 tests pass. Deploy will fix table headers on
Clients / Vehicles / Work orders / Payments / Purchases / Suppliers etc.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>