@ticketboothapp/booking 1.2.25-rc.0 → 1.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -29
- package/src/components/booking/AddOnsSection.tsx +2 -2
- package/src/components/booking/AdminPaymentChoiceModal.tsx +1 -1
- package/src/components/booking/BookingDialog.tsx +31 -13
- package/src/components/booking/BookingFlow.tsx +32 -27
- package/src/components/booking/BookingFlowCollage.tsx +10 -6
- package/src/components/booking/BookingFlowPlaceholder.tsx +1 -1
- package/src/components/booking/BookingFlowPreview.tsx +18 -9
- package/src/components/booking/BookingProductGrid.tsx +55 -19
- package/src/components/booking/Calendar.module.css +19 -4
- package/src/components/booking/Calendar.tsx +13 -8
- package/src/components/booking/CancellationPolicySelector.tsx +2 -2
- package/src/components/booking/ChangeBookingDialog.tsx +22 -12
- package/src/components/booking/CheckoutForm.module.css +10 -0
- package/src/components/booking/CheckoutForm.tsx +10 -2
- package/src/components/booking/CheckoutModal.tsx +16 -14
- package/src/components/booking/DapFlowCollage.tsx +5 -2
- package/src/components/booking/DapTourDescription.tsx +4 -4
- package/src/components/booking/DependentAddOnBookingDialog.tsx +23 -16
- package/src/components/booking/DependentAddOnPaymentForm.tsx +10 -7
- package/src/components/booking/ItineraryBox.tsx +6 -6
- package/src/components/booking/ItineraryBuilder.tsx +1 -1
- package/src/components/booking/MealDrinkAddOnSelector.tsx +3 -3
- package/src/components/booking/PickupLocationSelector.tsx +20 -18
- package/src/components/booking/PickupTimeSelector.tsx +3 -3
- package/src/components/booking/PriceBreakdown.tsx +5 -5
- package/src/components/booking/PriceSummary.module.css +7 -0
- package/src/components/booking/PriceSummary.tsx +8 -7
- package/src/components/booking/PrivateShuttleBookingFlow.tsx +28 -19
- package/src/components/booking/PromoCodeInput.module.css +31 -25
- package/src/components/booking/PromoCodeInput.tsx +36 -24
- package/src/components/booking/ReturnTimeSelector.tsx +3 -3
- package/src/components/booking/TermsAcceptance.tsx +7 -2
- package/src/components/booking/TicketSelector.tsx +1 -1
- package/src/components/booking/TourDescription.tsx +11 -6
- package/src/components/booking/booking-flow.css +65 -4
- package/src/hooks/useBookingSourceMetadataFromLocation.ts +1 -1
- package/src/hooks/useIsBookingLaunchLive.ts +1 -1
- package/src/index.ts +26 -64
- package/src/providers/booking-dialog-provider.tsx +62 -53
- package/src/runtime/BookingHostContext.tsx +39 -0
- package/src/runtime/index.ts +13 -0
- package/src/runtime/types.ts +86 -0
- package/tsconfig.json +3 -5
- package/src/assets/icons/minus.svg +0 -7
- package/src/assets/icons/partner-logos/getyourguide.svg +0 -8
- package/src/assets/icons/plus.svg +0 -3
- package/src/colours.css +0 -23
- package/src/components/BookingDetails.module.css +0 -1591
- package/src/components/BookingDetails.tsx +0 -2264
- package/src/components/BookingWidget.tsx +0 -302
- package/src/components/ManageBookingView.tsx +0 -437
- package/src/components/PhoneInputWithCountry.module.css +0 -131
- package/src/components/PhoneInputWithCountry.tsx +0 -44
- package/src/components/PickupLocationDialog.module.css +0 -360
- package/src/components/PickupLocationDialog.tsx +0 -357
- package/src/components/PostBookingDependentAddOnUpsell.module.css +0 -174
- package/src/components/PostBookingDependentAddOnUpsell.tsx +0 -407
- package/src/components/button.css +0 -245
- package/src/components/button.tsx +0 -152
- package/src/components/colorable-svg.tsx +0 -29
- package/src/components/image.css +0 -29
- package/src/components/image.tsx +0 -113
- package/src/components/partner/PartnerBookingPage.module.css +0 -130
- package/src/components/partner/PartnerBookingPage.tsx +0 -390
- package/src/components/partner/PartnerBookingPageWithBrowserMetadata.tsx +0 -45
- package/src/components/product-tag.module.css +0 -30
- package/src/components/product-tag.tsx +0 -34
- package/src/components/product-theme-pages/image-modal.tsx +0 -248
- package/src/components/product-theme-pages/photo-gallery.module.css +0 -200
- package/src/components/terms/TermsContent.tsx +0 -178
- package/src/components/value-pill.module.css +0 -59
- package/src/components/value-pill.tsx +0 -46
- package/src/constants/images.ts +0 -556
- package/src/constants/pill-values.ts +0 -210
- package/src/constants/products.ts +0 -155
- package/src/contexts/AvailabilitiesCacheContext.tsx +0 -125
- package/src/contexts/CompanyContext.tsx +0 -70
- package/src/data/dap-descriptions/session-couples-families-friends.en.json +0 -61
- package/src/data/dap-descriptions/session-elopements.en.json +0 -60
- package/src/data/dap-descriptions/session-proposals.en.json +0 -60
- package/src/data/product-descriptions/afternoon-delight.en.json +0 -35
- package/src/data/product-descriptions/emerald-lake-escape.en.json +0 -68
- package/src/data/product-descriptions/lake-louise-adventure.en.json +0 -74
- package/src/data/product-descriptions/moraine-lake-adventure.en.json +0 -78
- package/src/data/product-descriptions/moraine-lake-sunrise-lake-louise-golden-hour.en.json +0 -65
- package/src/data/product-descriptions/moraine-lake-sunrise.en.json +0 -64
- package/src/data/product-descriptions/private-tour.en.json +0 -80
- package/src/data/product-descriptions/two-lakes-combo.en.json +0 -65
- package/src/data/products-config.json +0 -101
- package/src/lib/analytics.ts +0 -197
- package/src/lib/booking/booking-source.ts +0 -51
- package/src/lib/booking/checkout-breakdown.ts +0 -69
- package/src/lib/booking/correlation-id.ts +0 -46
- package/src/lib/booking/i18n/config.ts +0 -21
- package/src/lib/booking/i18n/index.tsx +0 -144
- package/src/lib/booking/i18n/messages/en.json +0 -236
- package/src/lib/booking/i18n/messages/fr.json +0 -236
- package/src/lib/booking/itinerary-display.ts +0 -36
- package/src/lib/booking/itinerary-labels.ts +0 -70
- package/src/lib/booking/location-calculations.ts +0 -43
- package/src/lib/booking/location-utils.ts +0 -165
- package/src/lib/booking/map-utils.ts +0 -153
- package/src/lib/booking/marker-icons.ts +0 -113
- package/src/lib/booking/normalize-booking-product-id.ts +0 -21
- package/src/lib/booking/pickup-location-types.ts +0 -25
- package/src/lib/booking/places-api.ts +0 -154
- package/src/lib/booking/pricing.ts +0 -466
- package/src/lib/booking/product-option-id.ts +0 -35
- package/src/lib/booking/source-metadata.ts +0 -226
- package/src/lib/booking/sunday-week.ts +0 -14
- package/src/lib/booking/theme.ts +0 -83
- package/src/lib/booking/trace-context.ts +0 -62
- package/src/lib/booking/utils.ts +0 -9
- package/src/lib/booking-api.ts +0 -1793
- package/src/lib/booking-constants.ts +0 -23
- package/src/lib/booking-ref.ts +0 -13
- package/src/lib/booking-types.ts +0 -36
- package/src/lib/currency.ts +0 -81
- package/src/lib/dap-descriptions.ts +0 -50
- package/src/lib/dap-itinerary-preview.ts +0 -315
- package/src/lib/dependent-add-on-api.ts +0 -434
- package/src/lib/env.ts +0 -96
- package/src/lib/firebase.ts +0 -20
- package/src/lib/job-application-api.ts +0 -83
- package/src/lib/manage-booking-embed-print.ts +0 -16
- package/src/lib/manage-booking-post-checkout.ts +0 -68
- package/src/lib/photo-dap-config.ts +0 -228
- package/src/lib/photo-packages.ts +0 -75
- package/src/lib/pickup/map-utils.ts +0 -56
- package/src/lib/pickup/marker-icons.ts +0 -19
- package/src/lib/product-descriptions.ts +0 -66
- package/src/lib/products-config.ts +0 -73
- package/src/providers/dependent-add-on-dialog-provider.tsx +0 -105
- package/src/radius.css +0 -5
- package/src/spacing.css +0 -7
- package/src/strings/en.json +0 -1774
- package/src/strings/es.json +0 -1573
- package/src/strings/fr.json +0 -1573
- package/src/strings/index.js +0 -23
- package/src/text-style.css +0 -56
- package/src/utils/currency-converter.ts +0 -101
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* i18n Utilities
|
|
5
|
-
*
|
|
6
|
-
* Simple translation utilities for client components.
|
|
7
|
-
* For server components, use next-intl directly.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { useState, useEffect, createContext, useContext } from 'react';
|
|
11
|
-
import type { ReactNode } from 'react';
|
|
12
|
-
import messagesEn from './messages/en.json';
|
|
13
|
-
import messagesFr from './messages/fr.json';
|
|
14
|
-
import { defaultLocale, locales, type Locale } from './config';
|
|
15
|
-
|
|
16
|
-
type Messages = typeof messagesEn;
|
|
17
|
-
|
|
18
|
-
const messages: Record<Locale, Messages> = {
|
|
19
|
-
en: messagesEn,
|
|
20
|
-
fr: messagesFr,
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// Context for locale
|
|
24
|
-
const LocaleContext = createContext<{
|
|
25
|
-
locale: Locale;
|
|
26
|
-
setLocale: (locale: Locale) => void;
|
|
27
|
-
}>({
|
|
28
|
-
locale: defaultLocale,
|
|
29
|
-
setLocale: () => {},
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
// Provider component
|
|
33
|
-
export function LocaleProvider({ children }: { children: ReactNode }) {
|
|
34
|
-
// Always start with default locale to ensure server/client match
|
|
35
|
-
const [locale, setLocaleState] = useState<Locale>(defaultLocale);
|
|
36
|
-
|
|
37
|
-
// Load from localStorage after hydration to avoid SSR mismatch
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
try {
|
|
40
|
-
const saved = localStorage.getItem('booking-locale') as Locale | null;
|
|
41
|
-
// Validate that saved locale is in our supported locales array
|
|
42
|
-
if (saved && locales.includes(saved)) {
|
|
43
|
-
setLocaleState(saved);
|
|
44
|
-
}
|
|
45
|
-
} catch (error) {
|
|
46
|
-
// localStorage might be disabled or throw errors
|
|
47
|
-
console.warn('Failed to read locale from localStorage:', error);
|
|
48
|
-
}
|
|
49
|
-
}, []);
|
|
50
|
-
|
|
51
|
-
const setLocale = (newLocale: Locale) => {
|
|
52
|
-
// Validate locale before setting
|
|
53
|
-
if (!locales.includes(newLocale)) {
|
|
54
|
-
console.warn(`Invalid locale: ${newLocale}. Falling back to ${defaultLocale}`);
|
|
55
|
-
setLocaleState(defaultLocale);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
setLocaleState(newLocale);
|
|
60
|
-
if (typeof window !== 'undefined') {
|
|
61
|
-
try {
|
|
62
|
-
localStorage.setItem('booking-locale', newLocale);
|
|
63
|
-
} catch (error) {
|
|
64
|
-
// localStorage might be disabled or full
|
|
65
|
-
console.warn('Failed to save locale to localStorage:', error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
return (
|
|
71
|
-
<LocaleContext.Provider value={{ locale, setLocale }}>
|
|
72
|
-
{children}
|
|
73
|
-
</LocaleContext.Provider>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Hook to use translations
|
|
78
|
-
export function useTranslations() {
|
|
79
|
-
const { locale } = useContext(LocaleContext);
|
|
80
|
-
|
|
81
|
-
// Ensure we have a valid locale, fallback to default if invalid
|
|
82
|
-
const validLocale = locales.includes(locale) ? locale : defaultLocale;
|
|
83
|
-
const currentMessages = messages[validLocale] || messages[defaultLocale];
|
|
84
|
-
|
|
85
|
-
const t = (key: string, params?: Record<string, string | number>): string => {
|
|
86
|
-
if (!key || typeof key !== 'string') {
|
|
87
|
-
console.warn('Invalid translation key:', key);
|
|
88
|
-
return String(key || '');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const keys = key.split('.');
|
|
92
|
-
let value: unknown = currentMessages;
|
|
93
|
-
|
|
94
|
-
for (const k of keys) {
|
|
95
|
-
if (value === null || value === undefined) {
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
// Safe property access on unknown type
|
|
99
|
-
value = (value as Record<string, unknown>)[k];
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (value === undefined || value === null) {
|
|
103
|
-
// In development, show the key to help identify missing translations
|
|
104
|
-
if (process.env.NODE_ENV === 'development') {
|
|
105
|
-
console.warn(`Translation key not found: ${key} (locale: ${validLocale})`);
|
|
106
|
-
}
|
|
107
|
-
return key;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Ensure value is a string
|
|
111
|
-
if (typeof value !== 'string') {
|
|
112
|
-
console.warn(`Translation value is not a string for key: ${key}`);
|
|
113
|
-
return key;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Simple parameter replacement
|
|
117
|
-
if (params) {
|
|
118
|
-
return value.replace(/\{(\w+)\}/g, (match, paramKey) => {
|
|
119
|
-
const paramValue = params[paramKey];
|
|
120
|
-
return paramValue !== undefined && paramValue !== null
|
|
121
|
-
? String(paramValue)
|
|
122
|
-
: match;
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return value;
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
return { t };
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Hook to use locale switching
|
|
133
|
-
export function useLocale() {
|
|
134
|
-
return useContext(LocaleContext);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Type-safe translation key helper
|
|
138
|
-
export type TranslationKey =
|
|
139
|
-
| `common.${keyof Messages['common']}`
|
|
140
|
-
| `booking.${keyof Messages['booking']}`
|
|
141
|
-
| `pickup.${keyof Messages['pickup']}`
|
|
142
|
-
| `calendar.${keyof Messages['calendar']}`
|
|
143
|
-
| `products.${keyof Messages['products']}`;
|
|
144
|
-
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"common": {
|
|
3
|
-
"back": "Back",
|
|
4
|
-
"continue": "Continue",
|
|
5
|
-
"select": "Select",
|
|
6
|
-
"change": "Change",
|
|
7
|
-
"cancel": "Cancel",
|
|
8
|
-
"close": "Close",
|
|
9
|
-
"videoPause": "Pause video",
|
|
10
|
-
"videoPlay": "Play video",
|
|
11
|
-
"videoMute": "Mute",
|
|
12
|
-
"videoUnmute": "Unmute",
|
|
13
|
-
"loading": "Loading...",
|
|
14
|
-
"error": "Error",
|
|
15
|
-
"total": "Total",
|
|
16
|
-
"email": "Email",
|
|
17
|
-
"emailPlaceholder": "your@email.com",
|
|
18
|
-
"emailForConfirmation": "Email (for confirmation)"
|
|
19
|
-
},
|
|
20
|
-
"booking": {
|
|
21
|
-
"selectDate": "Select Date",
|
|
22
|
-
"selectPickupTime": "Select Pickup Time",
|
|
23
|
-
"requestDifferentTime": "Request different time",
|
|
24
|
-
"preferredPickupTime": "Preferred pickup time",
|
|
25
|
-
"selectReturnTime": "Select Return Time",
|
|
26
|
-
"selectPhotoSessionTime": "Select session time",
|
|
27
|
-
"dapPhotoSessionAddOn": "Photo session (add-on)",
|
|
28
|
-
"dapYourCurrentItinerary": "Your current itinerary",
|
|
29
|
-
"dapRefItineraryLoading": "Looking up your booking…",
|
|
30
|
-
"dapRefItineraryEmpty": "We didn’t get shuttle times for this reference yet. Your booking may still be valid — choose a session length (if needed) and load available times.",
|
|
31
|
-
"dapRefItineraryLookupFailed": "We couldn’t find a booking with that reference, or it isn’t eligible for this add-on. Double-check the code from your confirmation.",
|
|
32
|
-
"dapItineraryFallbackFoot": "After you pay, you’ll see this add-on with your full itinerary in Manage booking.",
|
|
33
|
-
"mostPopular": "Most popular",
|
|
34
|
-
"pickupAtTourStart": "<b>Your pickup time depends on your pickup location.</b><br>Your exact pickup time will be confirmed once you have confirmed your pickup location. Pickups start in Canmore and end in Lake Louise.",
|
|
35
|
-
"pickupAtTourStartLocation": "tour start location",
|
|
36
|
-
"pickupLocationUnknown": "I don't know",
|
|
37
|
-
"arrivalTimeMessage": "You'll arrive at {destination} around <b>{time}</b>.",
|
|
38
|
-
"yourItinerary": "Your Itinerary",
|
|
39
|
-
"buildYourItinerary": "Build Your Itinerary",
|
|
40
|
-
"selectPickupTimeToSeeItinerary": "Select a pickup time below to see your schedule.",
|
|
41
|
-
"selectTourOption": "Select Tour Option",
|
|
42
|
-
"selectTourOptionToSeeItinerary": "Select a tour option below to see your itinerary.",
|
|
43
|
-
"timesToBeDetermined": "times to be determined/confirmed…",
|
|
44
|
-
"proposedStops": "Proposed stops",
|
|
45
|
-
"orderAndTimesToBeConfirmed": "(order and times to be confirmed by our team)",
|
|
46
|
-
"startingAtPerShuttle": "Starting at {price} per shuttle",
|
|
47
|
-
"hoursTour": "{hours} hr tour",
|
|
48
|
-
"hoursTourStarting": "Tour starting with {hours} hours",
|
|
49
|
-
"startingAtForHours": "Starting at {price} per shuttle for {hours}.",
|
|
50
|
-
"hoursUnit": "hours",
|
|
51
|
-
"additionalHoursAvailable": "Additional hours available for a fee.",
|
|
52
|
-
"pickupAt": "Pickup at",
|
|
53
|
-
"pickupAtPrefix": "Pickup at ",
|
|
54
|
-
"pickupAtLocation": "Pickup at {location}",
|
|
55
|
-
"arriveAt": "Arrive at",
|
|
56
|
-
"arriveAtPlace": "Arrive at {place}",
|
|
57
|
-
"departFrom": "Depart",
|
|
58
|
-
"departFromPlace": "Depart {place}",
|
|
59
|
-
"dropOffAt": "Drop off at {location}",
|
|
60
|
-
"dropOffAtPrefix": "Drop off at ",
|
|
61
|
-
"tripEnd": "Trip ends",
|
|
62
|
-
"stopAtPlaceTbd": "Stop at {place} (time TBD)",
|
|
63
|
-
"placeTheDestination": "the destination",
|
|
64
|
-
"dropOffAtPickup": "Arrive at {pickupLocation}",
|
|
65
|
-
"yourPickupLocation": "your pickup location",
|
|
66
|
-
"tickets": "Tickets",
|
|
67
|
-
"overbookingWarnDeparture": "WARN OVERBOOKING: Only {count} seats available on {time} departure.",
|
|
68
|
-
"overbookingWarnReturn": "WARN OVERBOOKING: Only {count} seats available on {time} return.",
|
|
69
|
-
"overbookingWarnBoth": "WARN OVERBOOKING: Only {count} seats available on both trip directions.",
|
|
70
|
-
"overbookingResourcesSuffix": "({count} shared resources.)",
|
|
71
|
-
"adminBookingLoadLine1": "Booking {projected} /",
|
|
72
|
-
"adminBookingLoadLine2": "{total} total",
|
|
73
|
-
"available": "available",
|
|
74
|
-
"soldOut": "Sold out",
|
|
75
|
-
"continueToPayment": "Continue to Payment",
|
|
76
|
-
"continueToSecurePayment": "Continue to secure payment",
|
|
77
|
-
"preparingCheckout": "Preparing…",
|
|
78
|
-
"creatingReservation": "Creating reservation...",
|
|
79
|
-
"securePayment": "Secure payment powered by Stripe",
|
|
80
|
-
"selectTimeAndTickets": "Please select a time and at least one ticket",
|
|
81
|
-
"selectPickupLocation": "Please select a pickup location",
|
|
82
|
-
"loadingTimes": "Loading available times...",
|
|
83
|
-
"noAvailability": "No availability found for the next 30 days. Please check back later.",
|
|
84
|
-
"seeFullTourDescription": "See full tour description",
|
|
85
|
-
"seeFullAddOnDescription": "See full experience details",
|
|
86
|
-
"communicationPreference": "How would you like to receive future communication (confirmation, reminders, etc.)?",
|
|
87
|
-
"communicationEmail": "Email",
|
|
88
|
-
"communicationEmailDesc": "Send confirmation via email",
|
|
89
|
-
"communicationWhatsApp": "WhatsApp",
|
|
90
|
-
"communicationWhatsAppDesc": "Send confirmation via WhatsApp",
|
|
91
|
-
"emailForConfirmation": "Email",
|
|
92
|
-
"phoneNumberForConfirmation": "WhatsApp Phone Number",
|
|
93
|
-
"phoneNumberPlaceholder": "(555) 123-4567",
|
|
94
|
-
"invalidEmail": "Please enter a valid email address",
|
|
95
|
-
"invalidPhoneNumber": "Please enter a valid phone number",
|
|
96
|
-
"selectCommunicationPreference": "Please select how you would like to receive your confirmation",
|
|
97
|
-
"enterEmail": "Please enter your email address",
|
|
98
|
-
"enterFirstName": "Please enter your first name",
|
|
99
|
-
"enterLastName": "Please enter your last name",
|
|
100
|
-
"enterPhoneNumber": "Please enter your phone number",
|
|
101
|
-
"firstName": "First Name",
|
|
102
|
-
"firstNamePlaceholder": "Jane",
|
|
103
|
-
"lastName": "Last Name",
|
|
104
|
-
"lastNamePlaceholder": "Smith",
|
|
105
|
-
"dapNoLastNameOnFile": "We couldn’t find a last name on this booking in our system. Please contact us, or use Manage booking with the last name from your confirmation email.",
|
|
106
|
-
"dapCancellationPolicyHeading": "Cancellation policy",
|
|
107
|
-
"dapCancellationPolicyBody": "You may cancel this add-on for a full refund up to {days} {daysUnit} before your scheduled photo session. Cancellations made after that deadline may forfeit the entire add-on cost.",
|
|
108
|
-
"dapCancellationPolicyDayUnit": "day",
|
|
109
|
-
"dapCancellationPolicyDaysUnit": "days",
|
|
110
|
-
"noActiveOption": "No active product options available",
|
|
111
|
-
"people": "people",
|
|
112
|
-
"person": "person",
|
|
113
|
-
"rounding": "Rounding",
|
|
114
|
-
"deposit": "Deposit",
|
|
115
|
-
"totalOwedForBookingChange": "Total owed for booking difference",
|
|
116
|
-
"subtotal": "Subtotal",
|
|
117
|
-
"tax": "Taxes and fees",
|
|
118
|
-
"returnOption": "Return Option",
|
|
119
|
-
"fromPrice": "From {price}",
|
|
120
|
-
"communicationPermission": "By providing your contact information, you give permission to receive booking confirmations, reminders, and updates via this method.",
|
|
121
|
-
"communicationPermissionCheckbox": "I give permission to receive communication via this method",
|
|
122
|
-
"communicationPermissionRequired": "Please select at least one communication method",
|
|
123
|
-
"emailPermissionCheckbox": "Contact me by email (we will only send you communication relevant to your booking)",
|
|
124
|
-
"whatsappPermissionCheckbox": "Contact me by WhatsApp (we will only send you communication relevant to your booking)",
|
|
125
|
-
"reviewAndPay": "Review & pay",
|
|
126
|
-
"payNow": "Pay now",
|
|
127
|
-
"paying": "Paying...",
|
|
128
|
-
"checkout": "Checkout",
|
|
129
|
-
"paymentNotConfigured": "Payment is not configured. Please use the standard checkout.",
|
|
130
|
-
"loadingPayment": "Loading payment form...",
|
|
131
|
-
"promoCode": "Promo code",
|
|
132
|
-
"optionalPromoCode": "Promo / voucher / gift card",
|
|
133
|
-
"promoCodePlaceholder": "Enter code",
|
|
134
|
-
"applyPromo": "Apply",
|
|
135
|
-
"removePromo": "Remove",
|
|
136
|
-
"promoApplied": "Applied: {{code}}",
|
|
137
|
-
"invalidPromoCode": "Invalid or expired promo code",
|
|
138
|
-
"promoCodesCannotStackWithDiscounts": "Promo codes cannot be stacked with deals",
|
|
139
|
-
"discount": "Discount",
|
|
140
|
-
"cancellationPolicy": "Cancellation policy",
|
|
141
|
-
"promoIncludesCancellationPolicy": "This promo includes {label} cancellation policy",
|
|
142
|
-
"cancellationRefundTierDays": "Cancel <b>{days} days before</b> for <b>{percent}% refund</b>",
|
|
143
|
-
"cancellationRefundTierHours": "Cancel <b>{hours} hours before</b> for <b>{percent}% refund</b>",
|
|
144
|
-
"cancellationNoRefunds": "<b>No cancellation, no refunds</b>. You can make changes to your booking up to <b>{days} days before</b>.",
|
|
145
|
-
"cancellationNoRefundsNoDays": "<b>No cancellation, no refunds</b>. You can make changes to your booking before your booking date.",
|
|
146
|
-
"cancellationStandard": "Standard cancellation",
|
|
147
|
-
"included": "Included",
|
|
148
|
-
"flexibleCancellation": "Flexible cancellation",
|
|
149
|
-
"depositPaymentNotice": "You're paying the deposit today.",
|
|
150
|
-
"balanceChargeNotice": "The remaining balance will be charged {days} days before your booking. You can also pay it earlier from your Manage Booking page.",
|
|
151
|
-
"balancePayEarlier": "You can pay the remaining balance anytime from your Manage Booking page.",
|
|
152
|
-
"remainingBalance": "Remaining Balance"
|
|
153
|
-
},
|
|
154
|
-
"pickup": {
|
|
155
|
-
"title": "Select your pickup location",
|
|
156
|
-
"yesAddNow": "I know where I want to be picked up",
|
|
157
|
-
"dontKnow": "I don't know yet",
|
|
158
|
-
"pickupLocation": "Pickup Location",
|
|
159
|
-
"enterAddress": "Enter your pickup address",
|
|
160
|
-
"searchingLocation": "Searching for location...",
|
|
161
|
-
"locationNotFound": "Could not find that location. Please try a different address.",
|
|
162
|
-
"chooseNearby": "Choose a pickup location nearby",
|
|
163
|
-
"exactMatch": "Exact match found",
|
|
164
|
-
"locationsInCity": "Pickup locations in {{city}}",
|
|
165
|
-
"selectThisLocation": "Select This Location",
|
|
166
|
-
"yourLocation": "Your Location",
|
|
167
|
-
"chooseClosest": "Choose a pickup location below to see the closest option.",
|
|
168
|
-
"useThisAddress": "Use this address",
|
|
169
|
-
"away": "away",
|
|
170
|
-
"walk": "walk",
|
|
171
|
-
"drive": "drive",
|
|
172
|
-
"switchUnits": "Switch to {unit} units",
|
|
173
|
-
"metric": "metric",
|
|
174
|
-
"imperial": "imperial",
|
|
175
|
-
"dontKnowSubtext": "We will send you reminders to select your pickup location.",
|
|
176
|
-
"yesAddNowSubtext": "You can change this later.",
|
|
177
|
-
"skipWarningTitle": "Important Notice",
|
|
178
|
-
"skipWarningMessage": "You are not guaranteed to be picked up if you do not <b>update your booking with your pickup location at least 12 hours prior</b>.",
|
|
179
|
-
"iUnderstand": "I understand",
|
|
180
|
-
"nevermindSelectLocation": "Nevermind, I'll select my location",
|
|
181
|
-
"outsideServiceArea": "This address is outside our service area. We offer pickups between Lake Louise and Kananaskis. Please choose a preset location or search for an address in that area."
|
|
182
|
-
},
|
|
183
|
-
"calendar": {
|
|
184
|
-
"previousWeeks": "Previous 2 weeks",
|
|
185
|
-
"nextWeeks": "Next 2 weeks",
|
|
186
|
-
"soldOut": "Sold out",
|
|
187
|
-
"left": "{count} left",
|
|
188
|
-
"timesAvailable": "{count} times",
|
|
189
|
-
"spotsAvailable": "{count} available",
|
|
190
|
-
"available": "Available",
|
|
191
|
-
"days": {
|
|
192
|
-
"sun": "SUN",
|
|
193
|
-
"mon": "MON",
|
|
194
|
-
"tue": "TUE",
|
|
195
|
-
"wed": "WED",
|
|
196
|
-
"thu": "THU",
|
|
197
|
-
"fri": "FRI",
|
|
198
|
-
"sat": "SAT"
|
|
199
|
-
},
|
|
200
|
-
"months": {
|
|
201
|
-
"january": "January",
|
|
202
|
-
"february": "February",
|
|
203
|
-
"march": "March",
|
|
204
|
-
"april": "April",
|
|
205
|
-
"may": "May",
|
|
206
|
-
"june": "June",
|
|
207
|
-
"july": "July",
|
|
208
|
-
"august": "August",
|
|
209
|
-
"september": "September",
|
|
210
|
-
"october": "October",
|
|
211
|
-
"november": "November",
|
|
212
|
-
"december": "December"
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
|
-
"products": {
|
|
216
|
-
"backToExperiences": "Back to experiences",
|
|
217
|
-
"from": "From",
|
|
218
|
-
"noDescription": "No description available",
|
|
219
|
-
"productGridFilters": {
|
|
220
|
-
"all": "All",
|
|
221
|
-
"moraineLake": "Moraine Lake",
|
|
222
|
-
"lakeLouise": "Lake Louise",
|
|
223
|
-
"emeraldLake": "Emerald Lake",
|
|
224
|
-
"private": "Private",
|
|
225
|
-
"sunrise": "Sunrise"
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
"terms": {
|
|
229
|
-
"title": "Terms & Conditions",
|
|
230
|
-
"viewTerms": "Terms & Conditions",
|
|
231
|
-
"acceptPrefix": "I accept the",
|
|
232
|
-
"acceptAndClose": "I've read and accept",
|
|
233
|
-
"content": "By completing this booking you agree to the following terms and conditions.\n\n1. Booking and payment\nYour reservation is confirmed once payment has been processed. You will receive a confirmation by email or the contact method you selected.\n\n2. Cancellation and changes\nCancellation and change policies depend on the option you selected at checkout. Please refer to your confirmation for the policy that applies to your booking.\n\n3. Participation\nYou are responsible for arriving at the designated time and location. Late arrival may result in forfeiting the experience without refund.\n\n4. Liability\nThe operator is not liable for loss or damage beyond what is required by applicable law. Participation is at your own risk where activities involve inherent risk.\n\n5. Contact\nFor questions or changes to your booking, use the contact details provided in your confirmation."
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"common": {
|
|
3
|
-
"back": "Retour",
|
|
4
|
-
"continue": "Continuer",
|
|
5
|
-
"select": "Sélectionner",
|
|
6
|
-
"change": "Changer",
|
|
7
|
-
"cancel": "Annuler",
|
|
8
|
-
"close": "Fermer",
|
|
9
|
-
"videoPause": "Mettre en pause",
|
|
10
|
-
"videoPlay": "Lire la vidéo",
|
|
11
|
-
"videoMute": "Couper le son",
|
|
12
|
-
"videoUnmute": "Activer le son",
|
|
13
|
-
"loading": "Chargement...",
|
|
14
|
-
"error": "Erreur",
|
|
15
|
-
"total": "Total",
|
|
16
|
-
"email": "Courriel",
|
|
17
|
-
"emailPlaceholder": "votre@courriel.com",
|
|
18
|
-
"emailForConfirmation": "Courriel (pour confirmation)"
|
|
19
|
-
},
|
|
20
|
-
"booking": {
|
|
21
|
-
"selectDate": "Sélectionner la date",
|
|
22
|
-
"selectPickupTime": "Sélectionner l'heure de prise en charge",
|
|
23
|
-
"requestDifferentTime": "Demander une autre heure",
|
|
24
|
-
"preferredPickupTime": "Heure de prise en charge préférée",
|
|
25
|
-
"selectReturnTime": "Sélectionner l'heure de retour",
|
|
26
|
-
"selectPhotoSessionTime": "Choisir l'heure de la séance photo",
|
|
27
|
-
"dapPhotoSessionAddOn": "Séance photo (option)",
|
|
28
|
-
"dapYourCurrentItinerary": "Votre itinéraire actuel",
|
|
29
|
-
"dapRefItineraryLoading": "Recherche de votre réservation…",
|
|
30
|
-
"dapRefItineraryEmpty": "Nous n’avons pas encore d’horaires de navette pour cette référence. Votre réservation peut quand même être valide — choisissez une durée de séance (si besoin) et chargez les heures disponibles.",
|
|
31
|
-
"dapRefItineraryLookupFailed": "Nous n’avons pas trouvé de réservation avec cette référence, ou elle n’est pas admissible à cette option. Vérifiez le code dans votre courriel de confirmation.",
|
|
32
|
-
"dapItineraryFallbackFoot": "Après le paiement, vous verrez cette option avec l’itinéraire complet dans Gérer la réservation.",
|
|
33
|
-
"mostPopular": "Le plus populaire",
|
|
34
|
-
"pickupAtTourStart": "<b>Votre heure de prise en charge dépend de votre lieu de prise en charge.</b><br>Votre heure de prise en charge exacte sera confirmée une fois que vous aurez confirmé votre lieu de prise en charge. Les prises en charge commencent à Canmore et se terminent à Lake Louise.",
|
|
35
|
-
"pickupAtTourStartLocation": "lieu de départ du tour",
|
|
36
|
-
"pickupLocationUnknown": "Je ne sais pas",
|
|
37
|
-
"arrivalTimeMessage": "Vous arriverez à {destination} vers <b>{time}</b>.",
|
|
38
|
-
"yourItinerary": "Votre itinéraire",
|
|
39
|
-
"buildYourItinerary": "Construisez votre itinéraire",
|
|
40
|
-
"selectPickupTimeToSeeItinerary": "Sélectionnez une heure de prise en charge ci-dessous pour voir votre horaire.",
|
|
41
|
-
"selectTourOption": "Sélectionner l'option de tour",
|
|
42
|
-
"selectTourOptionToSeeItinerary": "Sélectionnez une option de tour ci-dessous pour voir votre itinéraire.",
|
|
43
|
-
"timesToBeDetermined": "heures à confirmer…",
|
|
44
|
-
"proposedStops": "Arrêts proposés",
|
|
45
|
-
"orderAndTimesToBeConfirmed": "(ordre et horaires à confirmer par notre équipe)",
|
|
46
|
-
"startingAtPerShuttle": "À partir de {price} par navette",
|
|
47
|
-
"hoursTour": "Tour de {hours} h",
|
|
48
|
-
"hoursTourStarting": "Tour commençant avec {hours} heures",
|
|
49
|
-
"startingAtForHours": "À partir de {price} par navette pour {hours}.",
|
|
50
|
-
"hoursUnit": "heures",
|
|
51
|
-
"additionalHoursAvailable": "Heures supplémentaires disponibles moyennant des frais.",
|
|
52
|
-
"pickupAt": "Prise en charge à",
|
|
53
|
-
"pickupAtPrefix": "Prise en charge à ",
|
|
54
|
-
"pickupAtLocation": "Prise en charge à {location}",
|
|
55
|
-
"arriveAt": "Arrivée à",
|
|
56
|
-
"arriveAtPlace": "Arrivée à {place}",
|
|
57
|
-
"departFrom": "Départ de",
|
|
58
|
-
"departFromPlace": "Départ de {place}",
|
|
59
|
-
"dropOffAt": "Retour à {location}",
|
|
60
|
-
"dropOffAtPrefix": "Retour à ",
|
|
61
|
-
"tripEnd": "Fin du voyage",
|
|
62
|
-
"stopAtPlaceTbd": "Arrêt à {place} (heure à confirmer)",
|
|
63
|
-
"placeTheDestination": "le lieu de destination",
|
|
64
|
-
"dropOffAtPickup": "Arrivée à {pickupLocation}",
|
|
65
|
-
"yourPickupLocation": "votre lieu de prise en charge",
|
|
66
|
-
"tickets": "Billets",
|
|
67
|
-
"overbookingWarnDeparture": "ALERTE SURRÉSERVATION : seulement {count} places pour le départ à {time}.",
|
|
68
|
-
"overbookingWarnReturn": "ALERTE SURRÉSERVATION : seulement {count} places pour le retour à {time}.",
|
|
69
|
-
"overbookingWarnBoth": "ALERTE SURRÉSERVATION : seulement {count} places sur les deux segments du trajet (aller et retour).",
|
|
70
|
-
"overbookingResourcesSuffix": "({count} ressources partagées.)",
|
|
71
|
-
"adminBookingLoadLine1": "Réservation {projected} /",
|
|
72
|
-
"adminBookingLoadLine2": "{total} au total",
|
|
73
|
-
"available": "disponible",
|
|
74
|
-
"soldOut": "Complet",
|
|
75
|
-
"continueToPayment": "Continuer vers le paiement",
|
|
76
|
-
"continueToSecurePayment": "Continuer vers le paiement sécurisé",
|
|
77
|
-
"preparingCheckout": "Préparation…",
|
|
78
|
-
"creatingReservation": "Création de la réservation...",
|
|
79
|
-
"securePayment": "Paiement sécurisé par Stripe",
|
|
80
|
-
"selectTimeAndTickets": "Veuillez sélectionner une heure et au moins un billet",
|
|
81
|
-
"selectPickupLocation": "Veuillez sélectionner un lieu de prise en charge",
|
|
82
|
-
"loadingTimes": "Chargement des heures disponibles...",
|
|
83
|
-
"noAvailability": "Aucune disponibilité trouvée pour les 30 prochains jours. Veuillez réessayer plus tard.",
|
|
84
|
-
"seeFullTourDescription": "Voir la description complète du circuit",
|
|
85
|
-
"seeFullAddOnDescription": "Voir tous les détails de l'expérience",
|
|
86
|
-
"communicationPreference": "Comment souhaitez-vous recevoir les communications futures (confirmation, rappels, etc.)?",
|
|
87
|
-
"communicationEmail": "Courriel",
|
|
88
|
-
"communicationEmailDesc": "Envoyer la confirmation par courriel",
|
|
89
|
-
"communicationWhatsApp": "WhatsApp",
|
|
90
|
-
"communicationWhatsAppDesc": "Envoyer la confirmation par WhatsApp",
|
|
91
|
-
"emailForConfirmation": "Courriel",
|
|
92
|
-
"phoneNumberForConfirmation": "Numéro de téléphone",
|
|
93
|
-
"phoneNumberPlaceholder": "(555) 123-4567",
|
|
94
|
-
"invalidEmail": "Veuillez entrer une adresse courriel valide",
|
|
95
|
-
"invalidPhoneNumber": "Veuillez entrer un numéro de téléphone valide",
|
|
96
|
-
"selectCommunicationPreference": "Veuillez sélectionner comment vous souhaitez recevoir votre confirmation",
|
|
97
|
-
"enterEmail": "Veuillez entrer votre adresse courriel",
|
|
98
|
-
"enterFirstName": "Veuillez entrer votre prénom",
|
|
99
|
-
"enterLastName": "Veuillez entrer votre nom de famille",
|
|
100
|
-
"enterPhoneNumber": "Veuillez entrer votre numéro de téléphone",
|
|
101
|
-
"firstName": "Prénom",
|
|
102
|
-
"firstNamePlaceholder": "Jeanne",
|
|
103
|
-
"lastName": "Nom de famille",
|
|
104
|
-
"lastNamePlaceholder": "Dupont",
|
|
105
|
-
"dapNoLastNameOnFile": "Nous n’avons pas trouvé de nom de famille pour cette réservation. Contactez-nous, ou utilisez Gérer la réservation avec le nom figurant sur votre courriel de confirmation.",
|
|
106
|
-
"dapCancellationPolicyHeading": "Politique d’annulation",
|
|
107
|
-
"dapCancellationPolicyBody": "Vous pouvez annuler cette option avec remboursement intégral jusqu’à {days} {daysUnit} avant votre séance photo prévue. Toute annulation après cette date peut entraîner la perte du montant total de l’option.",
|
|
108
|
-
"dapCancellationPolicyDayUnit": "jour",
|
|
109
|
-
"dapCancellationPolicyDaysUnit": "jours",
|
|
110
|
-
"noActiveOption": "Aucune option de produit disponible",
|
|
111
|
-
"people": "personnes",
|
|
112
|
-
"person": "personne",
|
|
113
|
-
"rounding": "Arrondi",
|
|
114
|
-
"deposit": "Acompte",
|
|
115
|
-
"totalOwedForBookingChange": "Montant dû pour le changement de réservation",
|
|
116
|
-
"subtotal": "Sous-total",
|
|
117
|
-
"tax": "Taxes et frais",
|
|
118
|
-
"returnOption": "Option de retour",
|
|
119
|
-
"fromPrice": "À partir de {price}",
|
|
120
|
-
"communicationPermission": "En fournissant vos coordonnées, vous autorisez la réception de confirmations de réservation, de rappels et de mises à jour par cette méthode.",
|
|
121
|
-
"communicationPermissionCheckbox": "J'autorise la réception de communications par cette méthode",
|
|
122
|
-
"communicationPermissionRequired": "Veuillez sélectionner au moins une méthode de communication",
|
|
123
|
-
"emailPermissionCheckbox": "Me contacter par courriel (nous ne vous enverrons que les communications pertinentes pour votre réservation)",
|
|
124
|
-
"whatsappPermissionCheckbox": "Me contacter par WhatsApp (nous ne vous enverrons que les communications pertinentes pour votre réservation)",
|
|
125
|
-
"reviewAndPay": "Réviser et payer",
|
|
126
|
-
"payNow": "Payer maintenant",
|
|
127
|
-
"paying": "Paiement en cours...",
|
|
128
|
-
"checkout": "Paiement",
|
|
129
|
-
"paymentNotConfigured": "Le paiement n'est pas configuré. Veuillez utiliser le paiement standard.",
|
|
130
|
-
"loadingPayment": "Chargement du formulaire de paiement...",
|
|
131
|
-
"promoCode": "Code promo",
|
|
132
|
-
"optionalPromoCode": "Promo / bon / carte cadeau",
|
|
133
|
-
"promoCodePlaceholder": "Entrez le code",
|
|
134
|
-
"applyPromo": "Appliquer",
|
|
135
|
-
"removePromo": "Retirer",
|
|
136
|
-
"promoApplied": "Appliqué : {{code}}",
|
|
137
|
-
"invalidPromoCode": "Code promo invalide ou expiré",
|
|
138
|
-
"promoCodesCannotStackWithDiscounts": "Les codes promo ne peuvent pas être cumulés avec les offres",
|
|
139
|
-
"discount": "Réduction",
|
|
140
|
-
"cancellationPolicy": "Politique d'annulation",
|
|
141
|
-
"promoIncludesCancellationPolicy": "Ce code promo inclut la politique d'annulation {label}",
|
|
142
|
-
"cancellationRefundTierDays": "Annuler <b>{days} jours avant</b> pour <b>{percent}% de remboursement</b>",
|
|
143
|
-
"cancellationRefundTierHours": "Annuler <b>{hours} heures avant</b> pour <b>{percent}% de remboursement</b>",
|
|
144
|
-
"cancellationNoRefunds": "<b>Pas d'annulation, pas de remboursement</b>. Vous pouvez modifier votre réservation jusqu'à <b>{days} jours avant</b>.",
|
|
145
|
-
"cancellationNoRefundsNoDays": "<b>Pas d'annulation, pas de remboursement</b>. Vous pouvez modifier votre réservation avant la date de votre réservation.",
|
|
146
|
-
"cancellationStandard": "Annulation standard",
|
|
147
|
-
"included": "Inclus",
|
|
148
|
-
"flexibleCancellation": "Annulation flexible",
|
|
149
|
-
"depositPaymentNotice": "Vous payez l'acompte aujourd'hui.",
|
|
150
|
-
"balanceChargeNotice": "Le solde restant sera facturé {days} jours avant votre réservation. Vous pouvez également le payer plus tôt depuis la page Gérer ma réservation.",
|
|
151
|
-
"balancePayEarlier": "Vous pouvez payer le solde restant à tout moment depuis la page Gérer ma réservation.",
|
|
152
|
-
"remainingBalance": "Solde restant"
|
|
153
|
-
},
|
|
154
|
-
"pickup": {
|
|
155
|
-
"title": "Savez-vous où vous souhaitez être pris en charge?",
|
|
156
|
-
"yesAddNow": "Oui, je peux l'ajouter maintenant",
|
|
157
|
-
"dontKnow": "Je ne sais pas encore",
|
|
158
|
-
"pickupLocation": "Lieu de prise en charge",
|
|
159
|
-
"enterAddress": "Entrez votre adresse de prise en charge",
|
|
160
|
-
"searchingLocation": "Recherche de l'emplacement...",
|
|
161
|
-
"locationNotFound": "Impossible de trouver cet emplacement. Veuillez essayer une autre adresse.",
|
|
162
|
-
"chooseNearby": "Choisissez un lieu de prise en charge à proximité",
|
|
163
|
-
"exactMatch": "Correspondance exacte trouvée",
|
|
164
|
-
"locationsInCity": "Points de ramassage à {{city}}",
|
|
165
|
-
"selectThisLocation": "Sélectionner ce lieu",
|
|
166
|
-
"yourLocation": "Votre emplacement",
|
|
167
|
-
"chooseClosest": "Choisissez un lieu de prise en charge ci-dessous pour voir l'option la plus proche.",
|
|
168
|
-
"useThisAddress": "Utiliser cette adresse",
|
|
169
|
-
"away": "de distance",
|
|
170
|
-
"walk": "à pied",
|
|
171
|
-
"drive": "en voiture",
|
|
172
|
-
"switchUnits": "Passer aux unités {unit}",
|
|
173
|
-
"metric": "métriques",
|
|
174
|
-
"imperial": "impériales",
|
|
175
|
-
"dontKnowSubtext": "Nous vous enverrons des rappels pour sélectionner votre lieu de prise en charge.",
|
|
176
|
-
"yesAddNowSubtext": "Vous pourrez modifier cela plus tard.",
|
|
177
|
-
"skipWarningTitle": "Avis important",
|
|
178
|
-
"skipWarningMessage": "Vous n'êtes pas garanti d'être pris en charge si vous ne <b>mettez pas à jour votre réservation avec votre lieu de prise en charge au moins 12 heures à l'avance</b>.",
|
|
179
|
-
"iUnderstand": "Je comprends",
|
|
180
|
-
"nevermindSelectLocation": "Annuler, je vais sélectionner mon lieu",
|
|
181
|
-
"outsideServiceArea": "Cette adresse est en dehors de notre zone de service. Nous proposons des prises en charge entre le lac Louise et Kananaskis. Veuillez choisir un lieu prédéfini ou rechercher une adresse dans cette zone."
|
|
182
|
-
},
|
|
183
|
-
"calendar": {
|
|
184
|
-
"previousWeeks": "2 semaines précédentes",
|
|
185
|
-
"nextWeeks": "2 semaines suivantes",
|
|
186
|
-
"soldOut": "Complet",
|
|
187
|
-
"left": "{count} restant",
|
|
188
|
-
"timesAvailable": "{count} départs",
|
|
189
|
-
"spotsAvailable": "{count} places",
|
|
190
|
-
"available": "Disponible",
|
|
191
|
-
"days": {
|
|
192
|
-
"sun": "DIM",
|
|
193
|
-
"mon": "LUN",
|
|
194
|
-
"tue": "MAR",
|
|
195
|
-
"wed": "MER",
|
|
196
|
-
"thu": "JEU",
|
|
197
|
-
"fri": "VEN",
|
|
198
|
-
"sat": "SAM"
|
|
199
|
-
},
|
|
200
|
-
"months": {
|
|
201
|
-
"january": "Janvier",
|
|
202
|
-
"february": "Février",
|
|
203
|
-
"march": "Mars",
|
|
204
|
-
"april": "Avril",
|
|
205
|
-
"may": "Mai",
|
|
206
|
-
"june": "Juin",
|
|
207
|
-
"july": "Juillet",
|
|
208
|
-
"august": "Août",
|
|
209
|
-
"september": "Septembre",
|
|
210
|
-
"october": "Octobre",
|
|
211
|
-
"november": "Novembre",
|
|
212
|
-
"december": "Décembre"
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
|
-
"products": {
|
|
216
|
-
"backToExperiences": "Retour aux expériences",
|
|
217
|
-
"from": "À partir de",
|
|
218
|
-
"noDescription": "Aucune description disponible",
|
|
219
|
-
"productGridFilters": {
|
|
220
|
-
"all": "Tous",
|
|
221
|
-
"moraineLake": "Lac Moraine",
|
|
222
|
-
"lakeLouise": "Lac Louise",
|
|
223
|
-
"emeraldLake": "Lac Émeraude",
|
|
224
|
-
"private": "Privé",
|
|
225
|
-
"sunrise": "Levé de soleil"
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
"terms": {
|
|
229
|
-
"title": "Conditions générales",
|
|
230
|
-
"viewTerms": "Conditions générales",
|
|
231
|
-
"acceptPrefix": "J'accepte les",
|
|
232
|
-
"acceptAndClose": "J'ai lu et j'accepte",
|
|
233
|
-
"content": "En finalisant cette réservation, vous acceptez les conditions générales suivantes.\n\n1. Réservation et paiement\nVotre réservation est confirmée une fois le paiement traité. Vous recevrez une confirmation par courriel ou par le mode de contact choisi.\n\n2. Annulation et modifications\nLes politiques d'annulation et de modification dépendent de l'option choisie au paiement. Veuillez consulter votre confirmation pour la politique applicable.\n\n3. Participation\nVous êtes responsable d'arriver à l'heure et au lieu indiqués. Un retard peut entraîner la perte de l'expérience sans remboursement.\n\n4. Responsabilité\nL'opérateur n'est pas responsable des pertes ou dommages au-delà de ce qu'exige la loi applicable. La participation est à vos risques lorsque les activités comportent des risques inhérents.\n\n5. Contact\nPour toute question ou modification de réservation, utilisez les coordonnées indiquées dans votre confirmation."
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared itinerary step labels for manage booking, change-booking dialog, etc.
|
|
3
|
-
* Keeps display consistent with BookingDetails.
|
|
4
|
-
*/
|
|
5
|
-
export type ItineraryStepForLabel = {
|
|
6
|
-
label?: string | null;
|
|
7
|
-
place?: string | null;
|
|
8
|
-
stepType?: string | null;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export function getItineraryStepLabel(step: ItineraryStepForLabel): string {
|
|
12
|
-
if (step.label?.trim()) return step.label.trim();
|
|
13
|
-
const place = step.place?.trim();
|
|
14
|
-
const placeDisplay =
|
|
15
|
-
place === 'your_pickup_location'
|
|
16
|
-
? 'your pickup location'
|
|
17
|
-
: place === 'the_destination'
|
|
18
|
-
? 'the destination'
|
|
19
|
-
: place ?? '';
|
|
20
|
-
switch (step.stepType) {
|
|
21
|
-
case 'pickup':
|
|
22
|
-
return placeDisplay ? `Pickup at ${placeDisplay}` : 'Pickup';
|
|
23
|
-
case 'drop_off':
|
|
24
|
-
return placeDisplay ? `Drop off at ${placeDisplay}` : 'Drop-off';
|
|
25
|
-
case 'arrive':
|
|
26
|
-
return placeDisplay ? `Arrive at ${placeDisplay}` : 'Arrive';
|
|
27
|
-
case 'depart':
|
|
28
|
-
return placeDisplay ? `Depart ${placeDisplay}` : 'Depart';
|
|
29
|
-
case 'trip_end':
|
|
30
|
-
return 'Trip ends';
|
|
31
|
-
case 'draft':
|
|
32
|
-
return placeDisplay || 'Stop';
|
|
33
|
-
default:
|
|
34
|
-
return placeDisplay || (step.stepType ?? 'Step');
|
|
35
|
-
}
|
|
36
|
-
}
|