Merged in feat/lokalise-rebuild (pull request #2993)

Feat/lokalise rebuild

* chore(lokalise): update translation ids

* chore(lokalise): easier to switch between projects

* chore(lokalise): update translation ids

* .

* .

* .

* .

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* .

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* chore(lokalise): new translations

* merge

* switch to errors for missing id's

* merge

* sync translations


Approved-by: Linus Flood
This commit is contained in:
Joakim Jäderberg
2025-10-22 11:00:03 +00:00
parent bdfe2ab213
commit aafad9781f
499 changed files with 93363 additions and 99164 deletions

View File

@@ -79,6 +79,7 @@ export default function Breakfast() {
{hasChildrenInRoom ? (
<Body>
{intl.formatMessage({
id: "enterDetails.breakfast.childrenFreeInfo",
defaultMessage:
"Children's breakfast is always free as part of the adult's breakfast.",
})}
@@ -92,26 +93,31 @@ export default function Breakfast() {
value={pkg.code}
Icon={BreakfastBuffetIcon}
title={intl.formatMessage({
id: "common.breakfastBuffet",
defaultMessage: "Breakfast buffet",
})}
subtitle={
pkg.code === BreakfastPackageEnum.FREE_MEMBER_BREAKFAST
? intl.formatMessage({
id: "common.included",
defaultMessage: "Included",
})
: `+ ${formatPrice(intl, pkg.localPrice.price, pkg.localPrice.currency ?? "")}`
}
subtitleSecondary={intl.formatMessage({
id: "common.perAdultNight",
defaultMessage: "Per adult/night",
})}
description={
hasChildrenInRoom
? intl.formatMessage({
id: "enterDetails.breakfast.freeForKidsUnder12",
defaultMessage: "Free for kids aged 12 and under.",
})
: undefined
}
descriptionSecondary={intl.formatMessage({
id: "enterDetails.breakfast.dietaryOptions",
defaultMessage:
"Includes vegan, gluten-free, and other allergy-friendly options.",
})}
@@ -122,16 +128,19 @@ export default function Breakfast() {
value="false"
Icon={NoBreakfastBuffetIcon}
title={intl.formatMessage({
id: "common.noBreakfast",
defaultMessage: "No breakfast",
})}
subtitle={`+ ${formatPrice(intl, totalPriceForNoBreakfast, packages?.[0].localPrice.currency ?? "")}`}
descriptionSecondary={
hasChildrenInRoom
? intl.formatMessage({
id: "enterDetails.breakfast.addAfterBookingChildren",
defaultMessage:
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.",
})
: intl.formatMessage({
id: "enterDetails.breakfast.addAfterBookingNoChilren",
defaultMessage:
"Breakfast can be added after booking for an additional fee.",
})

View File

@@ -39,6 +39,7 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
<Typography variant="Body/Supporting text (caption)/smRegular">
<span>
{intl.formatMessage({
id: "enterDetails.confirmBooking.guaranteeLabel",
defaultMessage:
"I may arrive later than 18:00 and want to guarantee my booking.",
})}
@@ -53,7 +54,10 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
>
<MaterialIcon icon="info" size={20} color="CurrentColor" />
<span className={styles.btnText}>
{intl.formatMessage({ defaultMessage: "How it works" })}
{intl.formatMessage({
id: "common.howItWorks",
defaultMessage: "How it works",
})}
</span>
</Button>
<ModalOverlay className={styles.overlay} isDismissable>
@@ -64,6 +68,7 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
<Typography variant="Title/Subtitle/lg">
<h3>
{intl.formatMessage({
id: "enterDetails.confirmBooking.guaranteeInfoModalTitle",
defaultMessage: "Guarantee for late arrival",
})}
</h3>
@@ -71,6 +76,7 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
<Typography variant="Body/Lead text">
<p className={styles.text}>
{intl.formatMessage({
id: "enterDetails.confirmBooking.guaranteeInfoModalDescription",
defaultMessage:
"When guaranteeing your booking with a credit card, we will hold the booking until 07:00 the day after check-in.",
})}
@@ -79,6 +85,7 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
<Typography variant="Body/Paragraph/mdRegular">
<p className={styles.text}>
{intl.formatMessage({
id: "enterDetails.confirmBooking.guaranteeInfoModalNoShowInfo",
defaultMessage:
"In case of a no-show, your credit card will be charged for the first night.",
})}
@@ -92,6 +99,7 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
variant="Secondary"
>
{intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
</Button>
@@ -121,15 +129,19 @@ export default function Guarantee({ savedCreditCards }: GuaranteeProps) {
name="paymentMethod"
label={
savedCreditCards?.length
? intl.formatMessage({
defaultMessage: "OTHER",
})
? intl
.formatMessage({
id: "common.other",
defaultMessage: "Other",
})
.toUpperCase()
: undefined
}
>
<PaymentOption
value={PaymentMethodEnum.card}
label={intl.formatMessage({
id: "common.creditCard",
defaultMessage: "Credit card",
})}
/>

View File

@@ -29,6 +29,7 @@ export default function ConfirmBooking({
<Typography variant="Body/Supporting text (caption)/smRegular">
<span>
{intl.formatMessage({
id: "booking.smsConfirmationLabel",
defaultMessage:
"I would like to get my booking confirmation via sms",
})}
@@ -52,6 +53,7 @@ export function ConfirmBookingRedemption() {
<Typography variant="Body/Supporting text (caption)/smRegular">
<span>
{intl.formatMessage({
id: "booking.smsConfirmationLabel",
defaultMessage:
"I would like to get my booking confirmation via sms",
})}
@@ -63,6 +65,7 @@ export function ConfirmBookingRedemption() {
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "enterDetails.confirmBooking.redemptionGuaranteeInfo",
defaultMessage:
"When you confirm the booking the room will be guaranteed for late arrival. If you fail to arrive without cancelling in advance or if you cancel after 18:00 local time, you will be charged for one reward night.",
})}

View File

@@ -58,6 +58,7 @@ export default function MemberPriceModal() {
<MagicWandIcon width="265px" />
<Title as="h3" level="h1" textTransform="regular">
{intl.formatMessage({
id: "enterDetails.memberPriceModal.title",
defaultMessage: "Member room price activated",
})}
</Title>
@@ -66,6 +67,7 @@ export default function MemberPriceModal() {
<span className={styles.newPrice}>
<Body>
{intl.formatMessage({
id: "enterDetails.memberPriceModal.newPriceLabel",
defaultMessage: "The new price is",
})}
</Body>
@@ -81,6 +83,7 @@ export default function MemberPriceModal() {
</div>
<Button intent="primary" theme="base" onClick={() => setIsOpen(false)}>
{intl.formatMessage({
id: "enterDetails.memberPriceModal.okButtonLabel",
defaultMessage: "OK",
})}
</Button>

View File

@@ -44,12 +44,14 @@ export default function JoinScandicFriendsCard({
<span>
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.title",
defaultMessage: "Get the member room price",
})}: `}
</span>
<span className={styles.price}>
{intl.formatMessage(
{
id: "enterDetails.joinScandicFriendsCard.priceForRoom",
defaultMessage: "{amount} for room {roomNr}",
},
{
@@ -73,6 +75,7 @@ export default function JoinScandicFriendsCard({
<Typography variant="Body/Paragraph/mdRegular">
<div>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.joinBeforeCheckinCheckboxLabel",
defaultMessage: "Join Scandic Friends before check-in",
})}
</div>
@@ -83,6 +86,7 @@ export default function JoinScandicFriendsCard({
<Footnote color="uiTextPlaceholder">
{intl.formatMessage(
{
id: "enterDetails.joinScandicFriendsCard.terms",
defaultMessage:
"By joining you accept the <termsAndConditionsLink>Terms and Conditions</termsAndConditionsLink>. The Scandic Friends Membership is valid until further notice, but can at any time be terminated by contacting Scandic Customer Service.",
},

View File

@@ -49,6 +49,7 @@ export function PartnerSASJoinScandicFriendsCard({
<h2 className={styles.priceContainer}>
<span>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.title",
defaultMessage: "Get the member room price",
})}
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
@@ -57,6 +58,7 @@ export function PartnerSASJoinScandicFriendsCard({
<span className={styles.price}>
{intl.formatMessage(
{
id: "enterDetails.joinScandicFriendsCard.priceForRoom",
defaultMessage: "{amount} for room {roomNr}",
},
{
@@ -77,6 +79,7 @@ export function PartnerSASJoinScandicFriendsCard({
<Typography variant="Body/Paragraph/mdRegular">
<div>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.joinBeforeCheckinCheckboxLabel",
defaultMessage: "Join Scandic Friends before check-in",
})}
</div>
@@ -88,6 +91,7 @@ export function PartnerSASJoinScandicFriendsCard({
registerOptions={{ onBlur: updateDetailsStore }}
disabled={Boolean(joinValue)}
label={intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.membershipIdLabel",
defaultMessage: "Already a member? Membership ID",
})}
/>
@@ -97,6 +101,7 @@ export function PartnerSASJoinScandicFriendsCard({
<Footnote color="uiTextPlaceholder">
{intl.formatMessage(
{
id: "enterDetails.joinScandicFriendsCard.terms",
defaultMessage:
"By joining you accept the <termsAndConditionsLink>Terms and Conditions</termsAndConditionsLink>. The Scandic Friends Membership is valid until further notice, but can at any time be terminated by contacting Scandic Customer Service.",
},

View File

@@ -184,11 +184,13 @@ export default function Details() {
className={styles.fullWidth}
>
{intl.formatMessage({
id: "enterDetails.roomInfo.title",
defaultMessage: "Guest information",
})}
</Footnote>
<BookingFlowInput
label={intl.formatMessage({
id: "common.firstName",
defaultMessage: "First name",
})}
maxLength={30}
@@ -201,6 +203,7 @@ export default function Details() {
/>
<BookingFlowInput
label={intl.formatMessage({
id: "common.lastName",
defaultMessage: "Last name",
})}
maxLength={30}
@@ -220,6 +223,7 @@ export default function Details() {
errors.countryCode?.message
)}
label={intl.formatMessage({
id: "common.country",
defaultMessage: "Country",
})}
lang={lang}
@@ -229,6 +233,7 @@ export default function Details() {
<BookingFlowInput
className={styles.fullWidth}
label={intl.formatMessage({
id: "common.emailAddress",
defaultMessage: "Email address",
})}
name="email"
@@ -236,6 +241,7 @@ export default function Details() {
/>
<Phone
countryLabel={intl.formatMessage({
id: "common.countryCode",
defaultMessage: "Country code",
})}
countriesWithTranslatedName={getFormattedCountryList(intl)}
@@ -247,6 +253,7 @@ export default function Details() {
)}
className={styles.fullWidth}
label={intl.formatMessage({
id: "common.phoneNumber",
defaultMessage: "Phone number",
})}
name="phoneNumber"
@@ -256,6 +263,7 @@ export default function Details() {
<BookingFlowInput
className={styles.fullWidth}
label={intl.formatMessage({
id: "common.membershipId",
defaultMessage: "Membership ID",
})}
name="membershipNo"

View File

@@ -45,6 +45,7 @@ export function JoinScandicFriendsCard({ name = "join" }: Props) {
<span>
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.title",
defaultMessage: "Get the member room price",
})}: `}
</span>
@@ -65,6 +66,7 @@ export function JoinScandicFriendsCard({ name = "join" }: Props) {
<Typography variant="Body/Paragraph/mdRegular">
<div>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.joinCheckboxLabel",
defaultMessage: "Join Scandic Friends now",
})}
</div>
@@ -83,6 +85,7 @@ export function JoinScandicFriendsCard({ name = "join" }: Props) {
redirectTo={loginPathname}
>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.loginButtonText",
defaultMessage: "Log in",
})}
</LoginButton>
@@ -92,6 +95,7 @@ export function JoinScandicFriendsCard({ name = "join" }: Props) {
<Footnote color="uiTextPlaceholder">
{intl.formatMessage(
{
id: "enterDetails.joinScandicFriendsCard.terms",
defaultMessage:
"By joining you accept the <termsAndConditionsLink>Terms and Conditions</termsAndConditionsLink>. The Scandic Friends Membership is valid until further notice, but can at any time be terminated by contacting Scandic Customer Service.",
},

View File

@@ -55,6 +55,7 @@ export function PartnerSASJoinScandicFriendsCard({
<h2 className={styles.priceContainer}>
<span>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.title",
defaultMessage: "Get the member room price",
})}
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
@@ -74,6 +75,7 @@ export function PartnerSASJoinScandicFriendsCard({
<Typography variant="Body/Paragraph/mdRegular">
<div>
{intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.joinCheckboxLabel",
defaultMessage: "Join Scandic Friends now",
})}
</div>
@@ -85,6 +87,7 @@ export function PartnerSASJoinScandicFriendsCard({
registerOptions={{ onBlur: updateDetailsStore }}
disabled={Boolean(joinValue)}
label={intl.formatMessage({
id: "enterDetails.joinScandicFriendsCard.membershipIdLabel",
defaultMessage: "Already a member? Membership ID",
})}
/>
@@ -94,6 +97,7 @@ export function PartnerSASJoinScandicFriendsCard({
<Footnote color="uiTextPlaceholder">
{intl.formatMessage(
{
id: "enterDetails.joinScandicFriendsCard.terms",
defaultMessage:
"By joining you accept the <termsAndConditionsLink>Terms and Conditions</termsAndConditionsLink>. The Scandic Friends Membership is valid until further notice, but can at any time be terminated by contacting Scandic Customer Service.",
},

View File

@@ -22,6 +22,7 @@ export function MembershipNumberInput({
label={
label ||
intl.formatMessage({
id: "common.membershipId",
defaultMessage: "Membership ID",
})
}

View File

@@ -48,6 +48,7 @@ export default function Signup({
<BookingFlowInput
name="zipCode"
label={intl.formatMessage({
id: "common.zipCode",
defaultMessage: "Zip code",
})}
registerOptions={{ required: true, ...registerOptions }}
@@ -57,6 +58,7 @@ export default function Signup({
<Caption type="bold">
<span className={styles.required}>
{intl.formatMessage({
id: "common.birthDate",
defaultMessage: "Birth date",
})}
</span>
@@ -64,9 +66,18 @@ export default function Signup({
</header>
<DateSelect
labels={{
day: intl.formatMessage({ defaultMessage: "Day" }),
month: intl.formatMessage({ defaultMessage: "Month" }),
year: intl.formatMessage({ defaultMessage: "Year" }),
day: intl.formatMessage({
id: "common.day",
defaultMessage: "Day",
}),
month: intl.formatMessage({
id: "common.month",
defaultMessage: "Month",
}),
year: intl.formatMessage({
id: "common.year",
defaultMessage: "Year",
}),
errorMessage: getErrorMessage(
intl,
config.variant,

View File

@@ -170,12 +170,14 @@ export default function Details({ user }: DetailsProps) {
className={styles.fullWidth}
>
{intl.formatMessage({
id: "enterDetails.roomInfo.title",
defaultMessage: "Guest information",
})}
</Footnote>
<BookingFlowInput
autoComplete="given-name"
label={intl.formatMessage({
id: "common.firstName",
defaultMessage: "First name",
})}
maxLength={30}
@@ -186,6 +188,7 @@ export default function Details({ user }: DetailsProps) {
<BookingFlowInput
autoComplete="family-name"
label={intl.formatMessage({
id: "common.lastName",
defaultMessage: "Last name",
})}
maxLength={30}
@@ -196,6 +199,7 @@ export default function Details({ user }: DetailsProps) {
<CountrySelect
className={styles.fullWidth}
label={intl.formatMessage({
id: "common.country",
defaultMessage: "Country",
})}
lang={lang}
@@ -213,6 +217,7 @@ export default function Details({ user }: DetailsProps) {
autoComplete="email"
className={styles.fullWidth}
label={intl.formatMessage({
id: "common.emailAddress",
defaultMessage: "Email address",
})}
name="email"
@@ -222,6 +227,7 @@ export default function Details({ user }: DetailsProps) {
<Phone
className={styles.fullWidth}
countryLabel={intl.formatMessage({
id: "common.countryCode",
defaultMessage: "Country code",
})}
countriesWithTranslatedName={getFormattedCountryList(intl)}
@@ -232,6 +238,7 @@ export default function Details({ user }: DetailsProps) {
formState.errors.phoneNumber?.message
)}
label={intl.formatMessage({
id: "common.phoneNumber",
defaultMessage: "Phone number",
})}
name="phoneNumber"

View File

@@ -19,6 +19,7 @@ export function SpecialRequests({
<Typography variant="Title/Overline/sm">
<p className={styles.heading}>
{intl.formatMessage({
id: "enterDetails.specialRequests.heading",
defaultMessage: "Special requests (optional)",
})}
</p>
@@ -64,6 +65,7 @@ export function SpecialRequests({
/> */}
<TextArea
label={intl.formatMessage({
id: "enterDetails.specialRequests.commentLabel",
defaultMessage:
"Is there anything else you would like us to know before your arrival?",
})}

View File

@@ -63,6 +63,7 @@ export default function HotelHeader({
restaurants={restaurants}
additionalHotelData={additionalData}
triggerLabel={intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
})}
buttonVariant={"secondary"}

View File

@@ -47,16 +47,19 @@ function useBookingErrorAlert() {
switch (errorCode) {
case BookingErrorCodeEnum.TransactionCancelled:
return intl.formatMessage({
id: "enterDetails.bookingAlert.transactionCancelled",
defaultMessage: "You have now cancelled your payment.",
})
case BookingErrorCodeEnum.AvailabilityError:
case BookingErrorCodeEnum.NoAvailabilityForRateAndRoomType:
return intl.formatMessage({
id: "error.availabilityErrorMessage",
defaultMessage:
"Unfortunately, one of the rooms you selected is sold out. Please choose another room to proceed.",
})
default:
return intl.formatMessage({
id: "enterDetails.bookingAlert.genericError",
defaultMessage:
"We had an issue processing your booking. Please try again. No charges have been made.",
})
@@ -151,6 +154,7 @@ export default function BookingAlert({ isVisible = false }: BookingAlertProps) {
isAvailabilityError
? {
title: intl.formatMessage({
id: "enterDetails.bookingAlert.changeRoomLink",
defaultMessage: "Change room",
}),
url: selectRateReturnUrl,

View File

@@ -13,6 +13,7 @@ export default function GuaranteeDetails() {
<Caption color="burgundy" type="bold" asChild>
<summary className={styles.summary}>
{intl.formatMessage({
id: "common.howItWorks",
defaultMessage: "How it works",
})}
<MaterialIcon
@@ -25,12 +26,14 @@ export default function GuaranteeDetails() {
<section className={styles.content}>
<Body>
{intl.formatMessage({
id: "enterDetails.payment.guaranteeInfoDescription",
defaultMessage:
"When guaranteeing your booking, we will hold the booking until 07:00 until the day after check-in. This will provide you as a guest with added flexibility for check-in times.",
})}
</Body>
<Body>
{intl.formatMessage({
id: "enterDetails.payment.guaranteeInfoWhatToDo",
defaultMessage: "What you have to do to guarantee booking:",
})}
</Body>
@@ -38,6 +41,7 @@ export default function GuaranteeDetails() {
<Body asChild>
<li>
{intl.formatMessage({
id: "enterDetails.payment.guaranteeInfoCompleteBooking",
defaultMessage: "Complete the booking",
})}
</li>
@@ -45,6 +49,7 @@ export default function GuaranteeDetails() {
<Body asChild>
<li>
{intl.formatMessage({
id: "enterDetails.payment.guaranteeInfoProvideCard",
defaultMessage: "Provide a payment card in the next step",
})}
</li>
@@ -52,6 +57,7 @@ export default function GuaranteeDetails() {
</ol>
<Body>
{intl.formatMessage({
id: "enterDetails.payment.guaranteeInfoMandatoryNote",
defaultMessage:
"Please note that this is mandatory, and that your card will only be charged in the event of a no-show.",
})}

View File

@@ -35,9 +35,11 @@ export default function MixedRatePaymentBreakdown({
}: MixedRatePaymentBreakdownProps) {
const intl = useIntl()
const payNowTitle = intl.formatMessage({
id: "booking.payNow",
defaultMessage: "Pay now",
})
const payAtCheckInTitle = intl.formatMessage({
id: "enterDetails.payment.payAtCheckInOption",
defaultMessage: "Pay at check-in",
})
@@ -125,6 +127,7 @@ function PaymentCard({
{"/ "}
{intl.formatMessage(
{
id: "booking.roomIndex",
defaultMessage: "Room {roomIndex}",
},
{

View File

@@ -22,12 +22,14 @@ export default function TimeoutSpinner() {
<LoadingSpinner />
<Subtitle className={styles.heading}>
{intl.formatMessage({
id: "enterDetails.payment.loadingTitle",
defaultMessage: "Taking longer than usual",
})}
</Subtitle>
<Body textAlign="center" className={styles.messageContainer}>
{intl.formatMessage(
{
id: "enterDetails.payment.loadingMessage",
defaultMessage:
"We are still confirming your booking. This is usually a matter of minutes and we do apologise for the wait. Please check your inbox for a booking confirmation email and if you still haven't received it by end of day, please contact our <link>customer support</link>.",
},

View File

@@ -525,8 +525,12 @@ export default function PaymentClient({
]
)
const finalStep = intl.formatMessage({ defaultMessage: "Final step" })
const finalStep = intl.formatMessage({
id: "enterDetails.payment.onlyFlexRatesTitle",
defaultMessage: "Final step",
})
const selectPayment = intl.formatMessage({
id: "enterDetails.payment.title",
defaultMessage: "Select payment method",
})
@@ -558,6 +562,7 @@ export default function PaymentClient({
<section className={styles.section}>
<Body>
{intl.formatMessage({
id: "enterDetails.payment.guaranteeInfo",
defaultMessage:
"To secure your reservation, we kindly ask you to provide your payment card details. Rest assured, no charges will be made at this time.",
})}
@@ -569,6 +574,7 @@ export default function PaymentClient({
{hasMixedRates ? (
<Body>
{intl.formatMessage({
id: "enterDetails.payment.mixedRatesInfo",
defaultMessage:
"As your booking includes rooms with different terms, we will be charging part of the booking now and the remainder will be collected by the reception at check-in.",
})}
@@ -582,6 +588,7 @@ export default function PaymentClient({
>
<Label className="sr-only">
{intl.formatMessage({
id: "enterDetails.payment.paymentMethods",
defaultMessage: "Payment methods",
})}
</Label>
@@ -591,6 +598,7 @@ export default function PaymentClient({
<Typography variant="Title/Overline/sm">
<span>
{intl.formatMessage({
id: "payment.mySavedCards",
defaultMessage: "My saved cards",
})}
</span>
@@ -612,6 +620,7 @@ export default function PaymentClient({
<Typography variant="Title/Overline/sm">
<span>
{intl.formatMessage({
id: "enterDetails.payment.otherPaymentMethods",
defaultMessage: "Other payment methods",
})}
</span>
@@ -621,6 +630,7 @@ export default function PaymentClient({
<PaymentOption
value={PaymentMethodEnum.card}
label={intl.formatMessage({
id: "common.creditCard",
defaultMessage: "Credit card",
})}
/>
@@ -650,6 +660,7 @@ export default function PaymentClient({
<Typography variant="Body/Supporting text (caption)/smRegular">
<span>
{intl.formatMessage({
id: "booking.smsConfirmationLabel",
defaultMessage:
"I would like to get my booking confirmation via sms",
})}
@@ -671,6 +682,7 @@ export default function PaymentClient({
typography="Body/Supporting text (caption)/smBold"
>
{intl.formatMessage({
id: "enterDetails.completeBooking",
defaultMessage: "Complete booking",
})}
</Button>

View File

@@ -27,6 +27,7 @@ export default function TermsAndConditions({
{isFlexBookingTerms
? intl.formatMessage(
{
id: "enterDetails.payment.flexBookingTermsAndConditions",
defaultMessage:
"I accept the terms for this booking and the general <termsAndConditionsLink>Booking & Cancellation Terms</termsAndConditionsLink>, and understand that Scandic will process my personal data for this booking in accordance with <privacyPolicyLink>Scandic's Privacy policy</privacyPolicyLink>.",
},
@@ -59,6 +60,7 @@ export default function TermsAndConditions({
)
: intl.formatMessage(
{
id: "enterDetails.payment.termsAndConditions",
defaultMessage:
"By paying with any of the payment methods available, I accept the terms for this booking and the general <termsAndConditionsLink>Booking & Cancellation Terms</termsAndConditionsLink>, and understand that Scandic will process my personal data for this booking in accordance with <privacyPolicyLink>Scandic's Privacy policy</privacyPolicyLink>. I also accept that Scandic requires a valid payment card during my visit in case anything is left unpaid.",
},
@@ -97,6 +99,7 @@ export default function TermsAndConditions({
}}
errorCodeMessages={{
[paymentError.TERMS_REQUIRED]: intl.formatMessage({
id: "common.mustAcceptTermsError",
defaultMessage: "You must accept the terms and conditions",
}),
}}
@@ -104,6 +107,7 @@ export default function TermsAndConditions({
<Typography variant="Body/Paragraph/mdBold">
<span>
{intl.formatMessage({
id: "booking.acceptBookingTerms",
defaultMessage: "I accept the booking and cancellation terms",
})}
</span>

View File

@@ -52,6 +52,7 @@ export default function PriceChangeSummary({
onClick={() => toggleOpen((isOpen) => !isOpen)}
>
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.seePriceDetailsButton",
defaultMessage: "See price details",
})}
<MaterialIcon icon="chevron_right" size={20} color="CurrentColor" />
@@ -64,6 +65,7 @@ export default function PriceChangeSummary({
<header className={styles.header}>
<Subtitle>
{intl.formatMessage({
id: "common.priceDetails",
defaultMessage: "Price details",
})}
</Subtitle>
@@ -88,11 +90,13 @@ export default function PriceChangeSummary({
{rooms.length > 1
? intl.formatMessage(
{
id: "booking.roomIndex",
defaultMessage: "Room {roomIndex}",
},
{ roomIndex: roomNumber }
)
: intl.formatMessage({
id: "common.room",
defaultMessage: "Room",
})}
</Body>
@@ -100,6 +104,7 @@ export default function PriceChangeSummary({
<div className={styles.priceRow}>
<Caption color="uiTextMediumContrast">
{intl.formatMessage({
id: "priceDetails.roomCharge",
defaultMessage: "Room charge",
})}
</Caption>
@@ -137,6 +142,7 @@ export default function PriceChangeSummary({
<div className={styles.priceRow}>
<Caption color="uiTextMediumContrast">
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.breakfastCharge",
defaultMessage: "Breakfast charge",
})}
</Caption>
@@ -181,12 +187,14 @@ export default function PriceChangeSummary({
<div className={styles.rowContainer}>
<Body>
{intl.formatMessage({
id: "common.total",
defaultMessage: "Total",
})}
</Body>
<div className={styles.priceRow}>
<Body textTransform="bold">
{intl.formatMessage({
id: "booking.priceIncludingVat",
defaultMessage: "Price including VAT",
})}
</Body>
@@ -203,11 +211,13 @@ export default function PriceChangeSummary({
<footer className={styles.footer}>
<Button intent="secondary" onClick={onCancel}>
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.cancelButton",
defaultMessage: "Back to room selection",
})}
</Button>
<Button onClick={onAccept}>
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.acceptButton",
defaultMessage: "Continue with new price",
})}
</Button>

View File

@@ -41,6 +41,7 @@ export default function PriceChangeDialog({
}: PriceChangeDialogProps) {
const intl = useIntl()
const title = intl.formatMessage({
id: "enterDetails.priceChangeDialog.title",
defaultMessage: "Price change",
})
const rooms = useEnterDetailsStore((state) => state.rooms)
@@ -68,6 +69,7 @@ export default function PriceChangeDialog({
const roomSelectionMsg = intl.formatMessage(
{
id: "enterDetails.priceChangeDialog.descriptionPreviousRooms",
defaultMessage: "{totalRooms, plural, one {room} other {rooms}}",
},
{
@@ -77,6 +79,7 @@ export default function PriceChangeDialog({
const newRoomSelectionMsg = intl.formatMessage(
{
id: "enterDetails.priceChangeDialog.descriptionNewRooms",
defaultMessage:
"{totalRooms, plural, one {a new room} other {new rooms}}",
},
@@ -112,6 +115,7 @@ export default function PriceChangeDialog({
<Body textAlign="center">
{intl.formatMessage(
{
id: "enterDetails.priceChangeDialog.description",
defaultMessage:
"Prices have increased since you selected your {roomSelection}.{linebreak} To continue your booking, accept the updated price,{linebreak} or go back to select {newRoomSelection}.",
},
@@ -125,6 +129,7 @@ export default function PriceChangeDialog({
<div>
<Subtitle textAlign="center" color="burgundy">
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.newTotalLabel",
defaultMessage: "New total",
})}
</Subtitle>
@@ -148,11 +153,13 @@ export default function PriceChangeDialog({
<footer className={styles.footer}>
<Button intent="secondary" onClick={onCancel}>
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.cancelButton",
defaultMessage: "Back to room selection",
})}
</Button>
<Button onClick={onAccept}>
{intl.formatMessage({
id: "enterDetails.priceChangeDialog.acceptButton",
defaultMessage: "Continue with new price",
})}
</Button>

View File

@@ -41,6 +41,7 @@ export default function Multiroom() {
<Title level="h2" as="h4">
{intl.formatMessage(
{
id: "booking.roomIndex",
defaultMessage: "Room {roomIndex}",
},
{
@@ -54,8 +55,14 @@ export default function Multiroom() {
{room.bedTypes.length ? (
<Section
header={intl.formatMessage({ defaultMessage: "Bed preference" })}
label={intl.formatMessage({ defaultMessage: "Preferred bed type" })}
header={intl.formatMessage({
id: "booking.bedPreference",
defaultMessage: "Bed preference",
})}
label={intl.formatMessage({
id: "enterDetails.bedPreference.description",
defaultMessage: "Preferred bed type",
})}
additionalInfo={bedTypeInfoText}
step={EnterDetailsStepEnum.selectBed}
>
@@ -66,9 +73,11 @@ export default function Multiroom() {
{showBreakfastStep ? (
<Section
header={intl.formatMessage({
id: "common.breakfast",
defaultMessage: "Breakfast",
})}
label={intl.formatMessage({
id: "enterDetails.breakfast.description",
defaultMessage: "Select breakfast options",
})}
step={EnterDetailsStepEnum.breakfast}
@@ -79,10 +88,12 @@ export default function Multiroom() {
<Section
header={intl.formatMessage({
id: "enterDetails.details.title",
defaultMessage: "Details",
})}
step={EnterDetailsStepEnum.details}
label={intl.formatMessage({
id: "enterDetails.details.description",
defaultMessage: "Contact details",
})}
>

View File

@@ -45,6 +45,7 @@ export default function RoomOne({ user }: { user: User | null }) {
<Title level="h2" as="h4">
{intl.formatMessage(
{
id: "booking.roomIndex",
defaultMessage: "Room {roomIndex}",
},
{
@@ -59,8 +60,14 @@ export default function RoomOne({ user }: { user: User | null }) {
{room.bedTypes ? (
<Section
header={intl.formatMessage({ defaultMessage: "Bed preference" })}
label={intl.formatMessage({ defaultMessage: "Preferred bed type" })}
header={intl.formatMessage({
id: "booking.bedPreference",
defaultMessage: "Bed preference",
})}
label={intl.formatMessage({
id: "enterDetails.bedPreference.description",
defaultMessage: "Preferred bed type",
})}
additionalInfo={bedTypeInfoText}
step={EnterDetailsStepEnum.selectBed}
>
@@ -71,9 +78,11 @@ export default function RoomOne({ user }: { user: User | null }) {
{showBreakfastStep ? (
<Section
header={intl.formatMessage({
id: "common.breakfast",
defaultMessage: "Breakfast",
})}
label={intl.formatMessage({
id: "enterDetails.breakfast.description",
defaultMessage: "Select breakfast options",
})}
step={EnterDetailsStepEnum.breakfast}
@@ -84,10 +93,12 @@ export default function RoomOne({ user }: { user: User | null }) {
<Section
header={intl.formatMessage({
id: "enterDetails.details.title",
defaultMessage: "Details",
})}
step={EnterDetailsStepEnum.details}
label={intl.formatMessage({
id: "enterDetails.details.description",
defaultMessage: "Contact details",
})}
>

View File

@@ -6,10 +6,12 @@ export function getBedTypeInfoText(
hasMultipleBedTypes: boolean
) {
const availabilityText = intl.formatMessage({
id: "booking.subjectToAvailability",
defaultMessage: "Subject to availability",
})
const extraBedText = intl.formatMessage({
id: "enterDetails.room.extraBedText",
defaultMessage: "Extra bed will be provided additionally",
})

View File

@@ -34,9 +34,11 @@ export default function Section({
const [title, setTitle] = useState(label)
const noBreakfastTitle = intl.formatMessage({
id: "common.noBreakfast",
defaultMessage: "No breakfast",
})
const breakfastTitle = intl.formatMessage({
id: "common.breakfastBuffet",
defaultMessage: "Breakfast buffet",
})

View File

@@ -56,6 +56,7 @@ export default function SelectedRoom() {
>
<h2>
{intl.formatMessage({
id: "common.room",
defaultMessage: "Room",
})}
</h2>
@@ -67,6 +68,7 @@ export default function SelectedRoom() {
>
{intl.formatMessage(
{
id: "enterDetails.selectedRoom.roomType.description",
defaultMessage: "{roomType} <rate>{rateDescription}</rate>",
},
{
@@ -88,6 +90,7 @@ export default function SelectedRoom() {
>
<MaterialIcon icon="edit_square" size={20} color="CurrentColor" />
{intl.formatMessage({
id: "common.change",
defaultMessage: "Change",
})}
</Button>
@@ -100,6 +103,7 @@ export default function SelectedRoom() {
room={selectedRoom}
buttonVariant="primary"
triggerLabel={intl.formatMessage({
id: "hotel.seeRoomDetails",
defaultMessage: "See room details",
})}
wrapping={false}

View File

@@ -80,6 +80,7 @@ export default function SummaryBottomSheet({
<Typography variant="Body/Supporting text (caption)/smRegular">
<span className={styles.priceLabel}>
{intl.formatMessage({
id: "common.totalPrice",
defaultMessage: "Total price",
})}
</span>
@@ -117,6 +118,7 @@ export default function SummaryBottomSheet({
<span className={styles.seeDetails}>
<span>
{intl.formatMessage({
id: "booking.seeDetails",
defaultMessage: "See details",
})}
</span>
@@ -139,6 +141,7 @@ export default function SummaryBottomSheet({
form={formId}
>
{intl.formatMessage({
id: "enterDetails.completeBooking",
defaultMessage: "Complete booking",
})}
</Button>

View File

@@ -26,6 +26,7 @@ export default function Breakfast({
const intl = useIntl()
const breakfastBuffet = intl.formatMessage({
id: "common.breakfastBuffet",
defaultMessage: "Breakfast buffet",
})
@@ -36,7 +37,10 @@ export default function Breakfast({
breakfast.localPrice.price * adults * nights,
breakfast.localPrice.currency
)
: intl.formatMessage({ defaultMessage: "Included" })
: intl.formatMessage({
id: "common.included",
defaultMessage: "Included",
})
return (
<div className={styles.entry}>
<div>
@@ -55,7 +59,10 @@ export default function Breakfast({
}
if (breakfast === false) {
const noBreakfast = intl.formatMessage({ defaultMessage: "No breakfast" })
const noBreakfast = intl.formatMessage({
id: "common.noBreakfast",
defaultMessage: "No breakfast",
})
return (
<div className={styles.entry}>
<Typography variant="Body/Paragraph/mdRegular">

View File

@@ -78,6 +78,7 @@ export default function Room({
const adultsMsg = intl.formatMessage(
{
id: "common.numberOfAdults",
defaultMessage: "{totalAdults, plural, one {# adult} other {# adults}}",
},
{ totalAdults: adults }
@@ -87,6 +88,7 @@ export default function Room({
if (childrenInRoom?.length) {
const childrenMsg = intl.formatMessage(
{
id: "common.numberOfChildren",
defaultMessage:
"{totalChildren, plural, one {# child} other {# children}}",
},
@@ -135,6 +137,7 @@ export default function Room({
<p className={styles.roomTitle}>
{intl.formatMessage(
{
id: "booking.roomIndex",
defaultMessage: "Room {roomIndex}",
},
{
@@ -189,6 +192,7 @@ export default function Room({
wrapping={false}
>
{intl.formatMessage({
id: "booking.rateDetails",
defaultMessage: "Rate details",
})}
<MaterialIcon
@@ -254,6 +258,7 @@ export default function Room({
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "booking.subjectToAvailability",
defaultMessage: "Subject to availability",
})}
</p>
@@ -274,6 +279,7 @@ export default function Room({
<p>
{intl.formatMessage(
{
id: "booking.numberOfCribs",
defaultMessage: "Crib (child) × {count}",
},
{ count: childBedCrib }
@@ -282,6 +288,7 @@ export default function Room({
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "booking.subjectToAvailability",
defaultMessage: "Subject to availability",
})}
</p>
@@ -303,6 +310,7 @@ export default function Room({
<p>
{intl.formatMessage(
{
id: "booking.extraBedsCount",
defaultMessage: "Extra bed (child) × {count}",
},
{
@@ -313,6 +321,7 @@ export default function Room({
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "booking.subjectToAvailability",
defaultMessage: "Subject to availability",
})}
</p>

View File

@@ -56,6 +56,7 @@ export default function SummaryUI({
const nightsMsg = intl.formatMessage(
{
id: "booking.numberOfNights",
defaultMessage: "{totalNights, plural, one {# night} other {# nights}}",
},
{ totalNights: nights }
@@ -102,6 +103,7 @@ export default function SummaryUI({
>
<Subtitle className={styles.title} type="two">
{intl.formatMessage({
id: "booking.bookingSummary",
defaultMessage: "Booking summary",
})}
</Subtitle>
@@ -144,6 +146,7 @@ export default function SummaryUI({
<p>
{intl.formatMessage(
{
id: "booking.totalPriceInclVat",
defaultMessage: "<b>Total price</b> (incl VAT)",
},
{
@@ -161,6 +164,7 @@ export default function SummaryUI({
<p className={styles.approxPrice}>
{intl.formatMessage(
{
id: "booking.approxValue",
defaultMessage: "Approx. {value}",
},
{