+ )
+}
diff --git a/components/HotelReservation/SelectRate/RoomSelection/RoomSidePeek/roomSidePeek.module.css b/components/HotelReservation/SelectRate/RoomSelection/RoomSidePeek/roomSidePeek.module.css
new file mode 100644
index 000000000..9197cb152
--- /dev/null
+++ b/components/HotelReservation/SelectRate/RoomSelection/RoomSidePeek/roomSidePeek.module.css
@@ -0,0 +1,29 @@
+.button {
+ margin-left: auto;
+ padding: 0 0 0 var(--Spacing-x-half);
+ text-decoration: none;
+}
+
+.imageContainer {
+ min-height: 185px;
+ position: relative;
+}
+
+.description {
+ margin-top: var(--Spacing-x-one-and-half);
+ margin-bottom: var(--Spacing-x2);
+}
+.facilityList {
+ margin-top: var(--Spacing-x-one-and-half);
+ column-count: 2;
+ column-gap: var(--Spacing-x2);
+}
+.facilityList li {
+ display: flex;
+ gap: var(--Spacing-x1);
+ margin-bottom: var(--Spacing-x-half);
+}
+
+.noIcon {
+ margin-left: var(--Spacing-x4);
+}
diff --git a/components/Icons/Ac.tsx b/components/Icons/Ac.tsx
new file mode 100644
index 000000000..5449112ca
--- /dev/null
+++ b/components/Icons/Ac.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function AcIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Bathtub.tsx b/components/Icons/Bathtub.tsx
new file mode 100644
index 000000000..26ab4ed54
--- /dev/null
+++ b/components/Icons/Bathtub.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function BathtubIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/BedDouble.tsx b/components/Icons/BedDouble.tsx
new file mode 100644
index 000000000..6eb59d7b0
--- /dev/null
+++ b/components/Icons/BedDouble.tsx
@@ -0,0 +1,40 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function BedDoubleIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Chair.tsx b/components/Icons/Chair.tsx
new file mode 100644
index 000000000..d7cdc81a2
--- /dev/null
+++ b/components/Icons/Chair.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function ChairIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/ChevronRightSmall.tsx b/components/Icons/ChevronRightSmall.tsx
index 25fb29002..1b69fd25b 100644
--- a/components/Icons/ChevronRightSmall.tsx
+++ b/components/Icons/ChevronRightSmall.tsx
@@ -18,23 +18,10 @@ export default function ChevronRightSmallIcon({
fill="none"
{...props}
>
-
-
-
-
-
-
+
)
}
diff --git a/components/Icons/City.tsx b/components/Icons/City.tsx
new file mode 100644
index 000000000..791242ade
--- /dev/null
+++ b/components/Icons/City.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function CityIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Desk.tsx b/components/Icons/Desk.tsx
new file mode 100644
index 000000000..de9d79ac6
--- /dev/null
+++ b/components/Icons/Desk.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function DeskIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Hairdryer.tsx b/components/Icons/Hairdryer.tsx
new file mode 100644
index 000000000..4d6ca72b2
--- /dev/null
+++ b/components/Icons/Hairdryer.tsx
@@ -0,0 +1,58 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function HairdryerIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/HandSoap.tsx b/components/Icons/HandSoap.tsx
new file mode 100644
index 000000000..a6850e4fe
--- /dev/null
+++ b/components/Icons/HandSoap.tsx
@@ -0,0 +1,49 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function HandSoapIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Iron.tsx b/components/Icons/Iron.tsx
new file mode 100644
index 000000000..ac2ac4882
--- /dev/null
+++ b/components/Icons/Iron.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function IronIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Mirror.tsx b/components/Icons/Mirror.tsx
new file mode 100644
index 000000000..f7f873a53
--- /dev/null
+++ b/components/Icons/Mirror.tsx
@@ -0,0 +1,25 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function MirrorIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/SafetyBox.tsx b/components/Icons/SafetyBox.tsx
new file mode 100644
index 000000000..2b79a063f
--- /dev/null
+++ b/components/Icons/SafetyBox.tsx
@@ -0,0 +1,46 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function SafetyBoxIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Shower.tsx b/components/Icons/Shower.tsx
new file mode 100644
index 000000000..432b5f346
--- /dev/null
+++ b/components/Icons/Shower.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function ShowerIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/WindowCurtainsAlt.tsx b/components/Icons/WindowCurtainsAlt.tsx
new file mode 100644
index 000000000..f32529566
--- /dev/null
+++ b/components/Icons/WindowCurtainsAlt.tsx
@@ -0,0 +1,40 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function WindowCurtainsAltIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/WindowNotAvailable.tsx b/components/Icons/WindowNotAvailable.tsx
new file mode 100644
index 000000000..f064e146d
--- /dev/null
+++ b/components/Icons/WindowNotAvailable.tsx
@@ -0,0 +1,52 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function WindowNotAvailableIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/WineBar.tsx b/components/Icons/WineBar.tsx
new file mode 100644
index 000000000..a0ae499d1
--- /dev/null
+++ b/components/Icons/WineBar.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function WineBarIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/WoodFloor.tsx b/components/Icons/WoodFloor.tsx
new file mode 100644
index 000000000..e7eaa4f35
--- /dev/null
+++ b/components/Icons/WoodFloor.tsx
@@ -0,0 +1,84 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function WoodFloorIcon({
+ className,
+ color,
+ ...props
+}: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/Yard.tsx b/components/Icons/Yard.tsx
new file mode 100644
index 000000000..9e853b4b0
--- /dev/null
+++ b/components/Icons/Yard.tsx
@@ -0,0 +1,36 @@
+import { iconVariants } from "./variants"
+
+import type { IconProps } from "@/types/components/icon"
+
+export default function YardIcon({ className, color, ...props }: IconProps) {
+ const classNames = iconVariants({ className, color })
+ return (
+
+ )
+}
diff --git a/components/Icons/index.tsx b/components/Icons/index.tsx
index e7547b178..fc7407ce8 100644
--- a/components/Icons/index.tsx
+++ b/components/Icons/index.tsx
@@ -1,3 +1,4 @@
+export { default as AcIcon } from "./Ac"
export { default as AccesoriesIcon } from "./Accesories"
export { default as AccessibilityIcon } from "./Accessibility"
export { default as AccountCircleIcon } from "./AccountCircle"
@@ -5,18 +6,22 @@ export { default as AirIcon } from "./Air"
export { default as AirplaneIcon } from "./Airplane"
export { default as ArrowRightIcon } from "./ArrowRight"
export { default as BarIcon } from "./Bar"
+export { default as BathtubIcon } from "./Bathtub"
+export { default as BedDoubleIcon } from "./BedDouble"
export { default as BikingIcon } from "./Biking"
export { default as BreakfastIcon } from "./Breakfast"
export { default as BusinessIcon } from "./Business"
export { default as CalendarIcon } from "./Calendar"
export { default as CameraIcon } from "./Camera"
export { default as CellphoneIcon } from "./Cellphone"
+export { default as ChairIcon } from "./Chair"
export { default as CheckIcon } from "./Check"
export { default as CheckCircleIcon } from "./CheckCircle"
export { default as ChevronDownIcon } from "./ChevronDown"
export { default as ChevronLeftIcon } from "./ChevronLeft"
export { default as ChevronRightIcon } from "./ChevronRight"
export { default as ChevronRightSmallIcon } from "./ChevronRightSmall"
+export { default as CityIcon } from "./City"
export { default as CloseIcon } from "./Close"
export { default as CloseLargeIcon } from "./CloseLarge"
export { default as CoffeeAltIcon } from "./CoffeeAlt"
@@ -27,6 +32,7 @@ export { default as CreditCard } from "./CreditCard"
export { default as CrossCircle } from "./CrossCircle"
export { default as CulturalIcon } from "./Cultural"
export { default as DeleteIcon } from "./Delete"
+export { default as DeskIcon } from "./Desk"
export { default as DoorOpenIcon } from "./DoorOpen"
export { default as DownloadIcon } from "./Download"
export { default as DresserIcon } from "./Dresser"
@@ -46,6 +52,8 @@ export { default as GiftIcon } from "./Gift"
export { default as GlobeIcon } from "./Globe"
export { default as GolfIcon } from "./Golf"
export { default as GroceriesIcon } from "./Groceries"
+export { default as HairdryerIcon } from "./Hairdryer"
+export { default as HandSoapIcon } from "./HandSoap"
export { default as HangerIcon } from "./Hanger"
export { default as HangerAltIcon } from "./HangerAlt"
export { default as HeartIcon } from "./Heart"
@@ -53,6 +61,8 @@ export { default as HeatIcon } from "./Heat"
export { default as HouseIcon } from "./House"
export { default as ImageIcon } from "./Image"
export { default as InfoCircleIcon } from "./InfoCircle"
+export { default as InstagramIcon } from "./Instagram"
+export { default as IronIcon } from "./Iron"
export { default as KayakingIcon } from "./Kayaking"
export { default as KettleIcon } from "./Kettle"
export { default as KingBedIcon } from "./KingBed"
@@ -63,6 +73,7 @@ export { default as LocationIcon } from "./Location"
export { default as LockIcon } from "./Lock"
export { default as MapIcon } from "./Map"
export { default as MinusIcon } from "./Minus"
+export { default as MirrorIcon } from "./Mirror"
export { default as MuseumIcon } from "./Museum"
export { default as NatureIcon } from "./Nature"
export { default as NightlifeIcon } from "./Nightlife"
@@ -80,11 +91,13 @@ export { default as PriceTagIcon } from "./PriceTag"
export { default as PrinterIcon } from "./Printer"
export { default as RestaurantIcon } from "./Restaurant"
export { default as RoomServiceIcon } from "./RoomService"
+export { default as SafetyBoxIcon } from "./SafetyBox"
export { default as SaunaIcon } from "./Sauna"
export { default as ScandicLogoIcon } from "./ScandicLogo"
export { default as SearchIcon } from "./Search"
export { default as ServiceIcon } from "./Service"
export { default as ShoppingIcon } from "./Shopping"
+export { default as ShowerIcon } from "./Shower"
export { default as SkateboardingIcon } from "./Skateboarding"
export { default as SmokingIcon } from "./Smoking"
export { default as SnowflakeIcon } from "./Snowflake"
@@ -99,3 +112,8 @@ export { default as TshirtWashIcon } from "./TshirtWash"
export { default as TvCastingIcon } from "./TvCasting"
export { default as WarningTriangle } from "./WarningTriangle"
export { default as WifiIcon } from "./Wifi"
+export { default as WindowCurtainsAltIcon } from "./WindowCurtainsAlt"
+export { default as WindowNotAvailableIcon } from "./WindowNotAvailable"
+export { default as WineBarIcon } from "./WineBar"
+export { default as WoodFloorIcon } from "./WoodFloor"
+export { default as YardIcon } from "./Yard"
diff --git a/components/Lightbox/Gallery.tsx b/components/Lightbox/Gallery.tsx
index fa4c94a5a..23149d3de 100644
--- a/components/Lightbox/Gallery.tsx
+++ b/components/Lightbox/Gallery.tsx
@@ -1,6 +1,4 @@
"use client"
-import { DialogTitle } from "@radix-ui/react-dialog"
-import { VisuallyHidden } from "@radix-ui/react-visually-hidden"
import { AnimatePresence, motion } from "framer-motion"
import { ChevronRightIcon } from "@/components/Icons"
@@ -16,7 +14,6 @@ import type { GalleryProps } from "@/types/components/lightbox/lightbox"
export default function Gallery({
images,
- dialogTitle,
onClose,
onSelectImage,
onImageClick,
@@ -57,11 +54,6 @@ export default function Gallery({
{/* Desktop Gallery */}
-
-
- {dialogTitle}
-
-
{mainImage.title && (
diff --git a/components/Lightbox/Lightbox.module.css b/components/Lightbox/Lightbox.module.css
index f5446a2aa..ae46b5a0e 100644
--- a/components/Lightbox/Lightbox.module.css
+++ b/components/Lightbox/Lightbox.module.css
@@ -1,3 +1,13 @@
+@keyframes darken-background {
+ from {
+ background-color: rgba(0, 0, 0, 0);
+ }
+
+ to {
+ background-color: rgba(0, 0, 0, 0.5);
+ }
+}
+
.mobileGallery {
height: 100%;
position: relative;
@@ -33,14 +43,22 @@
position: fixed;
top: 50%;
left: 50%;
- z-index: 10;
+ z-index: var(--lightbox-z-index);
}
.overlay {
position: fixed;
inset: 0;
background-color: rgba(0, 0, 0, 0.5);
- z-index: 10;
+ z-index: var(--lightbox-z-index);
+}
+
+.overlay[data-entering] {
+ animation: darken-background 0.2s;
+}
+
+.overlay[data-exiting] {
+ animation: darken-background 0.2s reverse;
}
.galleryContainer {
diff --git a/components/Lightbox/index.tsx b/components/Lightbox/index.tsx
index b63f10693..f76063848 100644
--- a/components/Lightbox/index.tsx
+++ b/components/Lightbox/index.tsx
@@ -1,7 +1,7 @@
"use client"
-import * as Dialog from "@radix-ui/react-dialog"
import { AnimatePresence, motion } from "framer-motion"
import React, { useState } from "react"
+import { Dialog, Modal, ModalOverlay } from "react-aria-components"
import FullView from "./FullView"
import Gallery from "./Gallery"
@@ -62,20 +62,16 @@ export default function Lightbox({
return (
<>
{triggerElement}
-
-
- {isOpen && (
-
-
-
-
-
+
+
+
+ {isOpen && (
+
-
- )}
-
-
+
+ )}
+
+
+
>
)
}
diff --git a/components/MyPages/Surprises/SurprisesNotification.tsx b/components/MyPages/Surprises/SurprisesNotification.tsx
new file mode 100644
index 000000000..6b71c6703
--- /dev/null
+++ b/components/MyPages/Surprises/SurprisesNotification.tsx
@@ -0,0 +1,247 @@
+"use client"
+
+import { usePathname } from "next/navigation"
+import React, { useState } from "react"
+import { Dialog, Modal, ModalOverlay } from "react-aria-components"
+import { useIntl } from "react-intl"
+
+import { benefits } from "@/constants/routes/myPages"
+import { dt } from "@/lib/dt"
+import { trpc } from "@/lib/trpc/client"
+
+import { ChevronRightSmallIcon, CloseLargeIcon } from "@/components/Icons"
+import Image from "@/components/Image"
+import Button from "@/components/TempDesignSystem/Button"
+import Link from "@/components/TempDesignSystem/Link"
+import Body from "@/components/TempDesignSystem/Text/Body"
+import Caption from "@/components/TempDesignSystem/Text/Caption"
+import Title from "@/components/TempDesignSystem/Text/Title"
+import { toast } from "@/components/TempDesignSystem/Toasts"
+import useLang from "@/hooks/useLang"
+
+import styles from "./surprises.module.css"
+
+import type { SurprisesProps } from "@/types/components/blocks/surprises"
+
+export default function SurprisesNotification({
+ surprises,
+ membershipNumber,
+}: SurprisesProps) {
+ const lang = useLang()
+ const pathname = usePathname()
+ const [open, setOpen] = useState(true)
+ const [selectedSurprise, setSelectedSurprise] = useState(0)
+ const [showSurprises, setShowSurprises] = useState(false)
+ const update = trpc.contentstack.rewards.update.useMutation()
+ const intl = useIntl()
+
+ if (!surprises.length) {
+ return null
+ }
+
+ const surprise = surprises[selectedSurprise]
+
+ function showSurprise(n: number) {
+ setSelectedSurprise((surprise) => surprise + n)
+ }
+
+ function viewRewards() {
+ if (surprise.reward_id) {
+ update.mutate({ id: surprise.reward_id })
+ }
+ }
+
+ function closeModal(close: VoidFunction) {
+ viewRewards()
+ close()
+
+ if (pathname.indexOf(benefits[lang]) !== 0) {
+ toast.success(
+ <>
+ {intl.formatMessage(
+ { id: "Gift(s) added to your benefits" },
+ { amount: surprises.length }
+ )}
+
+
+ {intl.formatMessage({ id: "Go to My Benefits" })}
+
+ >
+ )
+ }
+ }
+
+ return (
+
+
+
+
+
+ )
+}
+
+function Surprise({
+ title,
+ children,
+}: {
+ title?: string
+ children?: React.ReactNode
+}) {
+ return (
+ <>
+
+
+ {title}
+
+
+ {children}
+ >
+ )
+}
diff --git a/components/MyPages/Surprises/index.tsx b/components/MyPages/Surprises/index.tsx
new file mode 100644
index 000000000..131ae2b28
--- /dev/null
+++ b/components/MyPages/Surprises/index.tsx
@@ -0,0 +1,25 @@
+import { getProfile } from "@/lib/trpc/memoizedRequests"
+import { serverClient } from "@/lib/trpc/server"
+
+import SurprisesNotification from "./SurprisesNotification"
+
+export default async function Surprises() {
+ const user = await getProfile()
+
+ if (!user || "error" in user) {
+ return null
+ }
+
+ const surprises = await serverClient().contentstack.rewards.surprises()
+
+ if (!surprises) {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/components/MyPages/Surprises/surprises.module.css b/components/MyPages/Surprises/surprises.module.css
new file mode 100644
index 000000000..4bde7c46d
--- /dev/null
+++ b/components/MyPages/Surprises/surprises.module.css
@@ -0,0 +1,143 @@
+@keyframes modal-fade {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes slide-up {
+ from {
+ transform: translateY(100%);
+ }
+
+ to {
+ transform: translateY(0);
+ }
+}
+
+.overlay {
+ background: rgba(0, 0, 0, 0.5);
+ height: var(--visual-viewport-height);
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ z-index: 100;
+
+ &[data-entering] {
+ animation: modal-fade 200ms;
+ }
+ &[data-exiting] {
+ animation: modal-fade 200ms reverse ease-in;
+ }
+}
+
+@media screen and (min-width: 768px) {
+ .overlay {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+}
+
+.modal {
+ background-color: var(--Base-Surface-Primary-light-Normal);
+ border-radius: var(--Corner-radius-Medium);
+ box-shadow: 0px 4px 24px 0px rgba(38, 32, 30, 0.08);
+ width: 100%;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+
+ &[data-entering] {
+ animation: slide-up 200ms;
+ }
+ &[data-exiting] {
+ animation: slide-up 200ms reverse ease-in-out;
+ }
+}
+
+.dialog {
+ display: flex;
+ flex-direction: column;
+ gap: var(--Spacing-x2);
+ padding-bottom: var(--Spacing-x2);
+}
+
+@media screen and (min-width: 768px) {
+ .modal {
+ left: auto;
+ bottom: auto;
+ width: 400px;
+ }
+}
+
+.top {
+ --button-height: 32px;
+ box-sizing: content-box;
+ display: flex;
+ align-items: center;
+ height: var(--button-height);
+ position: relative;
+ justify-content: center;
+ padding: var(--Spacing-x2) var(--Spacing-x2) 0;
+}
+
+.content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 0 var(--Spacing-x3);
+ gap: var(--Spacing-x2);
+}
+
+.nav {
+ border-top: 1px solid var(--Base-Border-Subtle);
+ display: flex;
+ justify-content: space-between;
+ padding: 0 var(--Spacing-x2);
+ width: 100%;
+}
+
+.nav button {
+ &:nth-child(1) {
+ padding-left: 0;
+ }
+
+ &:nth-child(2) {
+ padding-right: 0;
+ }
+
+ &[disabled] {
+ visibility: hidden;
+ }
+}
+
+.chevron {
+ transform: rotate(180deg);
+}
+
+.badge {
+ padding: var(--Spacing-x1) var(--Spacing-x-one-and-half);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--Spacing-x-half);
+ background-color: var(--Base-Surface-Secondary-light-Normal);
+ border-radius: var(--Corner-radius-Small);
+}
+
+.close {
+ background: none;
+ border: none;
+ cursor: pointer;
+ position: absolute;
+ right: var(--Spacing-x2);
+ width: 32px;
+ height: var(--button-height);
+ display: flex;
+ align-items: center;
+}
diff --git a/components/Sidebar/JoinLoyalty/Contact/contact.module.css b/components/Sidebar/JoinLoyalty/Contact/contact.module.css
index 55234e9d2..72127e707 100644
--- a/components/Sidebar/JoinLoyalty/Contact/contact.module.css
+++ b/components/Sidebar/JoinLoyalty/Contact/contact.module.css
@@ -1,19 +1,29 @@
.contactContainer {
- display: none;
+ border-top: 1px solid var(--UI-Grey-30);
+ display: flex;
+ flex-direction: column;
+ gap: var(--Spacing-x2);
+ justify-content: center;
+ padding-top: var(--Spacing-x2);
+ align-items: center;
+}
+
+.contact {
+ display: grid;
+ gap: var(--Spacing-x-one-and-half);
+}
+
+.contact > div {
+ display: flex;
+ justify-content: center;
}
@media screen and (min-width: 1367px) {
.contactContainer {
- border-top: 1px solid var(--UI-Grey-30);
- display: flex;
- flex-direction: column;
- gap: var(--Spacing-x2);
- justify-content: center;
- padding-top: var(--Spacing-x2);
+ align-items: start;
}
- .contact {
- display: grid;
- gap: var(--Spacing-x-one-and-half);
+ .contact > div {
+ justify-content: start;
}
}
diff --git a/components/TempDesignSystem/Alert/index.tsx b/components/TempDesignSystem/Alert/index.tsx
index 2f1e97b6a..2c511b725 100644
--- a/components/TempDesignSystem/Alert/index.tsx
+++ b/components/TempDesignSystem/Alert/index.tsx
@@ -51,7 +51,7 @@ export default function Alert({
{phoneContact.displayText}
{phoneContact.phoneNumber}
diff --git a/components/TempDesignSystem/SidePeek/sidePeek.module.css b/components/TempDesignSystem/SidePeek/sidePeek.module.css
index 8282166c1..4c2bb9187 100644
--- a/components/TempDesignSystem/SidePeek/sidePeek.module.css
+++ b/components/TempDesignSystem/SidePeek/sidePeek.module.css
@@ -39,7 +39,7 @@
width: 100%;
height: 100vh;
background-color: var(--Base-Background-Primary-Normal);
- z-index: 100;
+ z-index: var(--sidepeek-z-index);
box-shadow: 0 0 10px rgba(0, 0, 0, 0.85);
}
diff --git a/components/TempDesignSystem/Text/Body/body.module.css b/components/TempDesignSystem/Text/Body/body.module.css
index dd9b85156..85b286b3a 100644
--- a/components/TempDesignSystem/Text/Body/body.module.css
+++ b/components/TempDesignSystem/Text/Body/body.module.css
@@ -80,6 +80,10 @@
color: var(--UI-Text-High-contrast);
}
+.baseTextMediumContrast {
+ color: var(--Base-Text-Medium-contrast);
+}
+
.white {
color: var(--UI-Opacity-White-100);
}
diff --git a/components/TempDesignSystem/Text/Body/variants.ts b/components/TempDesignSystem/Text/Body/variants.ts
index 1663e21f0..324d1baef 100644
--- a/components/TempDesignSystem/Text/Body/variants.ts
+++ b/components/TempDesignSystem/Text/Body/variants.ts
@@ -12,6 +12,7 @@ const config = {
pale: styles.pale,
red: styles.red,
textMediumContrast: styles.textMediumContrast,
+ baseTextMediumContrast: styles.baseTextMediumContrast,
textHighContrast: styles.textHighContrast,
white: styles.white,
peach50: styles.peach50,
diff --git a/components/TempDesignSystem/Toasts/index.tsx b/components/TempDesignSystem/Toasts/index.tsx
index df08c6803..f78360a0b 100644
--- a/components/TempDesignSystem/Toasts/index.tsx
+++ b/components/TempDesignSystem/Toasts/index.tsx
@@ -49,7 +49,7 @@ export function Toast({ message, onClose, variant }: ToastsProps) {
}
export const toast = {
- success: (message: string, options?: ExternalToast) =>
+ success: (message: React.ReactNode, options?: ExternalToast) =>
sonnerToast.custom(
(t) => (
+ info: (message: React.ReactNode, options?: ExternalToast) =>
sonnerToast.custom(
(t) => (
+ error: (message: React.ReactNode, options?: ExternalToast) =>
sonnerToast.custom(
(t) => (
+ warning: (message: React.ReactNode, options?: ExternalToast) =>
sonnerToast.custom(
(t) => (
, "color">,
VariantProps {
- message: string
+ message: React.ReactNode
onClose: () => void
}
diff --git a/i18n/dictionaries/da.json b/i18n/dictionaries/da.json
index 88ac5e6b3..ee5954d7d 100644
--- a/i18n/dictionaries/da.json
+++ b/i18n/dictionaries/da.json
@@ -15,15 +15,14 @@
"Already a friend?": "Allerede en ven?",
"Amenities": "Faciliteter",
"Amusement park": "Forlystelsespark",
- "An error occurred. Please try again.": "Der opstod en fejl. Prøv venligst igen.",
"An error occurred trying to manage your preferences, please try again later.": "Der opstod en fejl under forsøget på at administrere dine præferencer. Prøv venligst igen senere.",
"An error occurred when adding a credit card, please try again later.": "Der opstod en fejl under tilføjelse af et kreditkort. Prøv venligst igen senere.",
"An error occurred when trying to update profile.": "Der opstod en fejl under forsøg på at opdatere profilen.",
+ "An error occurred. Please try again.": "Der opstod en fejl. Prøv venligst igen.",
"Any changes you've made will be lost.": "Alle ændringer, du har foretaget, går tabt.",
"Approx.": "Ca.",
"Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?": "Er du sikker på, at du vil fjerne kortet, der slutter me {lastFourDigits} fra din medlemsprofil?",
"Arrival date": "Ankomstdato",
- "as of today": "pr. dags dato",
"As our": "Som vores {level}",
"As our Close Friend": "Som vores nære ven",
"At latest": "Senest",
@@ -36,12 +35,6 @@
"Book": "Book",
"Book reward night": "Book bonusnat",
"Booking number": "Bookingnummer",
- "booking.adults": "{totalAdults, plural, one {# voksen} other {# voksne}}",
- "booking.children": "{totalChildren, plural, one {# barn} other {# børn}}",
- "booking.guests": "Maks {nrOfGuests, plural, one {# gæst} other {# gæster}}",
- "booking.nights": "{totalNights, plural, one {# nat} other {# nætter}}",
- "booking.rooms": "{totalRooms, plural, one {# værelse} other {# værelser}}",
- "booking.terms": "Ved at betale med en af de tilgængelige betalingsmetoder, accepterer jeg vilkårene for denne booking og de generelle Vilkår og betingelser, og forstår, at Scandic vil behandle min personlige data i forbindelse med denne booking i henhold til Scandics Privatlivspolitik. Jeg accepterer, at Scandic kræver et gyldigt kreditkort under min besøg i tilfælde af, at noget er tilbagebetalt.",
"Breakfast": "Morgenmad",
"Breakfast buffet": "Morgenbuffet",
"Breakfast excluded": "Morgenmad ikke inkluderet",
@@ -50,9 +43,7 @@
"Breakfast selection in next step.": "Valg af morgenmad i næste trin.",
"Bus terminal": "Busstation",
"Business": "Forretning",
- "by": "inden",
"Cancel": "Afbestille",
- "characters": "tegn",
"Check in": "Check ind",
"Check out": "Check ud",
"Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.": "Tjek de kreditkort, der er gemt på din profil. Betal med et gemt kort, når du er logget ind for en mere jævn weboplevelse.",
@@ -110,9 +101,9 @@
"Explore all levels and benefits": "Udforsk alle niveauer og fordele",
"Explore nearby": "Udforsk i nærheden",
"Extras to your booking": "Tillæg til din booking",
+ "FAQ": "Ofte stillede spørgsmål",
"Failed to delete credit card, please try again later.": "Kunne ikke slette kreditkort. Prøv venligst igen senere.",
"Fair": "Messe",
- "FAQ": "Ofte stillede spørgsmål",
"Find booking": "Find booking",
"Find hotels": "Find hotel",
"First name": "Fornavn",
@@ -124,11 +115,11 @@
"From": "Fra",
"Get inspired": "Bliv inspireret",
"Get member benefits & offers": "Få medlemsfordele og tilbud",
+ "Gift(s) added to your benefits": "{amount, plural, one {Gave} other {Gaver}} tilføjet til dine fordele",
"Go back to edit": "Gå tilbage til redigering",
"Go back to overview": "Gå tilbage til oversigten",
- "guest": "gæst",
+ "Go to My Benefits": "Gå til ‘Mine fordele’",
"Guest information": "Gæsteinformation",
- "guests": "gæster",
"Guests & Rooms": "Gæster & værelser",
"Hi": "Hei",
"Highest level": "Højeste niveau",
@@ -136,12 +127,10 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotel faciliteter",
"Hotel surroundings": "Hotel omgivelser",
- "hotelPages.rooms.roomCard.person": "person",
- "hotelPages.rooms.roomCard.persons": "personer",
- "hotelPages.rooms.roomCard.seeRoomDetails": "Se værelsesdetaljer",
"Hotels": "Hoteller",
"How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det virker",
+ "Hurry up and use them before they expire!": "Skynd dig og brug dem, før de udløber!",
"I would like to get my booking confirmation via sms": "Jeg vil gerne få min booking bekræftelse via SMS",
"Image gallery": "Billedgalleri",
"In adults bed": "i de voksnes seng",
@@ -149,10 +138,9 @@
"In extra bed": "i ekstra seng",
"Included": "Inkluderet",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Det er ikke muligt at administrere dine kommunikationspræferencer lige nu, prøv venligst igen senere eller kontakt support, hvis problemet fortsætter.",
- "Join at no cost": "Tilmeld dig uden omkostninger",
"Join Scandic Friends": "Tilmeld dig Scandic Friends",
+ "Join at no cost": "Tilmeld dig uden omkostninger",
"King bed": "Kingsize-seng",
- "km to city center": "km til byens centrum",
"Language": "Sprog",
"Last name": "Efternavn",
"Latest searches": "Seneste søgninger",
@@ -172,7 +160,7 @@
"Log in here": "Log ind her",
"Log in/Join": "Log på/Tilmeld dig",
"Log out": "Log ud",
- "lowercase letter": "lille bogstav",
+ "MY SAVED CARDS": "MINE SAVEDE KORT",
"Main menu": "Hovedmenu",
"Manage preferences": "Administrer præferencer",
"Map": "Kort",
@@ -182,9 +170,9 @@
"Member price": "Medlemspris",
"Member price from": "Medlemspris fra",
"Members": "Medlemmer",
- "Membership cards": "Medlemskort",
"Membership ID": "Medlems-id",
"Membership ID copied to clipboard": "Medlems-ID kopieret til udklipsholder",
+ "Membership cards": "Medlemskort",
"Menu": "Menu",
"Modify": "Ændre",
"Month": "Måned",
@@ -194,16 +182,11 @@
"My pages": "Mine sider",
"My pages menu": "Mine sider menu",
"My payment cards": "Mine betalingskort",
- "MY SAVED CARDS": "MINE SAVEDE KORT",
"My wishes": "Mine ønsker",
- "n/a": "n/a",
"Nearby": "I nærheden",
"Nearby companies": "Nærliggende virksomheder",
"New password": "Nyt kodeord",
"Next": "Næste",
- "next level:": "Næste niveau:",
- "night": "nat",
- "nights": "nætter",
"Nights needed to level up": "Nætter nødvendige for at komme i niveau",
"No breakfast": "Ingen morgenmad",
"No content published": "Intet indhold offentliggjort",
@@ -216,14 +199,13 @@
"Nordic Swan Ecolabel": "Svanemærket",
"Not found": "Ikke fundet",
"Nr night, nr adult": "{nights, number} nat, {adults, number} voksen",
- "number": "nummer",
+ "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"On your journey": "På din rejse",
"Open": "Åben",
+ "Open gift(s)": "Åbne {amount, plural, one {gave} other {gaver}}",
"Open language menu": "Åbn sprogmenuen",
"Open menu": "Åbn menuen",
"Open my pages menu": "Åbn mine sider menuen",
- "or": "eller",
- "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"Overview": "Oversigt",
"Parking": "Parkering",
"Parking / Garage": "Parkering / Garage",
@@ -235,13 +217,13 @@
"Phone is required": "Telefonnummer er påkrævet",
"Phone number": "Telefonnummer",
"Please enter a valid phone number": "Indtast venligst et gyldigt telefonnummer",
- "points": "Point",
"Points": "Point",
"Points being calculated": "Point udregnes",
"Points earned prior to May 1, 2021": "Point optjent inden 1. maj 2021",
"Points may take up to 10 days to be displayed.": "Det kan tage op til 10 dage at få vist point.",
"Points needed to level up": "Point nødvendige for at stige i niveau",
"Points needed to stay on level": "Point nødvendige for at holde sig på niveau",
+ "Previous": "Forudgående",
"Previous victories": "Tidligere sejre",
"Proceed to login": "Fortsæt til login",
"Proceed to payment method": "Fortsæt til betalingsmetode",
@@ -297,40 +279,39 @@
"Something went wrong and we couldn't add your card. Please try again later.": "Noget gik galt, og vi kunne ikke tilføje dit kort. Prøv venligst igen senere.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Noget gik galt, og vi kunne ikke fjerne dit kort. Prøv venligst igen senere.",
"Something went wrong!": "Noget gik galt!",
- "special character": "speciel karakter",
- "spendable points expiring by": "{points} Brugbare point udløber den {date}",
"Sports": "Sport",
"Standard price": "Standardpris",
"Street": "Gade",
"Successfully updated profile!": "Profilen er opdateret med succes!",
"Summary": "Opsummering",
+ "Surprise!": "Overraskelse!",
+ "TUI Points": "TUI Points",
"Tell us what information and updates you'd like to receive, and how, by clicking the link below.": "Fortæl os, hvilke oplysninger og opdateringer du gerne vil modtage, og hvordan, ved at klikke på linket nedenfor.",
"Terms and conditions": "Vilkår og betingelser",
"Thank you": "Tak",
"Theatre": "Teater",
"There are no transactions to display": "Der er ingen transaktioner at vise",
"Things nearby HOTEL_NAME": "Ting i nærheden af {hotelName}",
- "to": "til",
- "Total incl VAT": "Inkl. moms",
"Total Points": "Samlet antal point",
+ "Total incl VAT": "Inkl. moms",
"Tourist": "Turist",
"Transaction date": "Overførselsdato",
"Transactions": "Transaktioner",
"Transportations": "Transport",
"Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)",
- "TUI Points": "TUI Points",
"Type of bed": "Sengtype",
"Type of room": "Værelsestype",
- "uppercase letter": "stort bogstav",
"Use bonus cheque": "Brug Bonus Cheque",
"Use code/voucher": "Brug kode/voucher",
"User information": "Brugeroplysninger",
+ "Valid through": "Gyldig igennem",
"View as list": "Vis som liste",
"View as map": "Vis som kort",
"View your booking": "Se din booking",
"Visiting address": "Besøgsadresse",
"We could not add a card right now, please try again later.": "Vi kunne ikke tilføje et kort lige nu. Prøv venligst igen senere.",
"We couldn't find a matching location for your search.": "Vi kunne ikke finde en matchende lokation til din søgning.",
+ "We have a special gift waiting for you!": "Vi har en speciel gave, der venter på dig!",
"We have sent a detailed confirmation of your booking to your email:": "Vi har sendt en detaljeret bekræftelse af din booking til din email:",
"We look forward to your visit!": "Vi ser frem til dit besøg!",
"Weekdays": "Hverdage",
@@ -343,16 +324,18 @@
"Where to": "Hvor",
"Which room class suits you the best?": "Hvilken rumklasse passer bedst til dig",
"Year": "År",
- "Yes, discard changes": "Ja, kasser ændringer",
"Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with": "Ja, jeg accepterer vilkårene for Scandic Friends og forstår, at Scandic vil behandle mine personlige oplysninger i henhold til",
+ "Yes, discard changes": "Ja, kasser ændringer",
"Yes, remove my card": "Ja, fjern mit kort",
"You can always change your mind later and add breakfast at the hotel.": "Du kan altid ombestemme dig senere og tilføje morgenmad på hotellet.",
"You canceled adding a new credit card.": "Du har annulleret tilføjelsen af et nyt kreditkort.",
+ "You have # gifts waiting for you!": "Du har {amount} gaver, der venter på dig!",
"You have no previous stays.": "Du har ingen tidligere ophold.",
"You have no upcoming stays.": "Du har ingen kommende ophold.",
+ "You'll find all your gifts in 'My benefits'": "Du finder alle dine gaver i ‘Mine fordele’",
+ "Your Challenges Conquer & Earn!": "Dine udfordringer Overvind og tjen!",
"Your card was successfully removed!": "Dit kort blev fjernet!",
"Your card was successfully saved!": "Dit kort blev gemt!",
- "Your Challenges Conquer & Earn!": "Dine udfordringer Overvind og tjen!",
"Your current level": "Dit nuværende niveau",
"Your details": "Dine oplysninger",
"Your level": "Dit niveau",
@@ -362,6 +345,36 @@
"Zoo": "Zoo",
"Zoom in": "Zoom ind",
"Zoom out": "Zoom ud",
+ "as of today": "pr. dags dato",
+ "booking.accommodatesUpTo": "Plads til {nrOfGuests, plural, one {# person} other {op til # personer}}",
+ "booking.adults": "{totalAdults, plural, one {# voksen} other {# voksne}}",
+ "booking.children": "{totalChildren, plural, one {# barn} other {# børn}}",
+ "booking.guests": "Maks {nrOfGuests, plural, one {# gæst} other {# gæster}}",
+ "booking.nights": "{totalNights, plural, one {# nat} other {# nætter}}",
+ "booking.rooms": "{totalRooms, plural, one {# værelse} other {# værelser}}",
+ "booking.terms": "Ved at betale med en af de tilgængelige betalingsmetoder, accepterer jeg vilkårene for denne booking og de generelle Vilkår og betingelser, og forstår, at Scandic vil behandle min personlige data i forbindelse med denne booking i henhold til Scandics Privatlivspolitik. Jeg accepterer, at Scandic kræver et gyldigt kreditkort under min besøg i tilfælde af, at noget er tilbagebetalt.",
+ "booking.thisRoomIsEquippedWith": "Dette værelse er udstyret med",
+ "by": "inden",
+ "characters": "tegn",
+ "guest": "gæst",
+ "guests": "gæster",
+ "hotelPages.rooms.roomCard.person": "person",
+ "hotelPages.rooms.roomCard.persons": "personer",
+ "hotelPages.rooms.roomCard.seeRoomDetails": "Se værelsesdetaljer",
+ "km to city center": "km til byens centrum",
+ "lowercase letter": "lille bogstav",
+ "n/a": "n/a",
+ "next level:": "Næste niveau:",
+ "night": "nat",
+ "nights": "nætter",
+ "number": "nummer",
+ "or": "eller",
+ "points": "Point",
+ "special character": "speciel karakter",
+ "spendable points expiring by": "{points} Brugbare point udløber den {date}",
+ "to": "til",
+ "uppercase letter": "stort bogstav",
+ "{amount} out of {total}": "{amount} ud af {total}",
"{amount} {currency}": "{amount} {currency}",
"{difference}{amount} {currency}": "{difference}{amount} {currency}",
"{width} cm × {length} cm": "{width} cm × {length} cm"
diff --git a/i18n/dictionaries/de.json b/i18n/dictionaries/de.json
index 8c3c9e4ce..9eb8bd1ec 100644
--- a/i18n/dictionaries/de.json
+++ b/i18n/dictionaries/de.json
@@ -15,15 +15,14 @@
"Already a friend?": "Sind wir schon Freunde?",
"Amenities": "Annehmlichkeiten",
"Amusement park": "Vergnügungspark",
- "An error occurred. Please try again.": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"An error occurred trying to manage your preferences, please try again later.": "Beim Versuch, Ihre Einstellungen zu verwalten, ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.",
"An error occurred when adding a credit card, please try again later.": "Beim Hinzufügen einer Kreditkarte ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.",
"An error occurred when trying to update profile.": "Beim Versuch, das Profil zu aktualisieren, ist ein Fehler aufgetreten.",
+ "An error occurred. Please try again.": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"Any changes you've made will be lost.": "Alle Änderungen, die Sie vorgenommen haben, gehen verloren.",
"Approx.": "Ca.",
"Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?": "Möchten Sie die Karte mit der Endung {lastFourDigits} wirklich aus Ihrem Mitgliedsprofil entfernen?",
"Arrival date": "Ankunftsdatum",
- "as of today": "Stand heute",
"As our": "Als unser {level}",
"As our Close Friend": "Als unser enger Freund",
"At latest": "Spätestens",
@@ -36,12 +35,6 @@
"Book": "Buchen",
"Book reward night": "Bonusnacht buchen",
"Booking number": "Buchungsnummer",
- "booking.adults": "{totalAdults, plural, one {# erwachsene} other {# erwachsene}}",
- "booking.children": "{totalChildren, plural, one {# kind} other {# kinder}}",
- "booking.guests": "Max {nrOfGuests, plural, one {# gast} other {# gäste}}",
- "booking.nights": "{totalNights, plural, one {# nacht} other {# Nächte}}",
- "booking.rooms": "{totalRooms, plural, one {# zimmer} other {# räume}}",
- "booking.terms": "Ved at betale med en af de tilgængelige betalingsmetoder, accepterer jeg vilkårene for denne booking og de generelle Vilkår og betingelser, og forstår, at Scandic vil behandle min personlige data i forbindelse med denne booking i henhold til Scandics Privatlivspolitik. Jeg accepterer, at Scandic kræver et gyldigt kreditkort under min besøg i tilfælde af, at noget er tilbagebetalt.",
"Breakfast": "Frühstück",
"Breakfast buffet": "Frühstücksbuffet",
"Breakfast excluded": "Frühstück nicht inbegriffen",
@@ -50,9 +43,7 @@
"Breakfast selection in next step.": "Frühstücksauswahl in nächsten Schritt.",
"Bus terminal": "Busbahnhof",
"Business": "Geschäft",
- "by": "bis",
"Cancel": "Stornieren",
- "characters": "figuren",
"Check in": "Einchecken",
"Check out": "Auschecken",
"Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.": "Sehen Sie sich die in Ihrem Profil gespeicherten Kreditkarten an. Bezahlen Sie mit einer gespeicherten Karte, wenn Sie angemeldet sind, für ein reibungsloseres Web-Erlebnis.",
@@ -110,9 +101,9 @@
"Explore all levels and benefits": "Entdecken Sie alle Levels und Vorteile",
"Explore nearby": "Erkunden Sie die Umgebung",
"Extras to your booking": "Extras zu Ihrer Buchung",
+ "FAQ": "Häufig gestellte Fragen",
"Failed to delete credit card, please try again later.": "Kreditkarte konnte nicht gelöscht werden. Bitte versuchen Sie es später noch einmal.",
"Fair": "Messe",
- "FAQ": "Häufig gestellte Fragen",
"Find booking": "Buchung finden",
"Find hotels": "Hotels finden",
"First name": "Vorname",
@@ -124,11 +115,11 @@
"From": "Fromm",
"Get inspired": "Lassen Sie sich inspieren",
"Get member benefits & offers": "Holen Sie sich Vorteile und Angebote für Mitglieder",
+ "Gift(s) added to your benefits": "{amount, plural, one {Geschenk zu Ihren Vorteilen hinzugefügt} other {Geschenke, die zu Ihren Vorteilen hinzugefügt werden}}",
"Go back to edit": "Zurück zum Bearbeiten",
"Go back to overview": "Zurück zur Übersicht",
- "guest": "gast",
+ "Go to My Benefits": "Gehen Sie zu „Meine Vorteile“",
"Guest information": "Informationen für Gäste",
- "guests": "gäste",
"Guests & Rooms": "Gäste & Zimmer",
"Hi": "Hallo",
"Highest level": "Höchstes Level",
@@ -136,12 +127,10 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotel-Infos",
"Hotel surroundings": "Umgebung des Hotels",
- "hotelPages.rooms.roomCard.person": "person",
- "hotelPages.rooms.roomCard.persons": "personen",
- "hotelPages.rooms.roomCard.seeRoomDetails": "Zimmerdetails ansehen",
"Hotels": "Hotels",
"How do you want to sleep?": "Wie möchtest du schlafen?",
"How it works": "Wie es funktioniert",
+ "Hurry up and use them before they expire!": "Beeilen Sie sich und nutzen Sie sie, bevor sie ablaufen!",
"I would like to get my booking confirmation via sms": "Ich möchte meine Buchungsbestätigung per SMS erhalten",
"Image gallery": "Bildergalerie",
"In adults bed": "Im Bett der Eltern",
@@ -149,10 +138,9 @@
"In extra bed": "im zusätzlichen Bett",
"Included": "Iinklusive",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Es ist derzeit nicht möglich, Ihre Kommunikationseinstellungen zu verwalten. Bitte versuchen Sie es später erneut oder wenden Sie sich an den Support, wenn das Problem weiterhin besteht.",
- "Join at no cost": "Kostenlos beitreten",
"Join Scandic Friends": "Treten Sie Scandic Friends bei",
+ "Join at no cost": "Kostenlos beitreten",
"King bed": "Kingsize-Bett",
- "km to city center": "km bis zum Stadtzentrum",
"Language": "Sprache",
"Last name": "Nachname",
"Latest searches": "Letzte Suchanfragen",
@@ -172,7 +160,7 @@
"Log in here": "Hier einloggen",
"Log in/Join": "Log in/Anmelden",
"Log out": "Ausloggen",
- "lowercase letter": "Kleinbuchstabe",
+ "MY SAVED CARDS": "MEINE SAVEDEN KARTEN",
"Main menu": "Hauptmenü",
"Manage preferences": "Verwalten von Voreinstellungen",
"Map": "Karte",
@@ -182,9 +170,9 @@
"Member price": "Mitgliederpreis",
"Member price from": "Mitgliederpreis ab",
"Members": "Mitglieder",
- "Membership cards": "Mitgliedskarten",
"Membership ID": "Mitglieds-ID",
"Membership ID copied to clipboard": "Mitglieds-ID in die Zwischenablage kopiert",
+ "Membership cards": "Mitgliedskarten",
"Menu": "Menu",
"Modify": "Ändern",
"Month": "Monat",
@@ -194,16 +182,11 @@
"My pages": "Meine Seiten",
"My pages menu": "Meine Seite Menü",
"My payment cards": "Meine Zahlungskarten",
- "MY SAVED CARDS": "MEINE SAVEDEN KARTEN",
"My wishes": "Meine Wünsche",
- "n/a": "n/a",
"Nearby": "In der Nähe",
"Nearby companies": "Nahe gelegene Unternehmen",
"New password": "Neues Kennwort",
"Next": "Nächste",
- "next level:": "Nächstes Level:",
- "night": "nacht",
- "nights": "Nächte",
"Nights needed to level up": "Nächte, die zum Levelaufstieg benötigt werden",
"No breakfast": "Kein Frühstück",
"No content published": "Kein Inhalt veröffentlicht",
@@ -216,14 +199,13 @@
"Nordic Swan Ecolabel": "Nordic Swan Ecolabel",
"Not found": "Nicht gefunden",
"Nr night, nr adult": "{nights, number} Nacht, {adults, number} Erwachsener",
- "number": "nummer",
+ "OTHER PAYMENT METHODS": "ANDERE BEZAHLMETHODE",
"On your journey": "Auf deiner Reise",
"Open": "Offen",
+ "Open gift(s)": "{amount, plural, one {Geschenk} other {Geschenke}} öffnen",
"Open language menu": "Sprachmenü öffnen",
"Open menu": "Menü öffnen",
"Open my pages menu": "Meine Seiten Menü öffnen",
- "or": "oder",
- "OTHER PAYMENT METHODS": "ANDERE BEZAHLMETHODE",
"Overview": "Übersicht",
"Parking": "Parken",
"Parking / Garage": "Parken / Garage",
@@ -235,13 +217,13 @@
"Phone is required": "Telefon ist erforderlich",
"Phone number": "Telefonnummer",
"Please enter a valid phone number": "Bitte geben Sie eine gültige Telefonnummer ein",
- "points": "Punkte",
"Points": "Punkte",
"Points being calculated": "Punkte werden berechnet",
"Points earned prior to May 1, 2021": "Zusammengeführte Punkte vor dem 1. Mai 2021",
"Points may take up to 10 days to be displayed.": "Es kann bis zu 10 Tage dauern, bis Punkte angezeigt werden.",
"Points needed to level up": "Punkte, die zum Levelaufstieg benötigt werden",
"Points needed to stay on level": "Erforderliche Punkte, um auf diesem Level zu bleiben",
+ "Previous": "Früher",
"Previous victories": "Bisherige Siege",
"Proceed to login": "Weiter zum Login",
"Proceed to payment method": "Weiter zur Zahlungsmethode",
@@ -297,40 +279,39 @@
"Something went wrong and we couldn't add your card. Please try again later.": "Ein Fehler ist aufgetreten und wir konnten Ihre Karte nicht hinzufügen. Bitte versuchen Sie es später erneut.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Ein Fehler ist aufgetreten und wir konnten Ihre Karte nicht entfernen. Bitte versuchen Sie es später noch einmal.",
"Something went wrong!": "Etwas ist schief gelaufen!",
- "special character": "sonderzeichen",
- "spendable points expiring by": "{points} Einlösbare punkte verfallen bis zum {date}",
"Sports": "Sport",
"Standard price": "Standardpreis",
"Street": "Straße",
"Successfully updated profile!": "Profil erfolgreich aktualisiert!",
"Summary": "Zusammenfassung",
+ "Surprise!": "Überraschung!",
+ "TUI Points": "TUI Points",
"Tell us what information and updates you'd like to receive, and how, by clicking the link below.": "Teilen Sie uns mit, welche Informationen und Updates Sie wie erhalten möchten, indem Sie auf den unten stehenden Link klicken.",
"Terms and conditions": "Geschäftsbedingungen",
"Thank you": "Danke",
"Theatre": "Theater",
"There are no transactions to display": "Es sind keine Transaktionen zum Anzeigen vorhanden",
"Things nearby HOTEL_NAME": "Dinge in der Nähe von {hotelName}",
- "to": "zu",
- "Total incl VAT": "Gesamt inkl. MwSt.",
"Total Points": "Gesamtpunktzahl",
+ "Total incl VAT": "Gesamt inkl. MwSt.",
"Tourist": "Tourist",
"Transaction date": "Transaktionsdatum",
"Transactions": "Transaktionen",
"Transportations": "Transportmittel",
"Tripadvisor reviews": "{rating} ({count} Bewertungen auf Tripadvisor)",
- "TUI Points": "TUI Points",
"Type of bed": "Bettentyp",
"Type of room": "Zimmerart",
- "uppercase letter": "großbuchstabe",
"Use bonus cheque": "Bonusscheck nutzen",
"Use code/voucher": "Code/Gutschein nutzen",
"User information": "Nutzerinformation",
+ "Valid through": "Gültig bis",
"View as list": "Als Liste anzeigen",
"View as map": "Als Karte anzeigen",
"View your booking": "Ihre Buchung ansehen",
"Visiting address": "Besuchsadresse",
"We could not add a card right now, please try again later.": "Wir konnten momentan keine Karte hinzufügen. Bitte versuchen Sie es später noch einmal.",
"We couldn't find a matching location for your search.": "Wir konnten keinen passenden Standort für Ihre Suche finden.",
+ "We have a special gift waiting for you!": "Wir haben ein besonderes Geschenk für Sie!",
"We have sent a detailed confirmation of your booking to your email:": "Wir haben eine detaillierte Bestätigung Ihrer Buchung an Ihre E-Mail gesendet:",
"We look forward to your visit!": "Wir freuen uns auf Ihren Besuch!",
"Weekdays": "Wochentage",
@@ -343,16 +324,18 @@
"Where to": "Wohin",
"Which room class suits you the best?": "Welche Zimmerklasse passt am besten zu Ihnen?",
"Year": "Jahr",
- "Yes, discard changes": "Ja, Änderungen verwerfen",
"Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with": "Ja, ich akzeptiere die Geschäftsbedingungen für Scandic Friends und erkenne an, dass Scandic meine persönlichen Daten in Übereinstimmung mit",
+ "Yes, discard changes": "Ja, Änderungen verwerfen",
"Yes, remove my card": "Ja, meine Karte entfernen",
"You can always change your mind later and add breakfast at the hotel.": "Sie können es sich später jederzeit anders überlegen und das Frühstück im Hotel hinzufügen.",
"You canceled adding a new credit card.": "Sie haben das Hinzufügen einer neuen Kreditkarte abgebrochen.",
+ "You have # gifts waiting for you!": "Es warten {amount} Geschenke auf Sie!",
"You have no previous stays.": "Sie haben keine vorherigen Aufenthalte.",
"You have no upcoming stays.": "Sie haben keine bevorstehenden Aufenthalte.",
+ "You'll find all your gifts in 'My benefits'": "Alle Ihre Geschenke finden Sie unter „Meine Vorteile“",
+ "Your Challenges Conquer & Earn!": "Meistern Sie Ihre Herausforderungen und verdienen Sie Geld!",
"Your card was successfully removed!": "Ihre Karte wurde erfolgreich entfernt!",
"Your card was successfully saved!": "Ihre Karte wurde erfolgreich gespeichert!",
- "Your Challenges Conquer & Earn!": "Meistern Sie Ihre Herausforderungen und verdienen Sie Geld!",
"Your current level": "Ihr aktuelles Level",
"Your details": "Ihre Angaben",
"Your level": "Dein level",
@@ -362,6 +345,36 @@
"Zoo": "Zoo",
"Zoom in": "Vergrößern",
"Zoom out": "Verkleinern",
+ "as of today": "Stand heute",
+ "booking.accommodatesUpTo": "Bietet Platz für {nrOfGuests, plural, one {# Person } other {bis zu # Personen}}",
+ "booking.adults": "{totalAdults, plural, one {# erwachsene} other {# erwachsene}}",
+ "booking.children": "{totalChildren, plural, one {# kind} other {# kinder}}",
+ "booking.guests": "Max {nrOfGuests, plural, one {# gast} other {# gäste}}",
+ "booking.nights": "{totalNights, plural, one {# nacht} other {# Nächte}}",
+ "booking.rooms": "{totalRooms, plural, one {# zimmer} other {# räume}}",
+ "booking.terms": "Ved at betale med en af de tilgængelige betalingsmetoder, accepterer jeg vilkårene for denne booking og de generelle Vilkår og betingelser, og forstår, at Scandic vil behandle min personlige data i forbindelse med denne booking i henhold til Scandics Privatlivspolitik. Jeg accepterer, at Scandic kræver et gyldigt kreditkort under min besøg i tilfælde af, at noget er tilbagebetalt.",
+ "booking.thisRoomIsEquippedWith": "Dieses Zimmer ist ausgestattet mit",
+ "by": "bis",
+ "characters": "figuren",
+ "guest": "gast",
+ "guests": "gäste",
+ "hotelPages.rooms.roomCard.person": "person",
+ "hotelPages.rooms.roomCard.persons": "personen",
+ "hotelPages.rooms.roomCard.seeRoomDetails": "Zimmerdetails ansehen",
+ "km to city center": "km bis zum Stadtzentrum",
+ "lowercase letter": "Kleinbuchstabe",
+ "n/a": "n/a",
+ "next level:": "Nächstes Level:",
+ "night": "nacht",
+ "nights": "Nächte",
+ "number": "nummer",
+ "or": "oder",
+ "points": "Punkte",
+ "special character": "sonderzeichen",
+ "spendable points expiring by": "{points} Einlösbare punkte verfallen bis zum {date}",
+ "to": "zu",
+ "uppercase letter": "großbuchstabe",
+ "{amount} out of {total}": "{amount} von {total}",
"{amount} {currency}": "{amount} {currency}",
"{difference}{amount} {currency}": "{difference}{amount} {currency}",
"{width} cm × {length} cm": "{width} cm × {length} cm"
diff --git a/i18n/dictionaries/en.json b/i18n/dictionaries/en.json
index 3500a8d01..f40909ac9 100644
--- a/i18n/dictionaries/en.json
+++ b/i18n/dictionaries/en.json
@@ -125,8 +125,10 @@
"From": "From",
"Get inspired": "Get inspired",
"Get member benefits & offers": "Get member benefits & offers",
+ "Gift(s) added to your benefits": "{amount, plural, one {Gift} other {Gifts}} added to your benefits",
"Go back to edit": "Go back to edit",
"Go back to overview": "Go back to overview",
+ "Go to My Benefits": "Go to My Benefits",
"Guest": "Guest",
"Guest information": "Guest information",
"Guests & Rooms": "Guests & Rooms",
@@ -139,6 +141,7 @@
"Hotels": "Hotels",
"How do you want to sleep?": "How do you want to sleep?",
"How it works": "How it works",
+ "Hurry up and use them before they expire!": "Hurry up and use them before they expire!",
"I would like to get my booking confirmation via sms": "I would like to get my booking confirmation via sms",
"Image gallery": "Image gallery",
"In adults bed": "In adults bed",
@@ -210,6 +213,7 @@
"OTHER PAYMENT METHODS": "OTHER PAYMENT METHODS",
"On your journey": "On your journey",
"Open": "Open",
+ "Open gift(s)": "Open {amount, plural, one {gift} other {gifts}}",
"Open language menu": "Open language menu",
"Open menu": "Open menu",
"Open my pages menu": "Open my pages menu",
@@ -231,6 +235,7 @@
"Points may take up to 10 days to be displayed.": "Points may take up to 10 days to be displayed.",
"Points needed to level up": "Points needed to level up",
"Points needed to stay on level": "Points needed to stay on level",
+ "Previous": "Previous",
"Previous victories": "Previous victories",
"Print confirmation": "Print confirmation",
"Proceed to login": "Proceed to login",
@@ -294,6 +299,7 @@
"Street": "Street",
"Successfully updated profile!": "Successfully updated profile!",
"Summary": "Summary",
+ "Surprise!": "Surprise!",
"TUI Points": "TUI Points",
"Tell us what information and updates you'd like to receive, and how, by clicking the link below.": "Tell us what information and updates you'd like to receive, and how, by clicking the link below.",
"Terms and conditions": "Terms and conditions",
@@ -315,12 +321,14 @@
"Use code/voucher": "Use code/voucher",
"User information": "User information",
"VAT": "VAT",
+ "Valid through": "Valid through",
"View as list": "View as list",
"View as map": "View as map",
"View your booking": "View your booking",
"Visiting address": "Visiting address",
"We could not add a card right now, please try again later.": "We could not add a card right now, please try again later.",
"We couldn't find a matching location for your search.": "We couldn't find a matching location for your search.",
+ "We have a special gift waiting for you!": "We have a special gift waiting for you!",
"We have sent a detailed confirmation of your booking to your email:": "We have sent a detailed confirmation of your booking to your email: ",
"We look forward to your visit!": "We look forward to your visit!",
"Weekdays": "Weekdays",
@@ -338,8 +346,10 @@
"Yes, remove my card": "Yes, remove my card",
"You can always change your mind later and add breakfast at the hotel.": "You can always change your mind later and add breakfast at the hotel.",
"You canceled adding a new credit card.": "You canceled adding a new credit card.",
+ "You have # gifts waiting for you!": "You have {amount} gifts waiting for you!",
"You have no previous stays.": "You have no previous stays.",
"You have no upcoming stays.": "You have no upcoming stays.",
+ "You'll find all your gifts in 'My benefits'": "You’ll find all your gifts in ‘My benefits’",
"Your Challenges Conquer & Earn!": "Your Challenges Conquer & Earn!",
"Your card was successfully removed!": "Your card was successfully removed!",
"Your card was successfully saved!": "Your card was successfully saved!",
@@ -354,6 +364,7 @@
"Zoom in": "Zoom in",
"Zoom out": "Zoom out",
"as of today": "as of today",
+ "booking.accommodatesUpTo": "Accommodates up to {nrOfGuests, plural, one {# person} other {# people}}",
"booking.adults": "{totalAdults, plural, one {# adult} other {# adults}}",
"booking.children": "{totalChildren, plural, one {# child} other {# children}}",
"booking.confirmation.text": "Thank you for booking with us! We look forward to welcoming you and hope you have a pleasant stay. If you have any questions or need to make changes to your reservation, please email us.",
@@ -362,6 +373,7 @@
"booking.nights": "{totalNights, plural, one {# night} other {# nights}}",
"booking.rooms": "{totalRooms, plural, one {# room} other {# rooms}}",
"booking.terms": "By paying with any of the payment methods available, I accept the terms for this booking and the general Terms & Conditions, and understand that Scandic will process my personal data for this booking in accordance with Scandic's Privacy policy. I also accept that Scandic require a valid credit card during my visit in case anything is left unpaid.",
+ "booking.thisRoomIsEquippedWith": "This room is equipped with",
"by": "by",
"characters": "characters",
"from": "from",
@@ -384,8 +396,9 @@
"spendable points expiring by": "{points} spendable points expiring by {date}",
"to": "to",
"uppercase letter": "uppercase letter",
+ "{amount} out of {total}": "{amount} out of {total}",
"{amount} {currency}": "{amount} {currency}",
"{card} ending with {cardno}": "{card} ending with {cardno}",
"{difference}{amount} {currency}": "{difference}{amount} {currency}",
"{width} cm × {length} cm": "{width} cm × {length} cm"
-}
\ No newline at end of file
+}
diff --git a/i18n/dictionaries/fi.json b/i18n/dictionaries/fi.json
index ddb3b80fa..b44c6755d 100644
--- a/i18n/dictionaries/fi.json
+++ b/i18n/dictionaries/fi.json
@@ -15,15 +15,14 @@
"Already a friend?": "Oletko jo ystävä?",
"Amenities": "Mukavuudet",
"Amusement park": "Huvipuisto",
- "An error occurred. Please try again.": "Tapahtui virhe. Yritä uudelleen.",
"An error occurred trying to manage your preferences, please try again later.": "Asetusten hallinnassa tapahtui virhe. Yritä myöhemmin uudelleen.",
"An error occurred when adding a credit card, please try again later.": "Luottokorttia lisättäessä tapahtui virhe. Yritä myöhemmin uudelleen.",
"An error occurred when trying to update profile.": "Profiilia päivitettäessä tapahtui virhe.",
+ "An error occurred. Please try again.": "Tapahtui virhe. Yritä uudelleen.",
"Any changes you've made will be lost.": "Kaikki tekemäsi muutokset menetetään.",
"Approx.": "N.",
"Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?": "Haluatko varmasti poistaa kortin, joka päättyy numeroon {lastFourDigits} jäsenprofiilistasi?",
"Arrival date": "Saapumispäivä",
- "as of today": "tänään",
"As our": "{level}-etu",
"As our Close Friend": "Läheisenä ystävänämme",
"At latest": "Viimeistään",
@@ -36,12 +35,6 @@
"Book": "Varaa",
"Book reward night": "Kirjapalkinto-ilta",
"Booking number": "Varausnumero",
- "booking.adults": "{totalAdults, plural, one {# aikuinen} other {# aikuiset}}",
- "booking.children": "{totalChildren, plural, one {# lapsi} other {# lasta}}",
- "booking.guests": "Max {nrOfGuests, plural, one {# vieras} other {# vieraita}}",
- "booking.nights": "{totalNights, plural, one {# yö} other {# yötä}}",
- "booking.rooms": "{totalRooms, plural, one {# huone} other {# sviitti}}",
- "booking.terms": "Maksamalla minkä tahansa saatavilla olevan maksutavan avulla hyväksyn tämän varauksen ehdot ja yleiset ehdot ja ehtoja, ja ymmärrän, että Scandic käsittelee minun henkilötietoni tässä varauksessa mukaisesti Scandicin tietosuojavaltuuden mukaisesti. Hyväksyn myös, että Scandic vaatii validin luottokortin majoituksen ajan, jos jokin jää maksamatta.",
"Breakfast": "Aamiainen",
"Breakfast buffet": "Aamiaisbuffet",
"Breakfast excluded": "Aamiainen ei sisälly",
@@ -50,9 +43,7 @@
"Breakfast selection in next step.": "Aamiaisvalinta seuraavassa vaiheessa.",
"Bus terminal": "Bussiasema",
"Business": "Business",
- "by": "mennessä",
"Cancel": "Peruuttaa",
- "characters": "hahmoja",
"Check in": "Sisäänkirjautuminen",
"Check out": "Uloskirjautuminen",
"Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.": "Tarkista profiiliisi tallennetut luottokortit. Maksa tallennetulla kortilla kirjautuneena, jotta verkkokokemus on sujuvampi.",
@@ -110,9 +101,9 @@
"Explore all levels and benefits": "Tutustu kaikkiin tasoihin ja etuihin",
"Explore nearby": "Tutustu lähialueeseen",
"Extras to your booking": "Varauksessa lisäpalveluita",
+ "FAQ": "UKK",
"Failed to delete credit card, please try again later.": "Luottokortin poistaminen epäonnistui, yritä myöhemmin uudelleen.",
"Fair": "Messukeskus",
- "FAQ": "UKK",
"Find booking": "Etsi varaus",
"Find hotels": "Etsi hotelleja",
"First name": "Etunimi",
@@ -124,11 +115,11 @@
"From": "From",
"Get inspired": "Inspiroidu",
"Get member benefits & offers": "Hanki jäsenetuja ja -tarjouksia",
+ "Gift(s) added to your benefits": "{amount, plural, one {Lahja} other {Lahjat}} lisätty etuusi",
"Go back to edit": "Palaa muokkaamaan",
"Go back to overview": "Palaa yleiskatsaukseen",
- "guest": "Vieras",
+ "Go to My Benefits": "Siirry kohtaan ‘Omat edut’",
"Guest information": "Vieraan tiedot",
- "guests": "Vieraita",
"Guests & Rooms": "Vieraat & Huoneet",
"Hi": "Hi",
"Highest level": "Korkein taso",
@@ -136,12 +127,10 @@
"Hotel": "Hotelli",
"Hotel facilities": "Hotellin palvelut",
"Hotel surroundings": "Hotellin ympäristö",
- "hotelPages.rooms.roomCard.person": "henkilö",
- "hotelPages.rooms.roomCard.persons": "Henkilöä",
- "hotelPages.rooms.roomCard.seeRoomDetails": "Katso huoneen tiedot",
"Hotels": "Hotellit",
"How do you want to sleep?": "Kuinka haluat nukkua?",
"How it works": "Kuinka se toimii",
+ "Hurry up and use them before they expire!": "Ole nopea ja käytä ne ennen kuin ne vanhenevat!",
"I would like to get my booking confirmation via sms": "Haluan saada varauksen vahvistuksen SMS-viestillä",
"Image gallery": "Kuvagalleria",
"In adults bed": "Aikuisten vuoteessa",
@@ -149,10 +138,9 @@
"In extra bed": "Oma vuodepaikka",
"Included": "Sisälly hintaan",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Viestintäasetuksiasi ei voi hallita juuri nyt. Yritä myöhemmin uudelleen tai ota yhteyttä tukeen, jos ongelma jatkuu.",
- "Join at no cost": "Liity maksutta",
"Join Scandic Friends": "Liity jäseneksi",
+ "Join at no cost": "Liity maksutta",
"King bed": "King-vuode",
- "km to city center": "km keskustaan",
"Language": "Kieli",
"Last name": "Sukunimi",
"Latest searches": "Viimeisimmät haut",
@@ -172,7 +160,7 @@
"Log in here": "Kirjaudu sisään",
"Log in/Join": "Kirjaudu sisään/Liittyä",
"Log out": "Kirjaudu ulos",
- "lowercase letter": "pien kirjain",
+ "MY SAVED CARDS": "MINUN SAVED CARDS",
"Main menu": "Päävalikko",
"Manage preferences": "Asetusten hallinta",
"Map": "Kartta",
@@ -182,9 +170,9 @@
"Member price": "Jäsenhinta",
"Member price from": "Jäsenhinta alkaen",
"Members": "Jäsenet",
- "Membership cards": "Jäsenkortit",
"Membership ID": "Jäsentunnus",
"Membership ID copied to clipboard": "Jäsenyystunnus kopioitu leikepöydälle",
+ "Membership cards": "Jäsenkortit",
"Menu": "Valikko",
"Modify": "Muokkaa",
"Month": "Kuukausi",
@@ -194,16 +182,11 @@
"My pages": "Omat sivut",
"My pages menu": "Omat sivut -valikko",
"My payment cards": "Minun maksukortit",
- "MY SAVED CARDS": "MINUN SAVED CARDS",
"My wishes": "Toiveeni",
- "n/a": "n/a",
"Nearby": "Lähistöllä",
"Nearby companies": "Läheiset yritykset",
"New password": "Uusi salasana",
"Next": "Seuraava",
- "next level:": "pistettä tasolle:",
- "night": "yö",
- "nights": "yötä",
"Nights needed to level up": "Yöt, joita tarvitaan tasolle",
"No breakfast": "Ei aamiaista",
"No content published": "Ei julkaistua sisältöä",
@@ -216,14 +199,13 @@
"Nordic Swan Ecolabel": "Ympäristömerkki Miljömärkt",
"Not found": "Ei löydetty",
"Nr night, nr adult": "{nights, number} yö, {adults, number} aikuinen",
- "number": "määrä",
+ "OTHER PAYMENT METHODS": "MUISE KORT",
"On your journey": "Matkallasi",
"Open": "Avata",
+ "Open gift(s)": "{amount, plural, one {Avoin lahja} other {Avoimet lahjat}}",
"Open language menu": "Avaa kielivalikko",
"Open menu": "Avaa valikko",
"Open my pages menu": "Avaa omat sivut -valikko",
- "or": "tai",
- "OTHER PAYMENT METHODS": "MUISE KORT",
"Overview": "Yleiskatsaus",
"Parking": "Pysäköinti",
"Parking / Garage": "Pysäköinti / Autotalli",
@@ -235,13 +217,13 @@
"Phone is required": "Puhelin vaaditaan",
"Phone number": "Puhelinnumero",
"Please enter a valid phone number": "Ole hyvä ja näppäile voimassaoleva puhelinnumero",
- "points": "pistettä",
"Points": "Pisteet",
"Points being calculated": "Pisteitä lasketaan",
"Points earned prior to May 1, 2021": "Pisteet, jotka ansaittu ennen 1.5.2021",
"Points may take up to 10 days to be displayed.": "Pisteiden näyttäminen voi kestää jopa 10 päivää.",
"Points needed to level up": "Tarvitset vielä",
"Points needed to stay on level": "Tällä tasolla pysymiseen tarvittavat pisteet",
+ "Previous": "Aikaisempi",
"Previous victories": "Edelliset voitot",
"Proceed to login": "Jatka kirjautumiseen",
"Proceed to payment method": "Siirry maksutavalle",
@@ -298,40 +280,39 @@
"Something went wrong and we couldn't add your card. Please try again later.": "Jotain meni pieleen, emmekä voineet lisätä korttiasi. Yritä myöhemmin uudelleen.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Jotain meni pieleen, emmekä voineet poistaa korttiasi. Yritä myöhemmin uudelleen.",
"Something went wrong!": "Jotain meni pieleen!",
- "special character": "erikoishahmo",
- "spendable points expiring by": "{points} pistettä vanhenee {date} mennessä",
"Sports": "Urheilu",
"Standard price": "Normaali hinta",
"Street": "Katu",
"Successfully updated profile!": "Profiilin päivitys onnistui!",
"Summary": "Yhteenveto",
+ "Surprise!": "Yllätys!",
+ "TUI Points": "TUI Points",
"Tell us what information and updates you'd like to receive, and how, by clicking the link below.": "Kerro meille, mitä tietoja ja päivityksiä haluat saada ja miten, napsauttamalla alla olevaa linkkiä.",
"Terms and conditions": "Käyttöehdot",
"Thank you": "Kiitos",
"Theatre": "Teatteri",
"There are no transactions to display": "Näytettäviä tapahtumia ei ole",
"Things nearby HOTEL_NAME": "Lähellä olevia asioita {hotelName}",
- "to": "to",
- "Total incl VAT": "Yhteensä sis. alv",
"Total Points": "Kokonaispisteet",
+ "Total incl VAT": "Yhteensä sis. alv",
"Tourist": "Turisti",
"Transaction date": "Tapahtuman päivämäärä",
"Transactions": "Tapahtumat",
"Transportations": "Kuljetukset",
"Tripadvisor reviews": "{rating} ({count} arvostelua TripAdvisorissa)",
- "TUI Points": "TUI Points",
"Type of bed": "Vuodetyyppi",
"Type of room": "Huonetyyppi",
- "uppercase letter": "iso kirjain",
"Use bonus cheque": "Käytä bonussekkiä",
"Use code/voucher": "Käytä koodia/voucheria",
"User information": "Käyttäjän tiedot",
+ "Valid through": "Voimassa läpi",
"View as list": "Näytä listana",
"View as map": "Näytä kartalla",
"View your booking": "Näytä varauksesi",
"Visiting address": "Käyntiosoite",
"We could not add a card right now, please try again later.": "Emme voineet lisätä korttia juuri nyt. Yritä myöhemmin uudelleen.",
"We couldn't find a matching location for your search.": "Emme löytäneet hakuasi vastaavaa sijaintia.",
+ "We have a special gift waiting for you!": "Meillä on erityinen lahja odottamassa sinua!",
"We have sent a detailed confirmation of your booking to your email:": "Olemme lähettäneet yksityiskohtaisen varausvahvistuksen sähköpostiisi:",
"We look forward to your visit!": "Odotamme innolla vierailuasi!",
"Weekdays": "Arkisin",
@@ -344,16 +325,18 @@
"Where to": "Minne",
"Which room class suits you the best?": "Mikä huoneluokka sopii sinulle parhaiten?",
"Year": "Vuosi",
- "Yes, discard changes": "Kyllä, hylkää muutokset",
"Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with": "Kyllä, hyväksyn Scandic Friends -käyttöehdot ja ymmärrän, että Scandic käsittelee minun henkilötietoni asianmukaisesti",
+ "Yes, discard changes": "Kyllä, hylkää muutokset",
"Yes, remove my card": "Kyllä, poista korttini",
"You can always change your mind later and add breakfast at the hotel.": "Voit aina muuttaa mieltäsi myöhemmin ja lisätä aamiaisen hotelliin.",
"You canceled adding a new credit card.": "Peruutit uuden luottokortin lisäämisen.",
+ "You have # gifts waiting for you!": "Sinulla on {amount} lahjaa odottamassa sinua!",
"You have no previous stays.": "Sinulla ei ole aiempia majoituksia.",
"You have no upcoming stays.": "Sinulla ei ole tulevia majoituksia.",
+ "You'll find all your gifts in 'My benefits'": "Löydät kaikki lahjasi kohdasta ‘Omat edut’",
+ "Your Challenges Conquer & Earn!": "Voita ja ansaitse haasteesi!",
"Your card was successfully removed!": "Korttisi poistettiin onnistuneesti!",
"Your card was successfully saved!": "Korttisi tallennettu onnistuneesti!",
- "Your Challenges Conquer & Earn!": "Voita ja ansaitse haasteesi!",
"Your current level": "Nykyinen tasosi",
"Your details": "Tietosi",
"Your level": "Tasosi",
@@ -363,6 +346,36 @@
"Zoo": "Eläintarha",
"Zoom in": "Lähennä",
"Zoom out": "Loitonna",
+ "as of today": "tänään",
+ "booking.accommodatesUpTo": "Huoneeseen {nrOfGuests, plural, one {# person} other {mahtuu 2 henkilöä}}",
+ "booking.adults": "{totalAdults, plural, one {# aikuinen} other {# aikuiset}}",
+ "booking.children": "{totalChildren, plural, one {# lapsi} other {# lasta}}",
+ "booking.guests": "Max {nrOfGuests, plural, one {# vieras} other {# vieraita}}",
+ "booking.nights": "{totalNights, plural, one {# yö} other {# yötä}}",
+ "booking.rooms": "{totalRooms, plural, one {# huone} other {# sviitti}}",
+ "booking.terms": "Maksamalla minkä tahansa saatavilla olevan maksutavan avulla hyväksyn tämän varauksen ehdot ja yleiset ehdot ja ehtoja, ja ymmärrän, että Scandic käsittelee minun henkilötietoni tässä varauksessa mukaisesti Scandicin tietosuojavaltuuden mukaisesti. Hyväksyn myös, että Scandic vaatii validin luottokortin majoituksen ajan, jos jokin jää maksamatta.",
+ "booking.thisRoomIsEquippedWith": "Tämä huone on varustettu",
+ "by": "mennessä",
+ "characters": "hahmoja",
+ "guest": "Vieras",
+ "guests": "Vieraita",
+ "hotelPages.rooms.roomCard.person": "henkilö",
+ "hotelPages.rooms.roomCard.persons": "Henkilöä",
+ "hotelPages.rooms.roomCard.seeRoomDetails": "Katso huoneen tiedot",
+ "km to city center": "km keskustaan",
+ "lowercase letter": "pien kirjain",
+ "n/a": "n/a",
+ "next level:": "pistettä tasolle:",
+ "night": "yö",
+ "nights": "yötä",
+ "number": "määrä",
+ "or": "tai",
+ "points": "pistettä",
+ "special character": "erikoishahmo",
+ "spendable points expiring by": "{points} pistettä vanhenee {date} mennessä",
+ "to": "to",
+ "uppercase letter": "iso kirjain",
+ "{amount} out of {total}": "{amount}/{total}",
"{amount} {currency}": "{amount} {currency}",
"{difference}{amount} {currency}": "{difference}{amount} {currency}",
"{width} cm × {length} cm": "{width} cm × {length} cm"
diff --git a/i18n/dictionaries/no.json b/i18n/dictionaries/no.json
index 56fcc5dc8..ab4143986 100644
--- a/i18n/dictionaries/no.json
+++ b/i18n/dictionaries/no.json
@@ -15,15 +15,14 @@
"Already a friend?": "Allerede Friend?",
"Amenities": "Fasiliteter",
"Amusement park": "Tivoli",
- "An error occurred. Please try again.": "Det oppsto en feil. Vennligst prøv igjen.",
"An error occurred trying to manage your preferences, please try again later.": "Det oppstod en feil under forsøket på å administrere innstillingene dine. Prøv igjen senere.",
"An error occurred when adding a credit card, please try again later.": "Det oppstod en feil ved å legge til et kredittkort. Prøv igjen senere.",
"An error occurred when trying to update profile.": "Det oppstod en feil under forsøk på å oppdatere profilen.",
+ "An error occurred. Please try again.": "Det oppsto en feil. Vennligst prøv igjen.",
"Any changes you've made will be lost.": "Eventuelle endringer du har gjort, går tapt.",
"Approx.": "Ca.",
"Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?": "Er du sikker på at du vil fjerne kortet som slutter på {lastFourDigits} fra medlemsprofilen din?",
"Arrival date": "Ankomstdato",
- "as of today": "per i dag",
"As our": "Som vår {level}",
"As our Close Friend": "Som vår nære venn",
"At latest": "Senest",
@@ -36,11 +35,6 @@
"Book": "Bestill",
"Book reward night": "Bestill belønningskveld",
"Booking number": "Bestillingsnummer",
- "booking.adults": "{totalAdults, plural, one {# voksen} other {# voksne}}",
- "booking.children": "{totalChildren, plural, one {# barn} other {# barn}}",
- "booking.guests": "Maks {nrOfGuests, plural, one {# gjest} other {# gjester}}",
- "booking.nights": "{totalNights, plural, one {# natt} other {# netter}}",
- "booking.rooms": "{totalRooms, plural, one {# rom} other {# rom}}",
"Breakfast": "Frokost",
"Breakfast buffet": "Breakfast buffet",
"Breakfast excluded": "Frokost ekskludert",
@@ -49,9 +43,7 @@
"Breakfast selection in next step.": "Frokostvalg i neste steg.",
"Bus terminal": "Bussterminal",
"Business": "Forretnings",
- "by": "innen",
"Cancel": "Avbryt",
- "characters": "tegn",
"Check in": "Sjekk inn",
"Check out": "Sjekk ut",
"Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.": "Sjekk ut kredittkortene som er lagret på profilen din. Betal med et lagret kort når du er pålogget for en jevnere nettopplevelse.",
@@ -108,9 +100,9 @@
"Explore all levels and benefits": "Utforsk alle nivåer og fordeler",
"Explore nearby": "Utforsk i nærheten",
"Extras to your booking": "Tilvalg til bestillingen din",
+ "FAQ": "FAQ",
"Failed to delete credit card, please try again later.": "Kunne ikke slette kredittkortet, prøv igjen senere.",
"Fair": "Messe",
- "FAQ": "FAQ",
"Find booking": "Finn booking",
"Find hotels": "Finn hotell",
"First name": "Fornavn",
@@ -122,11 +114,11 @@
"From": "Fra",
"Get inspired": "Bli inspirert",
"Get member benefits & offers": "Få medlemsfordeler og tilbud",
+ "Gift(s) added to your benefits": "{amount, plural, one {Gave} other {Gaver}} lagt til fordelene dine",
"Go back to edit": "Gå tilbake til redigering",
"Go back to overview": "Gå tilbake til oversikten",
- "guest": "gjest",
+ "Go to My Benefits": "Gå til ‘Mine fordeler’",
"Guest information": "Informasjon til gjester",
- "guests": "gjester",
"Guests & Rooms": "Gjester & rom",
"Hi": "Hei",
"Highest level": "Høyeste nivå",
@@ -134,22 +126,19 @@
"Hotel": "Hotel",
"Hotel facilities": "Hotelfaciliteter",
"Hotel surroundings": "Hotellomgivelser",
- "hotelPages.rooms.roomCard.person": "person",
- "hotelPages.rooms.roomCard.persons": "personer",
- "hotelPages.rooms.roomCard.seeRoomDetails": "Se detaljer om rommet",
"Hotels": "Hoteller",
"How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det fungerer",
+ "Hurry up and use them before they expire!": "Skynd deg og bruk dem før de utløper!",
"Image gallery": "Bildegalleri",
"In adults bed": "i voksnes seng",
"In crib": "i sprinkelseng",
"In extra bed": "i ekstraseng",
"Included": "Inkludert",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Det er ikke mulig å administrere kommunikasjonspreferansene dine akkurat nå, prøv igjen senere eller kontakt support hvis problemet vedvarer.",
- "Join at no cost": "Bli med uten kostnad",
"Join Scandic Friends": "Bli med i Scandic Friends",
+ "Join at no cost": "Bli med uten kostnad",
"King bed": "King-size-seng",
- "km to city center": "km til sentrum",
"Language": "Språk",
"Last name": "Etternavn",
"Latest searches": "Siste søk",
@@ -169,7 +158,7 @@
"Log in here": "Logg inn her",
"Log in/Join": "Logg på/Bli med",
"Log out": "Logg ut",
- "lowercase letter": "liten bokstav",
+ "MY SAVED CARDS": "MINE SAVEDE KORT",
"Main menu": "Hovedmeny",
"Manage preferences": "Administrer preferanser",
"Map": "Kart",
@@ -179,9 +168,9 @@
"Member price": "Medlemspris",
"Member price from": "Medlemspris fra",
"Members": "Medlemmer",
- "Membership cards": "Medlemskort",
"Membership ID": "Medlems-ID",
"Membership ID copied to clipboard": "Medlems-ID kopiert til utklippstavlen",
+ "Membership cards": "Medlemskort",
"Menu": "Menu",
"Modify": "Endre",
"Month": "Måned",
@@ -191,16 +180,11 @@
"My pages": "Mine sider",
"My pages menu": "Mine sider-menyen",
"My payment cards": "Mine betalingskort",
- "MY SAVED CARDS": "MINE SAVEDE KORT",
"My wishes": "Mine ønsker",
- "n/a": "n/a",
"Nearby": "I nærheten",
"Nearby companies": "Nærliggende selskaper",
"New password": "Nytt passord",
"Next": "Neste",
- "next level:": "Neste nivå:",
- "night": "natt",
- "nights": "netter",
"Nights needed to level up": "Netter som trengs for å komme opp i nivå",
"No breakfast": "Ingen frokost",
"No content published": "Ingen innhold publisert",
@@ -213,14 +197,13 @@
"Nordic Swan Ecolabel": "Svanemerket",
"Not found": "Ikke funnet",
"Nr night, nr adult": "{nights, number} natt, {adults, number} voksen",
- "number": "antall",
+ "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"On your journey": "På reisen din",
"Open": "Åpen",
+ "Open gift(s)": "{amount, plural, one {Åpen gave} other {Åpnen gaver}}",
"Open language menu": "Åpne språkmenyen",
"Open menu": "Åpne menyen",
"Open my pages menu": "Åpne mine sider menyen",
- "or": "eller",
- "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"Overview": "Oversikt",
"Parking": "Parkering",
"Parking / Garage": "Parkering / Garasje",
@@ -232,13 +215,13 @@
"Phone is required": "Telefon kreves",
"Phone number": "Telefonnummer",
"Please enter a valid phone number": "Vennligst oppgi et gyldig telefonnummer",
- "points": "poeng",
"Points": "Poeng",
"Points being calculated": "Poeng beregnes",
"Points earned prior to May 1, 2021": "Opptjente poeng før 1. mai 2021",
"Points may take up to 10 days to be displayed.": "Det kan ta opptil 10 dager før poeng vises.",
"Points needed to level up": "Poeng som trengs for å komme opp i nivå",
"Points needed to stay on level": "Poeng som trengs for å holde seg på nivå",
+ "Previous": "Tidligere",
"Previous victories": "Tidligere seire",
"Proceed to login": "Fortsett til innlogging",
"Proceed to payment method": "Fortsett til betalingsmetode",
@@ -294,40 +277,39 @@
"Something went wrong and we couldn't add your card. Please try again later.": "Noe gikk galt, og vi kunne ikke legge til kortet ditt. Prøv igjen senere.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Noe gikk galt, og vi kunne ikke fjerne kortet ditt. Vennligst prøv igjen senere.",
"Something went wrong!": "Noe gikk galt!",
- "special character": "spesiell karakter",
- "spendable points expiring by": "{points} Brukbare poeng utløper innen {date}",
"Sports": "Sport",
"Standard price": "Standardpris",
"Street": "Gate",
"Successfully updated profile!": "Vellykket oppdatert profil!",
"Summary": "Sammendrag",
+ "Surprise!": "Overraskelse!",
+ "TUI Points": "TUI Points",
"Tell us what information and updates you'd like to receive, and how, by clicking the link below.": "Fortell oss hvilken informasjon og hvilke oppdateringer du ønsker å motta, og hvordan, ved å klikke på lenken nedenfor.",
"Terms and conditions": "Vilkår og betingelser",
"Thank you": "Takk",
"Theatre": "Teater",
"There are no transactions to display": "Det er ingen transaksjoner å vise",
"Things nearby HOTEL_NAME": "Ting i nærheten av {hotelName}",
- "to": "til",
- "Total incl VAT": "Sum inkl mva",
"Total Points": "Totale poeng",
+ "Total incl VAT": "Sum inkl mva",
"Tourist": "Turist",
"Transaction date": "Transaksjonsdato",
"Transactions": "Transaksjoner",
"Transportations": "Transport",
"Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)",
- "TUI Points": "TUI Points",
"Type of bed": "Sengtype",
"Type of room": "Romtype",
- "uppercase letter": "stor bokstav",
"Use bonus cheque": "Bruk bonussjekk",
"Use code/voucher": "Bruk kode/voucher",
"User information": "Brukerinformasjon",
+ "Valid through": "Gyldig gjennom",
"View as list": "Vis som liste",
"View as map": "Vis som kart",
"View your booking": "Se din bestilling",
"Visiting address": "Besøksadresse",
"We could not add a card right now, please try again later.": "Vi kunne ikke legge til et kort akkurat nå. Prøv igjen senere.",
"We couldn't find a matching location for your search.": "Vi finner ikke et sted som samsvarer for søket ditt.",
+ "We have a special gift waiting for you!": "Vi har en spesiell gave som venter på deg!",
"We have sent a detailed confirmation of your booking to your email:": "Vi har sendt en detaljert bekreftelse av din bestilling til din e-post:",
"We look forward to your visit!": "Vi ser frem til ditt besøk!",
"Weekdays": "Hverdager",
@@ -340,16 +322,18 @@
"Where to": "Hvor skal du",
"Which room class suits you the best?": "Hvilken romklasse passer deg best?",
"Year": "År",
- "Yes, discard changes": "Ja, forkast endringer",
"Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with": "Ja, jeg aksepterer vilkårene for Scandic Friends og forstår at Scandic vil behandle mine personlige opplysninger i henhold til",
+ "Yes, discard changes": "Ja, forkast endringer",
"Yes, remove my card": "Ja, fjern kortet mitt",
"You can always change your mind later and add breakfast at the hotel.": "Du kan alltid ombestemme deg senere og legge til frokost på hotellet.",
"You canceled adding a new credit card.": "Du kansellerte å legge til et nytt kredittkort.",
+ "You have # gifts waiting for you!": "Du har {amount} gaver som venter på deg!",
"You have no previous stays.": "Du har ingen tidligere opphold.",
"You have no upcoming stays.": "Du har ingen kommende opphold.",
+ "You'll find all your gifts in 'My benefits'": "Du finner alle gavene dine i ‘Mine fordeler’",
+ "Your Challenges Conquer & Earn!": "Dine utfordringer Erobre og tjen!",
"Your card was successfully removed!": "Kortet ditt ble fjernet!",
"Your card was successfully saved!": "Kortet ditt ble lagret!",
- "Your Challenges Conquer & Earn!": "Dine utfordringer Erobre og tjen!",
"Your current level": "Ditt nåværende nivå",
"Your details": "Dine detaljer",
"Your level": "Ditt nivå",
@@ -359,6 +343,35 @@
"Zoo": "Dyrehage",
"Zoom in": "Zoom inn",
"Zoom out": "Zoom ut",
+ "as of today": "per i dag",
+ "booking.accommodatesUpTo": "Plass til {nrOfGuests, plural, one {# person} other {opptil # personer}}",
+ "booking.adults": "{totalAdults, plural, one {# voksen} other {# voksne}}",
+ "booking.children": "{totalChildren, plural, one {# barn} other {# barn}}",
+ "booking.guests": "Maks {nrOfGuests, plural, one {# gjest} other {# gjester}}",
+ "booking.nights": "{totalNights, plural, one {# natt} other {# netter}}",
+ "booking.rooms": "{totalRooms, plural, one {# rom} other {# rom}}",
+ "booking.thisRoomIsEquippedWith": "Dette rommet er utstyrt med",
+ "by": "innen",
+ "characters": "tegn",
+ "guest": "gjest",
+ "guests": "gjester",
+ "hotelPages.rooms.roomCard.person": "person",
+ "hotelPages.rooms.roomCard.persons": "personer",
+ "hotelPages.rooms.roomCard.seeRoomDetails": "Se detaljer om rommet",
+ "km to city center": "km til sentrum",
+ "lowercase letter": "liten bokstav",
+ "n/a": "n/a",
+ "next level:": "Neste nivå:",
+ "night": "natt",
+ "nights": "netter",
+ "number": "antall",
+ "or": "eller",
+ "points": "poeng",
+ "special character": "spesiell karakter",
+ "spendable points expiring by": "{points} Brukbare poeng utløper innen {date}",
+ "to": "til",
+ "uppercase letter": "stor bokstav",
+ "{amount} out of {total}": "{amount} av {total}",
"{amount} {currency}": "{amount} {currency}",
"{difference}{amount} {currency}": "{difference}{amount} {currency}",
"{width} cm × {length} cm": "{width} cm × {length} cm"
diff --git a/i18n/dictionaries/sv.json b/i18n/dictionaries/sv.json
index b22278223..9d7c3b95d 100644
--- a/i18n/dictionaries/sv.json
+++ b/i18n/dictionaries/sv.json
@@ -15,15 +15,14 @@
"Already a friend?": "Är du redan en vän?",
"Amenities": "Bekvämligheter",
"Amusement park": "Nöjespark",
- "An error occurred. Please try again.": "Ett fel uppstod. Försök igen.",
"An error occurred trying to manage your preferences, please try again later.": "Ett fel uppstod när du försökte hantera dina inställningar, försök igen senare.",
"An error occurred when adding a credit card, please try again later.": "Ett fel uppstod när ett kreditkort lades till, försök igen senare.",
"An error occurred when trying to update profile.": "Ett fel uppstod när du försökte uppdatera profilen.",
+ "An error occurred. Please try again.": "Ett fel uppstod. Försök igen.",
"Any changes you've made will be lost.": "Alla ändringar du har gjort kommer att gå förlorade.",
"Approx.": "Ca.",
"Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?": "Är du säker på att du vill ta bort kortet som slutar med {lastFourDigits} från din medlemsprofil?",
"Arrival date": "Ankomstdatum",
- "as of today": "från och med idag",
"As our": "Som vår {level}",
"As our Close Friend": "Som vår nära vän",
"At latest": "Senast",
@@ -36,12 +35,6 @@
"Book": "Boka",
"Book reward night": "Boka frinatt",
"Booking number": "Bokningsnummer",
- "booking.adults": "{totalAdults, plural, one {# vuxen} other {# vuxna}}",
- "booking.children": "{totalChildren, plural, one {# barn} other {# barn}}",
- "booking.guests": "Max {nrOfGuests, plural, one {# gäst} other {# gäster}}",
- "booking.nights": "{totalNights, plural, one {# natt} other {# nätter}}",
- "booking.rooms": "{totalRooms, plural, one {# rum} other {# rum}}",
- "booking.terms": "Genom att betala med någon av de tillgängliga betalningsmetoderna accepterar jag villkoren för denna bokning och de generella Villkoren och villkoren, och förstår att Scandic kommer att behandla min personliga data i samband med denna bokning i enlighet med Scandics integritetspolicy. Jag accepterar att Scandic kräver ett giltigt kreditkort under min besök i fall att något är tillbaka betalt.",
"Breakfast": "Frukost",
"Breakfast buffet": "Frukostbuffé",
"Breakfast excluded": "Frukost ingår ej",
@@ -50,9 +43,7 @@
"Breakfast selection in next step.": "Frukostval i nästa steg.",
"Bus terminal": "Bussterminal",
"Business": "Business",
- "by": "innan",
"Cancel": "Avbryt",
- "characters": "tecken",
"Check in": "Checka in",
"Check out": "Checka ut",
"Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.": "Kolla in kreditkorten som sparats i din profil. Betala med ett sparat kort när du är inloggad för en smidigare webbupplevelse.",
@@ -109,9 +100,9 @@
"Explore all levels and benefits": "Utforska alla nivåer och fördelar",
"Explore nearby": "Utforska i närheten",
"Extras to your booking": "Extra tillval till din bokning",
+ "FAQ": "FAQ",
"Failed to delete credit card, please try again later.": "Det gick inte att ta bort kreditkortet, försök igen senare.",
"Fair": "Mässa",
- "FAQ": "FAQ",
"Find booking": "Hitta bokning",
"Find hotels": "Hitta hotell",
"First name": "Förnamn",
@@ -123,11 +114,11 @@
"From": "Från",
"Get inspired": "Bli inspirerad",
"Get member benefits & offers": "Ta del av medlemsförmåner och erbjudanden",
+ "Gift(s) added to your benefits": "{amount, plural, one {Gåva} other {Gåvor}} läggs till dina förmåner",
"Go back to edit": "Gå tillbaka till redigeringen",
"Go back to overview": "Gå tillbaka till översikten",
- "guest": "gäst",
+ "Go to My Benefits": "Gå till ‘Mina förmåner’",
"Guest information": "Information till gästerna",
- "guests": "gäster",
"Guests & Rooms": "Gäster & rum",
"Hi": "Hej",
"Highest level": "Högsta nivå",
@@ -135,22 +126,19 @@
"Hotel": "Hotell",
"Hotel facilities": "Hotellfaciliteter",
"Hotel surroundings": "Hotellomgivning",
- "hotelPages.rooms.roomCard.person": "person",
- "hotelPages.rooms.roomCard.persons": "personer",
- "hotelPages.rooms.roomCard.seeRoomDetails": "Se information om rummet",
"Hotels": "Hotell",
"How do you want to sleep?": "Hur vill du sova?",
"How it works": "Hur det fungerar",
+ "Hurry up and use them before they expire!": "Skynda dig och använd dem innan de går ut!",
"Image gallery": "Bildgalleri",
"In adults bed": "I vuxens säng",
"In crib": "I spjälsäng",
"In extra bed": "Egen sängplats",
"Included": "Inkluderad",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Det gick inte att hantera dina kommunikationsinställningar just nu, försök igen senare eller kontakta supporten om problemet kvarstår.",
- "Join at no cost": "Gå med utan kostnad",
"Join Scandic Friends": "Gå med i Scandic Friends",
+ "Join at no cost": "Gå med utan kostnad",
"King bed": "King size-säng",
- "km to city center": "km till stadens centrum",
"Language": "Språk",
"Last name": "Efternamn",
"Latest searches": "Senaste sökningarna",
@@ -170,7 +158,7 @@
"Log in here": "Logga in här",
"Log in/Join": "Logga in/Gå med",
"Log out": "Logga ut",
- "lowercase letter": "liten bokstav",
+ "MY SAVED CARDS": "MINE SAVEDE KORT",
"Main menu": "Huvudmeny",
"Manage preferences": "Hantera inställningar",
"Map": "Karta",
@@ -180,9 +168,9 @@
"Member price": "Medlemspris",
"Member price from": "Medlemspris från",
"Members": "Medlemmar",
- "Membership cards": "Medlemskort",
"Membership ID": "Medlems-ID",
"Membership ID copied to clipboard": "Medlems-ID kopierat till urklipp",
+ "Membership cards": "Medlemskort",
"Menu": "Meny",
"Modify": "Ändra",
"Month": "Månad",
@@ -192,16 +180,11 @@
"My pages": "Mina sidor",
"My pages menu": "Mina sidor meny",
"My payment cards": "Mina betalningskort",
- "MY SAVED CARDS": "MINE SAVEDE KORT",
"My wishes": "Mina önskningar",
- "n/a": "n/a",
"Nearby": "I närheten",
"Nearby companies": "Närliggande företag",
"New password": "Nytt lösenord",
"Next": "Nästa",
- "next level:": "Nästa nivå:",
- "night": "natt",
- "nights": "nätter",
"Nights needed to level up": "Nätter som behövs för att gå upp i nivå",
"No breakfast": "Ingen frukost",
"No content published": "Inget innehåll publicerat",
@@ -214,14 +197,13 @@
"Nordic Swan Ecolabel": "Svanenmärkt",
"Not found": "Hittades inte",
"Nr night, nr adult": "{nights, number} natt, {adults, number} vuxen",
- "number": "nummer",
+ "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"On your journey": "På din resa",
"Open": "Öppna",
+ "Open gift(s)": "Öppna {amount, plural, one {gåva} other {gåvor}}",
"Open language menu": "Öppna språkmenyn",
"Open menu": "Öppna menyn",
"Open my pages menu": "Öppna mina sidor menyn",
- "or": "eller",
- "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER",
"Overview": "Översikt",
"Parking": "Parkering",
"Parking / Garage": "Parkering / Garage",
@@ -233,13 +215,13 @@
"Phone is required": "Telefonnummer är obligatorisk",
"Phone number": "Telefonnummer",
"Please enter a valid phone number": "Var vänlig och ange ett giltigt telefonnummer",
- "points": "poäng",
"Points": "Poäng",
"Points being calculated": "Poäng beräknas",
"Points earned prior to May 1, 2021": "Intjänade poäng före den 1 maj 2021",
"Points may take up to 10 days to be displayed.": "Det kan ta upp till 10 dagar innan poäng visas.",
"Points needed to level up": "Poäng som behövs för att gå upp i nivå",
"Points needed to stay on level": "Poäng som behövs för att hålla sig på nivå",
+ "Previous": "Föregående",
"Previous victories": "Tidigare segrar",
"Proceed to login": "Fortsätt till inloggning",
"Proceed to payment method": "Gå vidare till betalningsmetod",
@@ -295,40 +277,39 @@
"Something went wrong and we couldn't add your card. Please try again later.": "Något gick fel och vi kunde inte lägga till ditt kort. Försök igen senare.",
"Something went wrong and we couldn't remove your card. Please try again later.": "Något gick fel och vi kunde inte ta bort ditt kort. Försök igen senare.",
"Something went wrong!": "Något gick fel!",
- "special character": "speciell karaktär",
- "spendable points expiring by": "{points} poäng förfaller {date}",
"Sports": "Sport",
"Standard price": "Standardpris",
"Street": "Gata",
"Successfully updated profile!": "Profilen har uppdaterats framgångsrikt!",
"Summary": "Sammanfattning",
+ "Surprise!": "Överraskning!",
+ "TUI Points": "TUI Points",
"Tell us what information and updates you'd like to receive, and how, by clicking the link below.": "Berätta för oss vilken information och vilka uppdateringar du vill få och hur genom att klicka på länken nedan.",
"Terms and conditions": "Allmänna villkor",
"Thank you": "Tack",
"Theatre": "Teater",
"There are no transactions to display": "Det finns inga transaktioner att visa",
"Things nearby HOTEL_NAME": "Saker i närheten av {hotelName}",
- "to": "till",
- "Total incl VAT": "Totalt inkl moms",
"Total Points": "Poäng totalt",
+ "Total incl VAT": "Totalt inkl moms",
"Tourist": "Turist",
"Transaction date": "Transaktionsdatum",
"Transactions": "Transaktioner",
"Transportations": "Transport",
"Tripadvisor reviews": "{rating} ({count} recensioner på Tripadvisor)",
- "TUI Points": "TUI Points",
"Type of bed": "Sängtyp",
"Type of room": "Rumstyp",
- "uppercase letter": "stor bokstav",
"Use bonus cheque": "Använd bonuscheck",
"Use code/voucher": "Använd kod/voucher",
"User information": "Användarinformation",
+ "Valid through": "Giltig t.o.m.",
"View as list": "Visa som lista",
"View as map": "Visa som karta",
"View your booking": "Visa din bokning",
"Visiting address": "Besöksadress",
"We could not add a card right now, please try again later.": "Vi kunde inte lägga till ett kort just nu, vänligen försök igen senare.",
"We couldn't find a matching location for your search.": "Vi kunde inte hitta en plats som matchade din sökning.",
+ "We have a special gift waiting for you!": "Vi har en speciell present som väntar på dig!",
"We have sent a detailed confirmation of your booking to your email:": "Vi har skickat en detaljerad bekräftelse av din bokning till din e-post:",
"We look forward to your visit!": "Vi ser fram emot ditt besök!",
"Weekdays": "Vardagar",
@@ -341,16 +322,18 @@
"Where to": "Vart",
"Which room class suits you the best?": "Vilken rumsklass passar dig bäst?",
"Year": "År",
- "Yes, discard changes": "Ja, ignorera ändringar",
"Yes, I accept the Terms and conditions for Scandic Friends and understand that Scandic will process my personal data in accordance with": "Ja, jag accepterar villkoren för Scandic Friends och förstår att Scandic kommer att bearbeta mina personliga uppgifter i enlighet med",
+ "Yes, discard changes": "Ja, ignorera ändringar",
"Yes, remove my card": "Ja, ta bort mitt kort",
"You can always change your mind later and add breakfast at the hotel.": "Du kan alltid ändra dig senare och lägga till frukost på hotellet.",
"You canceled adding a new credit card.": "Du avbröt att lägga till ett nytt kreditkort.",
+ "You have # gifts waiting for you!": "Du har {amount} presenter som väntar på dig!",
"You have no previous stays.": "Du har inga tidigare vistelser.",
"You have no upcoming stays.": "Du har inga planerade resor.",
+ "You'll find all your gifts in 'My benefits'": "Du hittar alla dina gåvor i ‘Mina förmåner’",
+ "Your Challenges Conquer & Earn!": "Dina utmaningar Erövra och tjäna!",
"Your card was successfully removed!": "Ditt kort har tagits bort!",
"Your card was successfully saved!": "Ditt kort har sparats!",
- "Your Challenges Conquer & Earn!": "Dina utmaningar Erövra och tjäna!",
"Your current level": "Din nuvarande nivå",
"Your details": "Dina uppgifter",
"Your level": "Din nivå",
@@ -360,6 +343,36 @@
"Zoo": "Djurpark",
"Zoom in": "Zooma in",
"Zoom out": "Zooma ut",
+ "as of today": "från och med idag",
+ "booking.accommodatesUpTo": "Rymmer {nrOfGuests, plural, one {# person} other {upp till # personer}}",
+ "booking.adults": "{totalAdults, plural, one {# vuxen} other {# vuxna}}",
+ "booking.children": "{totalChildren, plural, one {# barn} other {# barn}}",
+ "booking.guests": "Max {nrOfGuests, plural, one {# gäst} other {# gäster}}",
+ "booking.nights": "{totalNights, plural, one {# natt} other {# nätter}}",
+ "booking.rooms": "{totalRooms, plural, one {# rum} other {# rum}}",
+ "booking.terms": "Genom att betala med någon av de tillgängliga betalningsmetoderna accepterar jag villkoren för denna bokning och de generella Villkoren och villkoren, och förstår att Scandic kommer att behandla min personliga data i samband med denna bokning i enlighet med Scandics integritetspolicy. Jag accepterar att Scandic kräver ett giltigt kreditkort under min besök i fall att något är tillbaka betalt.",
+ "booking.thisRoomIsEquippedWith": "Detta rum är utrustat med",
+ "by": "innan",
+ "characters": "tecken",
+ "guest": "gäst",
+ "guests": "gäster",
+ "hotelPages.rooms.roomCard.person": "person",
+ "hotelPages.rooms.roomCard.persons": "personer",
+ "hotelPages.rooms.roomCard.seeRoomDetails": "Se information om rummet",
+ "km to city center": "km till stadens centrum",
+ "lowercase letter": "liten bokstav",
+ "n/a": "n/a",
+ "next level:": "Nästa nivå:",
+ "night": "natt",
+ "nights": "nätter",
+ "number": "nummer",
+ "or": "eller",
+ "points": "poäng",
+ "special character": "speciell karaktär",
+ "spendable points expiring by": "{points} poäng förfaller {date}",
+ "to": "till",
+ "uppercase letter": "stor bokstav",
+ "{amount} out of {total}": "{amount} av {total}",
"{amount} {currency}": "{amount} {currency}",
"{difference}{amount} {currency}": "{difference}{amount} {currency}",
"{width} cm × {length} cm": "{width} cm × {length} cm"
diff --git a/public/_static/img/loyalty-award.png b/public/_static/img/loyalty-award.png
new file mode 100644
index 000000000..b8e7054ca
Binary files /dev/null and b/public/_static/img/loyalty-award.png differ
diff --git a/server/routers/contentstack/reward/input.ts b/server/routers/contentstack/reward/input.ts
index bf02e9255..acf4a67f8 100644
--- a/server/routers/contentstack/reward/input.ts
+++ b/server/routers/contentstack/reward/input.ts
@@ -17,3 +17,7 @@ export const rewardsCurrentInput = z.object({
cursor: z.number().optional().default(0),
lang: z.nativeEnum(Lang).optional(),
})
+
+export const rewardsUpdateInput = z.object({
+ id: z.string(),
+})
diff --git a/server/routers/contentstack/reward/output.ts b/server/routers/contentstack/reward/output.ts
index 302a6b4a7..bcb144442 100644
--- a/server/routers/contentstack/reward/output.ts
+++ b/server/routers/contentstack/reward/output.ts
@@ -2,24 +2,64 @@ import { z } from "zod"
import { MembershipLevelEnum } from "@/constants/membershipLevels"
-export const validateApiRewardSchema = z.object({
- data: z.array(
- z
- .object({
- title: z.string().optional(),
- id: z.string().optional(),
- type: z.string().optional(),
- status: z.string().optional(),
- rewardId: z.string().optional(),
- redeemLocation: z.string().optional(),
- autoApplyReward: z.boolean().default(false),
- rewardType: z.string().optional(),
- rewardTierLevel: z.string().optional(),
- })
- .optional()
- ),
+const Coupon = z.object({
+ code: z.string().optional(),
+ status: z.string().optional(),
+ createdAt: z.string().datetime({ offset: true }).optional(),
+ customer: z.object({
+ id: z.string().optional(),
+ }),
+ name: z.string().optional(),
+ claimedAt: z.string().datetime({ offset: true }).optional(),
+ redeemedAt: z
+ .date({ coerce: true })
+ .optional()
+ .transform((value) => {
+ if (value?.getFullYear() === 1) {
+ return null
+ }
+ return value
+ }),
+ type: z.string().optional(),
+ value: z.number().optional(),
+ pool: z.string().optional(),
+ cfUnwrapped: z.boolean().default(false),
})
+const SurpriseReward = z.object({
+ title: z.string().optional(),
+ id: z.string().optional(),
+ type: z.literal("coupon"),
+ status: z.string().optional(),
+ rewardId: z.string().optional(),
+ redeemLocation: z.string().optional(),
+ autoApplyReward: z.boolean().default(false),
+ rewardType: z.literal("Surprise"),
+ endsAt: z.string().datetime({ offset: true }).optional(),
+ coupons: z.array(Coupon).optional(),
+})
+
+export const validateApiRewardSchema = z
+ .object({
+ data: z.array(
+ z.discriminatedUnion("type", [
+ z.object({
+ title: z.string().optional(),
+ id: z.string().optional(),
+ type: z.literal("custom"),
+ status: z.string().optional(),
+ rewardId: z.string().optional(),
+ redeemLocation: z.string().optional(),
+ autoApplyReward: z.boolean().default(false),
+ rewardType: z.string().optional(),
+ rewardTierLevel: z.string().optional(),
+ }),
+ SurpriseReward,
+ ])
+ ),
+ })
+ .transform((data) => data.data)
+
enum TierKey {
tier1 = MembershipLevelEnum.L1,
tier2 = MembershipLevelEnum.L2,
@@ -37,19 +77,17 @@ export const validateApiTierRewardsSchema = z.record(
return TierKey[data as unknown as Key]
}),
z.array(
- z
- .object({
- title: z.string().optional(),
- id: z.string().optional(),
- type: z.string().optional(),
- status: z.string().optional(),
- rewardId: z.string().optional(),
- redeemLocation: z.string().optional(),
- autoApplyReward: z.boolean().default(false),
- rewardType: z.string().optional(),
- rewardTierLevel: z.string().optional(),
- })
- .optional()
+ z.object({
+ title: z.string().optional(),
+ id: z.string().optional(),
+ type: z.string().optional(),
+ status: z.string().optional(),
+ rewardId: z.string().optional(),
+ redeemLocation: z.string().optional(),
+ autoApplyReward: z.boolean().default(false),
+ rewardType: z.string().optional(),
+ rewardTierLevel: z.string().optional(),
+ })
)
)
@@ -77,6 +115,10 @@ export const validateCmsRewardsSchema = z
})
.transform((data) => data.data.all_reward.items)
+export type ApiReward = z.output[0]
+
+export type SurpriseReward = z.output
+
export type CmsRewardsResponse = z.input
export type Reward = z.output[0]
diff --git a/server/routers/contentstack/reward/query.ts b/server/routers/contentstack/reward/query.ts
index 85470553a..419e0a2c2 100644
--- a/server/routers/contentstack/reward/query.ts
+++ b/server/routers/contentstack/reward/query.ts
@@ -19,15 +19,19 @@ import {
rewardsAllInput,
rewardsByLevelInput,
rewardsCurrentInput,
+ rewardsUpdateInput,
} from "./input"
import {
CmsRewardsResponse,
Reward,
+ SurpriseReward,
validateApiRewardSchema,
validateApiTierRewardsSchema,
validateCmsRewardsSchema,
} from "./output"
+import { Surprise } from "@/types/components/blocks/surprises"
+
const meter = metrics.getMeter("trpc.reward")
// OpenTelemetry metrics: Reward
@@ -242,10 +246,10 @@ export const rewardQueryRouter = router({
return null
}
- const rewardIds = validatedApiRewards.data.data
+ const rewardIds = validatedApiRewards.data
.map((reward) => reward?.rewardId)
- .filter(Boolean)
- .sort() as string[]
+ .filter((rewardId): rewardId is string => !!rewardId)
+ .sort()
const slicedData = rewardIds.slice(cursor, limit + cursor)
@@ -258,9 +262,21 @@ export const rewardQueryRouter = router({
const nextCursor =
limit + cursor < rewardIds.length ? limit + cursor : undefined
+ const surprisesIds = validatedApiRewards.data
+ .filter(
+ ({ type, rewardType }) =>
+ type === "coupon" && rewardType === "Surprise"
+ )
+ .map(({ rewardId }) => rewardId)
+
+ const rewards = cmsRewards.filter(
+ (reward) => !surprisesIds.includes(reward.reward_id)
+ )
+
getCurrentRewardSuccessCounter.add(1)
+
return {
- rewards: cmsRewards,
+ rewards,
nextCursor,
}
}),
@@ -374,4 +390,112 @@ export const rewardQueryRouter = router({
getAllRewardSuccessCounter.add(1)
return levelsWithRewards
}),
+ surprises: contentStackBaseWithProtectedProcedure.query(async ({ ctx }) => {
+ getCurrentRewardCounter.add(1)
+
+ const apiResponse = await api.get(api.endpoints.v1.rewards, {
+ cache: undefined, // override defaultOptions
+ headers: {
+ Authorization: `Bearer ${ctx.session.token.access_token}`,
+ },
+ next: { revalidate: 60 * 60 },
+ })
+
+ if (!apiResponse.ok) {
+ const text = await apiResponse.text()
+ getCurrentRewardFailCounter.add(1, {
+ error_type: "http_error",
+ error: JSON.stringify({
+ status: apiResponse.status,
+ statusText: apiResponse.statusText,
+ text,
+ }),
+ })
+ console.error(
+ "api.reward error ",
+ JSON.stringify({
+ error: {
+ status: apiResponse.status,
+ statusText: apiResponse.statusText,
+ text,
+ },
+ })
+ )
+ return null
+ }
+
+ const data = await apiResponse.json()
+
+ const validatedApiRewards = validateApiRewardSchema.safeParse(data)
+
+ if (!validatedApiRewards.success) {
+ getCurrentRewardFailCounter.add(1, {
+ locale: ctx.lang,
+ error_type: "validation_error",
+ error: JSON.stringify(validatedApiRewards.error),
+ })
+ console.error(validatedApiRewards.error)
+ console.error(
+ "contentstack.surprises validation error",
+ JSON.stringify({
+ query: { locale: ctx.lang },
+ error: validatedApiRewards.error,
+ })
+ )
+ return null
+ }
+
+ const rewardIds = validatedApiRewards.data
+ .map((reward) => reward?.rewardId)
+ .filter((rewardId): rewardId is string => !!rewardId)
+ .sort()
+
+ const cmsRewards = await getCmsRewards(ctx.lang, rewardIds)
+
+ if (!cmsRewards) {
+ return null
+ }
+
+ getCurrentRewardSuccessCounter.add(1)
+
+ const surprises =
+ validatedApiRewards.data
+ .filter(
+ (reward): reward is SurpriseReward =>
+ reward?.type === "coupon" && reward?.rewardType === "Surprise"
+ )
+ .map((surprise) => {
+ const reward = cmsRewards.find(
+ ({ reward_id }) => surprise.rewardId === reward_id
+ )
+
+ if (!reward) {
+ return null
+ }
+
+ return {
+ ...reward,
+ id: surprise.id,
+ endsAt: surprise.endsAt,
+ }
+ })
+ .filter((surprise): surprise is Surprise => !!surprise) ?? []
+
+ return surprises
+ }),
+ update: contentStackBaseWithProtectedProcedure
+ .input(rewardsUpdateInput)
+ .mutation(async ({ input, ctx }) => {
+ const response = await Promise.resolve({ ok: true })
+ // const response = await api.post(api.endpoints.v1.rewards, {
+ // body: {
+ // ids: [input.id],
+ // },
+ // })
+ if (!response.ok) {
+ return false
+ }
+
+ return true
+ }),
})
diff --git a/server/routers/hotels/schemas/room.ts b/server/routers/hotels/schemas/room.ts
index bb3f7019c..19f922db0 100644
--- a/server/routers/hotels/schemas/room.ts
+++ b/server/routers/hotels/schemas/room.ts
@@ -89,5 +89,6 @@ export const roomSchema = z
roomSize: data.attributes.roomSize,
sortOrder: data.attributes.sortOrder,
type: data.type,
+ roomFacilities: data.attributes.roomFacilities,
}
})
diff --git a/types/components/blocks/surprises.ts b/types/components/blocks/surprises.ts
new file mode 100644
index 000000000..00c8fadfa
--- /dev/null
+++ b/types/components/blocks/surprises.ts
@@ -0,0 +1,14 @@
+import {
+ Reward,
+ SurpriseReward,
+} from "@/server/routers/contentstack/reward/output"
+
+export interface Surprise extends Reward {
+ endsAt: SurpriseReward["endsAt"]
+ id: SurpriseReward["id"]
+}
+
+export interface SurprisesProps {
+ surprises: Surprise[]
+ membershipNumber?: string
+}
diff --git a/types/components/hotelReservation/selectRate/roomSidePeek.ts b/types/components/hotelReservation/selectRate/roomSidePeek.ts
new file mode 100644
index 000000000..c526d04b4
--- /dev/null
+++ b/types/components/hotelReservation/selectRate/roomSidePeek.ts
@@ -0,0 +1,8 @@
+import { RoomConfiguration } from "@/server/routers/hotels/output"
+
+import { RoomData } from "@/types/hotel"
+
+export type RoomSidePeekProps = {
+ roomConfiguration: RoomConfiguration
+ selectedRoom?: RoomData
+}