57bdc1b594
Two fixes:
== 1. Language switcher (RO/RU/EN) in portal headers ==
New partial resources/views/partials/lang-switcher.blade.php with two
visual styles:
- style='chip' (default) — white-tinted glass for colored headers
(shop nav bar, tracking page hero)
- style='light' — outlined buttons for pale backgrounds (invitation
accept card)
Each button is a POST form to the existing /locale/{lang} route which:
- puts locale in session
- persists to user.locale if authenticated
- redirects back to the same page
Included in:
- resources/views/shop/layout.blade.php (right side of top nav,
after login/register)
- resources/views/tracking/show.blade.php (top-right of hero header,
absolutely positioned)
- resources/views/invitations/accept.blade.php (top-right of card,
above welcome heading, light style)
Current locale button is highlighted (opaque white on colored bg /
blue on pale bg). Others are muted until hovered.
Two new translation keys:
- portal.common.language (RO: Limbă / RU: Язык)
== 2. apply_margin toggle back in "Plată & total" ==
Previous session's edit didn't persist to the file. Now confirmed in
place: WorkOrderResource form's "Plată & total" section shows a
"Aplică marjă internă" toggle between discount_pct and
override_margin_pct. Gated by FINANCE_VIEW_INTERNAL_MARGIN so only
owner / admin / manager / accountant see it. Default = true.
When toggled off on a Fișă, WorkOrderWork::saving hook writes
salary_base = total for every line on that WO (no reduction).
Backend logic already in place — this commit fixes the missing UI
control.
Suite: 303 passed (840 assertions). Unchanged — refactor + view only.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
157 lines
7.7 KiB
PHP
157 lines
7.7 KiB
PHP
<?php
|
||
|
||
return [
|
||
// ─── Общие ───
|
||
'common' => [
|
||
'email' => 'Email',
|
||
'phone' => 'Телефон',
|
||
'name' => 'Имя',
|
||
'password' => 'Пароль',
|
||
'save' => 'Сохранить',
|
||
'cancel' => 'Отмена',
|
||
'back' => 'Назад',
|
||
'search' => 'Поиск',
|
||
'total' => 'Итого',
|
||
'yes' => 'Да',
|
||
'no' => 'Нет',
|
||
'required' => '*',
|
||
'currency_mdl' => 'MDL',
|
||
'powered_by' => 'Работает на AutoCRM',
|
||
'language' => 'Язык',
|
||
],
|
||
|
||
// ─── Приглашение ───
|
||
'invitation' => [
|
||
'title_accept' => 'Принять приглашение',
|
||
'welcome_name' => 'Добро пожаловать, :name!',
|
||
'welcome_body' => 'Вас пригласили в :company. Задайте пароль, чтобы активировать аккаунт.',
|
||
'new_password' => 'Новый пароль',
|
||
'confirm_password' => 'Подтвердите пароль',
|
||
'activate_account' => 'Активировать аккаунт',
|
||
'expired_title' => 'Приглашение просрочено',
|
||
'expired_body' => 'Срок действия ссылки истёк (максимум 7 дней). Попросите администратора выслать приглашение повторно.',
|
||
'invalid_title' => 'Недействительное приглашение',
|
||
'invalid_body' => 'Ссылка больше не действительна или уже была использована.',
|
||
],
|
||
|
||
// ─── Отслеживание заказ-наряда (публично) ───
|
||
'tracking' => [
|
||
'title_fisa' => 'Заказ-наряд #:number',
|
||
'ready_estimated' => 'Готово ориентировочно:',
|
||
'details' => 'Подробности',
|
||
'auto' => 'Автомобиль',
|
||
'mileage' => 'Пробег',
|
||
'opened' => 'Открыт',
|
||
'master' => 'Мастер',
|
||
'stages' => 'Этапы',
|
||
'what_asked' => 'Что вы просили',
|
||
'recommendations' => 'Рекомендации',
|
||
'photos' => 'Фотографии',
|
||
'approval_needed_title' => '⚠ Требуется ваше подтверждение',
|
||
'approval_needed_body' => 'Обнаружены дополнительные работы. Пожалуйста, примите решение ниже.',
|
||
'hours' => 'ч.',
|
||
'approve' => '✅ Согласен',
|
||
'decline' => '❌ Не согласен',
|
||
'unit_pcs' => 'шт.',
|
||
],
|
||
|
||
// ─── Магазин: навигация и лейаут ───
|
||
'shop' => [
|
||
'catalog' => 'Каталог',
|
||
'search_by_vin' => 'Поиск по VIN',
|
||
'cart' => '🛒 Корзина',
|
||
'login' => 'Войти',
|
||
'register' => 'Регистрация',
|
||
'logout' => 'Выйти',
|
||
|
||
// Каталог
|
||
'catalog_title' => 'Каталог запчастей',
|
||
'search_placeholder' => 'Найти по названию, коду, бренду, кросс-номеру…',
|
||
'all_categories' => 'Все категории',
|
||
'in_stock_only' => 'Только в наличии',
|
||
'no_parts_found' => 'Запчасти не найдены',
|
||
'no_parts_found_for' => 'Запчасти не найдены по запросу „:term"',
|
||
'in_stock' => '● В наличии',
|
||
'on_order' => '○ Под заказ',
|
||
'add_to_cart' => 'Добавить в корзину',
|
||
|
||
// Корзина
|
||
'cart_title' => 'Моя корзина',
|
||
'cart_empty' => 'Корзина пуста.',
|
||
'view_catalog' => 'Перейти в каталог',
|
||
'part' => 'Запчасть',
|
||
'price' => 'Цена',
|
||
'qty' => 'Кол-во',
|
||
'update_cart' => 'Обновить корзину',
|
||
'subtotal' => 'Промежуточный итог:',
|
||
'checkout_arrow' => 'Оформить заказ →',
|
||
|
||
// Оформление
|
||
'checkout_title' => 'Оформление заказа',
|
||
'full_name' => 'ФИО *',
|
||
'phone_req' => 'Телефон *',
|
||
'delivery_req' => 'Доставка *',
|
||
'address_delivery' => 'Адрес (для курьера/почты)',
|
||
'notes' => 'Комментарий',
|
||
'place_order' => 'Оформить заказ',
|
||
'summary' => 'Сводка',
|
||
'delivery_fee_note' => 'Стоимость доставки рассчитывается в зависимости от выбранного способа.',
|
||
|
||
// Статус заказа
|
||
'order_number' => 'Заказ',
|
||
'status' => 'Статус',
|
||
'products' => 'Товары',
|
||
'delivery' => 'Доставка',
|
||
'delivery_data' => 'Данные доставки',
|
||
'continue_shopping' => '← Продолжить покупки',
|
||
|
||
// Детали запчасти
|
||
'back_to_catalog' => '← Назад в каталог',
|
||
'brand_label' => 'Бренд:',
|
||
'code_label' => 'Код:',
|
||
'in_stock_qty' => '● В наличии (:qty :unit)',
|
||
'cross_refs_title' => 'Кросс-номера',
|
||
'description' => 'Описание',
|
||
|
||
// VIN
|
||
'vin_title' => 'Поиск запчастей по VIN',
|
||
'vin_intro' => 'Введите VIN-код (17 символов), чтобы мы определили автомобиль. Затем найдите запчасти в каталоге.',
|
||
'vin_decode' => 'Расшифровать',
|
||
'vin_invalid' => 'Неверный VIN — должно быть 17 символов.',
|
||
'vin_identified' => 'Автомобиль определён',
|
||
'vin_manufacturer' => 'Производитель',
|
||
'vin_year' => 'Год модели',
|
||
'vin_country' => 'Страна',
|
||
'vin_region' => 'Регион',
|
||
'vin_search_parts' => 'Найти запчасти для :maker →',
|
||
'vin_contact_note' => 'Для точного подбора по модели/двигателю свяжитесь с сервисом, указав этот VIN.',
|
||
'this_car' => 'этого автомобиля',
|
||
|
||
// Аккаунт
|
||
'my_account' => 'Мой аккаунт',
|
||
'hello_name' => 'Привет, :name!',
|
||
'contact_data' => 'Контактные данные',
|
||
'my_orders' => 'Мои заказы (:count)',
|
||
'no_orders_yet' => 'У вас пока нет заказов.',
|
||
'order_nr' => '№',
|
||
'order_date' => 'Дата',
|
||
'order_items' => 'Позиции',
|
||
'order_details_arrow' => 'Подробнее →',
|
||
|
||
// Аутентификация
|
||
'signin_title' => 'Войти в аккаунт',
|
||
'signin_button' => 'Войти',
|
||
'forgot_password' => 'Забыли пароль',
|
||
'no_account' => 'Нет аккаунта?',
|
||
'register_title' => 'Регистрация аккаунта',
|
||
'register_button' => 'Создать аккаунт',
|
||
'have_account' => 'Уже есть аккаунт?',
|
||
'forgot_title' => 'Забыли пароль',
|
||
'forgot_intro' => 'Введите email, с которым регистрировались — вышлем ссылку для сброса.',
|
||
'send_reset_link' => 'Выслать ссылку',
|
||
'back_to_login' => '← Вернуться ко входу',
|
||
'reset_title' => 'Задать новый пароль',
|
||
'reset_button' => 'Установить пароль',
|
||
],
|
||
];
|