update
This commit is contained in:
BIN
wp-content/.DS_Store
vendored
Normal file
BIN
wp-content/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
wp-content/languages/.DS_Store
vendored
Normal file
BIN
wp-content/languages/.DS_Store
vendored
Normal file
Binary file not shown.
22
wp-content/mu-plugins/fix-sprintf-global.php
Normal file
22
wp-content/mu-plugins/fix-sprintf-global.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugin Name: Fix: global sprintf backfill
|
||||
* Description: Przywraca globalny `window.sprintf` dla pluginów liczących na starsze API wp.i18n (np. Automatic Translate Addon For Polylang). Naprawia "ReferenceError: sprintf is not defined" w bulk translate.
|
||||
* Version: 1.0.0
|
||||
* Author: Carei
|
||||
*
|
||||
* Musi leżeć w wp-content/mu-plugins/ — WP ładuje stąd automatycznie, bez aktywacji.
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
add_action( 'admin_enqueue_scripts', function () {
|
||||
wp_enqueue_script( 'wp-i18n' );
|
||||
wp_add_inline_script(
|
||||
'wp-i18n',
|
||||
'if (window.wp && window.wp.i18n && typeof window.sprintf === "undefined") { window.sprintf = window.wp.i18n.sprintf; }',
|
||||
'after'
|
||||
);
|
||||
}, 999 );
|
||||
BIN
wp-content/plugins/.DS_Store
vendored
Normal file
BIN
wp-content/plugins/.DS_Store
vendored
Normal file
Binary file not shown.
@@ -1647,3 +1647,94 @@ button.carei-reservation-trigger:hover {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
/* ──────────────────────────────────────────────────────────────
|
||||
Flatpickr — compact theme + Carei colors
|
||||
────────────────────────────────────────────────────────────── */
|
||||
.flatpickr-calendar {
|
||||
width: 260px !important;
|
||||
font-size: 13px !important;
|
||||
box-shadow: 0 6px 20px rgba(47, 36, 130, 0.15);
|
||||
border-radius: 8px;
|
||||
}
|
||||
.flatpickr-calendar.open { z-index: 100000; }
|
||||
.flatpickr-months { padding: 4px 0; }
|
||||
.flatpickr-month { height: 28px; }
|
||||
.flatpickr-current-month {
|
||||
font-size: 13px;
|
||||
padding: 4px 0 0 0;
|
||||
height: 24px;
|
||||
}
|
||||
.flatpickr-current-month .flatpickr-monthDropdown-months,
|
||||
.flatpickr-current-month input.cur-year {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.flatpickr-prev-month,
|
||||
.flatpickr-next-month {
|
||||
padding: 4px 8px;
|
||||
height: 28px;
|
||||
}
|
||||
.flatpickr-prev-month svg,
|
||||
.flatpickr-next-month svg { width: 12px; height: 12px; }
|
||||
.flatpickr-weekdays { height: 24px; }
|
||||
.flatpickr-weekday {
|
||||
font-size: 11px !important;
|
||||
font-weight: 600;
|
||||
color: #6b6b8a !important;
|
||||
}
|
||||
.dayContainer {
|
||||
padding: 2px;
|
||||
width: 252px;
|
||||
min-width: 252px;
|
||||
max-width: 252px;
|
||||
}
|
||||
.flatpickr-day {
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
font-size: 12px;
|
||||
max-width: 32px;
|
||||
border-radius: 4px;
|
||||
margin: 1px 0;
|
||||
}
|
||||
.flatpickr-day.today { border-color: #2F2482; }
|
||||
.flatpickr-day.selected,
|
||||
.flatpickr-day.startRange,
|
||||
.flatpickr-day.endRange,
|
||||
.flatpickr-day.selected:hover {
|
||||
background: #2F2482 !important;
|
||||
border-color: #2F2482 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
.flatpickr-day:hover,
|
||||
.flatpickr-day.prevMonthDay:hover,
|
||||
.flatpickr-day.nextMonthDay:hover {
|
||||
background: rgba(47, 36, 130, 0.08);
|
||||
}
|
||||
.flatpickr-time {
|
||||
height: 32px;
|
||||
border-top: 1px solid rgba(47, 36, 130, 0.12);
|
||||
}
|
||||
.flatpickr-time input {
|
||||
font-size: 13px;
|
||||
height: 32px;
|
||||
}
|
||||
.flatpickr-time .flatpickr-time-separator,
|
||||
.flatpickr-time .flatpickr-am-pm {
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.flatpickr-time input:hover,
|
||||
.flatpickr-time input:focus {
|
||||
background: rgba(47, 36, 130, 0.05);
|
||||
}
|
||||
.flatpickr-time .numInputWrapper span {
|
||||
width: 12px;
|
||||
height: 50%;
|
||||
}
|
||||
@media (max-width: 380px) {
|
||||
.flatpickr-calendar { width: calc(100vw - 24px) !important; }
|
||||
.dayContainer { width: 100%; min-width: 0; max-width: 100%; }
|
||||
.flatpickr-day { max-width: none; }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,26 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
// ─── i18n Helpers ─────────────────────────────────────────────
|
||||
var I18N = (window.careiI18n || {});
|
||||
function t(key, fallback) {
|
||||
return (key in I18N) ? I18N[key] : (fallback || key);
|
||||
}
|
||||
function tFmt(key, params, fallback) {
|
||||
var str = t(key, fallback);
|
||||
if (params && typeof str === 'string') {
|
||||
Object.keys(params).forEach(function (k) {
|
||||
str = str.replace(new RegExp('%' + k + '%', 'g'), params[k]);
|
||||
});
|
||||
}
|
||||
return str;
|
||||
}
|
||||
function pluralPl(n, one, few, many) {
|
||||
if (n === 1) return one;
|
||||
if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) return few;
|
||||
return many;
|
||||
}
|
||||
|
||||
var REST_URL = (window.careiReservation && window.careiReservation.restUrl) || '/wp-json/carei/v1/';
|
||||
var NONCE = (window.careiReservation && window.careiReservation.nonce) || '';
|
||||
|
||||
@@ -48,13 +68,13 @@
|
||||
if (!r.ok) {
|
||||
var status = r.status;
|
||||
return r.json().then(function (body) {
|
||||
var msg = (body && body.message) || (body && body.detail) || ('Błąd API: HTTP ' + status);
|
||||
var msg = (body && body.message) || (body && body.detail) || tFmt('errorApiHttp', {status: status}, 'Błąd API: HTTP %status%');
|
||||
var err = new Error(msg);
|
||||
err.httpStatus = status;
|
||||
throw err;
|
||||
}).catch(function (parseErr) {
|
||||
if (parseErr.httpStatus) throw parseErr;
|
||||
var err = new Error('Błąd API: HTTP ' + status);
|
||||
var err = new Error(tFmt('errorApiHttp', {status: status}, 'Błąd API: HTTP %status%'));
|
||||
err.httpStatus = status;
|
||||
throw err;
|
||||
});
|
||||
@@ -64,13 +84,13 @@
|
||||
|
||||
function handleFetchError(err, retryFn, isRetry) {
|
||||
if (err.name === 'AbortError') {
|
||||
throw new Error('Przekroczono czas oczekiwania. Spróbuj ponownie.');
|
||||
throw new Error(t('errorTimeout', 'Przekroczono czas oczekiwania. Spróbuj ponownie.'));
|
||||
}
|
||||
if (err instanceof TypeError && !isRetry) {
|
||||
return retryFn();
|
||||
}
|
||||
if (err instanceof TypeError) {
|
||||
throw new Error('Brak połączenia z serwerem. Sprawdź internet i spróbuj ponownie.');
|
||||
throw new Error(t('errorNetwork', 'Brak połączenia z serwerem. Sprawdź internet i spróbuj ponownie.'));
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
@@ -79,7 +99,7 @@
|
||||
|
||||
var overlay, form, segmentSelect, dateFrom, dateTo, daysCount;
|
||||
var pickupSelect, returnSelect, returnWrap, sameReturnCheck;
|
||||
var extrasWrapper, extrasContainer, insuranceContainer, abroadSection, abroadToggle, abroadSearch, abroadInput, abroadResults, abroadSelected, errorSummary;
|
||||
var extrasWrapper, extrasContainer, abroadSection, abroadToggle, abroadSearch, abroadInput, abroadResults, abroadSelected, errorSummary;
|
||||
var summaryOverlay, summaryDetails, summaryTable, summaryTotal, summaryError;
|
||||
var summaryBack, summaryConfirm;
|
||||
var successView, successNumber, successClose;
|
||||
@@ -104,7 +124,6 @@
|
||||
sameReturnCheck = document.getElementById('carei-same-return');
|
||||
extrasWrapper = document.getElementById('carei-extras-wrapper');
|
||||
extrasContainer = document.getElementById('carei-extras-container');
|
||||
insuranceContainer = document.getElementById('carei-insurance-container');
|
||||
protectionContainer = document.getElementById('carei-protection-packages-container');
|
||||
abroadSection = document.getElementById('carei-abroad-section');
|
||||
abroadToggle = document.getElementById('carei-abroad-toggle');
|
||||
@@ -127,6 +146,89 @@
|
||||
successClose = document.getElementById('carei-success-close');
|
||||
}
|
||||
|
||||
// ─── Flatpickr date pickers (cross-browser, locale-aware) ─────
|
||||
// If Flatpickr fails to load (CDN blocked, network, etc.), fall back gracefully
|
||||
// to native <input type="datetime-local"> — never break date picking.
|
||||
function initDatePickers() {
|
||||
if (typeof window.flatpickr !== 'function') {
|
||||
console.warn('[carei] Flatpickr not loaded — keeping native datetime-local picker.');
|
||||
return;
|
||||
}
|
||||
var isEn = (document.documentElement.lang || '').toLowerCase().indexOf('en') === 0;
|
||||
var locale = 'default';
|
||||
if (!isEn && window.flatpickr.l10ns && window.flatpickr.l10ns.pl) {
|
||||
locale = window.flatpickr.l10ns.pl;
|
||||
}
|
||||
var baseOpts = {
|
||||
enableTime: true,
|
||||
time_24hr: true,
|
||||
dateFormat: 'Y-m-d\\TH:i',
|
||||
altInput: true,
|
||||
altFormat: isEn ? 'Y-m-d H:i' : 'd.m.Y H:i',
|
||||
minuteIncrement: 15,
|
||||
minDate: 'today',
|
||||
locale: locale,
|
||||
allowInput: false,
|
||||
// Force Flatpickr on mobile too (otherwise falls back to native iOS/Android picker — inconsistent look, locale = OS)
|
||||
disableMobile: true,
|
||||
// With enableTime, flatpickr doesn't auto-close on date click (time still editable).
|
||||
// Auto-close 1.5s after last change — gives user time to adjust time, then dismisses.
|
||||
onChange: function (selectedDates, dateStr, instance) {
|
||||
if (instance._careiCloseTimer) clearTimeout(instance._careiCloseTimer);
|
||||
instance._careiCloseTimer = setTimeout(function () {
|
||||
instance.close();
|
||||
}, 1500);
|
||||
}
|
||||
};
|
||||
|
||||
// Modal inputs — use static:true so popup renders INSIDE input container
|
||||
// (bypasses focus trap + z-index conflicts with modal overlay).
|
||||
var modalTargets = [dateFrom, dateTo];
|
||||
// Hero search inputs — render popup to body (default behavior is fine, no modal).
|
||||
var heroTargets = [
|
||||
document.getElementById('carei-search-date-from'),
|
||||
document.getElementById('carei-search-date-to')
|
||||
];
|
||||
|
||||
function attach(el, opts) {
|
||||
if (!el) return;
|
||||
// If already initialized, destroy previous instance (idempotent re-init)
|
||||
if (el._flatpickr) {
|
||||
try { el._flatpickr.destroy(); } catch (e) {}
|
||||
}
|
||||
try {
|
||||
el.setAttribute('type', 'text');
|
||||
window.flatpickr(el, opts);
|
||||
// Bind click on the whole field container — any click (icon, label, padding, input)
|
||||
// opens the flatpickr. Simplest UX.
|
||||
var field = el.closest('.carei-form__field--date') || el.closest('.carei-search-form__field');
|
||||
if (field && !field.dataset.careiFpBound) {
|
||||
field.dataset.careiFpBound = '1';
|
||||
field.style.cursor = 'pointer';
|
||||
var lastCloseAt = 0;
|
||||
if (el._flatpickr) {
|
||||
var origOnClose = el._flatpickr.config.onClose || [];
|
||||
el._flatpickr.config.onClose = (Array.isArray(origOnClose) ? origOnClose.slice() : [origOnClose]).concat([function () { lastCloseAt = Date.now(); }]);
|
||||
}
|
||||
field.addEventListener('click', function (e) {
|
||||
// Ignore clicks that originated inside the flatpickr popup itself.
|
||||
if (e.target.closest && e.target.closest('.flatpickr-calendar')) return;
|
||||
// Debounce: if we just closed (within 300ms, e.g. via date selection), don't reopen.
|
||||
if (Date.now() - lastCloseAt < 300) return;
|
||||
if (el._flatpickr) el._flatpickr.open();
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('[carei] Flatpickr init failed for', el.id, err);
|
||||
try { el.setAttribute('type', 'datetime-local'); } catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
var modalOpts = Object.assign({}, baseOpts, { static: true });
|
||||
modalTargets.forEach(function (el) { attach(el, modalOpts); });
|
||||
heroTargets.forEach(function (el) { attach(el, baseOpts); });
|
||||
}
|
||||
|
||||
// ─── State ────────────────────────────────────────────────────
|
||||
|
||||
var mapData = null;
|
||||
@@ -247,23 +349,23 @@
|
||||
if (Array.isArray(classes) && classes.length > 0) {
|
||||
allSegments = classes.map(function (c) {
|
||||
var val = typeof c === 'string' ? c : (c.name || c);
|
||||
var label = typeof c === 'string' ? ('Segment ' + c) : (c.description || c.name || c);
|
||||
var label = typeof c === 'string' ? tFmt('segmentLabel', {name: c}, 'Segment %name%') : (c.description || c.name || c);
|
||||
return { value: val, label: label };
|
||||
});
|
||||
populateSelect(segmentSelect, allSegments, 'Wybierz segment pojazdu');
|
||||
populateSelect(segmentSelect, allSegments, t('selectSegment', 'Wybierz segment pojazdu'));
|
||||
} else {
|
||||
populateSelect(segmentSelect, [], 'Brak segmentów');
|
||||
populateSelect(segmentSelect, [], t('noSegments', 'Brak segmentów'));
|
||||
}
|
||||
if (segmentSelect) setSelectLoading(segmentSelect, false);
|
||||
|
||||
if (pickupSelect) {
|
||||
populateSelect(pickupSelect, [], 'Najpierw wybierz segment');
|
||||
populateSelect(pickupSelect, [], t('pickupPlaceholder', 'Najpierw wybierz segment'));
|
||||
pickupSelect.disabled = true;
|
||||
}
|
||||
}).catch(function (err) {
|
||||
console.error('Failed to load initial data:', err);
|
||||
if (segmentSelect) {
|
||||
populateSelect(segmentSelect, [], 'Błąd ładowania');
|
||||
populateSelect(segmentSelect, [], t('errorLoading', 'Błąd ładowania'));
|
||||
setSelectLoading(segmentSelect, false);
|
||||
}
|
||||
});
|
||||
@@ -274,7 +376,7 @@
|
||||
function onSegmentChange() {
|
||||
var selectedSegment = segmentSelect ? segmentSelect.value : '';
|
||||
if (!selectedSegment || !mapData || !pickupSelect) {
|
||||
if (pickupSelect) { populateSelect(pickupSelect, [], 'Najpierw wybierz segment'); pickupSelect.disabled = true; }
|
||||
if (pickupSelect) { populateSelect(pickupSelect, [], t('pickupPlaceholder', 'Najpierw wybierz segment')); pickupSelect.disabled = true; }
|
||||
hideExtras();
|
||||
return;
|
||||
}
|
||||
@@ -289,10 +391,10 @@
|
||||
}
|
||||
});
|
||||
if (filteredOptions.length > 0) {
|
||||
populateSelect(pickupSelect, filteredOptions, 'Miejsce odbioru');
|
||||
populateSelect(pickupSelect, filteredOptions, t('pickupLabel', 'Miejsce odbioru'));
|
||||
pickupSelect.disabled = false;
|
||||
} else {
|
||||
populateSelect(pickupSelect, [], 'Brak lokalizacji dla tego segmentu');
|
||||
populateSelect(pickupSelect, [], t('noPickupForSegment', 'Brak lokalizacji dla tego segmentu'));
|
||||
pickupSelect.disabled = true;
|
||||
}
|
||||
if (returnSelect) {
|
||||
@@ -301,7 +403,7 @@
|
||||
if (b.city) label += ' — ' + b.city;
|
||||
return { value: b.name, label: label };
|
||||
});
|
||||
populateSelect(returnSelect, returnOptions, 'Miejsce zwrotu');
|
||||
populateSelect(returnSelect, returnOptions, t('returnLabel', 'Miejsce zwrotu'));
|
||||
}
|
||||
hideExtras();
|
||||
}
|
||||
@@ -353,7 +455,7 @@
|
||||
function checkPastAndWarn(input, label) {
|
||||
if (!input || !input.value) return;
|
||||
if (input.value < getNowLocal()) {
|
||||
warnPastDate(input, label + ' — data lub godzina już minęły');
|
||||
warnPastDate(input, tFmt('warnPastDate', {label: label}, '%label% — data lub godzina już minęły'));
|
||||
} else {
|
||||
clearDateError(input);
|
||||
}
|
||||
@@ -367,13 +469,13 @@
|
||||
if (!dateMinListenersBound) {
|
||||
if (dateFrom) {
|
||||
dateFrom.addEventListener('change', function () {
|
||||
checkPastAndWarn(dateFrom, 'Rozpoczęcie');
|
||||
checkPastAndWarn(dateFrom, t('dateStart', 'Rozpoczęcie'));
|
||||
if (dateTo && dateFrom.value) dateTo.setAttribute('min', dateFrom.value);
|
||||
});
|
||||
}
|
||||
if (dateTo) {
|
||||
dateTo.addEventListener('change', function () {
|
||||
checkPastAndWarn(dateTo, 'Zakończenie');
|
||||
checkPastAndWarn(dateTo, t('dateEnd', 'Zakończenie'));
|
||||
});
|
||||
}
|
||||
dateMinListenersBound = true;
|
||||
@@ -417,16 +519,18 @@
|
||||
if (!dateFrom || !dateTo || !daysCount) return;
|
||||
var from = new Date(dateFrom.value), to = new Date(dateTo.value);
|
||||
if (isNaN(from.getTime()) || isNaN(to.getTime()) || to <= from) {
|
||||
daysCount.innerHTML = 'Wybrano: <strong>0 dni</strong>'; return;
|
||||
daysCount.innerHTML = tFmt('daysCount', {count: 0, unit: t('dayMany', 'dni')}, 'Wybrano: <strong>%count% %unit%</strong>'); return;
|
||||
}
|
||||
var diff = Math.ceil((to - from) / 86400000);
|
||||
daysCount.innerHTML = 'Wybrano: <strong>' + diff + ' ' + (diff === 1 ? 'dzień' : 'dni') + '</strong>';
|
||||
var dayUnit = diff === 1 ? t('dayWord', 'dzień') : t('daysWord', 'dni');
|
||||
daysCount.innerHTML = tFmt('daysCount', {count: diff, unit: dayUnit}, 'Wybrano: <strong>%count% %unit%</strong>');
|
||||
}
|
||||
|
||||
// ─── Protection Packages (WP-managed: SOFT, PREMIUM) ──────────
|
||||
|
||||
function loadProtectionPackages() {
|
||||
return fetch(REST_URL + 'protection-packages', {
|
||||
var lang = (document.documentElement.lang || '').toLowerCase().indexOf('en') === 0 ? 'en' : 'pl';
|
||||
return fetch(REST_URL + 'protection-packages?lang=' + lang, {
|
||||
credentials: 'same-origin'
|
||||
}).then(function (r) { return r.ok ? r.json() : null; })
|
||||
.then(function (data) {
|
||||
@@ -444,7 +548,7 @@
|
||||
var pkg = protectionPackages[key];
|
||||
if (!pkg) return;
|
||||
var price = parseFloat(pkg.pricePerDay || 0);
|
||||
var priceLabel = price > 0 ? price.toFixed(0) + ' zł/doba' : 'Gratis';
|
||||
var priceLabel = price > 0 ? tFmt('pricePerDay', {price: price.toFixed(0)}, '%price% zł/doba') : t('free', 'Gratis');
|
||||
var descHtml = pkg.description ? '<span class="carei-form__protection-package__desc">' + escHtml(pkg.description) + '</span>' : '';
|
||||
var card = document.createElement('label');
|
||||
card.className = 'carei-form__protection-package';
|
||||
@@ -500,7 +604,7 @@
|
||||
var pricelist = pricelists[0];
|
||||
currentPriceListId = pricelist.id;
|
||||
var items = pricelist.additionalItems;
|
||||
var insuranceItems = [], extraItems = [];
|
||||
var extraItems = [];
|
||||
abroadItems = [];
|
||||
selectedCountries = {};
|
||||
if (Array.isArray(items)) {
|
||||
@@ -510,19 +614,20 @@
|
||||
var code = (item.code || '').toUpperCase();
|
||||
if (code.indexOf('BRAK') === 0 || code.indexOf('BRUD') === 0 || code.indexOf('KARA') === 0 ||
|
||||
code.indexOf('MYCIE USŁU') === 0 || code === 'MYJ WEW') return;
|
||||
// Drop Softra-insurance items — pakiety ochronne są zarządzane w panelu WP (SOFT/PREMIUM).
|
||||
if (name.indexOf('ubezp') !== -1 || name.indexOf('ochrony') !== -1 ||
|
||||
name.indexOf('zniesienie') !== -1 || name.indexOf('insurance') !== -1) {
|
||||
return;
|
||||
}
|
||||
if (name.indexOf('wyjazd za granic') !== -1) {
|
||||
item._countryName = parseCountryName(item.name);
|
||||
item._countryFlag = getCountryFlag(item._countryName);
|
||||
abroadItems.push(item);
|
||||
} else if (name.indexOf('ubezp') !== -1 || name.indexOf('ochrony') !== -1 ||
|
||||
name.indexOf('zniesienie') !== -1 || name.indexOf('insurance') !== -1) {
|
||||
insuranceItems.push(item);
|
||||
} else {
|
||||
extraItems.push(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (insuranceContainer) { insuranceContainer.innerHTML = ''; insuranceItems.forEach(function (item) { insuranceContainer.appendChild(buildExtraCard(item)); }); }
|
||||
if (extrasContainer) { extrasContainer.innerHTML = ''; extraItems.forEach(function (item) { extrasContainer.appendChild(buildExtraCard(item)); }); }
|
||||
if (abroadSection) { abroadSection.style.display = abroadItems.length > 0 ? '' : 'none'; }
|
||||
renderAbroadSelected();
|
||||
@@ -533,8 +638,12 @@
|
||||
var price = parseFloat(item.price || item.minPrice || 0);
|
||||
var maxPrice = parseFloat(item.maxPrice || 0);
|
||||
var priceLabel = (maxPrice > 0 && maxPrice !== price)
|
||||
? 'od ' + price.toFixed(0) + ' do ' + maxPrice.toFixed(0) + ' zł'
|
||||
: (price > 0 ? price.toFixed(0) + ' zł' + (item.unit === 'doba' ? '/doba' : '') : 'Gratis');
|
||||
? tFmt('priceRange', {min: price.toFixed(0), max: maxPrice.toFixed(0)}, 'od %min% do %max% zł')
|
||||
: (price > 0
|
||||
? (item.unit === 'doba'
|
||||
? tFmt('pricePerDay', {price: price.toFixed(0)}, '%price% zł/doba')
|
||||
: tFmt('priceSimple', {price: price.toFixed(0)}, '%price% zł'))
|
||||
: t('free', 'Gratis'));
|
||||
var card = document.createElement('div');
|
||||
card.className = 'carei-form__extra-card';
|
||||
card.innerHTML =
|
||||
@@ -652,7 +761,7 @@
|
||||
function buildCountryCard(item, isSelected) {
|
||||
var id = item.id || item.code;
|
||||
var price = parseFloat(item.price || item.minPrice || 0);
|
||||
var priceHtml = '<span class="carei-abroad__price-val">' + (price > 0 ? price.toFixed(0) + ' zł' : 'Gratis') + '</span>';
|
||||
var priceHtml = '<span class="carei-abroad__price-val">' + (price > 0 ? tFmt('priceSimple', {price: price.toFixed(0)}, '%price% zł') : t('free', 'Gratis')) + '</span>';
|
||||
|
||||
var card = document.createElement('div');
|
||||
card.className = 'carei-abroad__card' + (isSelected ? ' carei-abroad__card--selected' : '');
|
||||
@@ -660,7 +769,7 @@
|
||||
'<span class="carei-abroad__flag">' + escHtml(item._countryFlag) + '</span>' +
|
||||
'<span class="carei-abroad__name">' + escHtml(item._countryName) + '</span>' +
|
||||
'<span class="carei-abroad__price">' + priceHtml + '</span>' +
|
||||
'<span role="button" tabindex="0" class="carei-abroad__action" data-abroad-id="' + escAttr(id) + '" title="' + (isSelected ? 'Usuń' : 'Dodaj') + '">' +
|
||||
'<span role="button" tabindex="0" class="carei-abroad__action" data-abroad-id="' + escAttr(id) + '" title="' + (isSelected ? t('btnRemove', 'Usuń') : t('btnAdd', 'Dodaj')) + '">' +
|
||||
(isSelected
|
||||
? '<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M3 3l8 8M11 3l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'
|
||||
: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 2v10M2 7h10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'
|
||||
@@ -694,7 +803,7 @@
|
||||
if (!select) return;
|
||||
select.innerHTML = '';
|
||||
var ph = document.createElement('option');
|
||||
ph.value = ''; ph.disabled = true; ph.selected = true; ph.textContent = placeholder || 'Wybierz...';
|
||||
ph.value = ''; ph.disabled = true; ph.selected = true; ph.textContent = placeholder || t('selectPlaceholder', 'Wybierz...');
|
||||
select.appendChild(ph);
|
||||
options.forEach(function (opt) {
|
||||
var o = document.createElement('option');
|
||||
@@ -720,15 +829,15 @@
|
||||
// ─── Validation ───────────────────────────────────────────────
|
||||
|
||||
var requiredFields = [
|
||||
{ id: 'carei-segment', type: 'select', msg: 'Wybierz segment pojazdu' },
|
||||
{ id: 'carei-date-from', type: 'input', msg: 'Podaj datę rozpoczęcia' },
|
||||
{ id: 'carei-date-to', type: 'input', msg: 'Podaj datę zakończenia' },
|
||||
{ id: 'carei-pickup-branch', type: 'select', msg: 'Wybierz miejsce odbioru' },
|
||||
{ id: 'carei-firstname', type: 'input', msg: 'Podaj imię' },
|
||||
{ id: 'carei-lastname', type: 'input', msg: 'Podaj nazwisko' },
|
||||
{ id: 'carei-email', type: 'email', msg: 'Podaj poprawny adres e-mail' },
|
||||
{ id: 'carei-phone', type: 'phone', msg: 'Podaj numer telefonu (min. 9 cyfr)' },
|
||||
{ id: 'carei-privacy', type: 'checkbox', msg: 'Wymagana zgoda na Politykę Prywatności' }
|
||||
{ id: 'carei-segment', type: 'select', msgKey: 'selectSegment', msgFallback: 'Wybierz segment pojazdu' },
|
||||
{ id: 'carei-date-from', type: 'input', msgKey: 'enterDateFrom', msgFallback: 'Podaj datę rozpoczęcia' },
|
||||
{ id: 'carei-date-to', type: 'input', msgKey: 'enterDateTo', msgFallback: 'Podaj datę zakończenia' },
|
||||
{ id: 'carei-pickup-branch', type: 'select', msgKey: 'selectPickup', msgFallback: 'Wybierz miejsce odbioru' },
|
||||
{ id: 'carei-firstname', type: 'input', msgKey: 'enterFirstName', msgFallback: 'Podaj imię' },
|
||||
{ id: 'carei-lastname', type: 'input', msgKey: 'enterLastName', msgFallback: 'Podaj nazwisko' },
|
||||
{ id: 'carei-email', type: 'email', msgKey: 'enterEmail', msgFallback: 'Podaj poprawny adres e-mail' },
|
||||
{ id: 'carei-phone', type: 'phone', msgKey: 'enterPhone', msgFallback: 'Podaj numer telefonu (min. 9 cyfr)' },
|
||||
{ id: 'carei-privacy', type: 'checkbox', msgKey: 'privacyRequired', msgFallback: 'Wymagana zgoda na Politykę Prywatności' }
|
||||
];
|
||||
|
||||
function validateForm() {
|
||||
@@ -747,23 +856,23 @@
|
||||
else if (f.type === 'pesel') { if (!/^\d{11}$/.test(el.value.trim())) hasError = true; }
|
||||
else if (f.type === 'select') { if (!el.value) hasError = true; }
|
||||
else { if (!el.value.trim()) hasError = true; }
|
||||
if (hasError) { valid = false; markFieldError(el, f.msg, f.type); }
|
||||
if (hasError) { valid = false; markFieldError(el, t(f.msgKey, f.msgFallback), f.type); }
|
||||
});
|
||||
|
||||
var now = new Date();
|
||||
if (dateFrom && dateFrom.value && new Date(dateFrom.value) < now) {
|
||||
valid = false; markFieldError(dateFrom, 'Data lub godzina rozpoczęcia już minęły', 'input');
|
||||
valid = false; markFieldError(dateFrom, t('dateStartPast', 'Data lub godzina rozpoczęcia już minęły'), 'input');
|
||||
}
|
||||
if (dateTo && dateTo.value && new Date(dateTo.value) < now) {
|
||||
valid = false; markFieldError(dateTo, 'Data lub godzina zakończenia już minęły', 'input');
|
||||
valid = false; markFieldError(dateTo, t('dateEndPast', 'Data lub godzina zakończenia już minęły'), 'input');
|
||||
}
|
||||
if (dateFrom && dateTo && dateFrom.value && dateTo.value) {
|
||||
if (new Date(dateTo.value) <= new Date(dateFrom.value)) {
|
||||
valid = false; markFieldError(dateTo, 'Data zakończenia musi być po dacie rozpoczęcia', 'input');
|
||||
valid = false; markFieldError(dateTo, t('dateEndAfterStart', 'Data zakończenia musi być po dacie rozpoczęcia'), 'input');
|
||||
}
|
||||
}
|
||||
if (sameReturnCheck && !sameReturnCheck.checked && returnSelect && !returnSelect.value) {
|
||||
valid = false; markFieldError(returnSelect, 'Wybierz miejsce zwrotu', 'select');
|
||||
valid = false; markFieldError(returnSelect, t('selectReturn', 'Wybierz miejsce zwrotu'), 'select');
|
||||
}
|
||||
if (errorSummary) errorSummary.style.display = valid ? 'none' : 'block';
|
||||
return valid;
|
||||
@@ -826,11 +935,11 @@
|
||||
if (state === 'loading') {
|
||||
btn.disabled = true;
|
||||
btn.setAttribute('aria-busy', 'true');
|
||||
btn.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> Przetwarzanie...';
|
||||
btn.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> ' + escHtml(t('btnProcessing', 'Przetwarzanie...'));
|
||||
} else {
|
||||
btn.disabled = false;
|
||||
btn.setAttribute('aria-busy', 'false');
|
||||
btn.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> Wyślij';
|
||||
btn.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> ' + escHtml(t('btnSubmit', 'Wyślij'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -859,7 +968,7 @@
|
||||
function createCustomerAndShowSummary() {
|
||||
var fd = collectFormData();
|
||||
hideSummaryError();
|
||||
announce('Ładowanie podsumowania...');
|
||||
announce(t('loadingSummary', 'Ładowanie podsumowania...'));
|
||||
|
||||
apiPost('customer', {
|
||||
firstName: fd.firstName,
|
||||
@@ -878,11 +987,11 @@
|
||||
currentCustomerId = res.customerId;
|
||||
return loadPricingSummary(fd);
|
||||
}
|
||||
throw new Error(res.rejectReason || 'Nie udało się utworzyć klienta');
|
||||
throw new Error(res.rejectReason || t('errorCustomerCreate', 'Nie udało się utworzyć klienta'));
|
||||
}).catch(function (err) {
|
||||
console.error('Customer creation failed:', err);
|
||||
setSubmitState('ready');
|
||||
showFormError('Błąd tworzenia klienta: ' + err.message);
|
||||
showFormError(tFmt('errorCustomerCreatePrefix', {msg: err.message}, 'Błąd tworzenia klienta: %msg%'));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -905,7 +1014,7 @@
|
||||
}).catch(function (err) {
|
||||
console.error('Pricing summary failed:', err);
|
||||
setSubmitState('ready');
|
||||
showFormError('Błąd pobierania podsumowania: ' + err.message);
|
||||
showFormError(tFmt('errorSummaryPrefix', {msg: err.message}, 'Błąd pobierania podsumowania: %msg%'));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -965,7 +1074,12 @@
|
||||
function buildBookingComments(userMessage) {
|
||||
var pkg = getSelectedProtectionPayload();
|
||||
if (!pkg) return userMessage || '';
|
||||
var pkgLine = 'Pakiet ochronny: ' + pkg.name + ' — ' + pkg.pricePerDay.toFixed(2) + ' zł/doba × ' + pkg.days + ' = ' + pkg.total.toFixed(2) + ' zł (do doliczenia poza systemem)';
|
||||
var pkgLine = tFmt('protectionComment', {
|
||||
name: pkg.name,
|
||||
perDay: pkg.pricePerDay.toFixed(2),
|
||||
days: pkg.days,
|
||||
total: pkg.total.toFixed(2)
|
||||
}, 'Pakiet ochronny: %name% — %perDay% zł/doba × %days% = %total% zł (do doliczenia poza systemem)');
|
||||
return userMessage ? (pkgLine + '\n\n' + userMessage) : pkgLine;
|
||||
}
|
||||
|
||||
@@ -1023,7 +1137,7 @@
|
||||
|
||||
// Animated transition: form → summary
|
||||
transitionStep(form, summaryOverlay, function () {
|
||||
announce('Podsumowanie rezerwacji');
|
||||
announce(t('announceSummary', 'Podsumowanie rezerwacji'));
|
||||
var title = summaryOverlay.querySelector('.carei-summary__title');
|
||||
if (title) title.focus();
|
||||
});
|
||||
@@ -1039,40 +1153,40 @@
|
||||
returnLabel = returnSelect.options[returnSelect.selectedIndex].text;
|
||||
}
|
||||
var html =
|
||||
'<div><strong>Segment:</strong> ' + escHtml(segLabel) + '</div>' +
|
||||
'<div><strong>Od:</strong> ' + escHtml(fd.dateFrom.replace('T', ' ')) + '</div>' +
|
||||
'<div><strong>Do:</strong> ' + escHtml(fd.dateTo.replace('T', ' ')) + '</div>' +
|
||||
'<div><strong>Miejsce odbioru:</strong> ' + escHtml(pickupLabel) + '</div>';
|
||||
'<div><strong>' + escHtml(t('labelSegment', 'Segment')) + ':</strong> ' + escHtml(segLabel) + '</div>' +
|
||||
'<div><strong>' + escHtml(t('labelFrom', 'Od')) + ':</strong> ' + escHtml(fd.dateFrom.replace('T', ' ')) + '</div>' +
|
||||
'<div><strong>' + escHtml(t('labelTo', 'Do')) + ':</strong> ' + escHtml(fd.dateTo.replace('T', ' ')) + '</div>' +
|
||||
'<div><strong>' + escHtml(t('labelPickup', 'Miejsce odbioru')) + ':</strong> ' + escHtml(pickupLabel) + '</div>';
|
||||
if (returnLabel) {
|
||||
html += '<div><strong>Miejsce zwrotu:</strong> ' + escHtml(returnLabel) + '</div>';
|
||||
html += '<div><strong>' + escHtml(t('labelReturn', 'Miejsce zwrotu')) + ':</strong> ' + escHtml(returnLabel) + '</div>';
|
||||
}
|
||||
html += '<div><strong>Najemca:</strong> ' + escHtml(fd.firstName + ' ' + fd.lastName) + '</div>' +
|
||||
'<div><strong>Email:</strong> ' + escHtml(fd.email) + '</div>' +
|
||||
'<div><strong>Telefon:</strong> ' + escHtml(fd.phone) + '</div>';
|
||||
html += '<div><strong>' + escHtml(t('labelRenter', 'Najemca')) + ':</strong> ' + escHtml(fd.firstName + ' ' + fd.lastName) + '</div>' +
|
||||
'<div><strong>' + escHtml(t('labelEmail', 'Email')) + ':</strong> ' + escHtml(fd.email) + '</div>' +
|
||||
'<div><strong>' + escHtml(t('labelPhone', 'Telefon')) + ':</strong> ' + escHtml(fd.phone) + '</div>';
|
||||
|
||||
// Selected extras
|
||||
var selectedExtras = getSelectedExtrasForApi();
|
||||
var pkgForDetails = getSelectedProtectionPayload();
|
||||
if (selectedExtras.length > 0 || pkgForDetails) {
|
||||
html += '<div style="margin-top:8px"><strong>Wybrane opcje:</strong></div><ul style="margin:4px 0 0 16px;padding:0;list-style:disc;">';
|
||||
html += '<div style="margin-top:8px"><strong>' + escHtml(t('labelSelectedOptions', 'Wybrane opcje')) + ':</strong></div><ul style="margin:4px 0 0 16px;padding:0;list-style:disc;">';
|
||||
selectedExtras.forEach(function (ex) {
|
||||
var totalPrice = ex.priceAfterDiscount * (ex.amount || 1);
|
||||
var priceInfo = ex.unit === 'doba' && ex.amount > 1
|
||||
? fmtPrice(ex.priceAfterDiscount) + ' zł/doba × ' + ex.amount + ' = ' + fmtPrice(totalPrice) + ' zł'
|
||||
: fmtPrice(totalPrice) + ' zł';
|
||||
? tFmt('priceLineDaily', {perDay: fmtPrice(ex.priceAfterDiscount), days: ex.amount, total: fmtPrice(totalPrice)}, '%perDay% zł/doba × %days% = %total% zł')
|
||||
: tFmt('priceSimpleFmt', {price: fmtPrice(totalPrice)}, '%price% zł');
|
||||
html += '<li>' + escHtml(toSentenceCase(ex.name)) + ' — ' + priceInfo + '</li>';
|
||||
});
|
||||
if (pkgForDetails) {
|
||||
var pkgInfo = pkgForDetails.days > 1
|
||||
? fmtPrice(pkgForDetails.pricePerDay) + ' zł/doba × ' + pkgForDetails.days + ' = ' + fmtPrice(pkgForDetails.total) + ' zł'
|
||||
: fmtPrice(pkgForDetails.total) + ' zł';
|
||||
? tFmt('priceLineDaily', {perDay: fmtPrice(pkgForDetails.pricePerDay), days: pkgForDetails.days, total: fmtPrice(pkgForDetails.total)}, '%perDay% zł/doba × %days% = %total% zł')
|
||||
: tFmt('priceSimpleFmt', {price: fmtPrice(pkgForDetails.total)}, '%price% zł');
|
||||
html += '<li>' + escHtml(pkgForDetails.name) + ' — ' + pkgInfo + '</li>';
|
||||
}
|
||||
html += '</ul>';
|
||||
}
|
||||
|
||||
if (fd.message) {
|
||||
html += '<div style="margin-top:8px"><strong>Wiadomość:</strong> ' + escHtml(fd.message) + '</div>';
|
||||
html += '<div style="margin-top:8px"><strong>' + escHtml(t('labelMessage', 'Wiadomość')) + ':</strong> ' + escHtml(fd.message) + '</div>';
|
||||
}
|
||||
|
||||
summaryDetails.innerHTML = html;
|
||||
@@ -1082,19 +1196,19 @@
|
||||
|
||||
// Price table
|
||||
if (summaryTable && summary.pricelist) {
|
||||
var html = '<table><thead><tr><th>Nazwa</th><th>Ilość</th><th>Netto</th><th>Brutto</th></tr></thead><tbody>';
|
||||
var html = '<table><thead><tr><th>' + escHtml(t('thName', 'Nazwa')) + '</th><th>' + escHtml(t('thQuantity', 'Ilość')) + '</th><th>' + escHtml(t('thNet', 'Netto')) + '</th><th>' + escHtml(t('thGross', 'Brutto')) + '</th></tr></thead><tbody>';
|
||||
summary.pricelist.forEach(function (item) {
|
||||
var rowClass = item.addedBySystem ? ' class="carei-summary__auto-item"' : '';
|
||||
html += '<tr' + rowClass + '>' +
|
||||
'<td>' + escHtml(toSentenceCase(item.name)) + (item.addedBySystem ? ' <small>(auto)</small>' : '') + '</td>' +
|
||||
'<td>' + escHtml(toSentenceCase(item.name)) + (item.addedBySystem ? ' <small>(' + escHtml(t('labelAuto', 'auto')) + ')</small>' : '') + '</td>' +
|
||||
'<td>' + (item.amount || 1) + ' ' + escHtml(item.unit || '') + '</td>' +
|
||||
'<td>' + fmtPrice(item.netValue) + '</td>' +
|
||||
'<td>' + fmtPrice(item.grossValue) + '</td></tr>';
|
||||
});
|
||||
if (protectionPayload) {
|
||||
html += '<tr class="carei-summary__protection-row">' +
|
||||
'<td>' + escHtml(protectionPayload.name) + ' <small>(do doliczenia)</small></td>' +
|
||||
'<td>' + protectionPayload.days + ' doba</td>' +
|
||||
'<td>' + escHtml(protectionPayload.name) + ' <small>(' + escHtml(t('labelExtraCharge', 'do doliczenia')) + ')</small></td>' +
|
||||
'<td>' + protectionPayload.days + ' ' + escHtml(pluralPl(protectionPayload.days, t('dayOne', 'doba'), t('dayFew', 'doby'), t('dayMany', 'dób'))) + '</td>' +
|
||||
'<td>—</td>' +
|
||||
'<td>' + fmtPrice(protectionPayload.total) + '</td></tr>';
|
||||
}
|
||||
@@ -1108,12 +1222,12 @@
|
||||
var protectionTotal = protectionPayload ? protectionPayload.total : 0;
|
||||
var grandGross = softraGross + protectionTotal;
|
||||
var totalsHtml =
|
||||
'<div class="carei-summary__total-row"><span class="carei-summary__total-label">Netto:</span><span class="carei-summary__total-value">' + fmtPrice(summary.totalNetValue) + '</span></div>' +
|
||||
'<div class="carei-summary__total-row"><span class="carei-summary__total-label">VAT:</span><span class="carei-summary__total-value">' + fmtPrice(summary.totalVatValue) + '</span></div>';
|
||||
'<div class="carei-summary__total-row"><span class="carei-summary__total-label">' + escHtml(t('thNet', 'Netto')) + ':</span><span class="carei-summary__total-value">' + fmtPrice(summary.totalNetValue) + '</span></div>' +
|
||||
'<div class="carei-summary__total-row"><span class="carei-summary__total-label">' + escHtml(t('labelVat', 'VAT')) + ':</span><span class="carei-summary__total-value">' + fmtPrice(summary.totalVatValue) + '</span></div>';
|
||||
if (protectionPayload) {
|
||||
totalsHtml += '<div class="carei-summary__total-row"><span class="carei-summary__total-label">Pakiet ochronny:</span><span class="carei-summary__total-value">' + fmtPrice(protectionPayload.total) + '</span></div>';
|
||||
totalsHtml += '<div class="carei-summary__total-row"><span class="carei-summary__total-label">' + escHtml(t('labelProtectionPackage', 'Pakiet ochronny')) + ':</span><span class="carei-summary__total-value">' + fmtPrice(protectionPayload.total) + '</span></div>';
|
||||
}
|
||||
totalsHtml += '<div class="carei-summary__total-row carei-summary__total-row--gross"><span class="carei-summary__total-label">Do zapłaty:</span><span class="carei-summary__total-value">' + fmtPrice(grandGross) + ' zł</span></div>';
|
||||
totalsHtml += '<div class="carei-summary__total-row carei-summary__total-row--gross"><span class="carei-summary__total-label">' + escHtml(t('labelToPay', 'Do zapłaty')) + ':</span><span class="carei-summary__total-value">' + tFmt('priceSimpleFmt', {price: fmtPrice(grandGross)}, '%price% zł') + '</span></div>';
|
||||
summaryTotal.innerHTML = totalsHtml;
|
||||
}
|
||||
}
|
||||
@@ -1136,7 +1250,7 @@
|
||||
if (summaryConfirm) {
|
||||
summaryConfirm.disabled = true;
|
||||
summaryConfirm.setAttribute('aria-busy', 'true');
|
||||
summaryConfirm.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> Rezerwuję...';
|
||||
summaryConfirm.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> ' + escHtml(t('btnBookingInProgress', 'Rezerwuję...'));
|
||||
}
|
||||
hideSummaryError();
|
||||
|
||||
@@ -1178,7 +1292,7 @@
|
||||
showSuccessView(res.reservationNo || res.reservationId);
|
||||
return;
|
||||
}
|
||||
throw new Error(translateRejectReason(res.rejectReason) || 'Rezerwacja nie powiodła się');
|
||||
throw new Error(translateRejectReason(res.rejectReason) || t('errorBookingFailed', 'Rezerwacja nie powiodła się'));
|
||||
}).catch(function (err) {
|
||||
console.error('Booking failed:', err);
|
||||
showSummaryError(err.message);
|
||||
@@ -1189,12 +1303,12 @@
|
||||
function translateRejectReason(reason) {
|
||||
if (!reason) return null;
|
||||
var map = {
|
||||
'CAR_NOT_FOUND': 'Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment.',
|
||||
'INVALID_DATE_RANGE': 'Nieprawidłowy zakres dat',
|
||||
'BRANCH_NOT_FOUND': 'Nie znaleziono oddziału',
|
||||
'CUSTOMER_ALREADY_EXISTS': 'Klient o tych danych już istnieje w systemie',
|
||||
'INVALID_PESEL': 'Nieprawidłowy numer PESEL',
|
||||
'PRICE_LIST_EXPIRED': 'Cennik wygasł. Odśwież formularz i spróbuj ponownie.'
|
||||
'CAR_NOT_FOUND': t('rejectCarNotFound', 'Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment.'),
|
||||
'INVALID_DATE_RANGE': t('rejectInvalidDateRange', 'Nieprawidłowy zakres dat'),
|
||||
'BRANCH_NOT_FOUND': t('rejectBranchNotFound', 'Nie znaleziono oddziału'),
|
||||
'CUSTOMER_ALREADY_EXISTS': t('rejectCustomerExists', 'Klient o tych danych już istnieje w systemie'),
|
||||
'INVALID_PESEL': t('rejectInvalidPesel', 'Nieprawidłowy numer PESEL'),
|
||||
'PRICE_LIST_EXPIRED': t('rejectPriceListExpired', 'Cennik wygasł. Odśwież formularz i spróbuj ponownie.')
|
||||
};
|
||||
return map[reason] || reason;
|
||||
}
|
||||
@@ -1203,16 +1317,16 @@
|
||||
if (summaryConfirm) {
|
||||
summaryConfirm.disabled = false;
|
||||
summaryConfirm.setAttribute('aria-busy', 'false');
|
||||
summaryConfirm.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> Potwierdź rezerwację';
|
||||
summaryConfirm.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg> ' + escHtml(t('btnConfirmBooking', 'Potwierdź rezerwację'));
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Success View ─────────────────────────────────────────────
|
||||
|
||||
function showSuccessView(reservationNo) {
|
||||
if (successNumber) successNumber.textContent = 'Nr zamówienia: ' + reservationNo;
|
||||
if (successNumber) successNumber.textContent = tFmt('orderNumber', {no: reservationNo}, 'Nr zamówienia: %no%');
|
||||
transitionStep(summaryOverlay, successView, function () {
|
||||
announce('Rezerwacja potwierdzona');
|
||||
announce(t('announceBookingConfirmed', 'Rezerwacja potwierdzona'));
|
||||
var title = successView.querySelector('.carei-success__title');
|
||||
if (title) title.focus();
|
||||
});
|
||||
@@ -1226,7 +1340,7 @@
|
||||
currentCustomerId = null;
|
||||
currentReservationId = null;
|
||||
hideExtras();
|
||||
if (pickupSelect) { populateSelect(pickupSelect, [], 'Najpierw wybierz segment'); pickupSelect.disabled = true; }
|
||||
if (pickupSelect) { populateSelect(pickupSelect, [], t('pickupPlaceholder', 'Najpierw wybierz segment')); pickupSelect.disabled = true; }
|
||||
closeModal();
|
||||
}
|
||||
|
||||
@@ -1324,13 +1438,13 @@
|
||||
if (Array.isArray(classes) && classes.length > 0) {
|
||||
var segments = classes.map(function (c) {
|
||||
var val = typeof c === 'string' ? c : (c.name || c);
|
||||
var label = typeof c === 'string' ? ('Segment ' + c) : (c.description || c.name || c);
|
||||
var label = typeof c === 'string' ? tFmt('segmentLabel', {name: c}, 'Segment %name%') : (c.description || c.name || c);
|
||||
return { value: val, label: label };
|
||||
});
|
||||
populateSelect(searchSegment, segments, 'Wybierz segment');
|
||||
populateSelect(searchSegment, segments, t('selectSegmentShort', 'Wybierz segment'));
|
||||
}
|
||||
if (searchPickup) {
|
||||
populateSelect(searchPickup, [], 'Najpierw wybierz segment');
|
||||
populateSelect(searchPickup, [], t('pickupPlaceholder', 'Najpierw wybierz segment'));
|
||||
searchPickup.disabled = true;
|
||||
}
|
||||
}).catch(function (err) {
|
||||
@@ -1354,10 +1468,10 @@
|
||||
}
|
||||
});
|
||||
if (opts.length > 0) {
|
||||
populateSelect(searchPickup, opts, 'Miejsce odbioru');
|
||||
populateSelect(searchPickup, opts, t('pickupLabel', 'Miejsce odbioru'));
|
||||
searchPickup.disabled = false;
|
||||
} else {
|
||||
populateSelect(searchPickup, [], 'Brak lokalizacji');
|
||||
populateSelect(searchPickup, [], t('noLocations', 'Brak lokalizacji'));
|
||||
searchPickup.disabled = true;
|
||||
}
|
||||
});
|
||||
@@ -1449,6 +1563,9 @@
|
||||
// Inicjalizuj search form niezależnie od modala
|
||||
initSearchForm();
|
||||
|
||||
// Flatpickr on both modal + hero inputs — safe to call even if modal absent
|
||||
initDatePickers();
|
||||
|
||||
if (!overlay || !form) return;
|
||||
|
||||
initModal();
|
||||
|
||||
@@ -52,6 +52,13 @@ require_once CAREI_RESERVATION_PATH . 'includes/class-softra-api.php';
|
||||
require_once CAREI_RESERVATION_PATH . 'includes/class-rest-proxy.php';
|
||||
require_once CAREI_RESERVATION_PATH . 'includes/class-admin-panel.php';
|
||||
|
||||
/**
|
||||
* Load plugin textdomain
|
||||
*/
|
||||
add_action( 'plugins_loaded', function () {
|
||||
load_plugin_textdomain( 'carei-reservation', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Initialize plugin on plugins_loaded
|
||||
*/
|
||||
@@ -64,7 +71,7 @@ add_action( 'plugins_loaded', function () {
|
||||
|
||||
if ( empty( $api_url ) || empty( $username ) || empty( $password ) ) {
|
||||
add_action( 'admin_notices', function () {
|
||||
echo '<div class="notice notice-error"><p><strong>Carei Reservation:</strong> Brak konfiguracji API w pliku .env (url, username, password).</p></div>';
|
||||
echo '<div class="notice notice-error"><p><strong>Carei Reservation:</strong> ' . esc_html__( 'Brak konfiguracji API w pliku .env (url, username, password).', 'carei-reservation' ) . '</p></div>';
|
||||
} );
|
||||
return;
|
||||
}
|
||||
@@ -103,16 +110,38 @@ add_action( 'elementor/widgets/register', function ( $widgets_manager ) {
|
||||
* Enqueue frontend assets
|
||||
*/
|
||||
add_action( 'wp_enqueue_scripts', function () {
|
||||
// Flatpickr — cross-browser, locale-aware date/time picker (CDN)
|
||||
wp_register_style(
|
||||
'carei-flatpickr-css',
|
||||
'https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.css',
|
||||
array(),
|
||||
'4.6.13'
|
||||
);
|
||||
wp_register_script(
|
||||
'carei-flatpickr-js',
|
||||
'https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.js',
|
||||
array(),
|
||||
'4.6.13',
|
||||
true
|
||||
);
|
||||
wp_register_script(
|
||||
'carei-flatpickr-pl',
|
||||
'https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/l10n/pl.js',
|
||||
array( 'carei-flatpickr-js' ),
|
||||
'4.6.13',
|
||||
true
|
||||
);
|
||||
|
||||
wp_register_style(
|
||||
'carei-reservation-css',
|
||||
CAREI_RESERVATION_URL . 'assets/css/carei-reservation.css',
|
||||
array(),
|
||||
array( 'carei-flatpickr-css' ),
|
||||
CAREI_RESERVATION_VERSION
|
||||
);
|
||||
wp_register_script(
|
||||
'carei-reservation-js',
|
||||
CAREI_RESERVATION_URL . 'assets/js/carei-reservation.js',
|
||||
array(),
|
||||
array( 'carei-flatpickr-js', 'carei-flatpickr-pl' ),
|
||||
CAREI_RESERVATION_VERSION,
|
||||
true
|
||||
);
|
||||
@@ -120,4 +149,115 @@ add_action( 'wp_enqueue_scripts', function () {
|
||||
'restUrl' => esc_url_raw( rest_url( 'carei/v1/' ) ),
|
||||
'nonce' => wp_create_nonce( 'wp_rest' ),
|
||||
) );
|
||||
|
||||
wp_localize_script( 'carei-reservation-js', 'careiI18n', array(
|
||||
// API / sieć
|
||||
'errorApiHttp' => esc_html__( 'Błąd API: HTTP %status%', 'carei-reservation' ),
|
||||
'errorTimeout' => esc_html__( 'Przekroczono czas oczekiwania. Spróbuj ponownie.', 'carei-reservation' ),
|
||||
'errorNetwork' => esc_html__( 'Brak połączenia z serwerem. Sprawdź internet i spróbuj ponownie.', 'carei-reservation' ),
|
||||
'errorLoading' => esc_html__( 'Błąd ładowania', 'carei-reservation' ),
|
||||
|
||||
// Selecty / placeholdery
|
||||
'selectPlaceholder' => esc_html__( 'Wybierz...', 'carei-reservation' ),
|
||||
'selectSegment' => esc_html__( 'Wybierz segment pojazdu', 'carei-reservation' ),
|
||||
'selectSegmentShort' => esc_html__( 'Wybierz segment', 'carei-reservation' ),
|
||||
'selectPickup' => esc_html__( 'Wybierz miejsce odbioru', 'carei-reservation' ),
|
||||
'selectReturn' => esc_html__( 'Wybierz miejsce zwrotu', 'carei-reservation' ),
|
||||
'segmentLabel' => esc_html__( 'Segment %name%', 'carei-reservation' ),
|
||||
'noSegments' => esc_html__( 'Brak segmentów', 'carei-reservation' ),
|
||||
'pickupPlaceholder' => esc_html__( 'Najpierw wybierz segment', 'carei-reservation' ),
|
||||
'pickupLabel' => esc_html__( 'Miejsce odbioru', 'carei-reservation' ),
|
||||
'returnLabel' => esc_html__( 'Miejsce zwrotu', 'carei-reservation' ),
|
||||
'noPickupForSegment' => esc_html__( 'Brak lokalizacji dla tego segmentu', 'carei-reservation' ),
|
||||
'noLocations' => esc_html__( 'Brak lokalizacji', 'carei-reservation' ),
|
||||
|
||||
// Daty
|
||||
'dateStart' => esc_html__( 'Rozpoczęcie', 'carei-reservation' ),
|
||||
'dateEnd' => esc_html__( 'Zakończenie', 'carei-reservation' ),
|
||||
'warnPastDate' => esc_html__( '%label% — data lub godzina już minęły', 'carei-reservation' ),
|
||||
'dateStartPast' => esc_html__( 'Data lub godzina rozpoczęcia już minęły', 'carei-reservation' ),
|
||||
'dateEndPast' => esc_html__( 'Data lub godzina zakończenia już minęły', 'carei-reservation' ),
|
||||
'dateEndAfterStart' => esc_html__( 'Data zakończenia musi być po dacie rozpoczęcia', 'carei-reservation' ),
|
||||
'enterDateFrom' => esc_html__( 'Podaj datę rozpoczęcia', 'carei-reservation' ),
|
||||
'enterDateTo' => esc_html__( 'Podaj datę zakończenia', 'carei-reservation' ),
|
||||
|
||||
// Dni/Doby (pluralizacja PL)
|
||||
'daysCount' => wp_kses( __( 'Wybrano: <strong>%count% %unit%</strong>', 'carei-reservation' ), array( 'strong' => array() ) ),
|
||||
'dayWord' => esc_html__( 'dzień', 'carei-reservation' ),
|
||||
'daysWord' => esc_html__( 'dni', 'carei-reservation' ),
|
||||
'dayOne' => esc_html__( 'doba', 'carei-reservation' ),
|
||||
'dayFew' => esc_html__( 'doby', 'carei-reservation' ),
|
||||
'dayMany' => esc_html__( 'dób', 'carei-reservation' ),
|
||||
|
||||
// Ceny
|
||||
'pricePerDay' => esc_html__( '%price% zł/doba', 'carei-reservation' ),
|
||||
'priceSimple' => esc_html__( '%price% zł', 'carei-reservation' ),
|
||||
'priceSimpleFmt' => esc_html__( '%price% zł', 'carei-reservation' ),
|
||||
'priceRange' => esc_html__( 'od %min% do %max% zł', 'carei-reservation' ),
|
||||
'priceLineDaily' => esc_html__( '%perDay% zł/doba × %days% = %total% zł', 'carei-reservation' ),
|
||||
'free' => esc_html__( 'Gratis', 'carei-reservation' ),
|
||||
|
||||
// Zagranica / akcje
|
||||
'btnRemove' => esc_html__( 'Usuń', 'carei-reservation' ),
|
||||
'btnAdd' => esc_html__( 'Dodaj', 'carei-reservation' ),
|
||||
|
||||
// Walidacja formularza
|
||||
'enterFirstName' => esc_html__( 'Podaj imię', 'carei-reservation' ),
|
||||
'enterLastName' => esc_html__( 'Podaj nazwisko', 'carei-reservation' ),
|
||||
'enterEmail' => esc_html__( 'Podaj poprawny adres e-mail', 'carei-reservation' ),
|
||||
'enterPhone' => esc_html__( 'Podaj numer telefonu (min. 9 cyfr)', 'carei-reservation' ),
|
||||
'privacyRequired' => esc_html__( 'Wymagana zgoda na Politykę Prywatności', 'carei-reservation' ),
|
||||
|
||||
// Przyciski
|
||||
'btnSubmit' => esc_html__( 'Wyślij', 'carei-reservation' ),
|
||||
'btnProcessing' => esc_html__( 'Przetwarzanie...', 'carei-reservation' ),
|
||||
'btnBookingInProgress' => esc_html__( 'Rezerwuję...', 'carei-reservation' ),
|
||||
'btnConfirmBooking' => esc_html__( 'Potwierdź rezerwację', 'carei-reservation' ),
|
||||
|
||||
// Flow klienta / rezerwacji
|
||||
'loadingSummary' => esc_html__( 'Ładowanie podsumowania...', 'carei-reservation' ),
|
||||
'errorCustomerCreate' => esc_html__( 'Nie udało się utworzyć klienta', 'carei-reservation' ),
|
||||
'errorCustomerCreatePrefix' => esc_html__( 'Błąd tworzenia klienta: %msg%', 'carei-reservation' ),
|
||||
'errorSummaryPrefix' => esc_html__( 'Błąd pobierania podsumowania: %msg%', 'carei-reservation' ),
|
||||
'errorBookingFailed' => esc_html__( 'Rezerwacja nie powiodła się', 'carei-reservation' ),
|
||||
|
||||
// Pakiet ochronny (komentarz booking)
|
||||
'protectionComment' => esc_html__( 'Pakiet ochronny: %name% — %perDay% zł/doba × %days% = %total% zł (do doliczenia poza systemem)', 'carei-reservation' ),
|
||||
|
||||
// Podsumowanie — etykiety
|
||||
'labelSegment' => esc_html__( 'Segment', 'carei-reservation' ),
|
||||
'labelFrom' => esc_html__( 'Od', 'carei-reservation' ),
|
||||
'labelTo' => esc_html__( 'Do', 'carei-reservation' ),
|
||||
'labelPickup' => esc_html__( 'Miejsce odbioru', 'carei-reservation' ),
|
||||
'labelReturn' => esc_html__( 'Miejsce zwrotu', 'carei-reservation' ),
|
||||
'labelRenter' => esc_html__( 'Najemca', 'carei-reservation' ),
|
||||
'labelEmail' => esc_html__( 'Email', 'carei-reservation' ),
|
||||
'labelPhone' => esc_html__( 'Telefon', 'carei-reservation' ),
|
||||
'labelSelectedOptions' => esc_html__( 'Wybrane opcje', 'carei-reservation' ),
|
||||
'labelMessage' => esc_html__( 'Wiadomość', 'carei-reservation' ),
|
||||
'labelAuto' => esc_html__( 'auto', 'carei-reservation' ),
|
||||
'labelExtraCharge' => esc_html__( 'do doliczenia', 'carei-reservation' ),
|
||||
'labelVat' => esc_html__( 'VAT', 'carei-reservation' ),
|
||||
'labelProtectionPackage' => esc_html__( 'Pakiet ochronny', 'carei-reservation' ),
|
||||
'labelToPay' => esc_html__( 'Do zapłaty', 'carei-reservation' ),
|
||||
|
||||
// Tabela
|
||||
'thName' => esc_html__( 'Nazwa', 'carei-reservation' ),
|
||||
'thQuantity' => esc_html__( 'Ilość', 'carei-reservation' ),
|
||||
'thNet' => esc_html__( 'Netto', 'carei-reservation' ),
|
||||
'thGross' => esc_html__( 'Brutto', 'carei-reservation' ),
|
||||
|
||||
// Reject reasons (Softra → PL fallback)
|
||||
'rejectCarNotFound' => esc_html__( 'Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment.', 'carei-reservation' ),
|
||||
'rejectInvalidDateRange' => esc_html__( 'Nieprawidłowy zakres dat', 'carei-reservation' ),
|
||||
'rejectBranchNotFound' => esc_html__( 'Nie znaleziono oddziału', 'carei-reservation' ),
|
||||
'rejectCustomerExists' => esc_html__( 'Klient o tych danych już istnieje w systemie', 'carei-reservation' ),
|
||||
'rejectInvalidPesel' => esc_html__( 'Nieprawidłowy numer PESEL', 'carei-reservation' ),
|
||||
'rejectPriceListExpired' => esc_html__( 'Cennik wygasł. Odśwież formularz i spróbuj ponownie.', 'carei-reservation' ),
|
||||
|
||||
// Success / aria
|
||||
'orderNumber' => esc_html__( 'Nr zamówienia: %no%', 'carei-reservation' ),
|
||||
'announceBookingConfirmed' => esc_html__( 'Rezerwacja potwierdzona', 'carei-reservation' ),
|
||||
'announceSummary' => esc_html__( 'Podsumowanie rezerwacji', 'carei-reservation' ),
|
||||
) );
|
||||
} );
|
||||
|
||||
@@ -8,14 +8,28 @@ class Carei_Admin_Panel {
|
||||
const POST_TYPE = 'carei_reservation';
|
||||
const META_PREFIX = '_carei_';
|
||||
|
||||
const PROTECTION_OPTION = 'carei_protection_packages';
|
||||
const PROTECTION_OPTION = 'carei_protection_packages';
|
||||
const EXTRAS_SEEN_OPTION = 'carei_extras_seen';
|
||||
const EXTRAS_TRANSLATIONS_OPTION = 'carei_extras_translations';
|
||||
|
||||
private static $statuses = array(
|
||||
'nowe' => array( 'label' => 'Nowe', 'color' => '#2F2482' ),
|
||||
'przeczytane' => array( 'label' => 'Przeczytane', 'color' => '#f59e0b' ),
|
||||
'zrealizowane' => array( 'label' => 'Zrealizowane', 'color' => '#22c55e' ),
|
||||
'nowe' => array( 'color' => '#2F2482' ),
|
||||
'przeczytane' => array( 'color' => '#f59e0b' ),
|
||||
'zrealizowane' => array( 'color' => '#22c55e' ),
|
||||
);
|
||||
|
||||
private static function get_status_label( $key ) {
|
||||
switch ( $key ) {
|
||||
case 'nowe':
|
||||
return __( 'Nowe', 'carei-reservation' );
|
||||
case 'przeczytane':
|
||||
return __( 'Przeczytane', 'carei-reservation' );
|
||||
case 'zrealizowane':
|
||||
return __( 'Zrealizowane', 'carei-reservation' );
|
||||
}
|
||||
return $key;
|
||||
}
|
||||
|
||||
public function __construct() {
|
||||
add_action( 'init', array( $this, 'register_post_type' ) );
|
||||
add_filter( 'manage_' . self::POST_TYPE . '_posts_columns', array( $this, 'admin_columns' ) );
|
||||
@@ -28,6 +42,135 @@ class Carei_Admin_Panel {
|
||||
add_action( 'admin_head', array( $this, 'admin_styles' ) );
|
||||
add_action( 'admin_menu', array( $this, 'register_protection_packages_page' ) );
|
||||
add_action( 'admin_post_carei_save_protection_packages', array( $this, 'handle_protection_packages_save' ) );
|
||||
add_action( 'admin_menu', array( $this, 'register_extras_translations_page' ) );
|
||||
add_action( 'admin_post_carei_save_extras_translations', array( $this, 'handle_extras_translations_save' ) );
|
||||
}
|
||||
|
||||
// ─── Extras Translations (dynamic Softra pricelist item names) ────
|
||||
|
||||
public static function get_extras_seen() {
|
||||
$seen = get_option( self::EXTRAS_SEEN_OPTION, array() );
|
||||
if ( ! is_array( $seen ) ) return array();
|
||||
$seen = array_values( array_unique( array_filter( array_map( 'strval', $seen ), 'strlen' ) ) );
|
||||
sort( $seen, SORT_NATURAL | SORT_FLAG_CASE );
|
||||
return $seen;
|
||||
}
|
||||
|
||||
public static function get_extras_translations() {
|
||||
$map = get_option( self::EXTRAS_TRANSLATIONS_OPTION, array() );
|
||||
return is_array( $map ) ? $map : array();
|
||||
}
|
||||
|
||||
public static function remember_extra_name( $pl_name ) {
|
||||
$pl_name = trim( (string) $pl_name );
|
||||
if ( $pl_name === '' ) return;
|
||||
$seen = get_option( self::EXTRAS_SEEN_OPTION, array() );
|
||||
if ( ! is_array( $seen ) ) $seen = array();
|
||||
if ( ! in_array( $pl_name, $seen, true ) ) {
|
||||
$seen[] = $pl_name;
|
||||
update_option( self::EXTRAS_SEEN_OPTION, $seen, false );
|
||||
}
|
||||
}
|
||||
|
||||
public static function translate_extra_name( $pl_name, $locale = null ) {
|
||||
if ( $locale === null ) {
|
||||
$wp_locale = function_exists( 'determine_locale' ) ? determine_locale() : get_locale();
|
||||
$locale = ( 0 === strpos( (string) $wp_locale, 'en' ) ) ? 'en' : 'pl';
|
||||
}
|
||||
if ( $locale !== 'en' ) return $pl_name;
|
||||
$map = self::get_extras_translations();
|
||||
if ( isset( $map[ $pl_name ] ) && $map[ $pl_name ] !== '' ) {
|
||||
return $map[ $pl_name ];
|
||||
}
|
||||
return $pl_name;
|
||||
}
|
||||
|
||||
public function register_extras_translations_page() {
|
||||
add_submenu_page(
|
||||
'edit.php?post_type=' . self::POST_TYPE,
|
||||
__( 'Tłumaczenia extras', 'carei-reservation' ),
|
||||
__( 'Tłumaczenia extras', 'carei-reservation' ),
|
||||
'manage_options',
|
||||
'carei-extras-translations',
|
||||
array( $this, 'render_extras_translations_page' )
|
||||
);
|
||||
}
|
||||
|
||||
public function render_extras_translations_page() {
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_die( esc_html__( 'Brak uprawnień.', 'carei-reservation' ) );
|
||||
}
|
||||
$seen = self::get_extras_seen();
|
||||
$trans = self::get_extras_translations();
|
||||
$saved = isset( $_GET['carei_saved'] ) && $_GET['carei_saved'] === '1';
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h1><?php esc_html_e( 'Tłumaczenia extras', 'carei-reservation' ); ?></h1>
|
||||
<p><?php esc_html_e( 'Tłumaczenia nazw dodatkowych opcji (extras) zwracanych z API Softra. Puste pole = wersja polska jest używana także w wersji angielskiej (fallback).', 'carei-reservation' ); ?></p>
|
||||
<?php if ( $saved ) : ?>
|
||||
<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Zapisano.', 'carei-reservation' ); ?></p></div>
|
||||
<?php endif; ?>
|
||||
<?php if ( empty( $seen ) ) : ?>
|
||||
<div class="notice notice-info"><p><?php esc_html_e( 'Brak zebranych pozycji. Otwórz formularz rezerwacji i wybierz daty/oddział/klasę aby załadować pricelist — pozycje pojawią się tutaj automatycznie.', 'carei-reservation' ); ?></p></div>
|
||||
<?php else : ?>
|
||||
<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" class="carei-extras-form">
|
||||
<input type="hidden" name="action" value="carei_save_extras_translations">
|
||||
<?php wp_nonce_field( 'carei_extras_translations', 'carei_extras_nonce' ); ?>
|
||||
<table class="form-table striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 40%;"><?php esc_html_e( 'Nazwa PL (z API Softra)', 'carei-reservation' ); ?></th>
|
||||
<th><?php esc_html_e( 'Tłumaczenie EN', 'carei-reservation' ); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ( $seen as $pl_name ) :
|
||||
$en = isset( $trans[ $pl_name ] ) ? (string) $trans[ $pl_name ] : '';
|
||||
?>
|
||||
<tr>
|
||||
<td><strong><?php echo esc_html( $pl_name ); ?></strong></td>
|
||||
<td>
|
||||
<input type="text" name="translations[<?php echo esc_attr( $pl_name ); ?>]" value="<?php echo esc_attr( $en ); ?>" class="regular-text" placeholder="<?php echo esc_attr__( 'EN translation...', 'carei-reservation' ); ?>">
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php submit_button( __( 'Zapisz tłumaczenia', 'carei-reservation' ) ); ?>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
public function handle_extras_translations_save() {
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_die( esc_html__( 'Brak uprawnień.', 'carei-reservation' ) );
|
||||
}
|
||||
if ( ! isset( $_POST['carei_extras_nonce'] ) || ! wp_verify_nonce( $_POST['carei_extras_nonce'], 'carei_extras_translations' ) ) {
|
||||
wp_die( esc_html__( 'Nieprawidłowy token.', 'carei-reservation' ) );
|
||||
}
|
||||
|
||||
$input = isset( $_POST['translations'] ) && is_array( $_POST['translations'] ) ? $_POST['translations'] : array();
|
||||
$clean = array();
|
||||
foreach ( $input as $pl_name => $en_value ) {
|
||||
$pl = trim( (string) wp_unslash( $pl_name ) );
|
||||
$en = sanitize_text_field( wp_unslash( (string) $en_value ) );
|
||||
if ( $pl === '' ) continue;
|
||||
$clean[ $pl ] = $en;
|
||||
}
|
||||
update_option( self::EXTRAS_TRANSLATIONS_OPTION, $clean, false );
|
||||
|
||||
$redirect = add_query_arg(
|
||||
array(
|
||||
'post_type' => self::POST_TYPE,
|
||||
'page' => 'carei-extras-translations',
|
||||
'carei_saved' => '1',
|
||||
),
|
||||
admin_url( 'edit.php' )
|
||||
);
|
||||
wp_safe_redirect( $redirect );
|
||||
exit;
|
||||
}
|
||||
|
||||
// ─── Protection Packages (SOFT / PREMIUM) ────────────────────
|
||||
@@ -35,16 +178,20 @@ class Carei_Admin_Panel {
|
||||
public static function get_protection_packages_defaults() {
|
||||
return array(
|
||||
'soft' => array(
|
||||
'name' => 'Ubezpieczenie SOFT',
|
||||
'pricePerDay' => 0,
|
||||
'active' => true,
|
||||
'description' => '',
|
||||
'name' => __( 'Ubezpieczenie SOFT', 'carei-reservation' ),
|
||||
'name_en' => 'SOFT Protection',
|
||||
'pricePerDay' => 0,
|
||||
'active' => true,
|
||||
'description' => '',
|
||||
'description_en' => '',
|
||||
),
|
||||
'premium' => array(
|
||||
'name' => 'Ubezpieczenie PREMIUM',
|
||||
'pricePerDay' => 0,
|
||||
'active' => true,
|
||||
'description' => '',
|
||||
'name' => __( 'Ubezpieczenie PREMIUM', 'carei-reservation' ),
|
||||
'name_en' => 'PREMIUM Protection',
|
||||
'pricePerDay' => 0,
|
||||
'active' => true,
|
||||
'description' => '',
|
||||
'description_en' => '',
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -59,10 +206,12 @@ class Carei_Admin_Panel {
|
||||
foreach ( $defaults as $key => $def ) {
|
||||
$item = isset( $stored[ $key ] ) && is_array( $stored[ $key ] ) ? $stored[ $key ] : array();
|
||||
$out[ $key ] = array(
|
||||
'name' => isset( $item['name'] ) && $item['name'] !== '' ? (string) $item['name'] : $def['name'],
|
||||
'pricePerDay' => isset( $item['pricePerDay'] ) ? (float) $item['pricePerDay'] : (float) $def['pricePerDay'],
|
||||
'active' => isset( $item['active'] ) ? (bool) $item['active'] : (bool) $def['active'],
|
||||
'description' => isset( $item['description'] ) ? (string) $item['description'] : $def['description'],
|
||||
'name' => isset( $item['name'] ) && $item['name'] !== '' ? (string) $item['name'] : $def['name'],
|
||||
'name_en' => isset( $item['name_en'] ) ? (string) $item['name_en'] : '',
|
||||
'pricePerDay' => isset( $item['pricePerDay'] ) ? (float) $item['pricePerDay'] : (float) $def['pricePerDay'],
|
||||
'active' => isset( $item['active'] ) ? (bool) $item['active'] : (bool) $def['active'],
|
||||
'description' => isset( $item['description'] ) ? (string) $item['description'] : $def['description'],
|
||||
'description_en' => isset( $item['description_en'] ) ? (string) $item['description_en'] : '',
|
||||
);
|
||||
}
|
||||
return $out;
|
||||
@@ -71,8 +220,8 @@ class Carei_Admin_Panel {
|
||||
public function register_protection_packages_page() {
|
||||
add_submenu_page(
|
||||
'edit.php?post_type=' . self::POST_TYPE,
|
||||
'Pakiety ochronne',
|
||||
'Pakiety ochronne',
|
||||
__( 'Pakiety ochronne', 'carei-reservation' ),
|
||||
__( 'Pakiety ochronne', 'carei-reservation' ),
|
||||
'manage_options',
|
||||
'carei-protection-packages',
|
||||
array( $this, 'render_protection_packages_page' )
|
||||
@@ -81,16 +230,16 @@ class Carei_Admin_Panel {
|
||||
|
||||
public function render_protection_packages_page() {
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_die( 'Brak uprawnień.' );
|
||||
wp_die( esc_html__( 'Brak uprawnień.', 'carei-reservation' ) );
|
||||
}
|
||||
$data = self::get_protection_packages();
|
||||
$saved = isset( $_GET['carei_saved'] ) && $_GET['carei_saved'] === '1';
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h1>Pakiety ochronne</h1>
|
||||
<p>Konfiguracja pakietów wyświetlanych w sekcji <strong>Pakiety ochronne</strong> formularza rezerwacji. Cena podawana jest za dobę — total = cena × liczba dób rezerwacji.</p>
|
||||
<h1><?php esc_html_e( 'Pakiety ochronne', 'carei-reservation' ); ?></h1>
|
||||
<p><?php echo wp_kses( __( 'Konfiguracja pakietów wyświetlanych w sekcji <strong>Pakiety ochronne</strong> formularza rezerwacji. Cena podawana jest za dobę — total = cena × liczba dób rezerwacji.', 'carei-reservation' ), array( 'strong' => array() ) ); ?></p>
|
||||
<?php if ( $saved ) : ?>
|
||||
<div class="notice notice-success is-dismissible"><p>Zapisano.</p></div>
|
||||
<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Zapisano.', 'carei-reservation' ); ?></p></div>
|
||||
<?php endif; ?>
|
||||
<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" class="carei-protection-form">
|
||||
<input type="hidden" name="action" value="carei_save_protection_packages">
|
||||
@@ -100,29 +249,43 @@ class Carei_Admin_Panel {
|
||||
$pkg = $data[ $key ];
|
||||
?>
|
||||
<div class="carei-protection-card">
|
||||
<h2>Pakiet <?php echo esc_html( $label ); ?></h2>
|
||||
<h2><?php echo esc_html( sprintf( __( 'Pakiet %s', 'carei-reservation' ), $label ) ); ?></h2>
|
||||
<table class="form-table">
|
||||
<tr>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_name">Nazwa wyświetlana</label></th>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_name"><?php esc_html_e( 'Nazwa wyświetlana (PL)', 'carei-reservation' ); ?></label></th>
|
||||
<td><input type="text" id="carei_<?php echo esc_attr( $key ); ?>_name" name="packages[<?php echo esc_attr( $key ); ?>][name]" value="<?php echo esc_attr( $pkg['name'] ); ?>" class="regular-text" required></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_price">Cena za dobę (zł)</label></th>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_name_en"><?php esc_html_e( 'Nazwa wyświetlana (EN)', 'carei-reservation' ); ?></label></th>
|
||||
<td>
|
||||
<input type="text" id="carei_<?php echo esc_attr( $key ); ?>_name_en" name="packages[<?php echo esc_attr( $key ); ?>][name_en]" value="<?php echo esc_attr( $pkg['name_en'] ); ?>" class="regular-text" placeholder="<?php echo esc_attr__( 'Np. SOFT Protection', 'carei-reservation' ); ?>">
|
||||
<p class="description"><?php esc_html_e( 'Puste = fallback do wersji polskiej.', 'carei-reservation' ); ?></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_price"><?php esc_html_e( 'Cena za dobę (zł)', 'carei-reservation' ); ?></label></th>
|
||||
<td><input type="number" id="carei_<?php echo esc_attr( $key ); ?>_price" name="packages[<?php echo esc_attr( $key ); ?>][pricePerDay]" value="<?php echo esc_attr( $pkg['pricePerDay'] ); ?>" min="0" step="0.01" class="small-text" required></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Status</th>
|
||||
<td><label><input type="checkbox" name="packages[<?php echo esc_attr( $key ); ?>][active]" value="1" <?php checked( $pkg['active'] ); ?>> Aktywny (widoczny w modalu)</label></td>
|
||||
<th><?php esc_html_e( 'Status', 'carei-reservation' ); ?></th>
|
||||
<td><label><input type="checkbox" name="packages[<?php echo esc_attr( $key ); ?>][active]" value="1" <?php checked( $pkg['active'] ); ?>> <?php esc_html_e( 'Aktywny (widoczny w modalu)', 'carei-reservation' ); ?></label></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_desc">Opis / zakres usług</label></th>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_desc"><?php esc_html_e( 'Opis / zakres usług (PL)', 'carei-reservation' ); ?></label></th>
|
||||
<td><textarea id="carei_<?php echo esc_attr( $key ); ?>_desc" name="packages[<?php echo esc_attr( $key ); ?>][description]" rows="3" cols="60" class="large-text"><?php echo esc_textarea( $pkg['description'] ); ?></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><label for="carei_<?php echo esc_attr( $key ); ?>_desc_en"><?php esc_html_e( 'Opis / zakres usług (EN)', 'carei-reservation' ); ?></label></th>
|
||||
<td>
|
||||
<textarea id="carei_<?php echo esc_attr( $key ); ?>_desc_en" name="packages[<?php echo esc_attr( $key ); ?>][description_en]" rows="3" cols="60" class="large-text" placeholder="<?php echo esc_attr__( 'Basic protection package...', 'carei-reservation' ); ?>"><?php echo esc_textarea( $pkg['description_en'] ); ?></textarea>
|
||||
<p class="description"><?php esc_html_e( 'Puste = fallback do wersji polskiej.', 'carei-reservation' ); ?></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php submit_button( 'Zapisz pakiety' ); ?>
|
||||
<?php submit_button( __( 'Zapisz pakiety', 'carei-reservation' ) ); ?>
|
||||
</form>
|
||||
</div>
|
||||
<style>
|
||||
@@ -134,10 +297,10 @@ class Carei_Admin_Panel {
|
||||
|
||||
public function handle_protection_packages_save() {
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_die( 'Brak uprawnień.' );
|
||||
wp_die( esc_html__( 'Brak uprawnień.', 'carei-reservation' ) );
|
||||
}
|
||||
if ( ! isset( $_POST['carei_protection_nonce'] ) || ! wp_verify_nonce( $_POST['carei_protection_nonce'], 'carei_protection_packages' ) ) {
|
||||
wp_die( 'Nieprawidłowy token.' );
|
||||
wp_die( esc_html__( 'Nieprawidłowy token.', 'carei-reservation' ) );
|
||||
}
|
||||
|
||||
$input = isset( $_POST['packages'] ) && is_array( $_POST['packages'] ) ? $_POST['packages'] : array();
|
||||
@@ -145,16 +308,20 @@ class Carei_Admin_Panel {
|
||||
$clean = array();
|
||||
foreach ( $defaults as $key => $def ) {
|
||||
$raw = isset( $input[ $key ] ) && is_array( $input[ $key ] ) ? $input[ $key ] : array();
|
||||
$name = isset( $raw['name'] ) ? sanitize_text_field( wp_unslash( $raw['name'] ) ) : $def['name'];
|
||||
$price = isset( $raw['pricePerDay'] ) ? (float) $raw['pricePerDay'] : 0;
|
||||
$name = isset( $raw['name'] ) ? sanitize_text_field( wp_unslash( $raw['name'] ) ) : $def['name'];
|
||||
$name_en = isset( $raw['name_en'] ) ? sanitize_text_field( wp_unslash( $raw['name_en'] ) ) : '';
|
||||
$price = isset( $raw['pricePerDay'] ) ? (float) $raw['pricePerDay'] : 0;
|
||||
if ( $price < 0 ) { $price = 0; }
|
||||
$active = ! empty( $raw['active'] );
|
||||
$desc = isset( $raw['description'] ) ? sanitize_textarea_field( wp_unslash( $raw['description'] ) ) : '';
|
||||
$active = ! empty( $raw['active'] );
|
||||
$desc = isset( $raw['description'] ) ? sanitize_textarea_field( wp_unslash( $raw['description'] ) ) : '';
|
||||
$desc_en = isset( $raw['description_en'] ) ? sanitize_textarea_field( wp_unslash( $raw['description_en'] ) ) : '';
|
||||
$clean[ $key ] = array(
|
||||
'name' => $name !== '' ? $name : $def['name'],
|
||||
'pricePerDay' => $price,
|
||||
'active' => $active,
|
||||
'description' => $desc,
|
||||
'name' => $name !== '' ? $name : $def['name'],
|
||||
'name_en' => $name_en,
|
||||
'pricePerDay' => $price,
|
||||
'active' => $active,
|
||||
'description' => $desc,
|
||||
'description_en' => $desc_en,
|
||||
);
|
||||
}
|
||||
update_option( self::PROTECTION_OPTION, $clean );
|
||||
@@ -174,15 +341,15 @@ class Carei_Admin_Panel {
|
||||
public function register_post_type() {
|
||||
register_post_type( self::POST_TYPE, array(
|
||||
'labels' => array(
|
||||
'name' => 'Rezerwacje',
|
||||
'singular_name' => 'Rezerwacja',
|
||||
'menu_name' => 'Rezerwacje',
|
||||
'all_items' => 'Wszystkie rezerwacje',
|
||||
'view_item' => 'Zobacz rezerwację',
|
||||
'edit_item' => 'Szczegóły rezerwacji',
|
||||
'search_items' => 'Szukaj rezerwacji',
|
||||
'not_found' => 'Nie znaleziono rezerwacji',
|
||||
'not_found_in_trash' => 'Brak rezerwacji w koszu',
|
||||
'name' => __( 'Rezerwacje', 'carei-reservation' ),
|
||||
'singular_name' => __( 'Rezerwacja', 'carei-reservation' ),
|
||||
'menu_name' => __( 'Rezerwacje', 'carei-reservation' ),
|
||||
'all_items' => __( 'Wszystkie rezerwacje', 'carei-reservation' ),
|
||||
'view_item' => __( 'Zobacz rezerwację', 'carei-reservation' ),
|
||||
'edit_item' => __( 'Szczegóły rezerwacji', 'carei-reservation' ),
|
||||
'search_items' => __( 'Szukaj rezerwacji', 'carei-reservation' ),
|
||||
'not_found' => __( 'Nie znaleziono rezerwacji', 'carei-reservation' ),
|
||||
'not_found_in_trash' => __( 'Brak rezerwacji w koszu', 'carei-reservation' ),
|
||||
),
|
||||
'public' => false,
|
||||
'show_ui' => true,
|
||||
@@ -202,13 +369,13 @@ class Carei_Admin_Panel {
|
||||
public function admin_columns( $columns ) {
|
||||
return array(
|
||||
'cb' => '<input type="checkbox" />',
|
||||
'reservation_no' => 'Nr rezerwacji',
|
||||
'client' => 'Klient',
|
||||
'segment' => 'Segment',
|
||||
'dates' => 'Daty',
|
||||
'branch' => 'Oddział',
|
||||
'carei_status' => 'Status',
|
||||
'date' => 'Data',
|
||||
'reservation_no' => __( 'Nr rezerwacji', 'carei-reservation' ),
|
||||
'client' => __( 'Klient', 'carei-reservation' ),
|
||||
'segment' => __( 'Segment', 'carei-reservation' ),
|
||||
'dates' => __( 'Daty', 'carei-reservation' ),
|
||||
'branch' => __( 'Oddział', 'carei-reservation' ),
|
||||
'carei_status' => __( 'Status', 'carei-reservation' ),
|
||||
'date' => __( 'Data', 'carei-reservation' ),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -250,7 +417,7 @@ class Carei_Admin_Panel {
|
||||
printf(
|
||||
'<span class="carei-status-badge" style="background:%s;">%s</span>',
|
||||
esc_attr( $info['color'] ),
|
||||
esc_html( $info['label'] )
|
||||
esc_html( self::get_status_label( $status ) )
|
||||
);
|
||||
break;
|
||||
}
|
||||
@@ -264,13 +431,13 @@ class Carei_Admin_Panel {
|
||||
}
|
||||
$current = isset( $_GET['carei_status'] ) ? sanitize_text_field( $_GET['carei_status'] ) : '';
|
||||
echo '<select name="carei_status">';
|
||||
echo '<option value="">Wszystkie statusy</option>';
|
||||
echo '<option value="">' . esc_html__( 'Wszystkie statusy', 'carei-reservation' ) . '</option>';
|
||||
foreach ( self::$statuses as $key => $info ) {
|
||||
printf(
|
||||
'<option value="%s"%s>%s</option>',
|
||||
esc_attr( $key ),
|
||||
selected( $current, $key, false ),
|
||||
esc_html( $info['label'] )
|
||||
esc_html( self::get_status_label( $key ) )
|
||||
);
|
||||
}
|
||||
echo '</select>';
|
||||
@@ -306,7 +473,7 @@ class Carei_Admin_Panel {
|
||||
public function add_meta_boxes() {
|
||||
add_meta_box(
|
||||
'carei_reservation_details',
|
||||
'Szczegóły rezerwacji',
|
||||
__( 'Szczegóły rezerwacji', 'carei-reservation' ),
|
||||
array( $this, 'render_meta_box' ),
|
||||
self::POST_TYPE,
|
||||
'normal',
|
||||
@@ -345,7 +512,14 @@ class Carei_Admin_Panel {
|
||||
$price = isset( $protection['pricePerDay'] ) ? (float) $protection['pricePerDay'] : 0;
|
||||
$days = isset( $protection['days'] ) ? (int) $protection['days'] : 0;
|
||||
$total = isset( $protection['total'] ) ? (float) $protection['total'] : ( $price * $days );
|
||||
$protection_str = sprintf( '%s — %s zł/doba × %d = %s zł', $name, number_format( $price, 2, ',', ' ' ), $days, number_format( $total, 2, ',', ' ' ) );
|
||||
$protection_str = sprintf(
|
||||
/* translators: 1: package name, 2: price per day, 3: number of days, 4: total */
|
||||
__( '%1$s — %2$s zł/doba × %3$d = %4$s zł', 'carei-reservation' ),
|
||||
$name,
|
||||
number_format( $price, 2, ',', ' ' ),
|
||||
$days,
|
||||
number_format( $total, 2, ',', ' ' )
|
||||
);
|
||||
}
|
||||
|
||||
$address = $meta['address'] ? json_decode( $meta['address'], true ) : null;
|
||||
@@ -373,34 +547,34 @@ class Carei_Admin_Panel {
|
||||
|
||||
?>
|
||||
<table class="carei-meta-table">
|
||||
<tr><th>Nr rezerwacji</th><td><?php echo esc_html( $meta['reservation_no'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>ID rezerwacji (Softra)</th><td><?php echo esc_html( $meta['reservation_id'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>ID klienta (Softra)</th><td><?php echo esc_html( $meta['customer_id'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Nr rezerwacji', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['reservation_no'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'ID rezerwacji (Softra)', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['reservation_id'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'ID klienta (Softra)', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['customer_id'] ?: '—' ); ?></td></tr>
|
||||
<tr class="carei-meta-divider"><td colspan="2"><hr></td></tr>
|
||||
<tr><th>Segment</th><td><?php echo esc_html( $meta['segment'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>Data od</th><td><?php echo esc_html( $from_fmt ); ?></td></tr>
|
||||
<tr><th>Data do</th><td><?php echo esc_html( $to_fmt ); ?></td></tr>
|
||||
<tr><th>Oddział odbioru</th><td><?php echo esc_html( $meta['pickup_branch'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>Oddział zwrotu</th><td><?php echo esc_html( $meta['return_branch'] ?: $meta['pickup_branch'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Segment', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['segment'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Data od', 'carei-reservation' ); ?></th><td><?php echo esc_html( $from_fmt ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Data do', 'carei-reservation' ); ?></th><td><?php echo esc_html( $to_fmt ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Oddział odbioru', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['pickup_branch'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Oddział zwrotu', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['return_branch'] ?: $meta['pickup_branch'] ?: '—' ); ?></td></tr>
|
||||
<tr class="carei-meta-divider"><td colspan="2"><hr></td></tr>
|
||||
<tr><th>Imię</th><td><?php echo esc_html( $meta['first_name'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>Nazwisko</th><td><?php echo esc_html( $meta['last_name'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>Email</th><td><?php echo esc_html( $meta['email'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>Telefon</th><td><?php echo esc_html( $meta['phone'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>PESEL</th><td><?php echo esc_html( $meta['pesel'] ?: '—' ); ?></td></tr>
|
||||
<tr><th>Adres</th><td><?php echo esc_html( $address_str ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Imię', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['first_name'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Nazwisko', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['last_name'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Email', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['email'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Telefon', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['phone'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'PESEL', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['pesel'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Adres', 'carei-reservation' ); ?></th><td><?php echo esc_html( $address_str ?: '—' ); ?></td></tr>
|
||||
<tr class="carei-meta-divider"><td colspan="2"><hr></td></tr>
|
||||
<tr><th>Opcje dodatkowe</th><td><?php echo esc_html( $extras_str ?: 'Brak' ); ?></td></tr>
|
||||
<tr><th>Pakiet ochronny</th><td><?php echo esc_html( $protection_str ?: 'Brak' ); ?></td></tr>
|
||||
<tr><th>Wiadomość</th><td><?php echo esc_html( $meta['comments'] ?: '—' ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Opcje dodatkowe', 'carei-reservation' ); ?></th><td><?php echo esc_html( $extras_str ?: __( 'Brak', 'carei-reservation' ) ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Pakiet ochronny', 'carei-reservation' ); ?></th><td><?php echo esc_html( $protection_str ?: __( 'Brak', 'carei-reservation' ) ); ?></td></tr>
|
||||
<tr><th><?php esc_html_e( 'Wiadomość', 'carei-reservation' ); ?></th><td><?php echo esc_html( $meta['comments'] ?: '—' ); ?></td></tr>
|
||||
<tr class="carei-meta-divider"><td colspan="2"><hr></td></tr>
|
||||
<tr>
|
||||
<th>Status</th>
|
||||
<th><?php esc_html_e( 'Status', 'carei-reservation' ); ?></th>
|
||||
<td>
|
||||
<select name="carei_status">
|
||||
<?php foreach ( self::$statuses as $key => $info ) : ?>
|
||||
<option value="<?php echo esc_attr( $key ); ?>" <?php selected( $meta['status'], $key ); ?>>
|
||||
<?php echo esc_html( $info['label'] ); ?>
|
||||
<?php echo esc_html( self::get_status_label( $key ) ); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
@@ -513,7 +687,13 @@ class Carei_Admin_Panel {
|
||||
$first_name = isset( $driver['firstName'] ) ? $driver['firstName'] : '';
|
||||
$last_name = isset( $driver['lastName'] ) ? $driver['lastName'] : '';
|
||||
|
||||
$title = sprintf( 'Rezerwacja #%s — %s %s', $reservation_no ?: $reservation_id, $first_name, $last_name );
|
||||
$title = sprintf(
|
||||
/* translators: 1: reservation number or ID, 2: first name, 3: last name */
|
||||
__( 'Rezerwacja #%1$s — %2$s %3$s', 'carei-reservation' ),
|
||||
$reservation_no ?: $reservation_id,
|
||||
$first_name,
|
||||
$last_name
|
||||
);
|
||||
|
||||
$post_id = wp_insert_post( array(
|
||||
'post_type' => self::POST_TYPE,
|
||||
|
||||
@@ -20,7 +20,7 @@ class Carei_Branches_Widget extends \Elementor\Widget_Base {
|
||||
}
|
||||
|
||||
public function get_title() {
|
||||
return 'Carei Branches';
|
||||
return esc_html__( 'Carei Branches', 'carei-reservation' );
|
||||
}
|
||||
|
||||
public function get_icon() {
|
||||
@@ -92,11 +92,11 @@ class Carei_Branches_Widget extends \Elementor\Widget_Base {
|
||||
if ( $street ) {
|
||||
$street_lower = mb_strtolower( $street, 'UTF-8' );
|
||||
$has_prefix = preg_match( '/^(ul\.|al\.|pl\.|os\.)/u', $street_lower );
|
||||
$street = $has_prefix ? $street : 'ul. ' . $street;
|
||||
$street = $has_prefix ? $street : sprintf( /* translators: %s: street name */ __( 'ul. %s', 'carei-reservation' ), $street );
|
||||
}
|
||||
|
||||
$result[] = array(
|
||||
'name' => 'Oddział ' . $display_city,
|
||||
'name' => sprintf( /* translators: %s: city name */ __( 'Oddział %s', 'carei-reservation' ), $display_city ),
|
||||
'street' => $street,
|
||||
'zipCity' => trim( $zip . ' ' . $api_city_tc ),
|
||||
);
|
||||
|
||||
@@ -13,7 +13,7 @@ class Carei_Cities_Widget extends \Elementor\Widget_Base {
|
||||
}
|
||||
|
||||
public function get_title() {
|
||||
return 'Carei Cities';
|
||||
return esc_html__( 'Carei Cities', 'carei-reservation' );
|
||||
}
|
||||
|
||||
public function get_icon() {
|
||||
|
||||
@@ -13,7 +13,7 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
}
|
||||
|
||||
public function get_title() {
|
||||
return 'Carei Reservation';
|
||||
return esc_html__( 'Carei Reservation', 'carei-reservation' );
|
||||
}
|
||||
|
||||
public function get_icon() {
|
||||
@@ -34,14 +34,14 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
|
||||
protected function register_controls() {
|
||||
$this->start_controls_section( 'content_section', array(
|
||||
'label' => 'Przycisk rezerwacji',
|
||||
'label' => esc_html__( 'Przycisk rezerwacji', 'carei-reservation' ),
|
||||
'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
|
||||
) );
|
||||
|
||||
$this->add_control( 'button_text', array(
|
||||
'label' => 'Tekst przycisku',
|
||||
'label' => esc_html__( 'Tekst przycisku', 'carei-reservation' ),
|
||||
'type' => \Elementor\Controls_Manager::TEXT,
|
||||
'default' => 'Złóż zapytanie o rezerwację',
|
||||
'default' => esc_html__( 'Złóż zapytanie o rezerwację', 'carei-reservation' ),
|
||||
) );
|
||||
|
||||
$this->end_controls_section();
|
||||
@@ -59,12 +59,12 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-modal-overlay" data-carei-modal role="dialog" aria-modal="true" aria-labelledby="carei-modal-title">
|
||||
<div class="carei-modal">
|
||||
<div class="carei-modal__scroll">
|
||||
<span role="button" tabindex="0" class="carei-modal-close" data-carei-close-modal aria-label="Zamknij formularz">
|
||||
<span role="button" tabindex="0" class="carei-modal-close" data-carei-close-modal aria-label="<?php echo esc_attr__( 'Zamknij formularz', 'carei-reservation' ); ?>">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15 5L5 15M5 5l10 10" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
|
||||
</svg>
|
||||
</span>
|
||||
<h2 class="carei-modal-title" id="carei-modal-title">Wypełnij formularz rezerwacji<span>.</span></h2>
|
||||
<h2 class="carei-modal-title" id="carei-modal-title"><?php esc_html_e( 'Wypełnij formularz rezerwacji', 'carei-reservation' ); ?><span>.</span></h2>
|
||||
|
||||
<form class="carei-form" id="carei-reservation-form" novalidate>
|
||||
|
||||
@@ -74,7 +74,7 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-form__field">
|
||||
<div class="carei-form__select-wrap">
|
||||
<select id="carei-segment" name="segment" required>
|
||||
<option value="" disabled selected>Wybierz segment pojazdu</option>
|
||||
<option value="" disabled selected><?php esc_html_e( 'Wybierz segment pojazdu', 'carei-reservation' ); ?></option>
|
||||
</select>
|
||||
<svg class="carei-form__select-arrow" width="16" height="16" viewBox="0 0 16 16"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
@@ -82,27 +82,27 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-form__field carei-form__field--date">
|
||||
<div class="carei-form__date-wrap">
|
||||
<svg class="carei-form__date-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2.5" y="3" width="11" height="10" rx="0.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/><path d="M11 1.5v2M5 1.5v2M2.5 5.5h11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
<label class="carei-form__date-label" for="carei-date-from">Od kiedy?</label>
|
||||
<label class="carei-form__date-label" for="carei-date-from"><?php esc_html_e( 'Od kiedy?', 'carei-reservation' ); ?></label>
|
||||
<input type="datetime-local" id="carei-date-from" name="dateFrom" class="carei-form__input carei-form__input--date" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carei-form__field carei-form__field--date">
|
||||
<div class="carei-form__date-wrap">
|
||||
<svg class="carei-form__date-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2.5" y="3" width="11" height="10" rx="0.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/><path d="M11 1.5v2M5 1.5v2M2.5 5.5h11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
<label class="carei-form__date-label" for="carei-date-to">Do kiedy?</label>
|
||||
<label class="carei-form__date-label" for="carei-date-to"><?php esc_html_e( 'Do kiedy?', 'carei-reservation' ); ?></label>
|
||||
<input type="datetime-local" id="carei-date-to" name="dateTo" class="carei-form__input carei-form__input--date" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="carei-form__days-count" id="carei-days-count">Wybrano: <strong>0 dni</strong></div>
|
||||
<div class="carei-form__days-count" id="carei-days-count"><?php esc_html_e( 'Wybrano:', 'carei-reservation' ); ?> <strong><?php esc_html_e( '0 dni', 'carei-reservation' ); ?></strong></div>
|
||||
|
||||
<div class="carei-form__row carei-form__row--pickup">
|
||||
<div class="carei-form__field">
|
||||
<div class="carei-form__select-wrap carei-form__select-wrap--icon">
|
||||
<svg class="carei-form__icon-pin" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1C5.24 1 3 3.24 3 6c0 3.75 5 9 5 9s5-5.25 5-9c0-2.76-2.24-5-5-5zm0 7a2 2 0 110-4 2 2 0 010 4z" fill="currentColor"/></svg>
|
||||
<select id="carei-pickup-branch" name="pickupBranch" required>
|
||||
<option value="" disabled selected>Miejsce odbioru</option>
|
||||
<option value="" disabled selected><?php esc_html_e( 'Miejsce odbioru', 'carei-reservation' ); ?></option>
|
||||
</select>
|
||||
<svg class="carei-form__select-arrow" width="16" height="16" viewBox="0 0 16 16"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
@@ -112,7 +112,7 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<span class="carei-form__checkbox-box">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7l3.5 3.5L12 4" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span class="carei-form__checkbox-text">Zwrot w tej samej lokalizacji</span>
|
||||
<span class="carei-form__checkbox-text"><?php esc_html_e( 'Zwrot w tej samej lokalizacji', 'carei-reservation' ); ?></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@@ -120,7 +120,7 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-form__select-wrap carei-form__select-wrap--icon">
|
||||
<svg class="carei-form__icon-pin" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1C5.24 1 3 3.24 3 6c0 3.75 5 9 5 9s5-5.25 5-9c0-2.76-2.24-5-5-5zm0 7a2 2 0 110-4 2 2 0 010 4z" fill="currentColor"/></svg>
|
||||
<select id="carei-return-branch" name="returnBranch">
|
||||
<option value="" disabled selected>Miejsce zwrotu</option>
|
||||
<option value="" disabled selected><?php esc_html_e( 'Miejsce zwrotu', 'carei-reservation' ); ?></option>
|
||||
</select>
|
||||
<svg class="carei-form__select-arrow" width="16" height="16" viewBox="0 0 16 16"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
@@ -130,18 +130,18 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<!-- Ubezpieczenie + Opcje dodatkowe (ukryte do wybrania segmentu i miejsca odbioru) -->
|
||||
<div id="carei-extras-wrapper" class="carei-form__extras-wrapper" style="display:none;">
|
||||
|
||||
<div class="carei-form__divider"><span>Wyjazd zagraniczny</span></div>
|
||||
<div class="carei-form__divider"><span><?php esc_html_e( 'Wyjazd zagraniczny', 'carei-reservation' ); ?></span></div>
|
||||
<div class="carei-form__section" id="carei-abroad-section" style="display:none;">
|
||||
<label class="carei-form__checkbox-label carei-form__checkbox-label--abroad">
|
||||
<input type="checkbox" id="carei-abroad-toggle" name="abroadToggle">
|
||||
<span class="carei-form__checkbox-box"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7l3.5 3.5L12 4" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
||||
<span>Wyjazd poza granicę Polski do:</span>
|
||||
<span><?php esc_html_e( 'Wyjazd poza granicę Polski do:', 'carei-reservation' ); ?></span>
|
||||
</label>
|
||||
<div id="carei-abroad-search" class="carei-abroad" style="display:none;">
|
||||
<div class="carei-abroad__input-wrap">
|
||||
<svg class="carei-abroad__plus-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2v12M2 8h12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
|
||||
<input type="text" id="carei-abroad-input" class="carei-abroad__input" placeholder="Wyszukaj i dodaj kraj na trasie">
|
||||
<span role="button" tabindex="0" class="carei-abroad__clear" id="carei-abroad-clear" title="Wyczyść">
|
||||
<input type="text" id="carei-abroad-input" class="carei-abroad__input" placeholder="<?php echo esc_attr__( 'Wyszukaj i dodaj kraj na trasie', 'carei-reservation' ); ?>">
|
||||
<span role="button" tabindex="0" class="carei-abroad__clear" id="carei-abroad-clear" title="<?php echo esc_attr__( 'Wyczyść', 'carei-reservation' ); ?>">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M3 3l8 8M11 3l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
</div>
|
||||
@@ -150,18 +150,14 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="carei-form__divider"><span>Pakiety ochronne</span></div>
|
||||
<div class="carei-form__divider"><span><?php esc_html_e( 'Pakiety ochronne', 'carei-reservation' ); ?></span></div>
|
||||
<div class="carei-form__section">
|
||||
<div class="carei-form__row carei-form__row--protection-packages" id="carei-protection-packages-container">
|
||||
<!-- Dynamicznie z panelu WP (SOFT, PREMIUM) -->
|
||||
</div>
|
||||
<div class="carei-form__protection-divider" aria-hidden="true"></div>
|
||||
<div class="carei-form__row" id="carei-insurance-container">
|
||||
<!-- Dynamicznie z API pricelist -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="carei-form__divider"><span>Opcje dodatkowe</span></div>
|
||||
<div class="carei-form__divider"><span><?php esc_html_e( 'Opcje dodatkowe', 'carei-reservation' ); ?></span></div>
|
||||
<div class="carei-form__section">
|
||||
<div class="carei-form__row" id="carei-extras-container">
|
||||
<!-- Dynamicznie z API pricelist -->
|
||||
@@ -171,20 +167,20 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
</div>
|
||||
|
||||
<!-- Dane najemcy -->
|
||||
<div class="carei-form__divider"><span>Dane najemcy</span></div>
|
||||
<div class="carei-form__divider"><span><?php esc_html_e( 'Dane najemcy', 'carei-reservation' ); ?></span></div>
|
||||
|
||||
<div class="carei-form__section">
|
||||
<div class="carei-form__row">
|
||||
<div class="carei-form__field">
|
||||
<div class="carei-form__float-wrap">
|
||||
<input type="text" id="carei-firstname" name="firstName" class="carei-form__input carei-form__input--float" placeholder=" " required>
|
||||
<label class="carei-form__float-label" for="carei-firstname">Imię</label>
|
||||
<label class="carei-form__float-label" for="carei-firstname"><?php esc_html_e( 'Imię', 'carei-reservation' ); ?></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carei-form__field">
|
||||
<div class="carei-form__float-wrap">
|
||||
<input type="text" id="carei-lastname" name="lastName" class="carei-form__input carei-form__input--float" placeholder=" " required>
|
||||
<label class="carei-form__float-label" for="carei-lastname">Nazwisko</label>
|
||||
<label class="carei-form__float-label" for="carei-lastname"><?php esc_html_e( 'Nazwisko', 'carei-reservation' ); ?></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -193,12 +189,12 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-form__field">
|
||||
<div class="carei-form__float-wrap">
|
||||
<input type="email" id="carei-email" name="email" class="carei-form__input carei-form__input--float" placeholder=" " required>
|
||||
<label class="carei-form__float-label" for="carei-email">Adres e-mail</label>
|
||||
<label class="carei-form__float-label" for="carei-email"><?php esc_html_e( 'Adres e-mail', 'carei-reservation' ); ?></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carei-form__field">
|
||||
<div class="carei-form__phone-wrap">
|
||||
<label class="carei-form__phone-label" for="carei-phone">Nr telefonu</label>
|
||||
<label class="carei-form__phone-label" for="carei-phone"><?php esc_html_e( 'Nr telefonu', 'carei-reservation' ); ?></label>
|
||||
<div class="carei-form__phone-row">
|
||||
<div class="carei-form__phone-prefix">
|
||||
<span class="carei-form__phone-flag">🇵🇱</span>
|
||||
@@ -212,7 +208,7 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
|
||||
|
||||
<div class="carei-form__field carei-form__field--full">
|
||||
<textarea id="carei-message" name="message" class="carei-form__textarea" placeholder="Twoja wiadomość dotycząca rezerwacji" rows="4"></textarea>
|
||||
<textarea id="carei-message" name="message" class="carei-form__textarea" placeholder="<?php echo esc_attr__( 'Twoja wiadomość dotycząca rezerwacji', 'carei-reservation' ); ?>" rows="4"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -223,23 +219,23 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<span class="carei-form__checkbox-box">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7l3.5 3.5L12 4" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span class="carei-form__checkbox-text">Zgadzam się na <a href="/polityka-prywatnosci/" target="_blank">Politykę Prywatności</a></span>
|
||||
<span class="carei-form__checkbox-text"><?php echo wp_kses( __( 'Zgadzam się na <a href="/polityka-prywatnosci/" target="_blank">Politykę Prywatności</a>', 'carei-reservation' ), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ); ?></span>
|
||||
</label>
|
||||
<button type="submit" class="carei-form__submit" aria-busy="false">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg>
|
||||
Wyślij
|
||||
<?php esc_html_e( 'Wyślij', 'carei-reservation' ); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="carei-form__error-summary" id="carei-error-summary" style="display:none;">
|
||||
Uzupełnij wymagane pola zaznaczone na czerwono.
|
||||
<?php esc_html_e( 'Uzupełnij wymagane pola zaznaczone na czerwono.', 'carei-reservation' ); ?>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<!-- Podsumowanie kosztów (po submit) -->
|
||||
<div id="carei-summary-overlay" class="carei-summary" style="display:none;">
|
||||
<h3 class="carei-summary__title" tabindex="-1">Podsumowanie rezerwacji<span>.</span></h3>
|
||||
<h3 class="carei-summary__title" tabindex="-1"><?php esc_html_e( 'Podsumowanie rezerwacji', 'carei-reservation' ); ?><span>.</span></h3>
|
||||
<div class="carei-summary__details" id="carei-summary-details"></div>
|
||||
<div class="carei-summary__table" id="carei-summary-table"></div>
|
||||
<div class="carei-summary__total" id="carei-summary-total"></div>
|
||||
@@ -247,11 +243,11 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-summary__actions">
|
||||
<button type="button" class="carei-summary__btn carei-summary__btn--back" id="carei-summary-back">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none"><path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
Wróć do formularza
|
||||
<?php esc_html_e( 'Wróć do formularza', 'carei-reservation' ); ?>
|
||||
</button>
|
||||
<button type="button" class="carei-summary__btn carei-summary__btn--confirm" id="carei-summary-confirm" aria-busy="false">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg>
|
||||
Potwierdź rezerwację
|
||||
<?php esc_html_e( 'Potwierdź rezerwację', 'carei-reservation' ); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -261,10 +257,10 @@ class Carei_Reservation_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-success__icon">
|
||||
<svg width="40" height="40" viewBox="0 0 24 24" fill="none"><path d="M20 6L9 17l-5-5" stroke="#fff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</div>
|
||||
<h3 class="carei-success__title" tabindex="-1">Zamówienie złożone!</h3>
|
||||
<h3 class="carei-success__title" tabindex="-1"><?php esc_html_e( 'Zamówienie złożone!', 'carei-reservation' ); ?></h3>
|
||||
<p class="carei-success__number" id="carei-success-number"></p>
|
||||
<p class="carei-success__message">Oczekuj na kontakt z wypożyczalnią</p>
|
||||
<button type="button" class="carei-success__close" id="carei-success-close">Zamknij</button>
|
||||
<p class="carei-success__message"><?php esc_html_e( 'Oczekuj na kontakt z wypożyczalnią', 'carei-reservation' ); ?></p>
|
||||
<button type="button" class="carei-success__close" id="carei-success-close"><?php esc_html_e( 'Zamknij', 'carei-reservation' ); ?></button>
|
||||
</div>
|
||||
|
||||
</div><!-- .carei-modal__scroll -->
|
||||
|
||||
@@ -63,7 +63,7 @@ class Carei_Map_Widget extends \Elementor\Widget_Base {
|
||||
}
|
||||
|
||||
public function get_title() {
|
||||
return 'Carei Map';
|
||||
return esc_html__( 'Carei Map', 'carei-reservation' );
|
||||
}
|
||||
|
||||
public function get_icon() {
|
||||
@@ -169,11 +169,11 @@ class Carei_Map_Widget extends \Elementor\Widget_Base {
|
||||
$api_city = isset( $b['city'] ) ? trim( $b['city'] ) : '';
|
||||
$api_city_title = mb_convert_case( $api_city, MB_CASE_TITLE, 'UTF-8' );
|
||||
|
||||
$address_lines = array( 'Oddział ' . $display_city );
|
||||
$address_lines = array( sprintf( /* translators: %s: city name */ __( 'Oddział %s', 'carei-reservation' ), $display_city ) );
|
||||
if ( $street ) {
|
||||
$street_lower = mb_strtolower( $street, 'UTF-8' );
|
||||
$has_prefix = preg_match( '/^(ul\.|al\.|pl\.|os\.)/u', $street_lower );
|
||||
$address_lines[] = $has_prefix ? $street : 'ul. ' . $street;
|
||||
$address_lines[] = $has_prefix ? $street : sprintf( /* translators: %s: street name */ __( 'ul. %s', 'carei-reservation' ), $street );
|
||||
}
|
||||
$zip_city = trim( $zip . ' ' . $api_city_title );
|
||||
if ( $zip_city ) {
|
||||
|
||||
@@ -145,7 +145,7 @@ class Carei_REST_Proxy {
|
||||
public function check_nonce( WP_REST_Request $request ) {
|
||||
$nonce = $request->get_header( 'X-WP-Nonce' );
|
||||
if ( ! $nonce || ! wp_verify_nonce( $nonce, 'wp_rest' ) ) {
|
||||
return new WP_Error( 'rest_forbidden', 'Invalid nonce.', array( 'status' => 403 ) );
|
||||
return new WP_Error( 'rest_forbidden', __( 'Invalid nonce.', 'carei-reservation' ), array( 'status' => 403 ) );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -156,7 +156,7 @@ class Carei_REST_Proxy {
|
||||
private function api() {
|
||||
$api = Carei_Softra_API::get_instance();
|
||||
if ( null === $api ) {
|
||||
return new WP_Error( 'carei_not_configured', 'Softra API not configured.', array( 'status' => 500 ) );
|
||||
return new WP_Error( 'carei_not_configured', __( 'Softra API not configured.', 'carei-reservation' ), array( 'status' => 500 ) );
|
||||
}
|
||||
return $api;
|
||||
}
|
||||
@@ -227,12 +227,34 @@ class Carei_REST_Proxy {
|
||||
if ( is_wp_error( $api ) ) {
|
||||
return $api;
|
||||
}
|
||||
return $this->respond( $api->get_pricelist(
|
||||
$pricelists = $api->get_pricelist(
|
||||
$request->get_param( 'category' ),
|
||||
$request->get_param( 'dateFrom' ),
|
||||
$request->get_param( 'dateTo' ),
|
||||
$request->get_param( 'pickUpLocation' )
|
||||
) );
|
||||
);
|
||||
|
||||
// Auto-collect PL extra names + per-locale translate (Phase 19).
|
||||
if ( is_array( $pricelists ) ) {
|
||||
$locale = $this->resolve_locale( $request );
|
||||
$translations = Carei_Admin_Panel::get_extras_translations();
|
||||
foreach ( $pricelists as &$pricelist ) {
|
||||
if ( ! is_array( $pricelist ) || empty( $pricelist['additionalItems'] ) || ! is_array( $pricelist['additionalItems'] ) ) continue;
|
||||
foreach ( $pricelist['additionalItems'] as &$item ) {
|
||||
if ( ! is_array( $item ) || ! isset( $item['name'] ) || ! is_string( $item['name'] ) ) continue;
|
||||
$pl_name = trim( $item['name'] );
|
||||
if ( $pl_name === '' ) continue;
|
||||
Carei_Admin_Panel::remember_extra_name( $pl_name );
|
||||
if ( $locale === 'en' && isset( $translations[ $pl_name ] ) && $translations[ $pl_name ] !== '' ) {
|
||||
$item['name'] = $translations[ $pl_name ];
|
||||
}
|
||||
}
|
||||
unset( $item );
|
||||
}
|
||||
unset( $pricelist );
|
||||
}
|
||||
|
||||
return $this->respond( $pricelists );
|
||||
}
|
||||
|
||||
public function get_pricing_summary( WP_REST_Request $request ) {
|
||||
@@ -307,18 +329,36 @@ class Carei_REST_Proxy {
|
||||
}
|
||||
|
||||
public function get_protection_packages( WP_REST_Request $request ) {
|
||||
$all = Carei_Admin_Panel::get_protection_packages();
|
||||
$out = array( 'soft' => null, 'premium' => null );
|
||||
$all = Carei_Admin_Panel::get_protection_packages();
|
||||
$locale = $this->resolve_locale( $request );
|
||||
$out = array( 'soft' => null, 'premium' => null );
|
||||
foreach ( array( 'soft', 'premium' ) as $key ) {
|
||||
if ( isset( $all[ $key ] ) && ! empty( $all[ $key ]['active'] ) ) {
|
||||
$pkg = $all[ $key ];
|
||||
if ( 'en' === $locale ) {
|
||||
$name = ! empty( $pkg['name_en'] ) ? $pkg['name_en'] : $pkg['name'];
|
||||
$desc = ! empty( $pkg['description_en'] ) ? $pkg['description_en'] : $pkg['description'];
|
||||
} else {
|
||||
$name = $pkg['name'];
|
||||
$desc = $pkg['description'];
|
||||
}
|
||||
$out[ $key ] = array(
|
||||
'key' => $key,
|
||||
'name' => $all[ $key ]['name'],
|
||||
'pricePerDay' => (float) $all[ $key ]['pricePerDay'],
|
||||
'description' => $all[ $key ]['description'],
|
||||
'name' => $name,
|
||||
'pricePerDay' => (float) $pkg['pricePerDay'],
|
||||
'description' => $desc,
|
||||
);
|
||||
}
|
||||
}
|
||||
return rest_ensure_response( $out );
|
||||
}
|
||||
|
||||
private function resolve_locale( WP_REST_Request $request ) {
|
||||
$lang = $request->get_param( 'lang' );
|
||||
if ( $lang && in_array( strtolower( $lang ), array( 'pl', 'en' ), true ) ) {
|
||||
return strtolower( $lang );
|
||||
}
|
||||
$locale = function_exists( 'determine_locale' ) ? determine_locale() : get_locale();
|
||||
return ( 0 === strpos( (string) $locale, 'en' ) ) ? 'en' : 'pl';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ class Carei_Search_Widget extends \Elementor\Widget_Base {
|
||||
}
|
||||
|
||||
public function get_title() {
|
||||
return 'Carei Search Form';
|
||||
return esc_html__( 'Carei Search Form', 'carei-reservation' );
|
||||
}
|
||||
|
||||
public function get_icon() {
|
||||
@@ -37,14 +37,14 @@ class Carei_Search_Widget extends \Elementor\Widget_Base {
|
||||
protected function render() {
|
||||
?>
|
||||
<div class="carei-search-form">
|
||||
<h2 class="carei-search-form__title">Wypełnij formularz rezerwacji<span>.</span></h2>
|
||||
<h2 class="carei-search-form__title"><?php esc_html_e( 'Wypełnij formularz rezerwacji', 'carei-reservation' ); ?><span>.</span></h2>
|
||||
|
||||
<div class="carei-search-form__fields">
|
||||
<!-- Segment -->
|
||||
<div class="carei-search-form__field carei-search-form__field--full">
|
||||
<div class="carei-search-form__select-wrap">
|
||||
<select id="carei-search-segment">
|
||||
<option value="" disabled selected>Wybierz segment</option>
|
||||
<option value="" disabled selected><?php esc_html_e( 'Wybierz segment', 'carei-reservation' ); ?></option>
|
||||
</select>
|
||||
<svg class="carei-search-form__select-arrow" width="16" height="16" viewBox="0 0 16 16"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
@@ -55,14 +55,14 @@ class Carei_Search_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-search-form__field">
|
||||
<div class="carei-search-form__date-wrap">
|
||||
<svg class="carei-search-form__date-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2.5" y="3" width="11" height="10" rx="0.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/><path d="M11 1.5v2M5 1.5v2M2.5 5.5h11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
<label class="carei-search-form__date-label" for="carei-search-date-from">Od kiedy?</label>
|
||||
<label class="carei-search-form__date-label" for="carei-search-date-from"><?php esc_html_e( 'Od kiedy?', 'carei-reservation' ); ?></label>
|
||||
<input type="datetime-local" id="carei-search-date-from" class="carei-search-form__input carei-search-form__input--date">
|
||||
</div>
|
||||
</div>
|
||||
<div class="carei-search-form__field">
|
||||
<div class="carei-search-form__date-wrap">
|
||||
<svg class="carei-search-form__date-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2.5" y="3" width="11" height="10" rx="0.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/><path d="M11 1.5v2M5 1.5v2M2.5 5.5h11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
<label class="carei-search-form__date-label" for="carei-search-date-to">Do kiedy?</label>
|
||||
<label class="carei-search-form__date-label" for="carei-search-date-to"><?php esc_html_e( 'Do kiedy?', 'carei-reservation' ); ?></label>
|
||||
<input type="datetime-local" id="carei-search-date-to" class="carei-search-form__input carei-search-form__input--date">
|
||||
</div>
|
||||
</div>
|
||||
@@ -73,7 +73,7 @@ class Carei_Search_Widget extends \Elementor\Widget_Base {
|
||||
<div class="carei-search-form__select-wrap carei-search-form__select-wrap--icon">
|
||||
<svg class="carei-search-form__pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1C5.24 1 3 3.24 3 6c0 3.75 5 9 5 9s5-5.25 5-9c0-2.76-2.24-5-5-5zm0 7a2 2 0 110-4 2 2 0 010 4z" fill="currentColor"/></svg>
|
||||
<select id="carei-search-pickup">
|
||||
<option value="" disabled selected>Miejsce odbioru</option>
|
||||
<option value="" disabled selected><?php esc_html_e( 'Miejsce odbioru', 'carei-reservation' ); ?></option>
|
||||
</select>
|
||||
<svg class="carei-search-form__select-arrow" width="16" height="16" viewBox="0 0 16 16"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
|
||||
</div>
|
||||
@@ -86,7 +86,7 @@ class Carei_Search_Widget extends \Elementor\Widget_Base {
|
||||
<span class="carei-search-form__checkbox-box">
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7l3.5 3.5L12 4" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span class="carei-search-form__checkbox-text">Zwrot w tej samej lokalizacji</span>
|
||||
<span class="carei-search-form__checkbox-text"><?php esc_html_e( 'Zwrot w tej samej lokalizacji', 'carei-reservation' ); ?></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
@@ -94,7 +94,7 @@ class Carei_Search_Widget extends \Elementor\Widget_Base {
|
||||
<!-- Przycisk -->
|
||||
<button type="button" class="carei-search-form__submit" id="carei-search-submit">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg>
|
||||
Złóż zapytanie o rezerwację
|
||||
<?php esc_html_e( 'Złóż zapytanie o rezerwację', 'carei-reservation' ); ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
@@ -137,9 +137,12 @@ class Carei_Softra_API {
|
||||
}
|
||||
|
||||
if ( $res['status'] < 200 || $res['status'] >= 300 ) {
|
||||
$raw_msg = self::extract_softra_message( $res['body'] );
|
||||
$mapped = self::map_error_message( $raw_msg );
|
||||
$message = $mapped !== '' ? $mapped : sprintf( 'Softra API error: HTTP %d', $res['status'] );
|
||||
return new WP_Error(
|
||||
'carei_api_error',
|
||||
'Softra API error: HTTP ' . $res['status'],
|
||||
$message,
|
||||
array( 'status' => $res['status'], 'body' => $res['body'] )
|
||||
);
|
||||
}
|
||||
@@ -147,6 +150,69 @@ class Carei_Softra_API {
|
||||
return $res['body'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract human-readable message from Softra response body.
|
||||
* Softra returns either JSON with `message` / `error` / `details` field, or raw string.
|
||||
*/
|
||||
public static function extract_softra_message( $body ) {
|
||||
if ( is_array( $body ) ) {
|
||||
foreach ( array( 'message', 'error', 'details', 'description' ) as $field ) {
|
||||
if ( ! empty( $body[ $field ] ) && is_string( $body[ $field ] ) ) {
|
||||
return trim( $body[ $field ] );
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
if ( is_string( $body ) && $body !== '' ) {
|
||||
$decoded = json_decode( $body, true );
|
||||
if ( is_array( $decoded ) ) {
|
||||
return self::extract_softra_message( $decoded );
|
||||
}
|
||||
return trim( $body );
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Map typical Softra PL error messages to localized strings.
|
||||
* Exact match first, then fuzzy prefix match. Unknown messages passthrough.
|
||||
*/
|
||||
public static function map_error_message( $original_message ) {
|
||||
if ( ! is_string( $original_message ) || '' === trim( $original_message ) ) {
|
||||
return $original_message;
|
||||
}
|
||||
|
||||
$dict = array(
|
||||
'Brak dostępnego pojazdu w wybranym terminie' => __( 'Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment.', 'carei-reservation' ),
|
||||
'Nieprawidłowy zakres dat' => __( 'Nieprawidłowy zakres dat', 'carei-reservation' ),
|
||||
'Nie znaleziono oddziału' => __( 'Nie znaleziono oddziału', 'carei-reservation' ),
|
||||
'Klient o tych danych już istnieje' => __( 'Klient o tych danych już istnieje w systemie', 'carei-reservation' ),
|
||||
'Nieprawidłowy numer PESEL' => __( 'Nieprawidłowy numer PESEL', 'carei-reservation' ),
|
||||
'Cennik wygasł' => __( 'Cennik wygasł. Odśwież formularz i spróbuj ponownie.', 'carei-reservation' ),
|
||||
'Token wygasł' => __( 'Sesja wygasła. Odśwież stronę.', 'carei-reservation' ),
|
||||
'Nieprawidłowe dane logowania' => __( 'Błąd autoryzacji API. Skontaktuj się z administratorem.', 'carei-reservation' ),
|
||||
'Brak uprawnień' => __( 'Brak uprawnień do wykonania operacji.', 'carei-reservation' ),
|
||||
'Błąd serwera' => __( 'Błąd serwera. Spróbuj ponownie za chwilę.', 'carei-reservation' ),
|
||||
'Przekroczono limit rezerwacji' => __( 'Przekroczono limit rezerwacji dla tego klienta.', 'carei-reservation' ),
|
||||
'Nieprawidłowy numer telefonu' => __( 'Podaj poprawny numer telefonu (min. 9 cyfr).', 'carei-reservation' ),
|
||||
'Wymagane pole' => __( 'To pole jest wymagane.', 'carei-reservation' ),
|
||||
);
|
||||
|
||||
$trimmed = trim( $original_message );
|
||||
|
||||
if ( isset( $dict[ $trimmed ] ) ) {
|
||||
return $dict[ $trimmed ];
|
||||
}
|
||||
|
||||
foreach ( $dict as $pl_key => $translated ) {
|
||||
if ( 0 === stripos( $trimmed, $pl_key ) ) {
|
||||
return $translated;
|
||||
}
|
||||
}
|
||||
|
||||
return $original_message;
|
||||
}
|
||||
|
||||
// ─── Public API Methods ───────────────────────────────────────
|
||||
|
||||
public function get_branches() {
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,659 @@
|
||||
# Copyright (C) 2026 Carei
|
||||
# This file is distributed under the same license as the Carei Reservation plugin.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Carei Reservation 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-22 12:00+0000\n"
|
||||
"PO-Revision-Date: 2026-04-22 12:00+0000\n"
|
||||
"Last-Translator: Carei\n"
|
||||
"Language-Team: English\n"
|
||||
"Language: en_GB\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Domain: carei-reservation\n"
|
||||
|
||||
#: carei-reservation.php:133
|
||||
msgid "Błąd API: HTTP %status%"
|
||||
msgstr "API error: HTTP %status%"
|
||||
|
||||
#: carei-reservation.php:134
|
||||
msgid "Przekroczono czas oczekiwania. Spróbuj ponownie."
|
||||
msgstr "Request timed out. Please try again."
|
||||
|
||||
#: carei-reservation.php:135
|
||||
msgid "Brak połączenia z serwerem. Sprawdź internet i spróbuj ponownie."
|
||||
msgstr "No server connection. Check your internet and try again."
|
||||
|
||||
#: carei-reservation.php:136
|
||||
msgid "Błąd ładowania"
|
||||
msgstr "Loading error"
|
||||
|
||||
#: carei-reservation.php:139
|
||||
msgid "Wybierz..."
|
||||
msgstr "Select..."
|
||||
|
||||
#: carei-reservation.php:140 includes/class-elementor-widget.php:77
|
||||
msgid "Wybierz segment pojazdu"
|
||||
msgstr "Select a vehicle segment"
|
||||
|
||||
#: carei-reservation.php:141 includes/class-search-widget.php:47
|
||||
msgid "Wybierz segment"
|
||||
msgstr "Select segment"
|
||||
|
||||
#: carei-reservation.php:142
|
||||
msgid "Wybierz miejsce odbioru"
|
||||
msgstr "Select pickup location"
|
||||
|
||||
#: carei-reservation.php:143
|
||||
msgid "Wybierz miejsce zwrotu"
|
||||
msgstr "Select return location"
|
||||
|
||||
#: carei-reservation.php:144
|
||||
msgid "Segment %name%"
|
||||
msgstr "Segment %name%"
|
||||
|
||||
#: carei-reservation.php:145
|
||||
msgid "Brak segmentów"
|
||||
msgstr "No segments"
|
||||
|
||||
#: carei-reservation.php:146
|
||||
msgid "Najpierw wybierz segment"
|
||||
msgstr "Select segment first"
|
||||
|
||||
#: carei-reservation.php:147 carei-reservation.php:209
|
||||
#: includes/class-elementor-widget.php:105
|
||||
#: includes/class-search-widget.php:76
|
||||
msgid "Miejsce odbioru"
|
||||
msgstr "Pickup location"
|
||||
|
||||
#: carei-reservation.php:148 carei-reservation.php:210
|
||||
#: includes/class-elementor-widget.php:123
|
||||
msgid "Miejsce zwrotu"
|
||||
msgstr "Return location"
|
||||
|
||||
#: carei-reservation.php:149
|
||||
msgid "Brak lokalizacji dla tego segmentu"
|
||||
msgstr "No locations for this segment"
|
||||
|
||||
#: carei-reservation.php:150
|
||||
msgid "Brak lokalizacji"
|
||||
msgstr "No locations"
|
||||
|
||||
#: carei-reservation.php:153
|
||||
msgid "Rozpoczęcie"
|
||||
msgstr "Start"
|
||||
|
||||
#: carei-reservation.php:154
|
||||
msgid "Zakończenie"
|
||||
msgstr "End"
|
||||
|
||||
#: carei-reservation.php:155
|
||||
msgid "%label% — data lub godzina już minęły"
|
||||
msgstr "%label% — date or time has already passed"
|
||||
|
||||
#: carei-reservation.php:156
|
||||
msgid "Data lub godzina rozpoczęcia już minęły"
|
||||
msgstr "Start date or time has already passed"
|
||||
|
||||
#: carei-reservation.php:157
|
||||
msgid "Data lub godzina zakończenia już minęły"
|
||||
msgstr "End date or time has already passed"
|
||||
|
||||
#: carei-reservation.php:158
|
||||
msgid "Data zakończenia musi być po dacie rozpoczęcia"
|
||||
msgstr "End date must be after start date"
|
||||
|
||||
#: carei-reservation.php:159
|
||||
msgid "Podaj datę rozpoczęcia"
|
||||
msgstr "Enter start date"
|
||||
|
||||
#: carei-reservation.php:160
|
||||
msgid "Podaj datę zakończenia"
|
||||
msgstr "Enter end date"
|
||||
|
||||
#: carei-reservation.php:163
|
||||
msgid "Wybrano: <strong>%count% %unit%</strong>"
|
||||
msgstr "Selected: <strong>%count% %unit%</strong>"
|
||||
|
||||
#: carei-reservation.php:164
|
||||
msgid "dzień"
|
||||
msgstr "day"
|
||||
|
||||
#: carei-reservation.php:165
|
||||
msgid "dni"
|
||||
msgstr "days"
|
||||
|
||||
#: carei-reservation.php:166
|
||||
msgid "doba"
|
||||
msgstr "day"
|
||||
|
||||
#: carei-reservation.php:167
|
||||
msgid "doby"
|
||||
msgstr "days"
|
||||
|
||||
#: carei-reservation.php:168
|
||||
msgid "dób"
|
||||
msgstr "days"
|
||||
|
||||
#: carei-reservation.php:171
|
||||
msgid "%price% zł/doba"
|
||||
msgstr "%price% PLN/day"
|
||||
|
||||
#: carei-reservation.php:172 carei-reservation.php:173
|
||||
msgid "%price% zł"
|
||||
msgstr "%price% PLN"
|
||||
|
||||
#: carei-reservation.php:174
|
||||
msgid "od %min% do %max% zł"
|
||||
msgstr "from %min% to %max% PLN"
|
||||
|
||||
#: carei-reservation.php:175
|
||||
msgid "%perDay% zł/doba × %days% = %total% zł"
|
||||
msgstr "%perDay% PLN/day × %days% = %total% PLN"
|
||||
|
||||
#: carei-reservation.php:176
|
||||
msgid "Gratis"
|
||||
msgstr "Free"
|
||||
|
||||
#: carei-reservation.php:179
|
||||
msgid "Usuń"
|
||||
msgstr "Remove"
|
||||
|
||||
#: carei-reservation.php:180
|
||||
msgid "Dodaj"
|
||||
msgstr "Add"
|
||||
|
||||
#: carei-reservation.php:183
|
||||
msgid "Podaj imię"
|
||||
msgstr "Enter first name"
|
||||
|
||||
#: carei-reservation.php:184
|
||||
msgid "Podaj nazwisko"
|
||||
msgstr "Enter last name"
|
||||
|
||||
#: carei-reservation.php:185
|
||||
msgid "Podaj poprawny adres e-mail"
|
||||
msgstr "Enter a valid email address"
|
||||
|
||||
#: carei-reservation.php:186
|
||||
msgid "Podaj numer telefonu (min. 9 cyfr)"
|
||||
msgstr "Enter phone number (min. 9 digits)"
|
||||
|
||||
#: carei-reservation.php:187
|
||||
msgid "Wymagana zgoda na Politykę Prywatności"
|
||||
msgstr "Privacy policy consent is required"
|
||||
|
||||
#: carei-reservation.php:190 includes/class-elementor-widget.php:226
|
||||
msgid "Wyślij"
|
||||
msgstr "Send"
|
||||
|
||||
#: carei-reservation.php:191
|
||||
msgid "Przetwarzanie..."
|
||||
msgstr "Processing..."
|
||||
|
||||
#: carei-reservation.php:192
|
||||
msgid "Rezerwuję..."
|
||||
msgstr "Reserving..."
|
||||
|
||||
#: carei-reservation.php:193 includes/class-elementor-widget.php:250
|
||||
msgid "Potwierdź rezerwację"
|
||||
msgstr "Confirm reservation"
|
||||
|
||||
#: carei-reservation.php:196
|
||||
msgid "Ładowanie podsumowania..."
|
||||
msgstr "Loading summary..."
|
||||
|
||||
#: carei-reservation.php:197
|
||||
msgid "Nie udało się utworzyć klienta"
|
||||
msgstr "Failed to create customer"
|
||||
|
||||
#: carei-reservation.php:198
|
||||
msgid "Błąd tworzenia klienta: %msg%"
|
||||
msgstr "Customer creation error: %msg%"
|
||||
|
||||
#: carei-reservation.php:199
|
||||
msgid "Błąd pobierania podsumowania: %msg%"
|
||||
msgstr "Error loading summary: %msg%"
|
||||
|
||||
#: carei-reservation.php:200
|
||||
msgid "Rezerwacja nie powiodła się"
|
||||
msgstr "Reservation failed"
|
||||
|
||||
#: carei-reservation.php:203
|
||||
msgid "Pakiet ochronny: %name% — %perDay% zł/doba × %days% = %total% zł (do doliczenia poza systemem)"
|
||||
msgstr "Protection package: %name% — %perDay% PLN/day × %days% = %total% PLN (to be paid separately)"
|
||||
|
||||
#: carei-reservation.php:206 includes/class-admin-panel.php:219
|
||||
#: includes/class-admin-panel.php:399
|
||||
msgid "Segment"
|
||||
msgstr "Segment"
|
||||
|
||||
#: carei-reservation.php:207
|
||||
msgid "Od"
|
||||
msgstr "From"
|
||||
|
||||
#: carei-reservation.php:208
|
||||
msgid "Do"
|
||||
msgstr "To"
|
||||
|
||||
#: carei-reservation.php:211
|
||||
msgid "Najemca"
|
||||
msgstr "Renter"
|
||||
|
||||
#: carei-reservation.php:212 includes/class-admin-panel.php:407
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: carei-reservation.php:213 includes/class-admin-panel.php:408
|
||||
msgid "Telefon"
|
||||
msgstr "Phone"
|
||||
|
||||
#: carei-reservation.php:214
|
||||
msgid "Wybrane opcje"
|
||||
msgstr "Selected options"
|
||||
|
||||
#: carei-reservation.php:215 includes/class-admin-panel.php:414
|
||||
msgid "Wiadomość"
|
||||
msgstr "Message"
|
||||
|
||||
#: carei-reservation.php:216
|
||||
msgid "auto"
|
||||
msgstr "car"
|
||||
|
||||
#: carei-reservation.php:217
|
||||
msgid "do doliczenia"
|
||||
msgstr "to be added"
|
||||
|
||||
#: carei-reservation.php:218
|
||||
msgid "VAT"
|
||||
msgstr "VAT"
|
||||
|
||||
#: carei-reservation.php:219 includes/class-admin-panel.php:413
|
||||
msgid "Pakiet ochronny"
|
||||
msgstr "Protection package"
|
||||
|
||||
#: carei-reservation.php:220
|
||||
msgid "Do zapłaty"
|
||||
msgstr "Total due"
|
||||
|
||||
#: carei-reservation.php:223
|
||||
msgid "Nazwa"
|
||||
msgstr "Name"
|
||||
|
||||
#: carei-reservation.php:224
|
||||
msgid "Ilość"
|
||||
msgstr "Quantity"
|
||||
|
||||
#: carei-reservation.php:225
|
||||
msgid "Netto"
|
||||
msgstr "Net"
|
||||
|
||||
#: carei-reservation.php:226
|
||||
msgid "Brutto"
|
||||
msgstr "Gross"
|
||||
|
||||
#: carei-reservation.php:229
|
||||
msgid "Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment."
|
||||
msgstr "No vehicle available for the selected dates. Change dates or segment."
|
||||
|
||||
#: carei-reservation.php:230
|
||||
msgid "Nieprawidłowy zakres dat"
|
||||
msgstr "Invalid date range"
|
||||
|
||||
#: carei-reservation.php:231
|
||||
msgid "Nie znaleziono oddziału"
|
||||
msgstr "Location not found"
|
||||
|
||||
#: carei-reservation.php:232
|
||||
msgid "Klient o tych danych już istnieje w systemie"
|
||||
msgstr "A customer with these details already exists in the system"
|
||||
|
||||
#: carei-reservation.php:233
|
||||
msgid "Nieprawidłowy numer PESEL"
|
||||
msgstr "Invalid PESEL number"
|
||||
|
||||
#: carei-reservation.php:234
|
||||
msgid "Cennik wygasł. Odśwież formularz i spróbuj ponownie."
|
||||
msgstr "Price list expired. Refresh the form and try again."
|
||||
|
||||
#: carei-reservation.php:237
|
||||
msgid "Nr zamówienia: %no%"
|
||||
msgstr "Order number: %no%"
|
||||
|
||||
#: carei-reservation.php:238
|
||||
msgid "Rezerwacja potwierdzona"
|
||||
msgstr "Reservation confirmed"
|
||||
|
||||
#: carei-reservation.php:239 includes/class-elementor-widget.php:238
|
||||
msgid "Podsumowanie rezerwacji"
|
||||
msgstr "Reservation summary"
|
||||
|
||||
#: carei-reservation.php:74
|
||||
msgid "Brak konfiguracji API w pliku .env (url, username, password)."
|
||||
msgstr "Missing API configuration in .env file (url, username, password)."
|
||||
|
||||
#: includes/class-admin-panel.php:103
|
||||
msgid "Konfiguracja pakietów wyświetlanych w sekcji <strong>Pakiety ochronne</strong> formularza rezerwacji. Cena podawana jest za dobę — total = cena × liczba dób rezerwacji."
|
||||
msgstr "Configuration of packages displayed in the <strong>Protection packages</strong> section of the reservation form. Price is per day — total = price × number of rental days."
|
||||
|
||||
#: includes/class-admin-panel.php:105
|
||||
msgid "Zapisano."
|
||||
msgstr "Saved."
|
||||
|
||||
#: includes/class-admin-panel.php:115
|
||||
msgid "Pakiet %s"
|
||||
msgstr "%s Package"
|
||||
|
||||
#: includes/class-admin-panel.php:118
|
||||
msgid "Nazwa wyświetlana"
|
||||
msgstr "Display name"
|
||||
|
||||
#: includes/class-admin-panel.php:122
|
||||
msgid "Cena za dobę (zł)"
|
||||
msgstr "Price per day (PLN)"
|
||||
|
||||
#: includes/class-admin-panel.php:126 includes/class-admin-panel.php:222
|
||||
#: includes/class-admin-panel.php:417
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: includes/class-admin-panel.php:127
|
||||
msgid "Aktywny (widoczny w modalu)"
|
||||
msgstr "Active (visible in modal)"
|
||||
|
||||
#: includes/class-admin-panel.php:130
|
||||
msgid "Opis / zakres usług"
|
||||
msgstr "Description / service scope"
|
||||
|
||||
#: includes/class-admin-panel.php:137
|
||||
msgid "Zapisz pakiety"
|
||||
msgstr "Save packages"
|
||||
|
||||
#: includes/class-admin-panel.php:152
|
||||
msgid "Nieprawidłowy token."
|
||||
msgstr "Invalid token."
|
||||
|
||||
#: includes/class-admin-panel.php:189 includes/class-admin-panel.php:191
|
||||
msgid "Rezerwacje"
|
||||
msgstr "Reservations"
|
||||
|
||||
#: includes/class-admin-panel.php:190
|
||||
msgid "Rezerwacja"
|
||||
msgstr "Reservation"
|
||||
|
||||
#: includes/class-admin-panel.php:192
|
||||
msgid "Wszystkie rezerwacje"
|
||||
msgstr "All reservations"
|
||||
|
||||
#: includes/class-admin-panel.php:193
|
||||
msgid "Zobacz rezerwację"
|
||||
msgstr "View reservation"
|
||||
|
||||
#: includes/class-admin-panel.php:194 includes/class-admin-panel.php:321
|
||||
msgid "Szczegóły rezerwacji"
|
||||
msgstr "Reservation details"
|
||||
|
||||
#: includes/class-admin-panel.php:195
|
||||
msgid "Szukaj rezerwacji"
|
||||
msgstr "Search reservations"
|
||||
|
||||
#: includes/class-admin-panel.php:196
|
||||
msgid "Nie znaleziono rezerwacji"
|
||||
msgstr "No reservations found"
|
||||
|
||||
#: includes/class-admin-panel.php:197
|
||||
msgid "Brak rezerwacji w koszu"
|
||||
msgstr "No reservations in trash"
|
||||
|
||||
#: includes/class-admin-panel.php:217 includes/class-admin-panel.php:395
|
||||
msgid "Nr rezerwacji"
|
||||
msgstr "Reservation No."
|
||||
|
||||
#: includes/class-admin-panel.php:218
|
||||
msgid "Klient"
|
||||
msgstr "Customer"
|
||||
|
||||
#: includes/class-admin-panel.php:22
|
||||
msgid "Nowe"
|
||||
msgstr "New"
|
||||
|
||||
#: includes/class-admin-panel.php:220
|
||||
msgid "Daty"
|
||||
msgstr "Dates"
|
||||
|
||||
#: includes/class-admin-panel.php:221
|
||||
msgid "Oddział"
|
||||
msgstr "Location"
|
||||
|
||||
#: includes/class-admin-panel.php:223
|
||||
msgid "Data"
|
||||
msgstr "Date"
|
||||
|
||||
#: includes/class-admin-panel.php:24
|
||||
msgid "Przeczytane"
|
||||
msgstr "Read"
|
||||
|
||||
#: includes/class-admin-panel.php:26
|
||||
msgid "Zrealizowane"
|
||||
msgstr "Completed"
|
||||
|
||||
#: includes/class-admin-panel.php:279
|
||||
msgid "Wszystkie statusy"
|
||||
msgstr "All statuses"
|
||||
|
||||
#: includes/class-admin-panel.php:362
|
||||
msgid "%1$s — %2$s zł/doba × %3$d = %4$s zł"
|
||||
msgstr "%1$s — %2$s PLN/day × %3$d = %4$s PLN"
|
||||
|
||||
#: includes/class-admin-panel.php:396
|
||||
msgid "ID rezerwacji (Softra)"
|
||||
msgstr "Reservation ID (Softra)"
|
||||
|
||||
#: includes/class-admin-panel.php:397
|
||||
msgid "ID klienta (Softra)"
|
||||
msgstr "Customer ID (Softra)"
|
||||
|
||||
#: includes/class-admin-panel.php:400
|
||||
msgid "Data od"
|
||||
msgstr "Date from"
|
||||
|
||||
#: includes/class-admin-panel.php:401
|
||||
msgid "Data do"
|
||||
msgstr "Date to"
|
||||
|
||||
#: includes/class-admin-panel.php:402
|
||||
msgid "Oddział odbioru"
|
||||
msgstr "Pickup location"
|
||||
|
||||
#: includes/class-admin-panel.php:403
|
||||
msgid "Oddział zwrotu"
|
||||
msgstr "Return location"
|
||||
|
||||
#: includes/class-admin-panel.php:409
|
||||
msgid "PESEL"
|
||||
msgstr "PESEL"
|
||||
|
||||
#: includes/class-admin-panel.php:410
|
||||
msgid "Adres"
|
||||
msgstr "Address"
|
||||
|
||||
#: includes/class-admin-panel.php:412 includes/class-admin-panel.php:413
|
||||
msgid "Brak"
|
||||
msgstr "None"
|
||||
|
||||
#: includes/class-admin-panel.php:50
|
||||
msgid "Ubezpieczenie SOFT"
|
||||
msgstr "SOFT Protection"
|
||||
|
||||
#: includes/class-admin-panel.php:537
|
||||
msgid "Rezerwacja #%1$s — %2$s %3$s"
|
||||
msgstr "Reservation #%1$s — %2$s %3$s"
|
||||
|
||||
#: includes/class-admin-panel.php:56
|
||||
msgid "Ubezpieczenie PREMIUM"
|
||||
msgstr "PREMIUM Protection"
|
||||
|
||||
#: includes/class-admin-panel.php:149 includes/class-admin-panel.php:96
|
||||
msgid "Brak uprawnień."
|
||||
msgstr "No permissions."
|
||||
|
||||
#: includes/class-branches-widget.php:23
|
||||
msgid "Carei Branches"
|
||||
msgstr "Carei Branches"
|
||||
|
||||
#: includes/class-cities-widget.php:16
|
||||
msgid "Carei Cities"
|
||||
msgstr "Carei Cities"
|
||||
|
||||
#: includes/class-elementor-widget.php:115
|
||||
#: includes/class-search-widget.php:89
|
||||
msgid "Zwrot w tej samej lokalizacji"
|
||||
msgstr "Return at the same location"
|
||||
|
||||
#: includes/class-elementor-widget.php:133
|
||||
msgid "Wyjazd zagraniczny"
|
||||
msgstr "International travel"
|
||||
|
||||
#: includes/class-elementor-widget.php:138
|
||||
msgid "Wyjazd poza granicę Polski do:"
|
||||
msgstr "Travel outside Poland to:"
|
||||
|
||||
#: includes/class-elementor-widget.php:143
|
||||
msgid "Wyszukaj i dodaj kraj na trasie"
|
||||
msgstr "Search and add a country on the route"
|
||||
|
||||
#: includes/class-elementor-widget.php:144
|
||||
msgid "Wyczyść"
|
||||
msgstr "Clear"
|
||||
|
||||
#: includes/class-admin-panel.php:102 includes/class-admin-panel.php:86
|
||||
#: includes/class-admin-panel.php:87
|
||||
#: includes/class-elementor-widget.php:153
|
||||
msgid "Pakiety ochronne"
|
||||
msgstr "Protection packages"
|
||||
|
||||
#: includes/class-elementor-widget.php:16
|
||||
msgid "Carei Reservation"
|
||||
msgstr "Carei Reservation"
|
||||
|
||||
#: includes/class-admin-panel.php:412
|
||||
#: includes/class-elementor-widget.php:160
|
||||
msgid "Opcje dodatkowe"
|
||||
msgstr "Additional options"
|
||||
|
||||
#: includes/class-elementor-widget.php:170
|
||||
msgid "Dane najemcy"
|
||||
msgstr "Renter details"
|
||||
|
||||
#: includes/class-admin-panel.php:405
|
||||
#: includes/class-elementor-widget.php:177
|
||||
msgid "Imię"
|
||||
msgstr "First name"
|
||||
|
||||
#: includes/class-admin-panel.php:406
|
||||
#: includes/class-elementor-widget.php:183
|
||||
msgid "Nazwisko"
|
||||
msgstr "Last name"
|
||||
|
||||
#: includes/class-elementor-widget.php:192
|
||||
msgid "Adres e-mail"
|
||||
msgstr "Email address"
|
||||
|
||||
#: includes/class-elementor-widget.php:197
|
||||
msgid "Nr telefonu"
|
||||
msgstr "Phone number"
|
||||
|
||||
#: includes/class-elementor-widget.php:211
|
||||
msgid "Twoja wiadomość dotycząca rezerwacji"
|
||||
msgstr "Your message regarding the reservation"
|
||||
|
||||
#: includes/class-elementor-widget.php:222
|
||||
msgid "Zgadzam się na <a href=\"/polityka-prywatnosci/\" target=\"_blank\">Politykę Prywatności</a>"
|
||||
msgstr "I agree to the <a href=\"/polityka-prywatnosci/\" target=\"_blank\">Privacy Policy</a>"
|
||||
|
||||
#: includes/class-elementor-widget.php:231
|
||||
msgid "Uzupełnij wymagane pola zaznaczone na czerwono."
|
||||
msgstr "Please complete the required fields marked in red."
|
||||
|
||||
#: includes/class-elementor-widget.php:246
|
||||
msgid "Wróć do formularza"
|
||||
msgstr "Back to form"
|
||||
|
||||
#: includes/class-elementor-widget.php:260
|
||||
msgid "Zamówienie złożone!"
|
||||
msgstr "Order submitted!"
|
||||
|
||||
#: includes/class-elementor-widget.php:262
|
||||
msgid "Oczekuj na kontakt z wypożyczalnią"
|
||||
msgstr "Please wait for the rental company to contact you"
|
||||
|
||||
#: includes/class-elementor-widget.php:263
|
||||
msgid "Zamknij"
|
||||
msgstr "Close"
|
||||
|
||||
#: includes/class-elementor-widget.php:37
|
||||
msgid "Przycisk rezerwacji"
|
||||
msgstr "Reservation button"
|
||||
|
||||
#: includes/class-elementor-widget.php:42
|
||||
msgid "Tekst przycisku"
|
||||
msgstr "Button text"
|
||||
|
||||
#: includes/class-elementor-widget.php:44
|
||||
#: includes/class-search-widget.php:97
|
||||
msgid "Złóż zapytanie o rezerwację"
|
||||
msgstr "Request a reservation"
|
||||
|
||||
#: includes/class-elementor-widget.php:62
|
||||
msgid "Zamknij formularz"
|
||||
msgstr "Close form"
|
||||
|
||||
#: includes/class-elementor-widget.php:67
|
||||
#: includes/class-search-widget.php:40
|
||||
msgid "Wypełnij formularz rezerwacji"
|
||||
msgstr "Fill out the reservation form"
|
||||
|
||||
#: includes/class-elementor-widget.php:85
|
||||
#: includes/class-search-widget.php:58
|
||||
msgid "Od kiedy?"
|
||||
msgstr "From?"
|
||||
|
||||
#: includes/class-elementor-widget.php:92
|
||||
#: includes/class-search-widget.php:65
|
||||
msgid "Do kiedy?"
|
||||
msgstr "Until?"
|
||||
|
||||
#: includes/class-elementor-widget.php:98
|
||||
msgid "Wybrano:"
|
||||
msgstr "Selected:"
|
||||
|
||||
#: includes/class-elementor-widget.php:98
|
||||
msgid "0 dni"
|
||||
msgstr "0 days"
|
||||
|
||||
#: includes/class-branches-widget.php:99 includes/class-map-widget.php:172
|
||||
msgid "Oddział %s"
|
||||
msgstr "Location %s"
|
||||
|
||||
#: includes/class-branches-widget.php:95 includes/class-map-widget.php:176
|
||||
msgid "ul. %s"
|
||||
msgstr "%s St."
|
||||
|
||||
#: includes/class-map-widget.php:66
|
||||
msgid "Carei Map"
|
||||
msgstr "Carei Map"
|
||||
|
||||
#: includes/class-rest-proxy.php:148
|
||||
msgid "Invalid nonce."
|
||||
msgstr "Invalid nonce."
|
||||
|
||||
#: includes/class-rest-proxy.php:159
|
||||
msgid "Softra API not configured."
|
||||
msgstr "Softra API not configured."
|
||||
|
||||
#: includes/class-search-widget.php:16
|
||||
msgid "Carei Search Form"
|
||||
msgstr "Carei Search Form"
|
||||
Binary file not shown.
@@ -0,0 +1,659 @@
|
||||
# Copyright (C) 2026 Carei
|
||||
# This file is distributed under the same license as the Carei Reservation plugin.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Carei Reservation 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-22 12:00+0000\n"
|
||||
"PO-Revision-Date: 2026-04-22 12:00+0000\n"
|
||||
"Last-Translator: Carei\n"
|
||||
"Language-Team: English\n"
|
||||
"Language: en_US\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Domain: carei-reservation\n"
|
||||
|
||||
#: carei-reservation.php:133
|
||||
msgid "Błąd API: HTTP %status%"
|
||||
msgstr "API error: HTTP %status%"
|
||||
|
||||
#: carei-reservation.php:134
|
||||
msgid "Przekroczono czas oczekiwania. Spróbuj ponownie."
|
||||
msgstr "Request timed out. Please try again."
|
||||
|
||||
#: carei-reservation.php:135
|
||||
msgid "Brak połączenia z serwerem. Sprawdź internet i spróbuj ponownie."
|
||||
msgstr "No server connection. Check your internet and try again."
|
||||
|
||||
#: carei-reservation.php:136
|
||||
msgid "Błąd ładowania"
|
||||
msgstr "Loading error"
|
||||
|
||||
#: carei-reservation.php:139
|
||||
msgid "Wybierz..."
|
||||
msgstr "Select..."
|
||||
|
||||
#: carei-reservation.php:140 includes/class-elementor-widget.php:77
|
||||
msgid "Wybierz segment pojazdu"
|
||||
msgstr "Select a vehicle segment"
|
||||
|
||||
#: carei-reservation.php:141 includes/class-search-widget.php:47
|
||||
msgid "Wybierz segment"
|
||||
msgstr "Select segment"
|
||||
|
||||
#: carei-reservation.php:142
|
||||
msgid "Wybierz miejsce odbioru"
|
||||
msgstr "Select pickup location"
|
||||
|
||||
#: carei-reservation.php:143
|
||||
msgid "Wybierz miejsce zwrotu"
|
||||
msgstr "Select return location"
|
||||
|
||||
#: carei-reservation.php:144
|
||||
msgid "Segment %name%"
|
||||
msgstr "Segment %name%"
|
||||
|
||||
#: carei-reservation.php:145
|
||||
msgid "Brak segmentów"
|
||||
msgstr "No segments"
|
||||
|
||||
#: carei-reservation.php:146
|
||||
msgid "Najpierw wybierz segment"
|
||||
msgstr "Select segment first"
|
||||
|
||||
#: carei-reservation.php:147 carei-reservation.php:209
|
||||
#: includes/class-elementor-widget.php:105
|
||||
#: includes/class-search-widget.php:76
|
||||
msgid "Miejsce odbioru"
|
||||
msgstr "Pickup location"
|
||||
|
||||
#: carei-reservation.php:148 carei-reservation.php:210
|
||||
#: includes/class-elementor-widget.php:123
|
||||
msgid "Miejsce zwrotu"
|
||||
msgstr "Return location"
|
||||
|
||||
#: carei-reservation.php:149
|
||||
msgid "Brak lokalizacji dla tego segmentu"
|
||||
msgstr "No locations for this segment"
|
||||
|
||||
#: carei-reservation.php:150
|
||||
msgid "Brak lokalizacji"
|
||||
msgstr "No locations"
|
||||
|
||||
#: carei-reservation.php:153
|
||||
msgid "Rozpoczęcie"
|
||||
msgstr "Start"
|
||||
|
||||
#: carei-reservation.php:154
|
||||
msgid "Zakończenie"
|
||||
msgstr "End"
|
||||
|
||||
#: carei-reservation.php:155
|
||||
msgid "%label% — data lub godzina już minęły"
|
||||
msgstr "%label% — date or time has already passed"
|
||||
|
||||
#: carei-reservation.php:156
|
||||
msgid "Data lub godzina rozpoczęcia już minęły"
|
||||
msgstr "Start date or time has already passed"
|
||||
|
||||
#: carei-reservation.php:157
|
||||
msgid "Data lub godzina zakończenia już minęły"
|
||||
msgstr "End date or time has already passed"
|
||||
|
||||
#: carei-reservation.php:158
|
||||
msgid "Data zakończenia musi być po dacie rozpoczęcia"
|
||||
msgstr "End date must be after start date"
|
||||
|
||||
#: carei-reservation.php:159
|
||||
msgid "Podaj datę rozpoczęcia"
|
||||
msgstr "Enter start date"
|
||||
|
||||
#: carei-reservation.php:160
|
||||
msgid "Podaj datę zakończenia"
|
||||
msgstr "Enter end date"
|
||||
|
||||
#: carei-reservation.php:163
|
||||
msgid "Wybrano: <strong>%count% %unit%</strong>"
|
||||
msgstr "Selected: <strong>%count% %unit%</strong>"
|
||||
|
||||
#: carei-reservation.php:164
|
||||
msgid "dzień"
|
||||
msgstr "day"
|
||||
|
||||
#: carei-reservation.php:165
|
||||
msgid "dni"
|
||||
msgstr "days"
|
||||
|
||||
#: carei-reservation.php:166
|
||||
msgid "doba"
|
||||
msgstr "day"
|
||||
|
||||
#: carei-reservation.php:167
|
||||
msgid "doby"
|
||||
msgstr "days"
|
||||
|
||||
#: carei-reservation.php:168
|
||||
msgid "dób"
|
||||
msgstr "days"
|
||||
|
||||
#: carei-reservation.php:171
|
||||
msgid "%price% zł/doba"
|
||||
msgstr "%price% PLN/day"
|
||||
|
||||
#: carei-reservation.php:172 carei-reservation.php:173
|
||||
msgid "%price% zł"
|
||||
msgstr "%price% PLN"
|
||||
|
||||
#: carei-reservation.php:174
|
||||
msgid "od %min% do %max% zł"
|
||||
msgstr "from %min% to %max% PLN"
|
||||
|
||||
#: carei-reservation.php:175
|
||||
msgid "%perDay% zł/doba × %days% = %total% zł"
|
||||
msgstr "%perDay% PLN/day × %days% = %total% PLN"
|
||||
|
||||
#: carei-reservation.php:176
|
||||
msgid "Gratis"
|
||||
msgstr "Free"
|
||||
|
||||
#: carei-reservation.php:179
|
||||
msgid "Usuń"
|
||||
msgstr "Remove"
|
||||
|
||||
#: carei-reservation.php:180
|
||||
msgid "Dodaj"
|
||||
msgstr "Add"
|
||||
|
||||
#: carei-reservation.php:183
|
||||
msgid "Podaj imię"
|
||||
msgstr "Enter first name"
|
||||
|
||||
#: carei-reservation.php:184
|
||||
msgid "Podaj nazwisko"
|
||||
msgstr "Enter last name"
|
||||
|
||||
#: carei-reservation.php:185
|
||||
msgid "Podaj poprawny adres e-mail"
|
||||
msgstr "Enter a valid email address"
|
||||
|
||||
#: carei-reservation.php:186
|
||||
msgid "Podaj numer telefonu (min. 9 cyfr)"
|
||||
msgstr "Enter phone number (min. 9 digits)"
|
||||
|
||||
#: carei-reservation.php:187
|
||||
msgid "Wymagana zgoda na Politykę Prywatności"
|
||||
msgstr "Privacy policy consent is required"
|
||||
|
||||
#: carei-reservation.php:190 includes/class-elementor-widget.php:226
|
||||
msgid "Wyślij"
|
||||
msgstr "Send"
|
||||
|
||||
#: carei-reservation.php:191
|
||||
msgid "Przetwarzanie..."
|
||||
msgstr "Processing..."
|
||||
|
||||
#: carei-reservation.php:192
|
||||
msgid "Rezerwuję..."
|
||||
msgstr "Reserving..."
|
||||
|
||||
#: carei-reservation.php:193 includes/class-elementor-widget.php:250
|
||||
msgid "Potwierdź rezerwację"
|
||||
msgstr "Confirm reservation"
|
||||
|
||||
#: carei-reservation.php:196
|
||||
msgid "Ładowanie podsumowania..."
|
||||
msgstr "Loading summary..."
|
||||
|
||||
#: carei-reservation.php:197
|
||||
msgid "Nie udało się utworzyć klienta"
|
||||
msgstr "Failed to create customer"
|
||||
|
||||
#: carei-reservation.php:198
|
||||
msgid "Błąd tworzenia klienta: %msg%"
|
||||
msgstr "Customer creation error: %msg%"
|
||||
|
||||
#: carei-reservation.php:199
|
||||
msgid "Błąd pobierania podsumowania: %msg%"
|
||||
msgstr "Error loading summary: %msg%"
|
||||
|
||||
#: carei-reservation.php:200
|
||||
msgid "Rezerwacja nie powiodła się"
|
||||
msgstr "Reservation failed"
|
||||
|
||||
#: carei-reservation.php:203
|
||||
msgid "Pakiet ochronny: %name% — %perDay% zł/doba × %days% = %total% zł (do doliczenia poza systemem)"
|
||||
msgstr "Protection package: %name% — %perDay% PLN/day × %days% = %total% PLN (to be paid separately)"
|
||||
|
||||
#: carei-reservation.php:206 includes/class-admin-panel.php:219
|
||||
#: includes/class-admin-panel.php:399
|
||||
msgid "Segment"
|
||||
msgstr "Segment"
|
||||
|
||||
#: carei-reservation.php:207
|
||||
msgid "Od"
|
||||
msgstr "From"
|
||||
|
||||
#: carei-reservation.php:208
|
||||
msgid "Do"
|
||||
msgstr "To"
|
||||
|
||||
#: carei-reservation.php:211
|
||||
msgid "Najemca"
|
||||
msgstr "Renter"
|
||||
|
||||
#: carei-reservation.php:212 includes/class-admin-panel.php:407
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: carei-reservation.php:213 includes/class-admin-panel.php:408
|
||||
msgid "Telefon"
|
||||
msgstr "Phone"
|
||||
|
||||
#: carei-reservation.php:214
|
||||
msgid "Wybrane opcje"
|
||||
msgstr "Selected options"
|
||||
|
||||
#: carei-reservation.php:215 includes/class-admin-panel.php:414
|
||||
msgid "Wiadomość"
|
||||
msgstr "Message"
|
||||
|
||||
#: carei-reservation.php:216
|
||||
msgid "auto"
|
||||
msgstr "car"
|
||||
|
||||
#: carei-reservation.php:217
|
||||
msgid "do doliczenia"
|
||||
msgstr "to be added"
|
||||
|
||||
#: carei-reservation.php:218
|
||||
msgid "VAT"
|
||||
msgstr "VAT"
|
||||
|
||||
#: carei-reservation.php:219 includes/class-admin-panel.php:413
|
||||
msgid "Pakiet ochronny"
|
||||
msgstr "Protection package"
|
||||
|
||||
#: carei-reservation.php:220
|
||||
msgid "Do zapłaty"
|
||||
msgstr "Total due"
|
||||
|
||||
#: carei-reservation.php:223
|
||||
msgid "Nazwa"
|
||||
msgstr "Name"
|
||||
|
||||
#: carei-reservation.php:224
|
||||
msgid "Ilość"
|
||||
msgstr "Quantity"
|
||||
|
||||
#: carei-reservation.php:225
|
||||
msgid "Netto"
|
||||
msgstr "Net"
|
||||
|
||||
#: carei-reservation.php:226
|
||||
msgid "Brutto"
|
||||
msgstr "Gross"
|
||||
|
||||
#: carei-reservation.php:229
|
||||
msgid "Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment."
|
||||
msgstr "No vehicle available for the selected dates. Change dates or segment."
|
||||
|
||||
#: carei-reservation.php:230
|
||||
msgid "Nieprawidłowy zakres dat"
|
||||
msgstr "Invalid date range"
|
||||
|
||||
#: carei-reservation.php:231
|
||||
msgid "Nie znaleziono oddziału"
|
||||
msgstr "Location not found"
|
||||
|
||||
#: carei-reservation.php:232
|
||||
msgid "Klient o tych danych już istnieje w systemie"
|
||||
msgstr "A customer with these details already exists in the system"
|
||||
|
||||
#: carei-reservation.php:233
|
||||
msgid "Nieprawidłowy numer PESEL"
|
||||
msgstr "Invalid PESEL number"
|
||||
|
||||
#: carei-reservation.php:234
|
||||
msgid "Cennik wygasł. Odśwież formularz i spróbuj ponownie."
|
||||
msgstr "Price list expired. Refresh the form and try again."
|
||||
|
||||
#: carei-reservation.php:237
|
||||
msgid "Nr zamówienia: %no%"
|
||||
msgstr "Order number: %no%"
|
||||
|
||||
#: carei-reservation.php:238
|
||||
msgid "Rezerwacja potwierdzona"
|
||||
msgstr "Reservation confirmed"
|
||||
|
||||
#: carei-reservation.php:239 includes/class-elementor-widget.php:238
|
||||
msgid "Podsumowanie rezerwacji"
|
||||
msgstr "Reservation summary"
|
||||
|
||||
#: carei-reservation.php:74
|
||||
msgid "Brak konfiguracji API w pliku .env (url, username, password)."
|
||||
msgstr "Missing API configuration in .env file (url, username, password)."
|
||||
|
||||
#: includes/class-admin-panel.php:103
|
||||
msgid "Konfiguracja pakietów wyświetlanych w sekcji <strong>Pakiety ochronne</strong> formularza rezerwacji. Cena podawana jest za dobę — total = cena × liczba dób rezerwacji."
|
||||
msgstr "Configuration of packages displayed in the <strong>Protection packages</strong> section of the reservation form. Price is per day — total = price × number of rental days."
|
||||
|
||||
#: includes/class-admin-panel.php:105
|
||||
msgid "Zapisano."
|
||||
msgstr "Saved."
|
||||
|
||||
#: includes/class-admin-panel.php:115
|
||||
msgid "Pakiet %s"
|
||||
msgstr "%s Package"
|
||||
|
||||
#: includes/class-admin-panel.php:118
|
||||
msgid "Nazwa wyświetlana"
|
||||
msgstr "Display name"
|
||||
|
||||
#: includes/class-admin-panel.php:122
|
||||
msgid "Cena za dobę (zł)"
|
||||
msgstr "Price per day (PLN)"
|
||||
|
||||
#: includes/class-admin-panel.php:126 includes/class-admin-panel.php:222
|
||||
#: includes/class-admin-panel.php:417
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: includes/class-admin-panel.php:127
|
||||
msgid "Aktywny (widoczny w modalu)"
|
||||
msgstr "Active (visible in modal)"
|
||||
|
||||
#: includes/class-admin-panel.php:130
|
||||
msgid "Opis / zakres usług"
|
||||
msgstr "Description / service scope"
|
||||
|
||||
#: includes/class-admin-panel.php:137
|
||||
msgid "Zapisz pakiety"
|
||||
msgstr "Save packages"
|
||||
|
||||
#: includes/class-admin-panel.php:152
|
||||
msgid "Nieprawidłowy token."
|
||||
msgstr "Invalid token."
|
||||
|
||||
#: includes/class-admin-panel.php:189 includes/class-admin-panel.php:191
|
||||
msgid "Rezerwacje"
|
||||
msgstr "Reservations"
|
||||
|
||||
#: includes/class-admin-panel.php:190
|
||||
msgid "Rezerwacja"
|
||||
msgstr "Reservation"
|
||||
|
||||
#: includes/class-admin-panel.php:192
|
||||
msgid "Wszystkie rezerwacje"
|
||||
msgstr "All reservations"
|
||||
|
||||
#: includes/class-admin-panel.php:193
|
||||
msgid "Zobacz rezerwację"
|
||||
msgstr "View reservation"
|
||||
|
||||
#: includes/class-admin-panel.php:194 includes/class-admin-panel.php:321
|
||||
msgid "Szczegóły rezerwacji"
|
||||
msgstr "Reservation details"
|
||||
|
||||
#: includes/class-admin-panel.php:195
|
||||
msgid "Szukaj rezerwacji"
|
||||
msgstr "Search reservations"
|
||||
|
||||
#: includes/class-admin-panel.php:196
|
||||
msgid "Nie znaleziono rezerwacji"
|
||||
msgstr "No reservations found"
|
||||
|
||||
#: includes/class-admin-panel.php:197
|
||||
msgid "Brak rezerwacji w koszu"
|
||||
msgstr "No reservations in trash"
|
||||
|
||||
#: includes/class-admin-panel.php:217 includes/class-admin-panel.php:395
|
||||
msgid "Nr rezerwacji"
|
||||
msgstr "Reservation No."
|
||||
|
||||
#: includes/class-admin-panel.php:218
|
||||
msgid "Klient"
|
||||
msgstr "Customer"
|
||||
|
||||
#: includes/class-admin-panel.php:22
|
||||
msgid "Nowe"
|
||||
msgstr "New"
|
||||
|
||||
#: includes/class-admin-panel.php:220
|
||||
msgid "Daty"
|
||||
msgstr "Dates"
|
||||
|
||||
#: includes/class-admin-panel.php:221
|
||||
msgid "Oddział"
|
||||
msgstr "Location"
|
||||
|
||||
#: includes/class-admin-panel.php:223
|
||||
msgid "Data"
|
||||
msgstr "Date"
|
||||
|
||||
#: includes/class-admin-panel.php:24
|
||||
msgid "Przeczytane"
|
||||
msgstr "Read"
|
||||
|
||||
#: includes/class-admin-panel.php:26
|
||||
msgid "Zrealizowane"
|
||||
msgstr "Completed"
|
||||
|
||||
#: includes/class-admin-panel.php:279
|
||||
msgid "Wszystkie statusy"
|
||||
msgstr "All statuses"
|
||||
|
||||
#: includes/class-admin-panel.php:362
|
||||
msgid "%1$s — %2$s zł/doba × %3$d = %4$s zł"
|
||||
msgstr "%1$s — %2$s PLN/day × %3$d = %4$s PLN"
|
||||
|
||||
#: includes/class-admin-panel.php:396
|
||||
msgid "ID rezerwacji (Softra)"
|
||||
msgstr "Reservation ID (Softra)"
|
||||
|
||||
#: includes/class-admin-panel.php:397
|
||||
msgid "ID klienta (Softra)"
|
||||
msgstr "Customer ID (Softra)"
|
||||
|
||||
#: includes/class-admin-panel.php:400
|
||||
msgid "Data od"
|
||||
msgstr "Date from"
|
||||
|
||||
#: includes/class-admin-panel.php:401
|
||||
msgid "Data do"
|
||||
msgstr "Date to"
|
||||
|
||||
#: includes/class-admin-panel.php:402
|
||||
msgid "Oddział odbioru"
|
||||
msgstr "Pickup location"
|
||||
|
||||
#: includes/class-admin-panel.php:403
|
||||
msgid "Oddział zwrotu"
|
||||
msgstr "Return location"
|
||||
|
||||
#: includes/class-admin-panel.php:409
|
||||
msgid "PESEL"
|
||||
msgstr "PESEL"
|
||||
|
||||
#: includes/class-admin-panel.php:410
|
||||
msgid "Adres"
|
||||
msgstr "Address"
|
||||
|
||||
#: includes/class-admin-panel.php:412 includes/class-admin-panel.php:413
|
||||
msgid "Brak"
|
||||
msgstr "None"
|
||||
|
||||
#: includes/class-admin-panel.php:50
|
||||
msgid "Ubezpieczenie SOFT"
|
||||
msgstr "SOFT Protection"
|
||||
|
||||
#: includes/class-admin-panel.php:537
|
||||
msgid "Rezerwacja #%1$s — %2$s %3$s"
|
||||
msgstr "Reservation #%1$s — %2$s %3$s"
|
||||
|
||||
#: includes/class-admin-panel.php:56
|
||||
msgid "Ubezpieczenie PREMIUM"
|
||||
msgstr "PREMIUM Protection"
|
||||
|
||||
#: includes/class-admin-panel.php:149 includes/class-admin-panel.php:96
|
||||
msgid "Brak uprawnień."
|
||||
msgstr "No permissions."
|
||||
|
||||
#: includes/class-branches-widget.php:23
|
||||
msgid "Carei Branches"
|
||||
msgstr "Carei Branches"
|
||||
|
||||
#: includes/class-cities-widget.php:16
|
||||
msgid "Carei Cities"
|
||||
msgstr "Carei Cities"
|
||||
|
||||
#: includes/class-elementor-widget.php:115
|
||||
#: includes/class-search-widget.php:89
|
||||
msgid "Zwrot w tej samej lokalizacji"
|
||||
msgstr "Return at the same location"
|
||||
|
||||
#: includes/class-elementor-widget.php:133
|
||||
msgid "Wyjazd zagraniczny"
|
||||
msgstr "International travel"
|
||||
|
||||
#: includes/class-elementor-widget.php:138
|
||||
msgid "Wyjazd poza granicę Polski do:"
|
||||
msgstr "Travel outside Poland to:"
|
||||
|
||||
#: includes/class-elementor-widget.php:143
|
||||
msgid "Wyszukaj i dodaj kraj na trasie"
|
||||
msgstr "Search and add a country on the route"
|
||||
|
||||
#: includes/class-elementor-widget.php:144
|
||||
msgid "Wyczyść"
|
||||
msgstr "Clear"
|
||||
|
||||
#: includes/class-admin-panel.php:102 includes/class-admin-panel.php:86
|
||||
#: includes/class-admin-panel.php:87
|
||||
#: includes/class-elementor-widget.php:153
|
||||
msgid "Pakiety ochronne"
|
||||
msgstr "Protection packages"
|
||||
|
||||
#: includes/class-elementor-widget.php:16
|
||||
msgid "Carei Reservation"
|
||||
msgstr "Carei Reservation"
|
||||
|
||||
#: includes/class-admin-panel.php:412
|
||||
#: includes/class-elementor-widget.php:160
|
||||
msgid "Opcje dodatkowe"
|
||||
msgstr "Additional options"
|
||||
|
||||
#: includes/class-elementor-widget.php:170
|
||||
msgid "Dane najemcy"
|
||||
msgstr "Renter details"
|
||||
|
||||
#: includes/class-admin-panel.php:405
|
||||
#: includes/class-elementor-widget.php:177
|
||||
msgid "Imię"
|
||||
msgstr "First name"
|
||||
|
||||
#: includes/class-admin-panel.php:406
|
||||
#: includes/class-elementor-widget.php:183
|
||||
msgid "Nazwisko"
|
||||
msgstr "Last name"
|
||||
|
||||
#: includes/class-elementor-widget.php:192
|
||||
msgid "Adres e-mail"
|
||||
msgstr "Email address"
|
||||
|
||||
#: includes/class-elementor-widget.php:197
|
||||
msgid "Nr telefonu"
|
||||
msgstr "Phone number"
|
||||
|
||||
#: includes/class-elementor-widget.php:211
|
||||
msgid "Twoja wiadomość dotycząca rezerwacji"
|
||||
msgstr "Your message regarding the reservation"
|
||||
|
||||
#: includes/class-elementor-widget.php:222
|
||||
msgid "Zgadzam się na <a href=\"/polityka-prywatnosci/\" target=\"_blank\">Politykę Prywatności</a>"
|
||||
msgstr "I agree to the <a href=\"/polityka-prywatnosci/\" target=\"_blank\">Privacy Policy</a>"
|
||||
|
||||
#: includes/class-elementor-widget.php:231
|
||||
msgid "Uzupełnij wymagane pola zaznaczone na czerwono."
|
||||
msgstr "Please complete the required fields marked in red."
|
||||
|
||||
#: includes/class-elementor-widget.php:246
|
||||
msgid "Wróć do formularza"
|
||||
msgstr "Back to form"
|
||||
|
||||
#: includes/class-elementor-widget.php:260
|
||||
msgid "Zamówienie złożone!"
|
||||
msgstr "Order submitted!"
|
||||
|
||||
#: includes/class-elementor-widget.php:262
|
||||
msgid "Oczekuj na kontakt z wypożyczalnią"
|
||||
msgstr "Please wait for the rental company to contact you"
|
||||
|
||||
#: includes/class-elementor-widget.php:263
|
||||
msgid "Zamknij"
|
||||
msgstr "Close"
|
||||
|
||||
#: includes/class-elementor-widget.php:37
|
||||
msgid "Przycisk rezerwacji"
|
||||
msgstr "Reservation button"
|
||||
|
||||
#: includes/class-elementor-widget.php:42
|
||||
msgid "Tekst przycisku"
|
||||
msgstr "Button text"
|
||||
|
||||
#: includes/class-elementor-widget.php:44
|
||||
#: includes/class-search-widget.php:97
|
||||
msgid "Złóż zapytanie o rezerwację"
|
||||
msgstr "Request a reservation"
|
||||
|
||||
#: includes/class-elementor-widget.php:62
|
||||
msgid "Zamknij formularz"
|
||||
msgstr "Close form"
|
||||
|
||||
#: includes/class-elementor-widget.php:67
|
||||
#: includes/class-search-widget.php:40
|
||||
msgid "Wypełnij formularz rezerwacji"
|
||||
msgstr "Fill out the reservation form"
|
||||
|
||||
#: includes/class-elementor-widget.php:85
|
||||
#: includes/class-search-widget.php:58
|
||||
msgid "Od kiedy?"
|
||||
msgstr "From?"
|
||||
|
||||
#: includes/class-elementor-widget.php:92
|
||||
#: includes/class-search-widget.php:65
|
||||
msgid "Do kiedy?"
|
||||
msgstr "Until?"
|
||||
|
||||
#: includes/class-elementor-widget.php:98
|
||||
msgid "Wybrano:"
|
||||
msgstr "Selected:"
|
||||
|
||||
#: includes/class-elementor-widget.php:98
|
||||
msgid "0 dni"
|
||||
msgstr "0 days"
|
||||
|
||||
#: includes/class-branches-widget.php:99 includes/class-map-widget.php:172
|
||||
msgid "Oddział %s"
|
||||
msgstr "Location %s"
|
||||
|
||||
#: includes/class-branches-widget.php:95 includes/class-map-widget.php:176
|
||||
msgid "ul. %s"
|
||||
msgstr "%s St."
|
||||
|
||||
#: includes/class-map-widget.php:66
|
||||
msgid "Carei Map"
|
||||
msgstr "Carei Map"
|
||||
|
||||
#: includes/class-rest-proxy.php:148
|
||||
msgid "Invalid nonce."
|
||||
msgstr "Invalid nonce."
|
||||
|
||||
#: includes/class-rest-proxy.php:159
|
||||
msgid "Softra API not configured."
|
||||
msgstr "Softra API not configured."
|
||||
|
||||
#: includes/class-search-widget.php:16
|
||||
msgid "Carei Search Form"
|
||||
msgstr "Carei Search Form"
|
||||
@@ -0,0 +1,659 @@
|
||||
# Copyright (C) 2026 Carei
|
||||
# This file is distributed under the same license as the Carei Reservation plugin.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Carei Reservation 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-22 12:00+0000\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Domain: carei-reservation\n"
|
||||
|
||||
#: carei-reservation.php:133
|
||||
msgid "Błąd API: HTTP %status%"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:134
|
||||
msgid "Przekroczono czas oczekiwania. Spróbuj ponownie."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:135
|
||||
msgid "Brak połączenia z serwerem. Sprawdź internet i spróbuj ponownie."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:136
|
||||
msgid "Błąd ładowania"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:139
|
||||
msgid "Wybierz..."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:140 includes/class-elementor-widget.php:77
|
||||
msgid "Wybierz segment pojazdu"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:141 includes/class-search-widget.php:47
|
||||
msgid "Wybierz segment"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:142
|
||||
msgid "Wybierz miejsce odbioru"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:143
|
||||
msgid "Wybierz miejsce zwrotu"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:144
|
||||
msgid "Segment %name%"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:145
|
||||
msgid "Brak segmentów"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:146
|
||||
msgid "Najpierw wybierz segment"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:147 carei-reservation.php:209
|
||||
#: includes/class-elementor-widget.php:105
|
||||
#: includes/class-search-widget.php:76
|
||||
msgid "Miejsce odbioru"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:148 carei-reservation.php:210
|
||||
#: includes/class-elementor-widget.php:123
|
||||
msgid "Miejsce zwrotu"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:149
|
||||
msgid "Brak lokalizacji dla tego segmentu"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:150
|
||||
msgid "Brak lokalizacji"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:153
|
||||
msgid "Rozpoczęcie"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:154
|
||||
msgid "Zakończenie"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:155
|
||||
msgid "%label% — data lub godzina już minęły"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:156
|
||||
msgid "Data lub godzina rozpoczęcia już minęły"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:157
|
||||
msgid "Data lub godzina zakończenia już minęły"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:158
|
||||
msgid "Data zakończenia musi być po dacie rozpoczęcia"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:159
|
||||
msgid "Podaj datę rozpoczęcia"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:160
|
||||
msgid "Podaj datę zakończenia"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:163
|
||||
msgid "Wybrano: <strong>%count% %unit%</strong>"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:164
|
||||
msgid "dzień"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:165
|
||||
msgid "dni"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:166
|
||||
msgid "doba"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:167
|
||||
msgid "doby"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:168
|
||||
msgid "dób"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:171
|
||||
msgid "%price% zł/doba"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:172 carei-reservation.php:173
|
||||
msgid "%price% zł"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:174
|
||||
msgid "od %min% do %max% zł"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:175
|
||||
msgid "%perDay% zł/doba × %days% = %total% zł"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:176
|
||||
msgid "Gratis"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:179
|
||||
msgid "Usuń"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:180
|
||||
msgid "Dodaj"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:183
|
||||
msgid "Podaj imię"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:184
|
||||
msgid "Podaj nazwisko"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:185
|
||||
msgid "Podaj poprawny adres e-mail"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:186
|
||||
msgid "Podaj numer telefonu (min. 9 cyfr)"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:187
|
||||
msgid "Wymagana zgoda na Politykę Prywatności"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:190 includes/class-elementor-widget.php:226
|
||||
msgid "Wyślij"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:191
|
||||
msgid "Przetwarzanie..."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:192
|
||||
msgid "Rezerwuję..."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:193 includes/class-elementor-widget.php:250
|
||||
msgid "Potwierdź rezerwację"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:196
|
||||
msgid "Ładowanie podsumowania..."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:197
|
||||
msgid "Nie udało się utworzyć klienta"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:198
|
||||
msgid "Błąd tworzenia klienta: %msg%"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:199
|
||||
msgid "Błąd pobierania podsumowania: %msg%"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:200
|
||||
msgid "Rezerwacja nie powiodła się"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:203
|
||||
msgid "Pakiet ochronny: %name% — %perDay% zł/doba × %days% = %total% zł (do doliczenia poza systemem)"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:206 includes/class-admin-panel.php:219
|
||||
#: includes/class-admin-panel.php:399
|
||||
msgid "Segment"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:207
|
||||
msgid "Od"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:208
|
||||
msgid "Do"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:211
|
||||
msgid "Najemca"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:212 includes/class-admin-panel.php:407
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:213 includes/class-admin-panel.php:408
|
||||
msgid "Telefon"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:214
|
||||
msgid "Wybrane opcje"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:215 includes/class-admin-panel.php:414
|
||||
msgid "Wiadomość"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:216
|
||||
msgid "auto"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:217
|
||||
msgid "do doliczenia"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:218
|
||||
msgid "VAT"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:219 includes/class-admin-panel.php:413
|
||||
msgid "Pakiet ochronny"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:220
|
||||
msgid "Do zapłaty"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:223
|
||||
msgid "Nazwa"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:224
|
||||
msgid "Ilość"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:225
|
||||
msgid "Netto"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:226
|
||||
msgid "Brutto"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:229
|
||||
msgid "Brak dostępnego pojazdu w wybranym terminie. Zmień daty lub segment."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:230
|
||||
msgid "Nieprawidłowy zakres dat"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:231
|
||||
msgid "Nie znaleziono oddziału"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:232
|
||||
msgid "Klient o tych danych już istnieje w systemie"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:233
|
||||
msgid "Nieprawidłowy numer PESEL"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:234
|
||||
msgid "Cennik wygasł. Odśwież formularz i spróbuj ponownie."
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:237
|
||||
msgid "Nr zamówienia: %no%"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:238
|
||||
msgid "Rezerwacja potwierdzona"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:239 includes/class-elementor-widget.php:238
|
||||
msgid "Podsumowanie rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: carei-reservation.php:74
|
||||
msgid "Brak konfiguracji API w pliku .env (url, username, password)."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:103
|
||||
msgid "Konfiguracja pakietów wyświetlanych w sekcji <strong>Pakiety ochronne</strong> formularza rezerwacji. Cena podawana jest za dobę — total = cena × liczba dób rezerwacji."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:105
|
||||
msgid "Zapisano."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:115
|
||||
msgid "Pakiet %s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:118
|
||||
msgid "Nazwa wyświetlana"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:122
|
||||
msgid "Cena za dobę (zł)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:126 includes/class-admin-panel.php:222
|
||||
#: includes/class-admin-panel.php:417
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:127
|
||||
msgid "Aktywny (widoczny w modalu)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:130
|
||||
msgid "Opis / zakres usług"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:137
|
||||
msgid "Zapisz pakiety"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:152
|
||||
msgid "Nieprawidłowy token."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:189 includes/class-admin-panel.php:191
|
||||
msgid "Rezerwacje"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:190
|
||||
msgid "Rezerwacja"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:192
|
||||
msgid "Wszystkie rezerwacje"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:193
|
||||
msgid "Zobacz rezerwację"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:194 includes/class-admin-panel.php:321
|
||||
msgid "Szczegóły rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:195
|
||||
msgid "Szukaj rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:196
|
||||
msgid "Nie znaleziono rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:197
|
||||
msgid "Brak rezerwacji w koszu"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:217 includes/class-admin-panel.php:395
|
||||
msgid "Nr rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:218
|
||||
msgid "Klient"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:22
|
||||
msgid "Nowe"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:220
|
||||
msgid "Daty"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:221
|
||||
msgid "Oddział"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:223
|
||||
msgid "Data"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:24
|
||||
msgid "Przeczytane"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:26
|
||||
msgid "Zrealizowane"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:279
|
||||
msgid "Wszystkie statusy"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:362
|
||||
msgid "%1$s — %2$s zł/doba × %3$d = %4$s zł"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:396
|
||||
msgid "ID rezerwacji (Softra)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:397
|
||||
msgid "ID klienta (Softra)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:400
|
||||
msgid "Data od"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:401
|
||||
msgid "Data do"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:402
|
||||
msgid "Oddział odbioru"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:403
|
||||
msgid "Oddział zwrotu"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:409
|
||||
msgid "PESEL"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:410
|
||||
msgid "Adres"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:412 includes/class-admin-panel.php:413
|
||||
msgid "Brak"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:50
|
||||
msgid "Ubezpieczenie SOFT"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:537
|
||||
msgid "Rezerwacja #%1$s — %2$s %3$s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:56
|
||||
msgid "Ubezpieczenie PREMIUM"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:149 includes/class-admin-panel.php:96
|
||||
msgid "Brak uprawnień."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-branches-widget.php:23
|
||||
msgid "Carei Branches"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-cities-widget.php:16
|
||||
msgid "Carei Cities"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:115
|
||||
#: includes/class-search-widget.php:89
|
||||
msgid "Zwrot w tej samej lokalizacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:133
|
||||
msgid "Wyjazd zagraniczny"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:138
|
||||
msgid "Wyjazd poza granicę Polski do:"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:143
|
||||
msgid "Wyszukaj i dodaj kraj na trasie"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:144
|
||||
msgid "Wyczyść"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:102 includes/class-admin-panel.php:86
|
||||
#: includes/class-admin-panel.php:87
|
||||
#: includes/class-elementor-widget.php:153
|
||||
msgid "Pakiety ochronne"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:16
|
||||
msgid "Carei Reservation"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:412
|
||||
#: includes/class-elementor-widget.php:160
|
||||
msgid "Opcje dodatkowe"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:170
|
||||
msgid "Dane najemcy"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:405
|
||||
#: includes/class-elementor-widget.php:177
|
||||
msgid "Imię"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-admin-panel.php:406
|
||||
#: includes/class-elementor-widget.php:183
|
||||
msgid "Nazwisko"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:192
|
||||
msgid "Adres e-mail"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:197
|
||||
msgid "Nr telefonu"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:211
|
||||
msgid "Twoja wiadomość dotycząca rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:222
|
||||
msgid "Zgadzam się na <a href=\"/polityka-prywatnosci/\" target=\"_blank\">Politykę Prywatności</a>"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:231
|
||||
msgid "Uzupełnij wymagane pola zaznaczone na czerwono."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:246
|
||||
msgid "Wróć do formularza"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:260
|
||||
msgid "Zamówienie złożone!"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:262
|
||||
msgid "Oczekuj na kontakt z wypożyczalnią"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:263
|
||||
msgid "Zamknij"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:37
|
||||
msgid "Przycisk rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:42
|
||||
msgid "Tekst przycisku"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:44
|
||||
#: includes/class-search-widget.php:97
|
||||
msgid "Złóż zapytanie o rezerwację"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:62
|
||||
msgid "Zamknij formularz"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:67
|
||||
#: includes/class-search-widget.php:40
|
||||
msgid "Wypełnij formularz rezerwacji"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:85
|
||||
#: includes/class-search-widget.php:58
|
||||
msgid "Od kiedy?"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:92
|
||||
#: includes/class-search-widget.php:65
|
||||
msgid "Do kiedy?"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:98
|
||||
msgid "Wybrano:"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-elementor-widget.php:98
|
||||
msgid "0 dni"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-branches-widget.php:99 includes/class-map-widget.php:172
|
||||
msgid "Oddział %s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-branches-widget.php:95 includes/class-map-widget.php:176
|
||||
msgid "ul. %s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-map-widget.php:66
|
||||
msgid "Carei Map"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-rest-proxy.php:148
|
||||
msgid "Invalid nonce."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-rest-proxy.php:159
|
||||
msgid "Softra API not configured."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-search-widget.php:16
|
||||
msgid "Carei Search Form"
|
||||
msgstr ""
|
||||
BIN
wp-content/themes/.DS_Store
vendored
Normal file
BIN
wp-content/themes/.DS_Store
vendored
Normal file
Binary file not shown.
Reference in New Issue
Block a user