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

@@ -83,17 +83,20 @@ export default function CampaignHotelListingClient({
}
let buttonText = intl.formatMessage({
id: "common.showMore",
defaultMessage: "Show more",
})
let iconDirection: MaterialIconProps["icon"] = "keyboard_arrow_down"
if (visibleCount === activeHotels.length) {
buttonText = intl.formatMessage({
id: "common.showLess",
defaultMessage: "Show less",
})
iconDirection = "keyboard_arrow_up"
} else if (canShowAll) {
buttonText = intl.formatMessage({
id: "common.showAll",
defaultMessage: "Show all",
})
}

View File

@@ -40,6 +40,7 @@ export default function HotelListingItem({
sizes="(min-width: 768px) 450px, 100vw"
title={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: hotel.name }
@@ -77,6 +78,7 @@ export default function HotelListingItem({
<span>
{intl.formatMessage(
{
id: "common.kmToCityCenter",
defaultMessage: "{number} km to city center",
},
{
@@ -121,6 +123,7 @@ export default function HotelListingItem({
typography="Body/Supporting text (caption)/smBold"
>
{intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
})}
</ButtonLink>

View File

@@ -46,13 +46,15 @@ export default async function CampaignHotelListing({
const sortItems: HotelSortItem[] = [
{
label: intl.formatMessage({
id: "common.name",
defaultMessage: "Name",
}),
value: HotelSortOption.Name,
},
{
label: intl.formatMessage({
defaultMessage: "Tripadvisor rating",
id: "common.tripAdvisorRating",
defaultMessage: "TripAdvisor rating",
}),
value: HotelSortOption.TripAdvisorRating,
},

View File

@@ -15,6 +15,7 @@ export default async function HowItWorks({ dynamic_content }: HowItWorksProps) {
<section className={styles.container}>
<Title level="h3">
{intl.formatMessage({
id: "common.howItWorks",
defaultMessage: "How it works",
})}
</Title>

View File

@@ -34,9 +34,11 @@ export default function Filter({
items={countryFilters}
defaultSelectedKey={""}
label={intl.formatMessage({
id: "common.country",
defaultMessage: "Country",
})}
aria-label={intl.formatMessage({
id: "common.country",
defaultMessage: "Country",
})}
name="country"
@@ -46,9 +48,11 @@ export default function Filter({
items={cityFilters}
defaultSelectedKey={""}
label={intl.formatMessage({
id: "jobylonFeed.cityFilterLabel",
defaultMessage: "Location (shown in local language)",
})}
aria-label={intl.formatMessage({
id: "jobylonFeed.cityFilterLabel",
defaultMessage: "Location (shown in local language)",
})}
name="city"
@@ -58,9 +62,11 @@ export default function Filter({
items={departmentFilters}
defaultSelectedKey={""}
label={intl.formatMessage({
id: "jobylonFeed.departmentFilterLabel",
defaultMessage: "Hotel or office",
})}
aria-label={intl.formatMessage({
id: "jobylonFeed.departmentFilterLabel",
defaultMessage: "Hotel or office",
})}
name="department"
@@ -70,9 +76,11 @@ export default function Filter({
items={categoryFilters}
defaultSelectedKey={""}
label={intl.formatMessage({
id: "jobylonFeed.categoryFilterLabel",
defaultMessage: "Category",
})}
aria-label={intl.formatMessage({
id: "jobylonFeed.categoryFilterLabel",
defaultMessage: "Category",
})}
name="category"

View File

@@ -33,6 +33,7 @@ export default function JobList({ allJobs }: JobListProps) {
const countryFilters = [
{
label: intl.formatMessage({
id: "jobylonFeed.allCountriesFilter",
defaultMessage: "All countries",
}),
value: "",
@@ -42,6 +43,7 @@ export default function JobList({ allJobs }: JobListProps) {
const cityFilters = [
{
label: intl.formatMessage({
id: "jobylonFeed.allLocationsFilter",
defaultMessage: "All locations",
}),
value: "",
@@ -51,6 +53,7 @@ export default function JobList({ allJobs }: JobListProps) {
const departmentFilters = [
{
label: intl.formatMessage({
id: "jobylonFeed.allDepartmentsFilter",
defaultMessage: "All hotels and offices",
}),
value: "",
@@ -60,6 +63,7 @@ export default function JobList({ allJobs }: JobListProps) {
const categoryFilters = [
{
label: intl.formatMessage({
id: "jobylonFeed.allCategoriesFilter",
defaultMessage: "All categories",
}),
value: "",
@@ -79,6 +83,7 @@ export default function JobList({ allJobs }: JobListProps) {
<Subtitle type="two">
{intl.formatMessage(
{
id: "jobylonFeed.resultCount",
defaultMessage: "{count, plural, one {# Result} other {# Results}}",
},
{ count: state.jobs.length }

View File

@@ -24,11 +24,13 @@ export default function JobylonCard({ job }: JobylonCardProps) {
const deadlineText = job.toDate
? intl.formatMessage(
{
id: "jobylonFeed.card.deadlineText",
defaultMessage: "Deadline: {date}",
},
{ date: dt(job.toDate).locale(lang).format("Do MMMM") }
)
: intl.formatMessage({
id: "jobylonFeed.card.openForApplication",
defaultMessage: "Open for application",
})
@@ -57,6 +59,7 @@ export default function JobylonCard({ job }: JobylonCardProps) {
>
<a href={job.url} target="_blank" rel="noopener noreferrer">
{intl.formatMessage({
id: "jobylonFeed.card.viewAndApplyButton",
defaultMessage: "View & apply",
})}
<MaterialIcon icon="open_in_new" size={20} />

View File

@@ -39,6 +39,7 @@ async function LevelCard({ level }: LevelCardProps) {
let pointsMsg: React.ReactNode = intl.formatMessage(
{
id: "common.pointsAmountPoints",
defaultMessage: "{pointsAmount, number} points",
},
{ pointsAmount: level.required_points }
@@ -47,6 +48,7 @@ async function LevelCard({ level }: LevelCardProps) {
if (level.required_nights) {
pointsMsg = intl.formatMessage(
{
id: "loyaltyLevelsBlock.pointsOrNights",
defaultMessage:
"{pointsAmount, number} points <highlight>or {nightsAmount, number} nights</highlight>",
},
@@ -68,6 +70,7 @@ async function LevelCard({ level }: LevelCardProps) {
>
{intl.formatMessage(
{
id: "common.membershipLevelWithValue",
defaultMessage: "Level {level}",
},
{ level: level.user_facing_tag }

View File

@@ -28,6 +28,7 @@ export function CookieConsentButton() {
className={styles.cookieConsentButton}
>
{intl.formatMessage({
id: "cookieConsent.manageCookiesButton",
defaultMessage: "Manage cookies",
})}
<MaterialIcon icon="chevron_right" size={24} color="CurrentColor" />

View File

@@ -18,27 +18,35 @@ export default async function MyPagesOverviewShortcuts() {
const MyPagesLinkTranslationMap: Record<MyPagesLinkKey, string> = {
overview: intl.formatMessage({
id: "common.overview",
defaultMessage: "Overview",
}),
points: intl.formatMessage({
id: "common.myPoints",
defaultMessage: "My points",
}),
stays: intl.formatMessage({
id: "common.myStays",
defaultMessage: "My stays",
}),
benefits: intl.formatMessage({
id: "common.myBenefits",
defaultMessage: "My benefits",
}),
partnerSas: intl.formatMessage({
id: "partnerSas.sasEuroBonus",
defaultMessage: "SAS EuroBonus",
}),
teamMemberCard: intl.formatMessage({
id: "common.teamMemberCard",
defaultMessage: "Team Member Card",
}),
scandicFriends: intl.formatMessage({
id: "common.aboutScandicFriends",
defaultMessage: "About Scandic Friends",
}),
profile: intl.formatMessage({
id: "common.myProfile",
defaultMessage: "My profile",
}),
}
@@ -82,14 +90,26 @@ export default async function MyPagesOverviewShortcuts() {
})),
{
openInNewTab: false,
text: intl.formatMessage({ defaultMessage: "Partner benefits" }),
title: intl.formatMessage({ defaultMessage: "Partner benefits" }),
text: intl.formatMessage({
id: "myPagesOverviewShortcuts.partnerBenefits",
defaultMessage: "Partner benefits",
}),
title: intl.formatMessage({
id: "myPagesOverviewShortcuts.partnerBenefits",
defaultMessage: "Partner benefits",
}),
url: webHrefs.partners[lang],
},
{
openInNewTab: false,
text: intl.formatMessage({ defaultMessage: "Scandic Friends FAQ" }),
title: intl.formatMessage({ defaultMessage: "Scandic Friends FAQ" }),
text: intl.formatMessage({
id: "common.scandicFriendsFaq",
defaultMessage: "Scandic Friends FAQ",
}),
title: intl.formatMessage({
id: "common.scandicFriendsFaq",
defaultMessage: "Scandic Friends FAQ",
}),
url: webHrefs.faq[lang],
},
]
@@ -103,6 +123,7 @@ export default async function MyPagesOverviewShortcuts() {
<div className={styles.column}>
<SectionHeader
title={intl.formatMessage({
id: "myPagesOverviewShortcuts.yourMembership",
defaultMessage: "Your membership",
})}
headingAs="h4"
@@ -116,6 +137,7 @@ export default async function MyPagesOverviewShortcuts() {
<div className={styles.column}>
<SectionHeader
title={intl.formatMessage({
id: "myPagesOverviewShortcuts.scandicFriendsLinks",
defaultMessage: "Scandic Friends Links",
})}
headingAs="h4"

View File

@@ -18,12 +18,14 @@ export default function CopyButton({ membershipNumber }: CopyButtonProps) {
navigator.clipboard.writeText(membershipNumber)
toast.success(
intl.formatMessage({
id: "myPages.membershipIdCopied",
defaultMessage: "Membership ID copied to clipboard",
})
)
} catch {
toast.error(
intl.formatMessage({
id: "errorMessage.copyFailed",
defaultMessage: "Failed to copy",
})
)

View File

@@ -21,6 +21,7 @@ export default async function MembershipNumber({
<div className={classNames}>
<Caption color="pale">
{intl.formatMessage({
id: "overview.membershipNumber.label",
defaultMessage: "Membership ID:",
})}
</Caption>
@@ -29,6 +30,7 @@ export default async function MembershipNumber({
<code data-hj-suppress>
{membership?.membershipNumber ??
intl.formatMessage({
id: "common.NA",
defaultMessage: "N/A",
})}
</code>

View File

@@ -24,13 +24,12 @@ export default async function Friend({
const isHighestLevel = isHighestMembership(membership.membershipLevel)
const lvlMessageHighest = intl.formatMessage({
id: "overview.friend.highestLevel",
defaultMessage: "Highest level",
})
const lvlMessageLevel = intl.formatMessage(
{
defaultMessage: "Level {level}",
},
{ id: "common.membershipLevelWithValue", defaultMessage: "Level {level}" },
{ level: membershipLevels[membership.membershipLevel] }
)

View File

@@ -28,6 +28,7 @@ export default async function SasBoostStatus({
const sasBoostExpiryText = intl.formatMessage(
{
id: "membershipOverViewCard.sasBoostedUntilDate",
defaultMessage: "Boosted by SAS until {date}",
},
{

View File

@@ -32,7 +32,7 @@ export default async function MembershipOverviewCard({
const pointsToSpendText =
typeof user.membership.currentPoints === "number"
? intl.formatNumber(user.membership.currentPoints)
: intl.formatMessage({ defaultMessage: "N/A" })
: intl.formatMessage({ id: "common.NA", defaultMessage: "N/A" })
const sasMembership = user.loyalty
? getEurobonusMembership(user.loyalty)
@@ -53,6 +53,7 @@ export default async function MembershipOverviewCard({
<h2 className={styles.levelText} id="membership-level">
{intl.formatMessage(
{
id: "common.membershipLevelWithValue",
defaultMessage: "Level {level}",
},
{ level: membershipLevels[user.membership.membershipLevel] }
@@ -79,6 +80,7 @@ export default async function MembershipOverviewCard({
<Typography variant="Title/Overline/sm">
<h3 className={styles.pointsLabel}>
{intl.formatMessage({
id: "common.pointsToSpend",
defaultMessage: "Points to spend",
})}
</h3>

View File

@@ -26,6 +26,7 @@ export default async function ExpiringPoints({ user }: UserProps) {
<Body color="white" textTransform="bold" textAlign="center">
{intl.formatMessage(
{
id: "overview.stats.expiringPoints",
defaultMessage: "{points} spendable points expiring by {date}",
},
{

View File

@@ -28,9 +28,11 @@ export default async function Points({ user }: UserProps) {
<PointsColumn
value={membership?.currentPoints}
title={intl.formatMessage({
id: "stats.points.yourPointsToSpend",
defaultMessage: "Your points to spend",
})}
subtitle={intl.formatMessage({
id: "stats.points.asOfToday",
defaultMessage: "as of today",
})}
/>
@@ -38,10 +40,12 @@ export default async function Points({ user }: UserProps) {
<PointsColumn
value={membership?.pointsRequiredToNextlevel}
title={intl.formatMessage({
id: "stats.points.pointsNeededToLevelUp",
defaultMessage: "Points needed to level up",
})}
subtitle={intl.formatMessage(
{
id: "stats.points.nextLevel",
defaultMessage: "next level: {nextLevel}",
},
{ nextLevel: nextLevel.name }

View File

@@ -34,6 +34,7 @@ export default async function UserBaseInfo({ user }: UserBaseInfoProps) {
<Typography variant="Body/Supporting text (caption)/smBold">
<span>
{intl.formatMessage({
id: "overview.membershipNumber.label",
defaultMessage: "Membership ID:",
})}
</span>
@@ -46,6 +47,7 @@ export default async function UserBaseInfo({ user }: UserBaseInfoProps) {
<Typography variant="Body/Supporting text (caption)/smBold">
<span className={styles.noMembership}>
{intl.formatMessage({
id: "common.NA",
defaultMessage: "N/A",
})}
</span>

View File

@@ -55,6 +55,7 @@ export default async function Overview({
<>
<MaterialIcon icon="id_card" size={24} color="CurrentColor" />
{intl.formatMessage({
id: "dtmc.showTeamMemberCard",
defaultMessage: "Show Team Member Card",
})}
</>

View File

@@ -98,10 +98,12 @@ export default function OverviewTableClient({
/>
<DeprecatedSelect
aria-label={intl.formatMessage({
id: "common.level",
defaultMessage: "Level",
})}
name={`reward` + column}
label={intl.formatMessage({
id: "common.level",
defaultMessage: "Level",
})}
items={levelOptions}
@@ -137,10 +139,12 @@ export default function OverviewTableClient({
return (
<DeprecatedSelect
aria-label={intl.formatMessage({
id: "common.level",
defaultMessage: "Level",
})}
name={`reward` + column}
label={intl.formatMessage({
id: "common.level",
defaultMessage: "Level",
})}
items={levelOptions}

View File

@@ -13,6 +13,7 @@ export default function LevelSummary({
const pointsMsg: React.ReactNode = level.required_nights
? intl.formatMessage(
{
id: "overviewTable.levelSummary.pointsOrNights",
defaultMessage:
"{pointsAmount, number} points or {nightsAmount, number} nights",
},
@@ -23,6 +24,7 @@ export default function LevelSummary({
)
: intl.formatMessage(
{
id: "common.pointsAmountPoints",
defaultMessage: "{pointsAmount, number} points",
},
{ pointsAmount: level.required_points }

View File

@@ -14,6 +14,7 @@ export default function YourLevel() {
textAlign={"center"}
>
{intl.formatMessage({
id: "overviewTable.yourLevel",
defaultMessage: "Your level",
})}
</BiroScript>

View File

@@ -21,6 +21,7 @@ export default function ClaimPoints() {
<Typography variant="Body/Supporting text (caption)/smRegular">
<p>
{intl.formatMessage({
id: "points.claimPoints.missingPreviousStay",
defaultMessage: "Missing a previous stay?",
})}
</p>
@@ -32,7 +33,10 @@ export default function ClaimPoints() {
size="Small"
typography="Body/Supporting text (caption)/smBold"
>
{intl.formatMessage({ defaultMessage: "Claim points" })}
{intl.formatMessage({
id: "points.claimPoints.cta",
defaultMessage: "Claim points",
})}
<MaterialIcon icon="open_in_new" size={20} color="CurrentColor" />
</ButtonLink>
</div>

View File

@@ -36,6 +36,7 @@ export default function AwardPoints({
{isCalculated
? intl.formatNumber(awardPoints)
: intl.formatMessage({
id: "earnAndBurn.awardPoints.pointsBeingCalculated",
defaultMessage: "Points being calculated",
})}
</span>

View File

@@ -25,6 +25,7 @@ export default function Row({ transaction }: RowProps) {
const nightsMsg = intl.formatMessage(
{
id: "booking.numberOfNights",
defaultMessage: "{totalNights, plural, one {# night} other {# nights}}",
},
{
@@ -34,7 +35,10 @@ export default function Row({ transaction }: RowProps) {
let description =
transaction.confirmationNumber === "non-transactional" &&
transaction.nights === 0
? intl.formatMessage({ defaultMessage: "Points activity" })
? intl.formatMessage({
id: "earnAndBurn.journeyTable.pointsActivity",
defaultMessage: "Points activity",
})
: transaction.hotelName && transaction.city
? `${transaction.hotelName}, ${transaction.city} ${nightsMsg}`
: `${nightsMsg}`
@@ -44,37 +48,44 @@ export default function Row({ transaction }: RowProps) {
case Transactions.rewardType.stayAdj:
if (transaction.hotelId === "ORS") {
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.formerScandicHotel",
defaultMessage: "Former Scandic Hotel",
})
}
if (transaction.confirmationNumber === "BALFWD") {
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.pointsEarnedPriorMay2021",
defaultMessage: "Points earned prior to May 1, 2021",
})
}
break
case Transactions.rewardType.ancillary:
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.extrasToBooking",
defaultMessage: "Extras to your booking",
})
break
case Transactions.rewardType.enrollment:
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.signUpBonus",
defaultMessage: "Sign up bonus",
})
break
case Transactions.rewardType.mastercard_points:
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.scandicFriendsMastercard",
defaultMessage: "Scandic Friends Mastercard",
})
break
case Transactions.rewardType.tui_points:
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.tuiPoints",
defaultMessage: "TUI Points",
})
case Transactions.rewardType.pointShop:
description = intl.formatMessage({
id: "earnAndBurn.journeyTable.pointShop",
defaultMessage: "Scandic Friends Point Shop",
})
break

View File

@@ -16,15 +16,19 @@ export default function ClientTable({ transactions }: ClientTableProps) {
const tableHeadings = [
intl.formatMessage({
id: "common.points",
defaultMessage: "Points",
}),
intl.formatMessage({
id: "earnAndBurn.journeyTable.description",
defaultMessage: "Description",
}),
intl.formatMessage({
id: "earnAndBurn.journeyTable.bookingNumberReference",
defaultMessage: "Booking number / Reference",
}),
intl.formatMessage({
id: "earnAndBurn.journeyTable.date",
defaultMessage: "Date",
}),
]
@@ -55,6 +59,7 @@ export default function ClientTable({ transactions }: ClientTableProps) {
<Table.TR className={styles.placeholder}>
<Table.TD colSpan={tableHeadings.length}>
{intl.formatMessage({
id: "earnAndBurn.journeyTable.noTransactions",
defaultMessage: "No transactions available",
})}
</Table.TD>

View File

@@ -22,10 +22,9 @@ export default function ExpiringPointsTable({
const expiration = dt(expirationDate).locale(lang).format("DD MMM YYYY")
const tableHeadings = [
intl.formatMessage({ id: "common.points", defaultMessage: "Points" }),
intl.formatMessage({
defaultMessage: "Points",
}),
intl.formatMessage({
id: "points.expiringPointsTable.expirationDate",
defaultMessage: "Expiration Date",
}),
]

View File

@@ -32,11 +32,14 @@ export default function ExpiringPointsSeeAllButton({
typography="Body/Paragraph/mdBold"
onPress={() => setIsOpen(true)}
>
{intl.formatMessage({ defaultMessage: "See all" })}
{intl.formatMessage({ id: "common.seeAll", defaultMessage: "See all" })}
<MaterialIcon icon="chevron_right" color="CurrentColor" />
</Button>
<SidePeekSelfControlled
title={intl.formatMessage({ defaultMessage: "Expiring points" })}
title={intl.formatMessage({
id: "points.pointsToSpendCard.expiringPointsTitle",
defaultMessage: "Expiring points",
})}
isOpen={isOpen}
onClose={() => setIsOpen(false)}
>
@@ -44,6 +47,7 @@ export default function ExpiringPointsSeeAllButton({
<Typography variant="Body/Paragraph/mdRegular">
<p>
{intl.formatMessage({
id: "points.pointsToSpendCard.expiringPointsInfo",
defaultMessage:
"Points expire three years after they are earned, on the last day of that month. Expiring points do not affect your level.",
})}

View File

@@ -38,6 +38,7 @@
.pointsLabel {
color: var(--Text-Brand-OnPrimary-1-Heading);
text-transform: capitalize;
}
.description {

View File

@@ -52,6 +52,7 @@ export default async function PointsToSpendCard({
<Typography variant="Title/xs">
<h2 id="points-to-spend-card-title" className={styles.title}>
{intl.formatMessage({
id: "common.pointsToSpend",
defaultMessage: "Points to spend",
})}
</h2>
@@ -66,6 +67,7 @@ export default async function PointsToSpendCard({
<Typography variant="Title/Overline/sm">
<span className={styles.pointsLabel}>
{intl.formatMessage({
id: "common.points",
defaultMessage: "Points",
})}
</span>
@@ -75,6 +77,7 @@ export default async function PointsToSpendCard({
{hasPointsToSpend && (
<ButtonLink href={spendPoints[lang]} target="_blank" variant="Text">
{intl.formatMessage({
id: "points.pointsToSpendCard.howToSpendCta",
defaultMessage: "How to spend points",
})}
<MaterialIcon
@@ -91,6 +94,7 @@ export default async function PointsToSpendCard({
<Typography variant="Body/Paragraph/mdRegular">
<p className={styles.descriptionText}>
{intl.formatMessage({
id: "points.pointsToSpendCard.description",
defaultMessage:
"Earn points by staying at Scandic. Turn your points into free nights and memorable experiences.",
})}
@@ -108,6 +112,7 @@ export default async function PointsToSpendCard({
<p className={styles.expiringPoints}>
{intl.formatMessage(
{
id: "points.pointsToSpendCard.expiringPointsText",
defaultMessage: "{expiringPoints} points expiring",
},
{

View File

@@ -24,6 +24,7 @@ export function getExpiryLabel(
if (daysUntilExpiry <= DAYS_UNTIL_EXPIRY_WARNING) {
return intl.formatMessage(
{
id: "points.pointsToSpendCard.inDays",
defaultMessage: "In {days} days",
},
{
@@ -33,6 +34,7 @@ export function getExpiryLabel(
} else {
return intl.formatMessage(
{
id: "points.pointsToSpendCard.onDate",
defaultMessage: "on {expiryDate}",
},
{

View File

@@ -50,6 +50,7 @@ export default async function NextLevelRewardsBlock({
<Chip>
<Lock height={16} />
{intl.formatMessage({
id: "rewards.nextLevel.levelUpToUnlock",
defaultMessage: "Level up to unlock",
})}
</Chip>
@@ -57,6 +58,7 @@ export default async function NextLevelRewardsBlock({
<Body color="peach50" textAlign="center">
{intl.formatMessage(
{
id: "rewards.nextLevel.asOurLevel",
defaultMessage: "As our {level}",
},
{ level: nextLevelRewards.level?.name }

View File

@@ -27,6 +27,7 @@ export default function ActiveRedeemedBadge() {
</motion.div>
<Caption>
{intl.formatMessage({
id: "rewards.active",
defaultMessage: "Active",
})}
</Caption>

View File

@@ -17,16 +17,19 @@ export function ConfirmClose({ close }: { close: () => void }) {
<div className={styles.modalContent}>
<Title level="h3" textAlign="center" textTransform="regular">
{intl.formatMessage({
id: "redeem.confirmClose.title",
defaultMessage: "If you close this your benefit will be removed",
})}
</Title>
<Body>
{intl.formatMessage({
id: "redeem.confirmClose.question",
defaultMessage: "Have you showed this benefit to the hotel staff?",
})}
</Body>
<Body>
{intl.formatMessage({
id: "redeem.confirmClose.info",
defaultMessage:
"If not, please go back and do so before you close this. Once you close this your benefit will be void and removed from My Benefits.",
})}
@@ -39,11 +42,13 @@ export function ConfirmClose({ close }: { close: () => void }) {
theme="base"
>
{intl.formatMessage({
id: "redeem.confirmClose.goBack",
defaultMessage: "No, go back",
})}
</Button>
<Button onClick={close} intent="secondary" theme="base">
{intl.formatMessage({
id: "redeem.confirmClose.confirm",
defaultMessage: "Yes, close and remove benefit",
})}
</Button>

View File

@@ -29,6 +29,7 @@ export default function Campaign({ reward }: { reward: Campaign }) {
<div className={styles.rewardBadge}>
<Caption textAlign="center" color="uiTextHighContrast" type="bold">
{intl.formatMessage({
id: "redeemFlow.promoCode",
defaultMessage: "Promo code",
})}
</Caption>
@@ -44,12 +45,14 @@ export default function Campaign({ reward }: { reward: Campaign }) {
navigator.clipboard.writeText(reward.operaRewardId)
toast.success(
intl.formatMessage({
id: "redeemFlow.copiedToClipboard",
defaultMessage: "Copied to clipboard",
})
)
} catch {
toast.error(
intl.formatMessage({
id: "errorMessage.copyFailed",
defaultMessage: "Failed to copy",
})
)
@@ -63,6 +66,7 @@ export default function Campaign({ reward }: { reward: Campaign }) {
>
<MaterialIcon icon="content_copy" color="CurrentColor" />
{intl.formatMessage({
id: "redeemFlow.copyPromotionCode",
defaultMessage: "Copy promotion code",
})}
</Button>

View File

@@ -88,6 +88,7 @@ export default function Tier({
theme="base"
>
{intl.formatMessage({
id: "redeemFlow.redeemBenefit",
defaultMessage: "Redeem benefit",
})}
</Button>
@@ -103,6 +104,7 @@ export default function Tier({
theme="base"
>
{intl.formatMessage({
id: "redeemFlow.yesRedeem",
defaultMessage: "Yes, redeem",
})}
</Button>
@@ -112,6 +114,7 @@ export default function Tier({
theme="base"
>
{intl.formatMessage({
id: "common.goBack",
defaultMessage: "Go back",
})}
</Button>

View File

@@ -16,6 +16,7 @@ export default function MembershipNumberBadge({
<Caption textAlign="center" color="uiTextHighContrast">
{intl.formatMessage(
{
id: "rewards.membershipId",
defaultMessage: "Membership ID: {id}",
},
{ id: membershipNumber }

View File

@@ -23,6 +23,7 @@ export default function TimedRedeemedBadge() {
<MaterialIcon icon="check_circle" color="Icon/Feedback/Success" />
<Caption>
{intl.formatMessage({
id: "rewards.redeemed.validThrough",
defaultMessage: "Redeemed & valid through:",
})}
</Caption>

View File

@@ -78,9 +78,11 @@ export default function Redeem({ reward, membershipNumber }: RedeemProps) {
>
{reward.redeemLocation === "Non-redeemable"
? intl.formatMessage({
id: "rewards.howToUse",
defaultMessage: "How to use",
})
: intl.formatMessage({
id: "common.open",
defaultMessage: "Open",
})}
</Button>

View File

@@ -23,14 +23,17 @@ export default function ScriptedRewardText({
}
case "Campaign":
return intl.formatMessage({
id: "booking.campaign",
defaultMessage: "Campaign",
})
case "Surprise":
return intl.formatMessage({
id: "rewards.surprise",
defaultMessage: "Surprise!",
})
case "Member-voucher":
return intl.formatMessage({
id: "rewards.voucher",
defaultMessage: "Voucher",
})
default:

View File

@@ -28,12 +28,14 @@ export default async function SASLinkAccountBanner(
}
const headingText = intl.formatMessage({
id: "sas.linkAccountBanner.earnFlightsWithNights",
defaultMessage: "Earn flights with nights",
})
const buttonText =
props.link?.text ||
intl.formatMessage({
id: "sas.linkAccountBanner.readMoreAndLinkAccounts",
defaultMessage: "Read more and link accounts",
})
@@ -41,6 +43,7 @@ export default async function SASLinkAccountBanner(
return (
<span key="scandic-friends" className={styles.brandName}>
{intl.formatMessage({
id: "common.scandicFriends",
defaultMessage: "Scandic Friends",
})}
</span>
@@ -51,6 +54,7 @@ export default async function SASLinkAccountBanner(
return (
<span key="sas-eurobonus" className={styles.brandName}>
{intl.formatMessage({
id: "partnerSas.sasEuroBonus",
defaultMessage: "SAS EuroBonus",
})}
</span>
@@ -59,6 +63,7 @@ export default async function SASLinkAccountBanner(
const descriptionText = intl.formatMessage(
{
id: "sas.linkAccountBanner.description",
defaultMessage:
"Link your <scandicFriends></scandicFriends> and <sasEuroBonus></sasEuroBonus> accounts to earn, use and exchange points between memberships",
},

View File

@@ -17,22 +17,27 @@ export function UnlinkSAS() {
return (
<Dialog
titleText={intl.formatMessage({
id: "partnerSas.unlinkAccount",
defaultMessage: "Are you sure you want to unlink your account?",
})}
bodyText={intl.formatMessage({
id: "partnerSas.unlinkAccountWarning",
defaultMessage:
"This will remove any membership level upgrades gained from the linking. You can re-link your accounts again in 30 days.",
})}
cancelButtonText={intl.formatMessage({
id: "common.goBack",
defaultMessage: "Go back",
})}
proceedText={intl.formatMessage({
id: "partnerSas.yesUnlinkAccount",
defaultMessage: "Yes, unlink my accounts",
})}
proceedHref={`/${params.lang}/sas-x-scandic/login?intent=unlink`}
trigger={
<Button intent="text" theme="base">
{intl.formatMessage({
id: "partnerSas.unlinkAccounts",
defaultMessage: "Unlink accounts",
})}
<MaterialIcon icon="chevron_right" size={20} color="CurrentColor" />

View File

@@ -52,6 +52,7 @@ export default async function SASLinkedAccount({
<p className={styles.caption}>
<MaterialIcon icon="info" size={20} />
{intl.formatMessage({
id: "sas.linkedAccounts.changeDelayInfo",
defaultMessage:
"Changes in your level match can take up to 24 hours to be displayed.",
})}
@@ -96,12 +97,14 @@ async function MatchedAccountInfo() {
<div className={styles.stack}>
<Label>
{intl.formatMessage({
id: "sas.linkedAccounts.linkedAccount",
defaultMessage: "Linked account",
})}
</Label>
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "partnerSas.sasEuroBonus",
defaultMessage: "SAS EuroBonus",
})}
</p>
@@ -110,6 +113,7 @@ async function MatchedAccountInfo() {
<div className={styles.stack}>
<Label>
{intl.formatMessage({
id: "common.level",
defaultMessage: "Level",
})}
</Label>
@@ -120,6 +124,7 @@ async function MatchedAccountInfo() {
<div className={cx(styles.stack, styles.accountMemberNumber)}>
<Label>
{intl.formatMessage({
id: "common.membershipId",
defaultMessage: "Membership ID",
})}
</Label>
@@ -154,12 +159,14 @@ async function MatchedAccountInfoSkeleton() {
<div className={styles.stack}>
<Label>
{intl.formatMessage({
id: "sas.linkedAccounts.linkedAccount",
defaultMessage: "Linked account",
})}
</Label>
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "partnerSas.sasEuroBonus",
defaultMessage: "SAS EuroBonus",
})}
</p>
@@ -168,6 +175,7 @@ async function MatchedAccountInfoSkeleton() {
<div className={styles.stack}>
<Label>
{intl.formatMessage({
id: "common.level",
defaultMessage: "Level",
})}
</Label>
@@ -176,6 +184,7 @@ async function MatchedAccountInfoSkeleton() {
<div className={cx(styles.stack, styles.accountMemberNumber)}>
<Label>
{intl.formatMessage({
id: "common.membershipId",
defaultMessage: "Membership ID",
})}
</Label>
@@ -219,6 +228,7 @@ async function TierMatchMessage({
const messageMap: Record<MatchState, ReactNode> = {
boostedBySAS: intl.formatMessage(
{
id: "sas.linkedAccounts.euroBonusSasUpgradedText",
defaultMessage:
"<sasMark>EuroBonus {sasLevelName}</sasMark> has upgraded your Scandic Friends level to <scandicMark>{scandicLevelName}</scandicMark>.",
},
@@ -226,6 +236,7 @@ async function TierMatchMessage({
),
boostedByScandic: intl.formatMessage(
{
id: "sas.linkedAccounts.scandicFriendsUpgradedText",
defaultMessage:
"Your Scandic Friends level <scandicMark>{scandicLevelName}</scandicMark> has upgraded you to <sasMark>EuroBonus {sasLevelName}</sasMark>.",
},
@@ -233,6 +244,7 @@ async function TierMatchMessage({
),
noBoost: intl.formatMessage(
{
id: "sas.linkedAccounts.euroBonusSasText",
defaultMessage:
"<sasMark>EuroBonus {sasLevelName}</sasMark> and <scandicMark>{scandicLevelName}</scandicMark> are equally matched. Level up in one of your memberships to qualify for an upgrade!",
},
@@ -250,6 +262,7 @@ async function TierMatchMessage({
<div className={styles.stack}>
<Label>
{intl.formatMessage({
id: "sas.linkedAccounts.levelMatchStatus",
defaultMessage: "Level match status",
})}
</Label>
@@ -270,6 +283,7 @@ async function TierMatchMessageSkeleton() {
<div className={styles.stack}>
<Label>
{intl.formatMessage({
id: "sas.linkedAccounts.levelMatchStatus",
defaultMessage: "Level match status",
})}
</Label>
@@ -307,6 +321,7 @@ async function TierMatchExpiration({
<div className={cx(styles.stack, styles.textRight)}>
<Label>
{intl.formatMessage({
id: "sas.linkedAccounts.upgradeValidUntil",
defaultMessage: "Upgrade valid until",
})}
</Label>

View File

@@ -80,6 +80,7 @@ async function TransferPointsFormContent({
<Typography variant="Tag/sm">
<p>
{intl.formatMessage({
id: "partnerSas.exchangeFrom",
defaultMessage: "Exchange from",
})}
</p>
@@ -89,6 +90,7 @@ async function TransferPointsFormContent({
<Typography variant="Title/Subtitle/md">
<p>
{intl.formatMessage({
id: "partnerSas.sasEuroBonus",
defaultMessage: "SAS EuroBonus",
})}
</p>
@@ -98,6 +100,7 @@ async function TransferPointsFormContent({
<Typography variant="Tag/sm">
<p className={styles.balanceLabel}>
{intl.formatMessage({
id: "partnerSas.balance",
defaultMessage: "Balance",
})}
</p>
@@ -113,6 +116,7 @@ async function TransferPointsFormContent({
<p>
{intl.formatMessage(
{
id: "partnerSas.pointsWithValue",
defaultMessage: "{points, number} p",
},
{ points: sasPoints }
@@ -127,6 +131,7 @@ async function TransferPointsFormContent({
<Typography variant="Body/Paragraph/mdRegular">
<p>
{intl.formatMessage({
id: "partnerSas.noPointsToTransfer",
defaultMessage: "You have no points to transfer.",
})}
</p>
@@ -140,6 +145,7 @@ async function TransferPointsFormContent({
<Typography variant="Tag/sm">
<p>
{intl.formatMessage({
id: "partnerSas.exchangeTo",
defaultMessage: "Exchange to",
})}
</p>
@@ -148,6 +154,7 @@ async function TransferPointsFormContent({
<Typography variant="Title/Subtitle/md">
<p>
{intl.formatMessage({
id: "common.scandicFriends",
defaultMessage: "Scandic Friends",
})}
</p>
@@ -157,6 +164,7 @@ async function TransferPointsFormContent({
<Typography variant="Tag/sm">
<p className={styles.balanceLabel}>
{intl.formatMessage({
id: "partnerSas.balance",
defaultMessage: "Balance",
})}
</p>
@@ -172,6 +180,7 @@ async function TransferPointsFormContent({
<p>
{intl.formatMessage(
{
id: "partnerSas.pointsWithValue",
defaultMessage: "{points, number} p",
},
{ points: scandicPoints }
@@ -191,6 +200,7 @@ async function TransferPointsFormContent({
<Typography variant="Body/Supporting text (caption)/smRegular">
<p style={{ color: "var(--Text-Tertiary)" }}>
{intl.formatMessage({
id: "partnerSas.exchangedPointsNotLevelQualifying",
defaultMessage: "Exchanged points will not be level-qualifying.",
})}
</p>

View File

@@ -67,6 +67,7 @@ export function TransferPointsFormClient({
// Set max value to 1 if sasPoints is 0 since slider requires a range
maxValue={hasNoSasPoints ? 1 : sasPoints}
aria-label={intl.formatMessage({
id: "partnerSas.ebPointsToExchange",
defaultMessage: "EB points to exchange",
})}
formatOptions={{
@@ -88,6 +89,7 @@ export function TransferPointsFormClient({
<TextField type="number" isDisabled={disabled}>
<Input
label={intl.formatMessage({
id: "partnerSas.ebPointsToExchange",
defaultMessage: "EB points to exchange",
})}
type="number"
@@ -109,6 +111,7 @@ export function TransferPointsFormClient({
<p className={styles.conversionRate}>
{/* TODO maybe dynamic string based on exchange rate */}
{intl.formatMessage({
id: "partnerSas.conversionRateInfo",
defaultMessage: "1 EuroBonus point = 2 Scandic Friends points",
})}
</p>
@@ -117,6 +120,7 @@ export function TransferPointsFormClient({
<Typography variant="Label/xsRegular">
<p>
{intl.formatMessage({
id: "partnerSas.sfPointsToReceive",
defaultMessage: "SF points to receive",
})}
</p>
@@ -183,6 +187,7 @@ function ConfirmModal({
disabled={disabled}
>
{intl.formatMessage({
id: "partnerSas.exchangePoints",
defaultMessage: "Exchange points",
})}
</Button>
@@ -197,6 +202,7 @@ function ConfirmModal({
<Typography variant="Title/Subtitle/lg">
<h3>
{intl.formatMessage({
id: "partnerSas.proceedWithPointExchange",
defaultMessage: "Proceed with point exchange?",
})}
</h3>
@@ -205,6 +211,7 @@ function ConfirmModal({
<Typography variant="Body/Paragraph/mdRegular">
<p>
{intl.formatMessage({
id: "partnerSas.youAreAboutToExchange",
defaultMessage: "You are about to exchange:",
})}
</p>
@@ -213,6 +220,7 @@ function ConfirmModal({
<p>
{intl.formatMessage(
{
id: "partnerSas.exchangePointsDetails",
defaultMessage:
"<bold>{sasPoints, number} EuroBonus points</bold> to <bold>{scandicPoints, number} Scandic Friends points</bold>",
},
@@ -232,6 +240,7 @@ function ConfirmModal({
<Typography variant="Body/Supporting text (caption)/smRegular">
<p className={styles.expiryText}>
{intl.formatMessage({
id: "partnerSas.exchangePointsExpiry",
defaultMessage:
"Your exchanged points will retain their original expiry date with a maximum validity of 12 months.",
})}
@@ -245,6 +254,7 @@ function ConfirmModal({
color="none"
>
{intl.formatMessage({
id: "partnerSas.yesIWantToExchangeMyPoints",
defaultMessage: "Yes, I want to exchange my points",
})}
</Link>
@@ -256,6 +266,7 @@ function ConfirmModal({
onClick={() => handleToggle(false)}
>
{intl.formatMessage({
id: "common.cancel",
defaultMessage: "Cancel",
})}
</Button>

View File

@@ -24,10 +24,12 @@ export default async function EmptyUpcomingStaysBlock() {
textAlign="center"
>
{intl.formatMessage({
id: "stays.noUpcomingStays",
defaultMessage: "You have no upcoming stays.",
})}
<span className={styles.burgundyTitle}>
{intl.formatMessage({
id: "stays.whereToGoNext",
defaultMessage: "Where should you go next?",
})}
</span>
@@ -39,6 +41,7 @@ export default async function EmptyUpcomingStaysBlock() {
color="Text/Interactive/Secondary"
>
{intl.formatMessage({
id: "stays.getInspired",
defaultMessage: "Get inspired",
})}
<MaterialIcon icon="arrow_forward" color="CurrentColor" />

View File

@@ -30,6 +30,7 @@ export default function ShowMoreButton({
color="CurrentColor"
/>
{intl.formatMessage({
id: "common.showMore",
defaultMessage: "Show more",
})}
</Button>

View File

@@ -27,6 +27,7 @@ export default async function HotelListingItem({
url: hotelData.meetingUrl,
openInNewTab: true,
text: intl.formatMessage({
id: "meetingPackage.bookAMeeting",
defaultMessage: "Book a meeting",
}),
}
@@ -34,6 +35,7 @@ export default async function HotelListingItem({
url: hotelData.url,
openInNewTab: false,
text: intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
}),
}
@@ -61,6 +63,7 @@ export default async function HotelListingItem({
<span>
{intl.formatMessage(
{
id: "common.kmToCityCenter",
defaultMessage: "{number} km to city center",
},
{

View File

@@ -26,6 +26,7 @@ export function CarouselPrevious({ className }: CarouselButtonProps) {
style="Elevated"
onPress={scrollPrev}
aria-label={intl.formatMessage({
id: "carousel.previousSlide",
defaultMessage: "Previous slide",
})}
>
@@ -49,6 +50,7 @@ export function CarouselNext({ className }: CarouselButtonProps) {
style="Elevated"
onPress={scrollNext}
aria-label={intl.formatMessage({
id: "carousel.nextSlide",
defaultMessage: "Next slide",
})}
>

View File

@@ -18,7 +18,10 @@ export default async function TopCampaign({ topCampaign }: TopCampaignProps) {
const intl = await getIntl()
const { campaign, heading } = topCampaign
const buttonData = {
cta: intl.formatMessage({ defaultMessage: "Explore the offer" }),
cta: intl.formatMessage({
id: "campaign.exploreTheOffer",
defaultMessage: "Explore the offer",
}),
url: `/${lang}${campaign.url}`,
}
@@ -34,6 +37,7 @@ export default async function TopCampaign({ topCampaign }: TopCampaignProps) {
heading={
campaign.hotel_listing.heading ||
intl.formatMessage({
id: "campaignPage.hotelsIncludedInOffer",
defaultMessage: "Hotels included in this offer",
})
}

View File

@@ -26,9 +26,11 @@ export default function HotelListContent({
<Alert
type={AlertTypeEnum.Info}
heading={intl.formatMessage({
id: "filter.noMatchingHotelsFound",
defaultMessage: "No matching hotels found",
})}
text={intl.formatMessage({
id: "filter.noMatchingHotelsFoundDescription",
defaultMessage:
"It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.",
})}

View File

@@ -73,6 +73,7 @@ export default function HotelList() {
<p>
{intl.formatMessage(
{
id: "destinationPage.hotelsCount",
defaultMessage: "{count} hotels",
},
{ count: visibleHotels.length }

View File

@@ -73,6 +73,7 @@ export default function HotelListItem({ hotel, url }: HotelListItemProps) {
sizes="(min-width: 768px) 700px, 100vw"
title={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: hotel.name }
@@ -111,6 +112,7 @@ export default function HotelListItem({ hotel, url }: HotelListItemProps) {
<span>
{intl.formatMessage(
{
id: "common.kmToCityCenter",
defaultMessage: "{number} km to city center",
},
{
@@ -149,6 +151,7 @@ export default function HotelListItem({ hotel, url }: HotelListItemProps) {
typography="Body/Paragraph/mdBold"
>
{intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
})}
</ButtonLink>

View File

@@ -69,7 +69,10 @@ export default function CityMap({
>
<MaterialIcon icon="arrow_back" color="CurrentColor" size={24} />
<span>
{intl.formatMessage({ defaultMessage: "Back to cities" })}
{intl.formatMessage({
id: "destination.backToCities",
defaultMessage: "Back to cities",
})}
</span>
</Button>
) : null}

View File

@@ -69,6 +69,7 @@ export default async function DestinationCityPage({
const sortItems: HotelSortItem[] = [
{
label: intl.formatMessage({
id: "filter.distanceToCityCenter",
defaultMessage: "Distance to city center",
}),
value: HotelSortOption.Distance,
@@ -76,13 +77,15 @@ export default async function DestinationCityPage({
},
{
label: intl.formatMessage({
id: "common.name",
defaultMessage: "Name",
}),
value: HotelSortOption.Name,
},
{
label: intl.formatMessage({
defaultMessage: "Tripadvisor rating",
id: "common.tripAdvisorRating",
defaultMessage: "TripAdvisor rating",
}),
value: HotelSortOption.TripAdvisorRating,
},

View File

@@ -51,6 +51,7 @@ export default function CityMapCard({
className={styles.closeButton}
onPress={handleClose}
aria-label={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>
@@ -90,6 +91,7 @@ export default function CityMapCard({
<Typography variant="Body/Supporting text (caption)/smBold">
<p>
{intl.formatMessage({
id: "destinationPage.seeHotelsOnMap",
defaultMessage: "See hotels on map",
})}
</p>
@@ -103,6 +105,7 @@ export default function CityMapCard({
textDecoration="underline"
>
{intl.formatMessage({
id: "destination.exploreCity",
defaultMessage: "Explore city",
})}
</Link>

View File

@@ -21,9 +21,11 @@ export function CityListContent() {
<Alert
type={AlertTypeEnum.Info}
heading={intl.formatMessage({
id: "destination.noLocationsFound",
defaultMessage: "No matching locations found",
})}
text={intl.formatMessage({
id: "destination.noLocationsFoundLong",
defaultMessage:
"It looks like no location match your filters. Try adjusting your search to find the perfect stay.",
})}

View File

@@ -29,6 +29,7 @@ export default function CityList() {
<p>
{intl.formatMessage(
{
id: "destination.city.count",
defaultMessage: "{count} destinations",
},
{ count: activeCities.length }

View File

@@ -111,6 +111,7 @@ export function CityListItem({
textDecoration="underline"
>
{intl.formatMessage({
id: "destination.exploreCity",
defaultMessage: "Explore city",
})}
</Link>
@@ -119,6 +120,7 @@ export function CityListItem({
<button
onClick={handleClickCard}
aria-label={intl.formatMessage({
id: "destination.seeOnMap",
defaultMessage: "See on map",
})}
className={styles.right}

View File

@@ -73,6 +73,7 @@ export default async function DestinationCountryPage({
const sortItems: HotelSortItem[] = [
{
label: intl.formatMessage({
id: "destination.country.sort.recommended",
defaultMessage: "Recommended",
}),
value: HotelSortOption.Recommended,
@@ -80,6 +81,7 @@ export default async function DestinationCountryPage({
},
{
label: intl.formatMessage({
id: "common.name",
defaultMessage: "Name",
}),
value: HotelSortOption.Name,

View File

@@ -33,6 +33,7 @@ export default function CityListingItem({ city }: CityListingItemProps) {
fill
title={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: city.cityName }
@@ -61,6 +62,7 @@ export default function CityListingItem({ city }: CityListingItemProps) {
<Link href={city.url}>
{intl.formatMessage(
{
id: "destination.cityList.exploreCity",
defaultMessage: "Explore {city}",
},
{ city: city.cityName }

View File

@@ -40,6 +40,7 @@ export default function CityListing() {
<h2>
{intl.formatMessage(
{
id: "destination.cityList.count",
defaultMessage:
"{count, plural, one {# destination} other {# destinations}}",
},
@@ -53,9 +54,11 @@ export default function CityListing() {
<Alert
type={AlertTypeEnum.Info}
heading={intl.formatMessage({
id: "destination.noLocationsFound",
defaultMessage: "No matching locations found",
})}
text={intl.formatMessage({
id: "destination.noLocationsFoundLong",
defaultMessage:
"It looks like no location match your filters. Try adjusting your search to find the perfect stay.",
})}
@@ -74,6 +77,7 @@ export default function CityListing() {
position="right"
onClick={scrollToTop}
label={intl.formatMessage({
id: "common.backToTop",
defaultMessage: "Back to top",
})}
/>

View File

@@ -47,6 +47,7 @@ export default function HotelListingItem({
sizes="(min-width: 768px) 700px, 100vw"
title={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: hotel.name }
@@ -77,6 +78,7 @@ export default function HotelListingItem({
href={mapUrl}
className={styles.addressLink}
aria-label={intl.formatMessage({
id: "destination.seeOnMap",
defaultMessage: "See on map",
})}
>
@@ -89,6 +91,7 @@ export default function HotelListingItem({
<p>
{intl.formatMessage(
{
id: "common.kmToCityCenter",
defaultMessage: "{number} km to city center",
},
{
@@ -134,6 +137,7 @@ export default function HotelListingItem({
onClick={() => setActiveMarker(hotel.id)}
>
{intl.formatMessage({
id: "destination.seeOnMap",
defaultMessage: "See on map",
})}
<MaterialIcon icon="chevron_right" size={24} color="CurrentColor" />
@@ -152,6 +156,7 @@ export default function HotelListingItem({
typography="Body/Paragraph/mdBold"
>
{intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
})}
</ButtonLink>

View File

@@ -40,6 +40,7 @@ export default function HotelListing() {
<h2>
{intl.formatMessage(
{
id: "destination.hotelList.count",
defaultMessage:
"{count, plural, one {# hotel} other {# hotels}}",
},
@@ -53,9 +54,11 @@ export default function HotelListing() {
<Alert
type={AlertTypeEnum.Info}
heading={intl.formatMessage({
id: "filter.noMatchingHotelsFound",
defaultMessage: "No matching hotels found",
})}
text={intl.formatMessage({
id: "filter.noMatchingHotelsFoundDescription",
defaultMessage:
"It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.",
})}
@@ -74,6 +77,7 @@ export default function HotelListing() {
position="right"
onClick={scrollToTop}
label={intl.formatMessage({
id: "common.backToTop",
defaultMessage: "Back to top",
})}
/>

View File

@@ -54,7 +54,10 @@ export function DestinationSearchForm({
)
toast.error(
intl.formatMessage(
{ defaultMessage: "Unable to open page for {locationName}" },
{
id: "destination.search.unableToOpenPage",
defaultMessage: "Unable to open page for {locationName}",
},
{ locationName: item.name }
)
)

View File

@@ -29,6 +29,7 @@ export function DestinationSearch() {
<Typography variant="Body/Supporting text (caption)/smBold">
<span className={styles.whereTo}>
{intl.formatMessage({
id: "bookingWidget.label.whereTo",
defaultMessage: "Where to?",
})}
</span>
@@ -36,6 +37,7 @@ export function DestinationSearch() {
<Typography variant="Body/Paragraph/mdRegular">
<span className={styles.displayAsPlaceholder}>
{intl.formatMessage({
id: "booking.hotelsAndDestinations",
defaultMessage: "Hotels & Destinations",
})}
</span>

View File

@@ -24,6 +24,7 @@ export default async function Destination({
const intl = await getIntl()
const accordionSubtitle = intl.formatMessage(
{
id: "common.numberOfHotels",
defaultMessage: "{amount, plural, one {# hotel} other {# hotels}}",
},
{ amount: numberOfHotels }
@@ -54,6 +55,7 @@ export default async function Destination({
<Link href={countryUrl} variant="icon" weight="bold">
{intl.formatMessage(
{
id: "destination.overview.viewAllHotelsInCountry",
defaultMessage: "View all hotels in {country}",
},
{ country: country }

View File

@@ -21,6 +21,7 @@ export default async function HotelsSection() {
<Typography variant="Title/md">
<h4 className={styles.heading}>
{intl.formatMessage({
id: "destination.overview.exploreAllHotels",
defaultMessage: "Explore all our hotels",
})}
</h4>

View File

@@ -18,6 +18,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="hiking" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.hiking",
defaultMessage: "Hiking",
}),
}
@@ -27,6 +28,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="kayaking" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.kayaking",
defaultMessage: "Kayaking",
}),
}
@@ -36,6 +38,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="pedal_bike" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.bikeFriendly",
defaultMessage: "Bike friendly",
}),
}
@@ -45,6 +48,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="museum" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.museums",
defaultMessage: "Museums",
}),
}
@@ -54,6 +58,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="family_restroom" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.familyFriendly",
defaultMessage: "Family friendly",
}),
}
@@ -63,6 +68,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="location_city" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.cityPulse",
defaultMessage: "City pulse",
}),
}
@@ -72,6 +78,7 @@ export function mapExperiencesToListData(
<MaterialIcon icon="nightlife" {...props} />
),
name: intl.formatMessage({
id: "destination.experience.nightLife",
defaultMessage: "Nightlife",
}),
}

View File

@@ -54,6 +54,7 @@ export default function HotelMapCard({
className={styles.closeButton}
onPress={handleClose}
aria-label={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>
@@ -121,6 +122,7 @@ export default function HotelMapCard({
<Typography variant="Body/Supporting text (caption)/smBold">
<p>
{intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
})}
</p>

View File

@@ -116,6 +116,7 @@ export default function DynamicMap({
fallback={
<h2>
{intl.formatMessage({
id: "destination.map.error.unableToDisplayMap",
defaultMessage: "Unable to display map",
})}
</h2>
@@ -136,6 +137,7 @@ export default function DynamicMap({
<MaterialIcon icon="format_list_bulleted" color="CurrentColor" />
<span>
{intl.formatMessage({
id: "destination.map.seeAsList",
defaultMessage: "See as list",
})}
</span>
@@ -148,6 +150,7 @@ export default function DynamicMap({
className={styles.zoomButton}
onClick={zoomIn}
aria-label={intl.formatMessage({
id: "map.zoomIn",
defaultMessage: "Zoom in",
})}
isDisabled={isMaxZoom}
@@ -160,6 +163,7 @@ export default function DynamicMap({
className={styles.zoomButton}
onClick={zoomOut}
aria-label={intl.formatMessage({
id: "map.zoomOut",
defaultMessage: "Zoom out",
})}
isDisabled={isMinZoom}

View File

@@ -181,9 +181,11 @@ export default function Map({
/>
{fromCountryPage
? intl.formatMessage({
id: "destination.backToCities",
defaultMessage: "Back to cities",
})
: intl.formatMessage({
id: "destination.map.backToList",
defaultMessage: "Back to list",
})}
</Button>
@@ -198,6 +200,7 @@ export default function Map({
position="left"
onClick={scrollToTop}
label={intl.formatMessage({
id: "common.backToTop",
defaultMessage: "Back to top",
})}
/>

View File

@@ -32,6 +32,7 @@ export function SeeOnMapFilterWrapper({
>
<MaterialIcon icon="map" color="CurrentColor" />
{intl.formatMessage({
id: "destination.seeOnMap",
defaultMessage: "See on map",
})}
</ButtonLink>

View File

@@ -32,7 +32,10 @@ export function SeoFilters({ seoFilters }: SeoFiltersProps) {
<Accordion className={styles.accordion}>
{facilityFilters.length > 0 ? (
<AccordionItem
title={intl.formatMessage({ defaultMessage: "Hotel facilities" })}
title={intl.formatMessage({
id: "filter.facilities",
defaultMessage: "Hotel facilities",
})}
showAsSubtitle
titleLevel="h3"
>
@@ -53,7 +56,10 @@ export function SeoFilters({ seoFilters }: SeoFiltersProps) {
) : null}
{surroundingsFilters.length > 0 ? (
<AccordionItem
title={intl.formatMessage({ defaultMessage: "Hotel surroundings" })}
title={intl.formatMessage({
id: "filter.hotelSurroundings",
defaultMessage: "Hotel surroundings",
})}
showAsSubtitle
titleLevel="h3"
>

View File

@@ -51,6 +51,7 @@ export default function DestinationPageSidepeek({
>
{buttonText ||
intl.formatMessage({
id: "common.readMore",
defaultMessage: "Read more",
})}
<MaterialIcon icon="chevron_right" size={20} color="CurrentColor" />
@@ -61,6 +62,7 @@ export default function DestinationPageSidepeek({
openInRoot
handleClose={() => setSidePeekIsOpen(false)}
closeLabel={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>

View File

@@ -31,9 +31,11 @@ export default async function DestinationStaticMap({
const intl = await getIntl()
const altText = city
? intl.formatMessage({
id: "destination.mapStatic.mapOfCity",
defaultMessage: "Map of the city",
})
: intl.formatMessage({
id: "destination.mapStatic.mapOfCountry",
defaultMessage: "Map of the country",
})
const coordinates = location

View File

@@ -69,6 +69,7 @@ export default function TopImages({ images, destinationName }: TopImageProps) {
className={styles.seeAllButton}
>
{intl.formatMessage({
id: "common.seeAllPhotos",
defaultMessage: "See all photos",
})}
</Button>
@@ -76,6 +77,7 @@ export default function TopImages({ images, destinationName }: TopImageProps) {
images={lightboxImages}
dialogTitle={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: destinationName }

View File

@@ -11,12 +11,14 @@ export function getHeadingText(
pageType === "country"
? intl.formatMessage(
{
id: "destination.destinationsInLocation",
defaultMessage: "Destinations in {location}",
},
{ location }
)
: intl.formatMessage(
{
id: "destination.hotelsInLocation",
defaultMessage: "Hotels in {location}",
},
{ location }

View File

@@ -111,6 +111,7 @@ export default function HotelMapPageClient({
<MaterialIcon icon="close" size={20} color="CurrentColor" />
<span>
{intl.formatMessage({
id: "selectHotel.closeMap",
defaultMessage: "Close the map",
})}
</span>

View File

@@ -95,9 +95,11 @@ export default function Sidebar({
}
const viewAsMapMsg = intl.formatMessage({
id: "hotelMap.sidebar.viewAsMap",
defaultMessage: "View as map",
})
const viewAsListMsg = intl.formatMessage({
id: "hotelMap.sidebar.viewAsList",
defaultMessage: "View as list",
})
@@ -121,7 +123,8 @@ export default function Sidebar({
<h1 className={styles.title}>
{intl.formatMessage(
{
defaultMessage: "Nearby {hotelName}",
id: "hotelMap.sidebar.thingsNearbyHotel",
defaultMessage: "Things nearby {hotelName}",
},
{ hotelName }
)}
@@ -157,6 +160,7 @@ export default function Sidebar({
<span>
{intl.formatMessage(
{
id: "common.distanceKm",
defaultMessage: "{distanceInKm} km",
},
{

View File

@@ -10,26 +10,32 @@ export function translatePOIGroup(
switch (group) {
case PointOfInterestGroupEnum.PUBLIC_TRANSPORT:
return intl.formatMessage({
id: "hotelMap.sidebar.poi.publicTransport",
defaultMessage: "Public transport",
})
case PointOfInterestGroupEnum.ATTRACTIONS:
return intl.formatMessage({
id: "hotelMap.sidebar.poi.attractions",
defaultMessage: "Attractions",
})
case PointOfInterestGroupEnum.BUSINESS:
return intl.formatMessage({
id: "hotelMap.sidebar.poi.business",
defaultMessage: "Business",
})
case PointOfInterestGroupEnum.LOCATION:
return intl.formatMessage({
id: "hotelMap.sidebar.poi.location",
defaultMessage: "Location",
})
case PointOfInterestGroupEnum.PARKING:
return intl.formatMessage({
id: "common.parking",
defaultMessage: "Parking",
})
case PointOfInterestGroupEnum.SHOPPING_DINING:
return intl.formatMessage({
id: "hotelMap.sidebar.poi.shoppingDining",
defaultMessage: "Shopping & Dining",
})
default:
@@ -37,6 +43,7 @@ export function translatePOIGroup(
logger.warn(`Unsupported group given: ${option}`)
return intl.formatMessage({
id: "common.NA",
defaultMessage: "N/A",
})
}

View File

@@ -21,6 +21,7 @@ export default async function AmenitiesList({
<Typography variant="Title/Subtitle/md">
<p>
{intl.formatMessage({
id: "hotel.amenitiesList.atTheHotel",
defaultMessage: "At the hotel",
})}
</p>
@@ -54,6 +55,7 @@ export default async function AmenitiesList({
scroll={false}
>
{intl.formatMessage({
id: "hotel.seeAllAmenities",
defaultMessage: "See all amenities",
})}
<MaterialIcon icon="chevron_right" size={24} color="CurrentColor" />

View File

@@ -39,7 +39,11 @@ export default async function HotelCampaigns({
<div className={styles.intro}>
<Typography variant="Title/md">
<h2 className={styles.heading}>
{heading || intl.formatMessage({ defaultMessage: "Offers" })}
{heading ||
intl.formatMessage({
id: "hotelPage.offers",
defaultMessage: "Offers",
})}
</h2>
</Typography>
{preamble ? (
@@ -52,7 +56,10 @@ export default async function HotelCampaigns({
<CampaignHero
{...topCampaign.hero}
button={{
cta: intl.formatMessage({ defaultMessage: "Explore the offer" }),
cta: intl.formatMessage({
id: "campaign.exploreTheOffer",
defaultMessage: "Explore the offer",
}),
url: topCampaign.url,
}}
pageType="hotelPage"

View File

@@ -54,11 +54,13 @@ export default async function Facilities({
case FacilityCardButtonText.RESTAURANT:
case FacilityCardButtonText.WELLNESS:
return intl.formatMessage({
id: "common.readMore",
defaultMessage: "Read more",
})
default:
logger.warn(`Unsupported option given: ${text}`)
return intl.formatMessage({
id: "common.readMore",
defaultMessage: "Read more",
})
}

View File

@@ -27,6 +27,7 @@ export default async function TripAdvisorSection({
const formattedTripAdvisorText = intl.formatMessage(
{
id: "hotel.introSection.tripAdvisorReviews",
defaultMessage: "{count} reviews",
},
{ count: numberOfReviews }

View File

@@ -46,6 +46,7 @@ export default async function IntroSection({
const { distanceToCentre } = location
const formattedDistanceText = intl.formatMessage(
{
id: "common.kmToCityCenter",
defaultMessage: "{number} km to city center",
},
{ number: getSingleDecimal(distanceToCentre / 1000) }
@@ -62,6 +63,7 @@ export default async function IntroSection({
<Typography variant="Title/Decorative/lg">
<span className={styles.script}>
{intl.formatMessage({
id: "hotel.introSection.welcomeTo",
defaultMessage: "Welcome to",
})}
</span>
@@ -132,6 +134,7 @@ export default async function IntroSection({
scroll={false}
>
{intl.formatMessage({
id: "destination.seeHotelDetails",
defaultMessage: "See hotel details",
})}
<MaterialIcon icon="chevron_right" size={24} color="CurrentColor" />

View File

@@ -23,6 +23,7 @@ export default function MapCard({ hotelName, pois }: MapCardProps) {
<Typography variant="Title/Overline/sm" className={styles.nearby}>
<span>
{intl.formatMessage({
id: "hotel.mapCard.nearby",
defaultMessage: "Nearby",
})}
</span>
@@ -50,6 +51,7 @@ export default function MapCard({ hotelName, pois }: MapCardProps) {
<span>
{intl.formatMessage(
{
id: "common.distanceKm",
defaultMessage: "{distanceInKm} km",
},
{ distanceInKm: poi.distance }
@@ -70,6 +72,7 @@ export default function MapCard({ hotelName, pois }: MapCardProps) {
onClick={trackHotelMapClick}
>
{intl.formatMessage({
id: "hotel.seeMap",
defaultMessage: "See map",
})}
</ButtonLink>

View File

@@ -26,6 +26,7 @@ export default function MobileMapToggle() {
<MaterialIcon icon="home" color="CurrentColor" />
<span>
{intl.formatMessage({
id: "hotel.mapToggle.hotel",
defaultMessage: "Hotel",
})}
</span>
@@ -38,12 +39,14 @@ export default function MobileMapToggle() {
href={mapUrl}
onClick={trackHotelMapClick}
aria-label={intl.formatMessage({
id: "hotel.seeMap",
defaultMessage: "See map",
})}
>
<MaterialIcon icon="map" color="CurrentColor" />
<span>
{intl.formatMessage({
id: "hotel.mapToggle.map",
defaultMessage: "Map",
})}
</span>

View File

@@ -35,6 +35,7 @@ export default async function StaticMap({
zoomLevel={zoomLevel}
altText={intl.formatMessage(
{
id: "hotel.staticMap.mapOfHotelName",
defaultMessage: "Map of {hotelName}",
},
{ hotelName }

View File

@@ -33,6 +33,7 @@ export default function PreviewImages({
key={image.src}
className={styles.imageButton}
aria-label={intl.formatMessage({
id: "common.seeAllPhotos",
defaultMessage: "See all photos",
})}
onPress={() =>
@@ -68,6 +69,7 @@ export default function PreviewImages({
className={styles.seeAllButton}
>
{intl.formatMessage({
id: "common.seeAllPhotos",
defaultMessage: "See all photos",
})}
</Button>
@@ -75,6 +77,7 @@ export default function PreviewImages({
images={lightboxImages}
dialogTitle={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: hotelName }

View File

@@ -33,6 +33,7 @@ export function RoomCard({ room }: RoomCardProps) {
images={galleryImages}
title={intl.formatMessage(
{
id: "common.imageGalleryWithTitle",
defaultMessage: "{title} - Image gallery",
},
{ title: name }
@@ -51,6 +52,7 @@ export function RoomCard({ room }: RoomCardProps) {
<p className={styles.roomSize}>
{intl.formatMessage(
{
id: "hotel.roomCard.size",
defaultMessage:
"{size} ({max, plural, one {{range} guest} other {{range} guests}})",
},
@@ -72,6 +74,7 @@ export function RoomCard({ room }: RoomCardProps) {
className={styles.buttonLink}
>
{intl.formatMessage({
id: "hotel.seeRoomDetails",
defaultMessage: "See room details",
})}
<MaterialIcon icon="chevron_right" size={24} color="CurrentColor" />

View File

@@ -29,6 +29,7 @@ export default async function ContactInformation({
<Typography variant="Title/Subtitle/lg">
<h3>
{intl.formatMessage({
id: "common.practicalInformation",
defaultMessage: "Practical information",
})}
</h3>
@@ -38,6 +39,7 @@ export default async function ContactInformation({
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "common.address",
defaultMessage: "Address",
})}
</p>
@@ -53,6 +55,7 @@ export default async function ContactInformation({
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "common.drivingDirections",
defaultMessage: "Driving directions",
})}
</p>
@@ -64,6 +67,7 @@ export default async function ContactInformation({
textDecoration="underline"
>
{intl.formatMessage({
id: "common.googleMaps",
defaultMessage: "Google Maps",
})}
</Link>
@@ -72,6 +76,7 @@ export default async function ContactInformation({
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "common.contactUs",
defaultMessage: "Contact us",
})}
</p>
@@ -90,6 +95,7 @@ export default async function ContactInformation({
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "common.followUs",
defaultMessage: "Follow us",
})}
</p>
@@ -112,6 +118,7 @@ export default async function ContactInformation({
<Typography variant="Body/Paragraph/mdBold">
<p>
{intl.formatMessage({
id: "common.email",
defaultMessage: "Email",
})}
</p>
@@ -130,6 +137,7 @@ export default async function ContactInformation({
height={38}
width={38}
alt={intl.formatMessage({
id: "common.nordicSwanEcolabel",
defaultMessage: "Nordic Swan Ecolabel",
})}
src={`/_static/img/icons/swan-eco/swan_eco_dark_${lang}.png`}
@@ -139,6 +147,7 @@ export default async function ContactInformation({
<span>
<p>
{intl.formatMessage({
id: "common.nordicSwanEcolabel",
defaultMessage: "Nordic Swan Ecolabel",
})}
</p>

View File

@@ -25,9 +25,11 @@ export default async function AboutTheHotelSidePeek({
<SidePeek
contentKey={SidepeekSlugs.about}
title={intl.formatMessage({
id: "hotel.aboutTheHotel",
defaultMessage: "About the hotel",
})}
closeLabel={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>

View File

@@ -20,9 +20,11 @@ export default async function ActivitiesSidePeek({
<SidePeek
contentKey={sidepeekSlug}
title={intl.formatMessage({
id: "hotelPage.activities",
defaultMessage: "Activities",
})}
closeLabel={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>

View File

@@ -31,9 +31,11 @@ export default async function AmenitiesSidePeek({
<SidePeek
contentKey={SidepeekSlugs.amenities}
title={intl.formatMessage({
id: "sidepeek.amenities",
defaultMessage: "Amenities",
})}
closeLabel={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>

View File

@@ -30,6 +30,7 @@ export default async function MeetingsAndConferencesSidePeek({
contentKey={SidepeekSlugs.meetings}
title={heading}
closeLabel={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>
@@ -37,6 +38,7 @@ export default async function MeetingsAndConferencesSidePeek({
<Typography variant="Title/Subtitle/lg">
<h3>
{intl.formatMessage({
id: "hotel.sidepeeks.meetingsAndConferences.title",
defaultMessage: "Creative spaces for meetings",
})}
</h3>
@@ -69,6 +71,7 @@ export default async function MeetingsAndConferencesSidePeek({
typography="Body/Paragraph/mdBold"
>
{intl.formatMessage({
id: "common.readMore",
defaultMessage: "Read more",
})}
</ButtonLink>

View File

@@ -30,6 +30,7 @@ async function getRoomText(roomSizes: number[]) {
if (largestRoom === smallestRoom) {
roomText = intl.formatMessage(
{
id: "hotel.sidepeeks.meetingsAndConferences.roomSize",
defaultMessage: "{value} m²",
},
{ value: largestRoom }
@@ -38,6 +39,7 @@ async function getRoomText(roomSizes: number[]) {
{
roomText = intl.formatMessage(
{
id: "hotel.sidepeeks.meetingsAndConferences.roomSizeRange",
defaultMessage: "{smallest}{largest} m²",
},
{ largest: largestRoom, smallest: smallestRoom }
@@ -56,6 +58,7 @@ async function getSeatingText(roomSeating: number[]) {
if (biggestSeating === smallestSeating) {
seatingText = intl.formatMessage(
{
id: "common.numberOfGuests",
defaultMessage: "{value, plural, one {# guest} other {# guests}}",
},
{ value: biggestSeating }
@@ -64,6 +67,7 @@ async function getSeatingText(roomSeating: number[]) {
{
seatingText = intl.formatMessage(
{
id: "hotel.sidepeeks.meetingsAndConferences.seatingCapacityRange",
defaultMessage: "{lowest}{highest} guests",
},
{ highest: biggestSeating, lowest: smallestSeating }

View File

@@ -36,9 +36,11 @@ export function RestaurantBarItemLinks({
>
{showDetailsLink
? intl.formatMessage({
id: "restaurantBar.bookATable",
defaultMessage: "Book a table",
})
: intl.formatMessage({
id: "common.readMore",
defaultMessage: "Read more",
})}
</ButtonLink>
@@ -53,6 +55,7 @@ export function RestaurantBarItemLinks({
>
{intl.formatMessage(
{
id: "restaurantBar.discoverRestaurant",
defaultMessage: "Discover {name}",
},
{ name: restaurantName }

View File

@@ -54,6 +54,7 @@ export default async function RestaurantBarItem({
<Typography variant="Title/Subtitle/md">
<h4 className={styles.text}>
{intl.formatMessage({
id: "common.openingHours",
defaultMessage: "Opening hours",
})}
</h4>
@@ -72,6 +73,7 @@ export default async function RestaurantBarItem({
<Typography variant="Title/Subtitle/md">
<h4 className={styles.text}>
{intl.formatMessage({
id: "restaurantBar.menus",
defaultMessage: "Menus",
})}
</h4>

View File

@@ -20,6 +20,7 @@ export default async function RestaurantBarSidePeek({
contentKey={SidepeekSlugs.restaurant}
title={heading}
closeLabel={intl.formatMessage({
id: "common.close",
defaultMessage: "Close",
})}
>

Some files were not shown because too many files have changed in this diff Show More