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

@@ -50,9 +50,11 @@ export default function ActionButtons({
const intl = useIntl()
const isConfirmStep = currentStep === AncillaryStepEnum.confirmation
const confirmLabel = intl.formatMessage({
id: "common.confirm",
defaultMessage: "Confirm",
})
const continueLabel = intl.formatMessage({
id: "common.continue",
defaultMessage: "Continue",
})
const quantityWithCard = useWatch<AncillaryQuantityFormData>({
@@ -99,6 +101,7 @@ export default function ActionButtons({
className={styles.priceButton}
>
{intl.formatMessage({
id: "common.priceDetails",
defaultMessage: "Price details",
})}
<MaterialIcon
@@ -120,6 +123,7 @@ export default function ActionButtons({
onPress={isMobile ? prevStepMobile : prevStep}
>
{intl.formatMessage({
id: "common.back",
defaultMessage: "Back",
})}
</Button>

View File

@@ -37,6 +37,7 @@ export default function PriceSummary({
<Typography variant="Body/Paragraph/mdBold">
<h2>
{intl.formatMessage({
id: "common.summary",
defaultMessage: "Summary",
})}
</h2>
@@ -50,6 +51,7 @@ export default function PriceSummary({
title={item.title}
quantity={item.quantityWithCard}
label={intl.formatMessage({
id: "booking.priceIncludingVat",
defaultMessage: "Price including VAT",
})}
value={formatPrice(intl, item.totalPrice, item.currency)}
@@ -60,11 +62,17 @@ export default function PriceSummary({
title={item.title}
quantity={item.quantityWithPoints}
label={intl.formatMessage({
id: "common.points",
defaultMessage: "Points",
})}
value={`${item.points} ${intl.formatMessage({
defaultMessage: "points",
})}`}
value={intl.formatMessage(
{
id: "common.numberOfPoints",
defaultMessage:
"{points, plural, one {# point} other {# points}}",
},
{ points: item.points }
)}
/>
)}
<Divider />
@@ -76,9 +84,11 @@ export default function PriceSummary({
<p>
{hasTotalPrice
? intl.formatMessage({
id: "priceSummary.totalPriceIncludingVat",
defaultMessage: "Total price including VAT",
})
: intl.formatMessage({
id: "common.totalPoints",
defaultMessage: "Total points",
})}
</p>
@@ -93,10 +103,14 @@ export default function PriceSummary({
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{hasTotalPoints && hasTotalPrice ? " + " : null}
{hasTotalPoints
? // eslint-disable-next-line formatjs/no-literal-string-in-jsx
`${totalPoints} ${intl.formatMessage({
defaultMessage: "points",
})}`
? intl.formatMessage(
{
id: "common.numberOfPoints",
defaultMessage:
"{points, plural, one {# point} other {# points}}",
},
{ points: totalPoints }
)
: null}
</p>
</Typography>

View File

@@ -77,6 +77,7 @@ export default function PriceDetails({
const items = [
{
title: `${selectedAncillary.title} / ${intl.formatMessage({
id: "common.adult",
defaultMessage: "adult",
})}`,
totalPrice: breakfastData.priceAdult,
@@ -88,6 +89,7 @@ export default function PriceDetails({
if (breakfastData.nrOfPayingChildren > 0) {
items.push({
title: `${selectedAncillary.title} / ${intl.formatMessage({
id: "common.children",
defaultMessage: "Children",
})} 4-12`,
totalPrice: breakfastData.priceChild,
@@ -101,6 +103,7 @@ export default function PriceDetails({
items.push({
title: `${selectedAncillary.title} / ${intl.formatMessage(
{
id: "common.childrenUnderAge",
defaultMessage: "Children under {age}",
},
{ age: 4 }
@@ -135,6 +138,7 @@ export default function PriceDetails({
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "common.total",
defaultMessage: "Total",
})}
</p>
@@ -144,6 +148,7 @@ export default function PriceDetails({
<p className={styles.vatText}>
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`(${intl.formatMessage({
id: "common.inclVAT",
defaultMessage: "Incl. VAT",
})})`}
</p>
@@ -154,6 +159,7 @@ export default function PriceDetails({
<p className={styles.hideOnDesktop}>
{intl.formatMessage(
{
id: "booking.numberOfNights",
defaultMessage:
"{totalNights, plural, one {# night} other {# nights}}",
},
@@ -165,6 +171,7 @@ export default function PriceDetails({
" / " +
intl.formatMessage(
{
id: "common.numberOfGuests",
defaultMessage:
"{value, plural, one {# guest} other {# guests}}",
},
@@ -186,6 +193,7 @@ export default function PriceDetails({
<p className={styles.showOnDesktop}>
{intl.formatMessage(
{
id: "booking.numberOfNights",
defaultMessage:
"{totalNights, plural, one {# night} other {# nights}}",
},
@@ -197,6 +205,7 @@ export default function PriceDetails({
" / " +
intl.formatMessage(
{
id: "common.numberOfGuests",
defaultMessage:
"{value, plural, one {# guest} other {# guests}}",
},
@@ -231,14 +240,14 @@ export default function PriceDetails({
</div>
<Typography variant="Body/Paragraph/mdBold">
<p>
{totalPoints}
{
/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */
" "
}
{intl.formatMessage({
defaultMessage: "points",
})}
{intl.formatMessage(
{
id: "common.numberOfPoints",
defaultMessage:
"{points, plural, one {# point} other {# points}}",
},
{ points: totalPoints }
)}
</p>
</Typography>
</div>

View File

@@ -54,6 +54,7 @@ export default function ConfirmationStep({
<p>
{intl.formatMessage(
{
id: "addAncillary.confirmationStep.refundPolicy",
defaultMessage:
"All ancillaries are fully refundable until {date}. Time selection and special requests are also modifiable.",
},
@@ -66,6 +67,7 @@ export default function ConfirmationStep({
<Typography variant="Title/Subtitle/md">
<h2>
{intl.formatMessage({
id: "addAncillary.confirmationStep.pointsToBeDeducted",
defaultMessage: "Points to be deducted now",
})}
</h2>
@@ -77,9 +79,11 @@ export default function ConfirmationStep({
<h2>
{intl.formatMessage(
{
defaultMessage: "{amount} points",
id: "common.numberOfPoints",
defaultMessage:
"{points, plural, one {# point} other {# points}}",
},
{ amount: totalPoints }
{ points: totalPoints }
)}
</h2>
</Typography>
@@ -88,6 +92,7 @@ export default function ConfirmationStep({
<p>
{intl.formatMessage(
{
id: "addAncillary.confirmationStep.pointsAvailable",
defaultMessage: "{amount} points available",
},
{ amount: currentPoints }
@@ -103,6 +108,7 @@ export default function ConfirmationStep({
<Typography variant="Title/Subtitle/md">
<h2>
{intl.formatMessage({
id: "addAncillary.confirmationStep.reserveWithCard",
defaultMessage: "Reserve with Card",
})}
</h2>
@@ -111,6 +117,7 @@ export default function ConfirmationStep({
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "addAncillary.confirmationStep.paymentAtCheckInInfo",
defaultMessage:
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.",
})}
@@ -122,6 +129,7 @@ export default function ConfirmationStep({
value={PaymentMethodEnum.card}
cardNumber={guaranteeInfo.maskedCard.slice(-4)}
label={intl.formatMessage({
id: "common.creditCard",
defaultMessage: "Credit card",
})}
/>
@@ -131,6 +139,7 @@ export default function ConfirmationStep({
<Alert
type={AlertTypeEnum.Info}
text={intl.formatMessage({
id: "addAncillary.confirmationStep.guaranteeAddCard",
defaultMessage:
"By adding a card you also guarantee your room booking for late arrival.",
})}
@@ -151,15 +160,19 @@ export default function ConfirmationStep({
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",
})}
/>
@@ -174,6 +187,7 @@ export default function ConfirmationStep({
<p>
{intl.formatMessage(
{
id: "addAncillary.confirmationStep.termsAndConditionsNotice",
defaultMessage:
"Yes, I accept the general <termsAndConditionsLink>Booking & Cancellation Terms</termsAndConditionsLink>, and understand that Scandic will process my personal data in accordance with <privacyPolicyLink>Scandic's Privacy policy</privacyPolicyLink>. There you can learn more about what data we process, your rights and where to turn if you have questions.",
},
@@ -209,6 +223,7 @@ export default function ConfirmationStep({
<Typography variant="Body/Supporting text (caption)/smRegular">
<span>
{intl.formatMessage({
id: "booking.acceptBookingTerms",
defaultMessage: "I accept the booking and cancellation terms",
})}
</span>

View File

@@ -18,6 +18,7 @@ export default function DeliveryMethodStep() {
<Typography variant="Body/Supporting text (caption)/smBold">
<h3>
{intl.formatMessage({
id: "ancillaries.deliveredAt",
defaultMessage: "Delivered at:",
})}
</h3>
@@ -33,6 +34,7 @@ export default function DeliveryMethodStep() {
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "addAncillary.deliveryDetailsStep.deliveryTimeDescription",
defaultMessage:
"All extras are delivered together. Changes to delivery times will affect previously ordered extras.",
})}
@@ -41,6 +43,7 @@ export default function DeliveryMethodStep() {
<div className={styles.select}>
<Input
label={intl.formatMessage({
id: "addAncillary.deliveryDetailsStep.optionalTextLabel",
defaultMessage: "Other Requests",
})}
name="optionalText"
@@ -48,6 +51,7 @@ export default function DeliveryMethodStep() {
<Typography variant="Body/Supporting text (caption)/smRegular">
<h3>
{intl.formatMessage({
id: "common.optional",
defaultMessage: "Optional",
})}
</h3>

View File

@@ -35,6 +35,7 @@ export default function SelectAncillaryStep() {
{categoryName
? categoryName
: intl.formatMessage({
id: "common.other",
defaultMessage: "Other",
})}
</p>

View File

@@ -58,6 +58,7 @@ export default function SelectQuantityStep({ user }: SelectQuantityStepProps) {
<Typography variant="Title/Subtitle/md">
<h2 className={styles.selectTitle}>
{intl.formatMessage({
id: "addAncillary.selectQuantityStep.payWithPoints",
defaultMessage: "Pay with points",
})}
</h2>
@@ -68,6 +69,7 @@ export default function SelectQuantityStep({ user }: SelectQuantityStepProps) {
<Typography variant="Title/Overline/sm">
<h2>
{intl.formatMessage({
id: "common.totalPoints",
defaultMessage: "Total points",
})}
</h2>
@@ -81,6 +83,7 @@ export default function SelectQuantityStep({ user }: SelectQuantityStepProps) {
<Typography variant="Body/Supporting text (caption)/smRegular">
<h2 className={styles.insufficientPoints}>
{intl.formatMessage({
id: "addAncillary.selectQuantityStep.insufficientPoints",
defaultMessage: "Insufficient points",
})}
</h2>
@@ -89,6 +92,7 @@ export default function SelectQuantityStep({ user }: SelectQuantityStepProps) {
<Select
name="quantityWithPoints"
label={intl.formatMessage({
id: "addAncillary.selectQuantityStep.selectQuantityLabel",
defaultMessage: "Select quantity",
})}
items={pointsQuantityOptions}
@@ -100,11 +104,8 @@ export default function SelectQuantityStep({ user }: SelectQuantityStepProps) {
<div className={styles.select}>
<Typography variant="Title/Subtitle/md">
<h2 className={styles.selectTitle}>
{
/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */
" "
}
{intl.formatMessage({
id: "addAncillary.selectQuantityStep.payWithCard",
defaultMessage: "Pay with card at the hotel",
})}
</h2>
@@ -112,6 +113,7 @@ export default function SelectQuantityStep({ user }: SelectQuantityStepProps) {
<Select
name="quantityWithCard"
label={intl.formatMessage({
id: "addAncillary.selectQuantityStep.selectQuantityLabel",
defaultMessage: "Select quantity",
})}
items={cardQuantityOptions}
@@ -136,6 +138,7 @@ function BreakfastInfo() {
if (!breakfastData) {
return intl.formatMessage({
id: "ancillaries.unableToDisplayBreakfastPrices",
defaultMessage: "Unable to display breakfast prices.",
})
}
@@ -145,6 +148,7 @@ function BreakfastInfo() {
<Alert
type={AlertTypeEnum.Info}
text={intl.formatMessage({
id: "addAncillary.selectQuantityStep.breakfastInfoMessage",
defaultMessage:
"Breakfast can only be added for the entire duration of the stay and for all guests.",
})}
@@ -158,6 +162,7 @@ function BreakfastInfo() {
<dt>
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${breakfastData.nrOfAdults} × ${intl.formatMessage({
id: "common.adults",
defaultMessage: "Adults",
})}`}
</dt>
@@ -177,6 +182,7 @@ function BreakfastInfo() {
<dt>
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${breakfastData.nrOfPayingChildren} × ${intl.formatMessage({
id: "common.ages",
defaultMessage: "ages",
})} 4-12`}
</dt>
@@ -198,12 +204,14 @@ function BreakfastInfo() {
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${breakfastData.nrOfFreeChildren} × ${intl.formatMessage({
defaultMessage: "under",
id: "common.under",
})} 4`}
</dt>
<dd>
<Body>
{intl.formatMessage({
defaultMessage: "Free",
id: "common.free",
})}
</Body>
</dd>

View File

@@ -110,6 +110,7 @@ export default function AddAncillaryFlowModal({
const ancillaryErrorMessage = intl.formatMessage(
{
id: "addAncillaryFlowModal.errorMessage.ancillary",
defaultMessage:
"Something went wrong. {ancillary} could not be added to your booking!",
},
@@ -170,6 +171,7 @@ export default function AddAncillaryFlowModal({
toast.success(
intl.formatMessage(
{
id: "addAncillaryFlowModal.ancillaryAdded",
defaultMessage: "{ancillary} added to your booking!",
},
{ ancillary: selectedAncillary?.title }
@@ -274,6 +276,7 @@ export default function AddAncillaryFlowModal({
if (isBreakfast && !breakfastData) {
toast.error(
intl.formatMessage({
id: "errorMessage.somethingWentWrong",
defaultMessage: "Something went wrong!",
})
)
@@ -352,6 +355,7 @@ export default function AddAncillaryFlowModal({
const modalTitle =
currentStep === AncillaryStepEnum.selectAncillary
? intl.formatMessage({
id: "ancillaries.upgradeYourStay",
defaultMessage: "Upgrade your stay",
})
: selectedAncillary?.title
@@ -392,10 +396,12 @@ export default function AddAncillaryFlowModal({
<p>
{intl.formatMessage(
{
defaultMessage: "{value} points",
id: "common.numberOfPoints",
defaultMessage:
"{points, plural, one {# point} other {# points}}",
},
{
value: selectedAncillary.points,
points: selectedAncillary.points,
}
)}
</p>
@@ -450,6 +456,7 @@ function BreakfastPriceList() {
if (!breakfastData) {
return intl.formatMessage({
id: "ancillaries.unableToDisplayBreakfastPrices",
defaultMessage: "Unable to display breakfast prices.",
})
}
@@ -461,6 +468,7 @@ function BreakfastPriceList() {
<span>
{intl.formatMessage(
{
id: "addAncillaryFlowModal.pricePerNightPerAdult",
defaultMessage: "{price}/night per adult",
},
{
@@ -480,6 +488,7 @@ function BreakfastPriceList() {
<span>
{intl.formatMessage(
{
id: "addAncillaryFlowModal.pricePerNightPerKids",
defaultMessage: "{price}/night for kids (ages 412)",
},
{
@@ -500,6 +509,7 @@ function BreakfastPriceList() {
<Typography variant="Body/Paragraph/mdBold">
<span>
{intl.formatMessage({
id: "addAncillaryFlowModal.freeBreakfastForKids",
defaultMessage: "Free for kids (under 4)",
})}
</span>