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

@@ -72,7 +72,7 @@ export default defineConfig([
'formatjs/no-multiple-whitespaces': ['error'],
'formatjs/no-multiple-plurals': ['error'],
'formatjs/no-invalid-icu': ['error'],
'formatjs/no-id': ['error'],
'formatjs/enforce-id': ['error'],
'formatjs/no-complex-selectors': ['error'],
'formatjs/no-useless-message': ['error'],
'formatjs/prefer-pound-in-plural': ['error'],

View File

@@ -39,6 +39,7 @@ export default function AlertSidepeek({
isOpen={sidePeekIsOpen}
handleClose={() => setSidePeekIsOpen(false)}
closeLabel={intl.formatMessage({
id: 'common.close',
defaultMessage: 'Close',
})}
>

View File

@@ -56,7 +56,10 @@ export function BookingCodeChip({
<p className={styles.bookingCodeChip}>
<Typography variant="Body/Supporting text (caption)/smBold">
<strong>
{intl.formatMessage({ defaultMessage: 'Campaign' })}
{intl.formatMessage({
id: 'booking.campaign',
defaultMessage: 'Campaign',
})}
</strong>
</Typography>
{bookingCode && (
@@ -92,6 +95,7 @@ export function BookingCodeChip({
<Typography variant="Body/Supporting text (caption)/smBold">
<strong>
{intl.formatMessage({
id: 'booking.bookingCode',
defaultMessage: 'Booking code',
})}
</strong>

View File

@@ -30,6 +30,7 @@ export function SelectPaymentMethod({
}: SelectPaymentMethodProps) {
const intl = useIntl()
const mySavedCardsLabel = intl.formatMessage({
id: 'payment.mySavedCards',
defaultMessage: 'My saved cards',
})

View File

@@ -30,6 +30,7 @@ export default function HotelChequeCard({
<div className={styles.chequeRow}>
<Caption>
{intl.formatMessage({
id: 'common.from',
defaultMessage: 'From',
})}
</Caption>
@@ -56,6 +57,7 @@ export default function HotelChequeCard({
<div className={styles.chequeRow}>
<Caption color="uiTextMediumContrast">
{intl.formatMessage({
id: 'booking.approx',
defaultMessage: 'Approx.',
})}
</Caption>

View File

@@ -56,6 +56,7 @@ export function StandaloneHotelCardDialog({
} = data
const notEnoughPointsLabel = intl.formatMessage({
id: 'booking.notEnoughPoints',
defaultMessage: 'Not enough points',
})
@@ -80,6 +81,7 @@ export function StandaloneHotelCardDialog({
className={styles.closeButton}
onPress={handleClose}
aria-label={intl.formatMessage({
id: 'common.close',
defaultMessage: 'Close',
})}
>
@@ -118,8 +120,14 @@ export function StandaloneHotelCardDialog({
<Typography variant="Body/Supporting text (caption)/smBold">
<p>
{redemptionPrice
? intl.formatMessage({ defaultMessage: 'Available rates' })
: intl.formatMessage({ defaultMessage: 'From' })}
? intl.formatMessage({
id: 'hotelCard.availableRates',
defaultMessage: 'Available rates',
})
: intl.formatMessage({
id: 'common.from',
defaultMessage: 'From',
})}
</p>
</Typography>
{chequePrice ? (
@@ -147,9 +155,9 @@ export function StandaloneHotelCardDialog({
{voucherPrice ? (
<RoomPrice price={voucherPrice} currency={currency} />
) : null}
{/* Show public price if:
1) user is not logged in, or
2) user is logged in but no member price is available (use of booking codes)
{/* Show public price if:
1) user is not logged in, or
2) user is logged in but no member price is available (use of booking codes)
*/}
{publicPrice && (!isUserLoggedIn || !memberPrice) ? (
<RoomPrice price={publicPrice} currency={currency} />
@@ -183,6 +191,7 @@ export function StandaloneHotelCardDialog({
onClick={onClick}
>
{intl.formatMessage({
id: 'common.seeRooms',
defaultMessage: 'See rooms',
})}
</ButtonLink>

View File

@@ -25,7 +25,11 @@ export function HotelPointsRow({
className={styles.roomPrice}
price={pointsPerStay}
currency={
pointsCurrency ?? intl.formatMessage({ defaultMessage: 'Points' })
pointsCurrency ??
intl.formatMessage({
id: 'common.points',
defaultMessage: 'Points',
})
}
includePerNight={false}
>

View File

@@ -43,6 +43,7 @@ export function HotelPriceCard({
<dt>
<Caption color="red">
{intl.formatMessage({
id: 'booking.memberPrice',
defaultMessage: 'Member price',
})}
</Caption>
@@ -53,6 +54,7 @@ export function HotelPriceCard({
<dt>
<Caption color="uiTextHighContrast">
{intl.formatMessage({
id: 'booking.standardPrice',
defaultMessage: 'Standard price',
})}
</Caption>
@@ -66,6 +68,7 @@ export function HotelPriceCard({
color={isMemberPrice ? 'red' : 'uiTextHighContrast'}
>
{intl.formatMessage({
id: 'common.from',
defaultMessage: 'From',
})}
</Caption>
@@ -87,6 +90,7 @@ export function HotelPriceCard({
<span className={styles.perNight}>
/
{intl.formatMessage({
id: 'common.night',
defaultMessage: 'night',
})}
</span>
@@ -99,6 +103,7 @@ export function HotelPriceCard({
<dt>
<Caption color="uiTextMediumContrast">
{intl.formatMessage({
id: 'booking.approx',
defaultMessage: 'Approx.',
})}
</Caption>
@@ -122,6 +127,7 @@ export function HotelPriceCard({
<dt>
<Caption color="uiTextMediumContrast">
{intl.formatMessage({
id: 'common.total',
defaultMessage: 'Total',
})}
</Caption>

View File

@@ -20,6 +20,7 @@ export default function HotelVoucherCard({
<div className={styles.voucherRow}>
<Caption>
{intl.formatMessage({
id: 'common.from',
defaultMessage: 'From',
})}
</Caption>
@@ -30,6 +31,7 @@ export default function HotelVoucherCard({
<Caption color="uiTextHighContrast" className={styles.currency}>
{intl.formatMessage(
{
id: 'price.numberOfVouchers',
defaultMessage:
'{numberOfVouchers, plural, one {Voucher} other {Vouchers}}',
},

View File

@@ -14,6 +14,7 @@ export function NoPriceAvailableCard() {
<Typography variant="Body/Paragraph/mdRegular">
<span>
{intl.formatMessage({
id: 'booking.noRoomsAvailable',
defaultMessage:
'There are no rooms available that match your request.',
})}

View File

@@ -28,7 +28,13 @@ export function RoomPrice({
{includePerNight ? (
<Typography variant="Body/Supporting text (caption)/smRegular">
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
<span>/{intl.formatMessage({ defaultMessage: 'night' })}</span>
<span>
/
{intl.formatMessage({
id: 'common.night',
defaultMessage: 'night',
})}
</span>
</Typography>
) : null}
</p>

View File

@@ -161,6 +161,7 @@ export const HotelCard = memo(
(r) => r.hasEnoughPoints
)
const notEnoughPointsLabel = intl.formatMessage({
id: 'booking.notEnoughPoints',
defaultMessage: 'Not enough points',
})
@@ -207,6 +208,7 @@ export const HotelCard = memo(
href={mapUrl}
keepSearchParams
aria-label={intl.formatMessage({
id: 'destination.seeOnMap',
defaultMessage: 'See on map',
})}
>
@@ -224,6 +226,7 @@ export const HotelCard = memo(
<span>
{intl.formatMessage(
{
id: 'common.kmToCityCenter',
defaultMessage: '{number} km to city center',
},
{
@@ -296,6 +299,7 @@ export const HotelCard = memo(
<div className={styles.pointsCard}>
<Caption>
{intl.formatMessage({
id: 'hotelCard.availableRates',
defaultMessage: 'Available rates',
})}
</Caption>
@@ -325,6 +329,7 @@ export const HotelCard = memo(
<Typography variant="Body/Paragraph/mdBold">
<span>
{intl.formatMessage({
id: 'common.seeRooms',
defaultMessage: 'See rooms',
})}
</span>

View File

@@ -29,10 +29,12 @@ export default function HotelDescription({
}
const textShowMore = intl.formatMessage({
id: 'common.showMore',
defaultMessage: 'Show more',
})
const textShowLess = intl.formatMessage({
id: 'common.showLess',
defaultMessage: 'Show less',
})

View File

@@ -72,6 +72,7 @@ export function HotelInfoCard({
<p className={styles.hotelAddress}>
{intl.formatMessage(
{
id: 'hotelInfoCard.kmToCityCenter',
defaultMessage:
'{address}, {city} ∙ {distanceToCityCenterInKm} km to city center',
},

View File

@@ -81,6 +81,7 @@ function ImageGallery({
className={styles.triggerArea}
onPress={() => setIsOpen(true)}
aria-label={intl.formatMessage({
id: 'imageGallery.openImageGallery',
defaultMessage: 'Open image gallery',
})}
/>

View File

@@ -92,6 +92,7 @@ export default function FullView({
className={styles.closeButton}
onPress={onClose}
aria-label={intl.formatMessage({
id: 'common.close',
defaultMessage: 'Close',
})}
>

View File

@@ -92,6 +92,7 @@ export default function Gallery({
className={styles.closeButton}
onPress={onClose}
aria-label={intl.formatMessage({
id: 'common.close',
defaultMessage: 'Close',
})}
>
@@ -139,6 +140,7 @@ export default function Gallery({
onClick={onImageClick}
tabIndex={0}
aria-label={intl.formatMessage({
id: 'lightbox.openImage',
defaultMessage: 'Open image',
})}
role="button"
@@ -173,6 +175,7 @@ export default function Gallery({
className={styles.imageButton}
onPress={() => onSelectImage(image)}
aria-label={intl.formatMessage({
id: 'lightbox.openImage',
defaultMessage: 'Open image',
})}
>
@@ -202,7 +205,10 @@ export default function Gallery({
>
<ButtonRAC
className={styles.imageButton}
aria-label={intl.formatMessage({ defaultMessage: 'Open image' })}
aria-label={intl.formatMessage({
id: 'lightbox.openImage',
defaultMessage: 'Open image',
})}
onPress={() => {
onSelectImage(image)
onImageClick()

View File

@@ -65,7 +65,10 @@ export function HotelListingMapContent({
null
const pinCurrency = pin.redemptionPrice
? intl.formatMessage({ defaultMessage: 'Points' })
? intl.formatMessage({
id: 'common.points',
defaultMessage: 'Points',
})
: pin.currency
const hotelAdditionalPrice = pin.chequePrice

View File

@@ -71,6 +71,7 @@ export default function PoiMapMarkers({
<span>
{intl.formatMessage(
{
id: 'common.distanceKm',
defaultMessage: '{distanceInKm} km',
},
{

View File

@@ -147,6 +147,7 @@ export function InteractiveMap({
className={styles.zoomButton}
onClick={zoomOut}
aria-label={intl.formatMessage({
id: 'map.zoomOut',
defaultMessage: 'Zoom out',
})}
isDisabled={isMinZoom}
@@ -160,6 +161,7 @@ export function InteractiveMap({
className={styles.zoomButton}
onClick={zoomIn}
aria-label={intl.formatMessage({
id: 'map.zoomIn',
defaultMessage: 'Zoom in',
})}
isDisabled={isMaxZoom}

View File

@@ -89,6 +89,7 @@ function InnerModal({
<Dialog
className={styles.dialog}
aria-label={intl.formatMessage({
id: 'modal.dialog',
defaultMessage: 'Dialog',
})}
>

View File

@@ -38,6 +38,7 @@ export default function AlternateOpeningHours({
<h5 className={styles.heading}>
{intl.formatMessage(
{
id: 'openingHours.alternateOpeningHours',
defaultMessage: 'Alternate opening hours ({name})',
},
{ name: alternateOpeningHours.name }

View File

@@ -8,9 +8,11 @@ export function getGroupedOpeningHours(
intl: IntlShape
): string[] {
const closedMsg = intl.formatMessage({
id: 'openingHours.closed',
defaultMessage: 'Closed',
})
const alwaysOpenMsg = intl.formatMessage({
id: 'openingHours.alwaysOpen',
defaultMessage: 'Always open',
})
@@ -19,42 +21,49 @@ export function getGroupedOpeningHours(
{
key: 'monday',
label: intl.formatMessage({
id: 'common.monday',
defaultMessage: 'Monday',
}),
},
{
key: 'tuesday',
label: intl.formatMessage({
id: 'common.tuesday',
defaultMessage: 'Tuesday',
}),
},
{
key: 'wednesday',
label: intl.formatMessage({
id: 'common.wednesday',
defaultMessage: 'Wednesday',
}),
},
{
key: 'thursday',
label: intl.formatMessage({
id: 'common.thursday',
defaultMessage: 'Thursday',
}),
},
{
key: 'friday',
label: intl.formatMessage({
id: 'common.friday',
defaultMessage: 'Friday',
}),
},
{
key: 'saturday',
label: intl.formatMessage({
id: 'common.saturday',
defaultMessage: 'Saturday',
}),
},
{
key: 'sunday',
label: intl.formatMessage({
id: 'common.sunday',
defaultMessage: 'Sunday',
}),
},
@@ -116,56 +125,69 @@ export function getTranslatedName(name: string, intl: IntlShape) {
switch (lowercaseName) {
case 'breakfast':
return intl.formatMessage({
id: 'common.breakfast',
defaultMessage: 'Breakfast',
})
case 'brunch':
return intl.formatMessage({
id: 'common.brunch',
defaultMessage: 'Brunch',
})
case 'after work':
return intl.formatMessage({
id: 'common.afterwork',
defaultMessage: 'After Work',
})
case 'cafe':
return intl.formatMessage({
id: 'common.cafe',
defaultMessage: 'Cafe',
})
case 'lunch':
return intl.formatMessage({
id: 'common.lunch',
defaultMessage: 'Lunch',
})
case 'dinner':
return intl.formatMessage({
id: 'common.dinner',
defaultMessage: 'Dinner',
})
case 'bar':
return intl.formatMessage({
id: 'common.bar',
defaultMessage: 'Bar',
})
case 'snacks & drinks':
return intl.formatMessage({
id: 'common.snacks&drinks',
defaultMessage: 'Snacks & drinks',
})
case 'takeaway':
return intl.formatMessage({
id: 'common.takeaway',
defaultMessage: 'Takeaway',
})
case 'changes':
return intl.formatMessage({
id: 'common.changes',
defaultMessage: 'Changes',
})
case 'live events':
return intl.formatMessage({
id: 'common.liveEvents',
defaultMessage: 'Live events',
})
case 'terrace':
return intl.formatMessage({
id: 'common.terrace',
defaultMessage: 'Terrace',
})
default:
logger.warn(`Unsupported name given: ${name}`)
return intl.formatMessage({
id: 'common.NA',
defaultMessage: 'N/A',
})
}

View File

@@ -27,9 +27,11 @@ export default function ParkingList({
const intl = useIntl()
const canMakeReservationYesMsg = intl.formatMessage({
id: 'parkingInformation.reservedInAdvanceYes',
defaultMessage: 'Parking can be reserved in advance: Yes',
})
const canMakeReservationNoMsg = intl.formatMessage({
id: 'parkingInformation.reservedInAdvanceNo',
defaultMessage: 'Parking can be reserved in advance: No',
})
@@ -40,6 +42,7 @@ export default function ParkingList({
<li>
{intl.formatMessage(
{
id: 'parkingInformation.numberOfChargingPoints',
defaultMessage:
'Number of charging points for electric cars: {number}',
},
@@ -56,6 +59,7 @@ export default function ParkingList({
<li>
{intl.formatMessage(
{
id: 'parkingInformation.numberOfParkingSpots',
defaultMessage: 'Number of parking spots: {number}',
},
{ number: numberOfParkingSpots }
@@ -66,6 +70,7 @@ export default function ParkingList({
<li>
{intl.formatMessage(
{
id: 'parkingInformation.distanceToHotel',
defaultMessage: 'Distance to hotel: {distanceInM} m',
},
{ distanceInM: distanceToHotel }
@@ -76,6 +81,7 @@ export default function ParkingList({
<li>
{intl.formatMessage(
{
id: 'parkingInformation.address',
defaultMessage: 'Address: {address}',
},
{ address }

View File

@@ -28,7 +28,10 @@ export default function ParkingPrices({
return (
<Typography variant="Body/Paragraph/mdBold">
<p className={styles.wrapper}>
{intl.formatMessage({ defaultMessage: 'Free parking' })}
{intl.formatMessage({
id: 'parkingInformation.freeParking',
defaultMessage: 'Free parking',
})}
</p>
</Typography>
)
@@ -47,6 +50,7 @@ export default function ParkingPrices({
<Typography variant="Body/Paragraph/mdRegular">
<dd>
{intl.formatMessage({
id: 'parkingInformation.atACost',
defaultMessage: 'At a cost',
})}
</dd>
@@ -72,7 +76,12 @@ export default function ParkingPrices({
{startTime && endTime && period !== ParkingPricePeriods.allDay ? (
<Typography variant="Body/Paragraph/mdRegular">
<div className={styles.information}>
<dt>{intl.formatMessage({ defaultMessage: 'From' })}</dt>
<dt>
{intl.formatMessage({
id: 'common.from',
defaultMessage: 'From',
})}
</dt>
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
<dd>{`${startTime}-${endTime}`}</dd>
</div>

View File

@@ -6,18 +6,22 @@ export function getPeriod(intl: IntlShape, period?: string) {
switch (period) {
case ParkingPricePeriods.hour:
return intl.formatMessage({
id: 'parkingInformation.pricePerHour',
defaultMessage: 'Price per hour',
})
case ParkingPricePeriods.day:
return intl.formatMessage({
id: 'parkingInformation.pricePerDay',
defaultMessage: 'Price per day',
})
case ParkingPricePeriods.night:
return intl.formatMessage({
id: 'parkingInformation.pricePerNight',
defaultMessage: 'Price per night',
})
case ParkingPricePeriods.allDay:
return intl.formatMessage({
id: 'parkingInformation.pricePer24Hours',
defaultMessage: 'Price per 24 hours',
})
default:

View File

@@ -42,13 +42,19 @@ export default function ParkingInformation({
<div className={styles.prices}>
<Typography variant="Body/Paragraph/mdBold">
<h5 className={styles.heading}>
{intl.formatMessage({ defaultMessage: 'Prices' })}
{intl.formatMessage({
id: 'parkingInformation.prices',
defaultMessage: 'Prices',
})}
</h5>
</Typography>
<div className={styles.priceWrapper}>
<Typography variant="Title/Overline/sm">
<h6 className={styles.priceHeading}>
{intl.formatMessage({ defaultMessage: 'Weekday prices' })}
{intl.formatMessage({
id: 'parkingInformation.weekdayPrices',
defaultMessage: 'Weekday prices',
})}
</h6>
</Typography>
<Divider />
@@ -63,7 +69,10 @@ export default function ParkingInformation({
<div className={styles.priceWrapper}>
<Typography variant="Title/Overline/sm">
<h6 className={styles.priceHeading}>
{intl.formatMessage({ defaultMessage: 'Weekend prices' })}
{intl.formatMessage({
id: 'parkingInformation.weekendPrices',
defaultMessage: 'Weekend prices',
})}
</h6>
</Typography>
<Divider />
@@ -82,7 +91,10 @@ export default function ParkingInformation({
href={parking.externalParkingUrl}
target="_blank"
>
{intl.formatMessage({ defaultMessage: 'Book parking' })}
{intl.formatMessage({
id: 'parkingInformation.bookParking',
defaultMessage: 'Book parking',
})}
<MaterialIcon icon="open_in_new" color="CurrentColor" />
</ButtonLink>
)}

View File

@@ -68,6 +68,7 @@ export default function SidePeekSelfControlled({
style="Muted"
onPress={() => handleClose(true)}
aria-label={intl.formatMessage({
id: 'common.close',
defaultMessage: 'Close',
})}
>

View File

@@ -41,9 +41,10 @@ export function Toast({ children, message, onClose, variant }: ToastsProps) {
<IconButton
onClick={onClose}
aria-label={intl.formatMessage({
id: 'toast.dismissNotification',
defaultMessage: 'Dismiss notification',
})}
theme={'Black'}
theme="Black"
>
<MaterialIcon icon="close" />
</IconButton>