fix: special requests

This commit is contained in:
Christel Westerberg
2024-12-10 14:40:26 +01:00
parent 854563d099
commit 241e354fc5
16 changed files with 393 additions and 18 deletions

View File

@@ -9,11 +9,7 @@
width: min(100%, 600px);
}
.header,
.country,
.email,
.signup,
.phone {
.fullWidth {
grid-column: 1/-1;
}

View File

@@ -10,10 +10,17 @@ import Button from "@/components/TempDesignSystem/Button"
import CountrySelect from "@/components/TempDesignSystem/Form/Country"
import Input from "@/components/TempDesignSystem/Form/Input"
import Phone from "@/components/TempDesignSystem/Form/Phone"
import Select from "@/components/TempDesignSystem/Form/Select"
import TextArea from "@/components/TempDesignSystem/Form/TextArea"
import Footnote from "@/components/TempDesignSystem/Text/Footnote"
import JoinScandicFriendsCard from "./JoinScandicFriendsCard"
import { guestDetailsSchema, signedInDetailsSchema } from "./schema"
import {
ElevatorPreference,
FloorPreference,
guestDetailsSchema,
signedInDetailsSchema,
} from "./schema"
import Signup from "./Signup"
import styles from "./details.module.css"
@@ -71,7 +78,7 @@ export default function Details({ user, memberPrice }: DetailsProps) {
color="uiTextHighContrast"
textTransform="uppercase"
type="label"
className={styles.header}
className={styles.fullWidth}
>
{intl.formatMessage({ id: "Guest information" })}
</Footnote>
@@ -90,31 +97,92 @@ export default function Details({ user, memberPrice }: DetailsProps) {
registerOptions={{ required: true }}
/>
<CountrySelect
className={styles.country}
className={styles.fullWidth}
label={intl.formatMessage({ id: "Country" })}
name="countryCode"
readOnly={!!user}
registerOptions={{ required: true }}
/>
<Input
className={styles.email}
className={styles.fullWidth}
label={intl.formatMessage({ id: "Email address" })}
name="email"
readOnly={!!user}
registerOptions={{ required: true }}
/>
<Phone
className={styles.phone}
className={styles.fullWidth}
label={intl.formatMessage({ id: "Phone number" })}
name="phoneNumber"
readOnly={!!user}
registerOptions={{ required: true }}
/>
{user ? null : (
<div className={styles.signup}>
<div className={styles.fullWidth}>
<Signup name="join" />
</div>
)}
<Footnote
color="uiTextHighContrast"
textTransform="uppercase"
type="label"
className={styles.fullWidth}
>
{intl.formatMessage({ id: "Special requests" })}
</Footnote>
<Select
className={styles.fullWidth}
label={intl.formatMessage({ id: "Floor preference" })}
name="specialRequests.floorPreference"
items={[
{
value: "",
label: intl.formatMessage({
id: "No preference",
}),
},
{
value: FloorPreference.HIGH,
label: intl.formatMessage({ id: FloorPreference.HIGH }),
},
{
value: FloorPreference.LOW,
label: intl.formatMessage({ id: FloorPreference.LOW }),
},
]}
/>
<Select
className={styles.fullWidth}
label={intl.formatMessage({ id: "Elevator preference" })}
name="specialRequests.elevatorPreference"
items={[
{
value: "",
label: intl.formatMessage({
id: "No preference",
}),
},
{
value: ElevatorPreference.AWAY_FROM_ELEVATOR,
label: intl.formatMessage({
id: ElevatorPreference.AWAY_FROM_ELEVATOR,
}),
},
{
value: ElevatorPreference.NEAR_ELEVATOR,
label: intl.formatMessage({
id: ElevatorPreference.NEAR_ELEVATOR,
}),
},
]}
/>
<TextArea
label={intl.formatMessage({
id: "Is there anything else you would like us to know before your arrival?",
})}
name="specialRequests.comments"
className={styles.fullWidth}
/>
</div>
<footer className={styles.footer}>
<Button

View File

@@ -8,6 +8,24 @@ const stringMatcher =
const isValidString = (key: string) => stringMatcher.test(key)
export enum FloorPreference {
LOW = "Low level",
HIGH = "High level",
}
export enum ElevatorPreference {
AWAY_FROM_ELEVATOR = "Away from elevator",
NEAR_ELEVATOR = "Near elevator",
}
const specialRequestsSchema = z
.object({
floorPreference: z.nativeEnum(FloorPreference).optional(),
elevatorPreference: z.nativeEnum(ElevatorPreference).optional(),
comments: z.string().optional(),
})
.optional()
export const baseDetailsSchema = z.object({
countryCode: z.string().min(1, { message: "Country is required" }),
email: z.string().email({ message: "Email address is required" }),
@@ -24,6 +42,7 @@ export const baseDetailsSchema = z.object({
message: "Last name can't contain any special characters",
}),
phoneNumber: phoneValidator(),
specialRequests: specialRequestsSchema,
})
export const notJoinDetailsSchema = baseDetailsSchema.merge(
@@ -78,4 +97,5 @@ export const signedInDetailsSchema = z.object({
.transform((_) => false),
dateOfBirth: z.string().default(""),
zipCode: z.string().default(""),
specialRequests: specialRequestsSchema,
})

View File

@@ -46,3 +46,26 @@ input:placeholder-shown:active ~ .label {
input:disabled ~ .label {
color: var(--Main-Grey-40);
}
textarea:active ~ .label,
textarea:not(:placeholder-shown) ~ .label {
display: block;
font-size: 12px;
}
textarea:focus ~ .label {
font-size: 12px;
}
textarea:placeholder-shown ~ .label {
grid-row: 1/-1;
}
textarea:placeholder-shown:focus ~ .label,
textarea:placeholder-shown:active ~ .label {
margin-bottom: var(--Spacing-x-half);
}
textarea:disabled ~ .label {
color: var(--Main-Grey-40);
}

View File

@@ -6,6 +6,7 @@ import ReactAriaSelect from "@/components/TempDesignSystem/Select"
import type { SelectProps } from "./select"
export default function Select({
className,
items,
label,
name,
@@ -21,6 +22,7 @@ export default function Select({
return (
<ReactAriaSelect
className={className}
defaultSelectedKey={field.value}
disabled={field.disabled}
items={items}

View File

@@ -0,0 +1,90 @@
"use client"
import {
Label as AriaLabel,
Text,
TextArea as AriaTextArea,
TextField,
} from "react-aria-components"
import { Controller, useFormContext } from "react-hook-form"
import { CheckIcon, InfoCircleIcon } from "@/components/Icons"
import Label from "@/components/TempDesignSystem/Form/Label"
import Caption from "@/components/TempDesignSystem/Text/Caption"
import Body from "../../Text/Body"
import styles from "./textarea.module.css"
import type { HTMLAttributes, WheelEvent } from "react"
import type { TextAreaProps } from "./input"
export default function TextArea({
"aria-label": ariaLabel,
className = "",
disabled = false,
helpText = "",
label,
name,
placeholder = "",
readOnly = false,
registerOptions = {},
type = "text",
}: TextAreaProps) {
const { control } = useFormContext()
let numberAttributes: HTMLAttributes<HTMLTextAreaElement> = {}
if (type === "number") {
numberAttributes.onWheel = function (evt: WheelEvent<HTMLTextAreaElement>) {
evt.currentTarget.blur()
}
}
return (
<Controller
disabled={disabled}
control={control}
name={name}
rules={registerOptions}
render={({ field, fieldState }) => (
<TextField
aria-label={ariaLabel}
className={className}
isDisabled={field.disabled}
isRequired={!!registerOptions.required}
onBlur={field.onBlur}
onChange={field.onChange}
validationBehavior="aria"
value={field.value}
>
<AriaLabel className={styles.container} htmlFor={name}>
<Body asChild fontOnly>
<AriaTextArea
{...field}
aria-labelledby={field.name}
id={name}
placeholder={placeholder}
readOnly={readOnly}
required={!!registerOptions.required}
className={styles.textarea}
/>
</Body>
<Label required={!!registerOptions.required}>{label}</Label>
</AriaLabel>
{helpText && !fieldState.error ? (
<Caption asChild color="black">
<Text className={styles.helpText} slot="description">
<CheckIcon height={20} width={30} />
{helpText}
</Text>
</Caption>
) : null}
{fieldState.error ? (
<Caption className={styles.error} fontOnly>
<InfoCircleIcon color="red" />
{fieldState.error.message}
</Caption>
) : null}
</TextField>
)}
/>
)
}

View File

@@ -0,0 +1,9 @@
import type { RegisterOptions } from "react-hook-form"
export interface TextAreaProps
extends React.InputHTMLAttributes<HTMLTextAreaElement> {
helpText?: string
label: string
name: string
registerOptions?: RegisterOptions
}

View File

@@ -0,0 +1,72 @@
.helpText {
align-items: flex-start;
display: flex;
gap: var(--Spacing-x-half);
}
.error {
align-items: center;
color: var(--Scandic-Red-60);
display: flex;
gap: var(--Spacing-x-half);
margin: var(--Spacing-x1) 0 0;
}
.container {
background-color: var(--Main-Grey-White);
border-color: var(--Scandic-Beige-40);
border-style: solid;
border-width: 1px;
border-radius: var(--Corner-radius-Medium);
display: grid;
min-width: 0; /* allow shrinkage */
grid-template-rows: auto 1fr;
height: 138px;
padding: var(--Spacing-x3) var(--Spacing-x2) 0 var(--Spacing-x2);
transition: border-color 200ms ease;
}
.container:has(.textarea:active, .textarea:focus) {
border-color: var(--Scandic-Blue-90);
}
.container:has(.textarea:disabled) {
background-color: var(--Main-Grey-10);
border: none;
color: var(--Main-Grey-40);
}
.container:has(.textarea[data-invalid="true"], .textarea[aria-invalid="true"]) {
border-color: var(--Scandic-Red-60);
}
.textarea {
background: none;
border: none;
color: var(--Main-Grey-100);
height: 100%;
width: 100%;
margin: 0;
order: 2;
overflow: visible;
padding: 0;
resize: none;
}
.textarea:not(:active, :focus):placeholder-shown {
height: 88px;
transition: height 150ms ease;
}
.textarea:focus,
.textarea:focus:placeholder-shown,
.textarea:active,
.textarea:active:placeholder-shown {
height: 94px;
transition: height 150ms ease;
outline: none;
}
.textarea:disabled {
color: var(--Main-Grey-40);
}

View File

@@ -25,6 +25,7 @@ import type {
} from "./select"
export default function Select({
className = "",
"aria-label": ariaLabel,
defaultSelectedKey,
items,
@@ -54,7 +55,7 @@ export default function Select({
}
return (
<div className={styles.container} ref={setRef}>
<div className={`${styles.container} ${className}`} ref={setRef}>
<ReactAriaSelect
aria-label={ariaLabel}
className={`${styles.select} ${discreet && styles.discreet}`}
@@ -68,11 +69,26 @@ export default function Select({
<Body asChild fontOnly>
<Button className={styles.input} data-testid={name}>
<span className={styles.inputContentWrapper} tabIndex={tabIndex}>
<Label required={required} size={discreet ? "discreet" : "small"}>
{label}
{discreet && `:`}
</Label>
<SelectValue />
<SelectValue>
{({ isPlaceholder, selectedText }) => (
<>
<Label
required={required}
size={discreet ? "discreet" : "small"}
>
{label}
{discreet && `:`}
</Label>
{isPlaceholder ? (
placeholder ? (
<Body color="uiTextPlaceholder"> {placeholder}</Body>
) : null
) : (
selectedText
)}
</>
)}
</SelectValue>
</span>
<SelectChevron
{...(discreet ? { color: "baseButtonTextOnFillNormal" } : {})}

View File

@@ -1,4 +1,4 @@
import type { Key, SelectProps as AriaSelectProps } from "react-aria-components"
import type { Key } from "react-aria-components"
export interface SelectProps
extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, "onSelect"> {

View File

@@ -18,6 +18,7 @@
"Add Room": "Tilføj værelse",
"Add code": "Tilføj kode",
"Add new card": "Tilføj nyt kort",
"Add to calendar": "Tilføj til kalender",
"Address": "Adresse",
"Adults": "voksne",
"Age": "Alder",
@@ -41,6 +42,7 @@
"At latest": "Senest",
"At the hotel": "På hotellet",
"Attractions": "Attraktioner",
"Away from elevator": "Væk fra elevator",
"Back to scandichotels.com": "Tilbage til scandichotels.com",
"Back to top": "Tilbage til top",
"Bar": "Bar",
@@ -120,11 +122,13 @@
"Distance to hotel": "Afstand til hotel: {distance} m",
"Do you want to start the day with Scandics famous breakfast buffé?": "Vil du starte dagen med Scandics berømte morgenbuffet?",
"Done": "Færdig",
"Download invoice": "Download faktura",
"Download the Scandic app": "Download Scandic-appen",
"Driving directions": "Kørselsanvisning",
"Earn bonus nights & points": "Optjen bonusnætter og point",
"Edit": "Redigere",
"Edit profile": "Rediger profil",
"Elevator preference": "Elevatorpræference",
"Email": "E-mail",
"Email address": "E-mailadresse",
"Email address is required": "Email address is required",
@@ -148,6 +152,7 @@
"First name can't contain any special characters": "Fornavn kan ikke indeholde specielle tegn",
"First name is required": "Fornavn er påkrævet",
"Flexibility": "Fleksibilitet",
"Floor preferences": "Etagepræferencer",
"Follow us": "Følg os",
"Food options": "Madvalg",
"Former Scandic Hotel": "Tidligere Scandic Hotel",
@@ -167,10 +172,12 @@
"Guests & Rooms": "Gæster & værelser",
"Gym": "Fitnesscenter",
"Hi": "Hei",
"High level": "Højt niveau",
"Highest level": "Højeste niveau",
"Home": "Hjem",
"Hospital": "Hospital",
"Hotel": "Hotel",
"Hotel details": "Hoteloplysninger",
"Hotel facilities": "Hotel faciliteter",
"Hotel reservation": "Hotel reservation",
"Hotel surroundings": "Hotel omgivelser",
@@ -189,6 +196,7 @@
"In extra bed": "i ekstra seng",
"Included": "Inkluderet",
"IndoorPool": "Indendørs pool",
"Is there anything else you would like us to know before your arrival?": "Er der andet, du gerne vil have os til at vide, før din ankomst?",
"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.",
"Jacuzzi": "Jacuzzi",
"Join Scandic Friends": "Tilmeld dig Scandic Friends",
@@ -217,6 +225,9 @@
"Log in here": "Log ind her",
"Log in/Join": "Log på/Tilmeld dig",
"Log out": "Log ud",
"Long {long} ∙ Lat {lat}": "Long {long} ∙ Lat {lat}",
"Longitude": "Længde {long}",
"Low floor": "Lav etage",
"MY SAVED CARDS": "MINE SAVEDE KORT",
"Main menu": "Hovedmenu",
"Manage preferences": "Administrer præferencer",
@@ -243,6 +254,7 @@
"My payment cards": "Mine betalingskort",
"My wishes": "Mine ønsker",
"Name": "Navn",
"Near elevator": "Tæt på elevator",
"Nearby": "I nærheden",
"Nearby companies": "Nærliggende virksomheder",
"New password": "Nyt kodeord",
@@ -377,6 +389,8 @@
"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!",
"Sort by": "Sorter efter",
"Special requests": "Specielle ønsker",
"Spice things up": "Krydre tingene",
"Sports": "Sport",
"Standard price": "Standardpris",
"Stay at HOTEL_NAME | Hotel in DESTINATION": "Bo på {hotelName} | Hotel i {destination}",

View File

@@ -18,6 +18,7 @@
"Add Room": "Zimmer hinzufügen",
"Add code": "Code hinzufügen",
"Add new card": "Neue Karte hinzufügen",
"Add to calendar": "Zum Kalender hinzufügen",
"Address": "Adresse",
"Adults": "Erwachsene",
"Age": "Alter",
@@ -41,6 +42,7 @@
"At latest": "Spätestens",
"At the hotel": "Im Hotel",
"Attraction": "Attraktion",
"Away from elevator": "Weg vom Aufzug",
"Back to scandichotels.com": "Zurück zu scandichotels.com",
"Back to top": "Zurück zur Spitze",
"Bar": "Bar",
@@ -120,11 +122,13 @@
"Distance to hotel": "Entfernung zum Hotel: {distance} m",
"Do you want to start the day with Scandics famous breakfast buffé?": "Möchten Sie den Tag mit Scandics berühmtem Frühstücksbuffet beginnen?",
"Done": "Fertig",
"Download invoice": "Rechnung herunterladen",
"Download the Scandic app": "Laden Sie die Scandic-App herunter",
"Driving directions": "Anfahrtsbeschreibung",
"Earn bonus nights & points": "Sammeln Sie Bonusnächte und -punkte",
"Edit": "Bearbeiten",
"Edit profile": "Profil bearbeiten",
"Elevator preference": "Aufzugpräferenz",
"Email": "Email",
"Email address": "E-Mail-Adresse",
"Email address is required": "E-Mail-Adresse ist erforderlich",
@@ -148,6 +152,7 @@
"First name can't contain any special characters": "Der Vorname darf keine Sonderzeichen enthalten",
"First name is required": "Vorname ist erforderlich",
"Flexibility": "Flexibilität",
"Floor preferences": "Etagenpräferenzen",
"Follow us": "Folgen Sie uns",
"Food options": "Speisen & Getränke",
"Former Scandic Hotel": "Ehemaliges Scandic Hotel",
@@ -167,10 +172,12 @@
"Guests & Rooms": "Gäste & Zimmer",
"Gym": "Fitnessstudio",
"Hi": "Hallo",
"High level": "Hohes Level",
"Highest level": "Höchstes Level",
"Home": "Heim",
"Hospital": "Krankenhaus",
"Hotel": "Hotel",
"Hotel details": "Hotelinformationen",
"Hotel facilities": "Hotel-Infos",
"Hotel reservation": "Hotelreservierung",
"Hotel surroundings": "Umgebung des Hotels",
@@ -189,6 +196,7 @@
"In extra bed": "im zusätzlichen Bett",
"Included": "Iinklusive",
"IndoorPool": "Innenpool",
"Is there anything else you would like us to know before your arrival?": "Gibt es noch etwas, das Sie uns vor Ihrer Ankunft mitteilen möchten?",
"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.",
"Jacuzzi": "Whirlpool",
"Join Scandic Friends": "Treten Sie Scandic Friends bei",
@@ -217,6 +225,9 @@
"Log in here": "Hier einloggen",
"Log in/Join": "Log in/Anmelden",
"Log out": "Ausloggen",
"Long {long} ∙ Lat {lat}": "Long {long} ∙ Lat {lat}",
"Longitude": "Länge {long}",
"Low floor": "Niedrige Etage",
"MY SAVED CARDS": "MEINE SAVEDEN KARTEN",
"Main menu": "Hauptmenü",
"Manage preferences": "Verwalten von Voreinstellungen",
@@ -242,6 +253,7 @@
"My payment cards": "Meine Zahlungskarten",
"My wishes": "Meine Wünsche",
"Name": "Name",
"Near elevator": "In der Nähe des Aufzugs",
"Nearby": "In der Nähe",
"Nearby companies": "Nahe gelegene Unternehmen",
"New password": "Neues Kennwort",
@@ -377,6 +389,8 @@
"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!",
"Sort by": "Sortieren nach",
"Special requests": "Spezielle Anfragen",
"Spice things up": "Würzen Sie die Dinge auf",
"Sports": "Sport",
"Standard price": "Standardpreis",
"Stay at HOTEL_NAME | Hotel in DESTINATION": "Übernachten Sie im {hotelName} | Hotel in {destination}",

View File

@@ -42,6 +42,7 @@
"At latest": "At latest",
"At the hotel": "At the hotel",
"Attractions": "Attractions",
"Away from elevator": "Away from elevator",
"Back to scandichotels.com": "Back to scandichotels.com",
"Back to top": "Back to top",
"Bar": "Bar",
@@ -135,6 +136,7 @@
"Earn bonus nights & points": "Earn bonus nights & points",
"Edit": "Edit",
"Edit profile": "Edit profile",
"Elevator preference": "Elevator preference",
"Email": "Email",
"Email address": "Email address",
"Email address is required": "Email address is required",
@@ -158,6 +160,7 @@
"First name can't contain any special characters": "First name can't contain any special characters",
"First name is required": "First name is required",
"Flexibility": "Flexibility",
"Floor preferences": "Floor preferences",
"Follow us": "Follow us",
"Food options": "Food options",
"Former Scandic Hotel": "Former Scandic Hotel",
@@ -183,6 +186,7 @@
"Guests & Rooms": "Guests & Rooms",
"Gym": "Gym",
"Hi": "Hi",
"High level": "High level",
"Highest level": "Highest level",
"Home": "Home",
"Hospital": "Hospital",
@@ -206,6 +210,7 @@
"In extra bed": "In extra bed",
"Included": "Included",
"IndoorPool": "Indoor pool",
"Is there anything else you would like us to know before your arrival?": "Is there anything else you would like us to know before your arrival?",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.",
"Jacuzzi": "Jacuzzi",
"Join Scandic Friends": "Join Scandic Friends",
@@ -237,6 +242,7 @@
"Log out": "Log out",
"Long {long} ∙ Lat {lat}": "Long {long} ∙ Lat {lat}",
"Longitude": "Longitude {long}",
"Low floor": "Low floor",
"MY SAVED CARDS": "MY SAVED CARDS",
"Main guest": "Main guest",
"Main menu": "Main menu",
@@ -268,6 +274,7 @@
"My payment cards": "My payment cards",
"My wishes": "My wishes",
"Name": "Name",
"Near elevator": "Near elevator",
"Nearby": "Nearby",
"Nearby companies": "Nearby companies",
"New password": "New password",
@@ -419,6 +426,7 @@
"Something went wrong and we couldn't remove your card. Please try again later.": "Something went wrong and we couldn't remove your card. Please try again later.",
"Something went wrong!": "Something went wrong!",
"Sort by": "Sort by",
"Special requests": "Special requests",
"Spice things up": "Spice things up",
"Sports": "Sports",
"Standard price": "Standard price",

View File

@@ -18,6 +18,7 @@
"Add Room": "Lisää huone",
"Add code": "Lisää koodi",
"Add new card": "Lisää uusi kortti",
"Add to calendar": "Lisää kalenteriin",
"Address": "Osoite",
"Adults": "Aikuista",
"Age": "Ikä",
@@ -41,6 +42,7 @@
"At latest": "Viimeistään",
"At the hotel": "Hotellissa",
"Attractions": "Nähtävyydet",
"Away from elevator": "Kaukana hissistä",
"Back to scandichotels.com": "Takaisin scandichotels.com",
"Back to top": "Takaisin ylös",
"Bar": "Bar",
@@ -120,11 +122,13 @@
"Distance to hotel": "Etäisyys hotelliin: {distance} m",
"Do you want to start the day with Scandics famous breakfast buffé?": "Haluatko aloittaa päiväsi Scandicsin kuuluisalla aamiaisbuffella?",
"Done": "Valmis",
"Download invoice": "Lataa lasku",
"Download the Scandic app": "Lataa Scandic-sovellus",
"Driving directions": "Ajo-ohjeet",
"Earn bonus nights & points": "Ansaitse bonusöitä ja -pisteitä",
"Edit": "Muokata",
"Edit profile": "Muokkaa profiilia",
"Elevator preference": "Hissitoive",
"Email": "Sähköposti",
"Email address": "Sähköpostiosoite",
"Email address is required": "Sähköpostiosoite vaaditaan",
@@ -148,6 +152,7 @@
"First name can't contain any special characters": "Etunimi ei voi sisältää erikoismerkkejä",
"First name is required": "Etunimi vaaditaan",
"Flexibility": "Joustavuus",
"Floor preferences": "Kerrostasotoive",
"Follow us": "Seuraa meitä",
"Food options": "Ruokavalio",
"Former Scandic Hotel": "Entinen Scandic-hotelli",
@@ -167,10 +172,12 @@
"Guests & Rooms": "Vieraat & Huoneet",
"Gym": "Kuntosali",
"Hi": "Hi",
"High level": "Korkea taso",
"Highest level": "Korkein taso",
"Home": "Kotiin",
"Hospital": "Sairaala",
"Hotel": "Hotelli",
"Hotel details": "Hotellin tiedot",
"Hotel facilities": "Hotellin palvelut",
"Hotel reservation": "Hotellivaraukset",
"Hotel surroundings": "Hotellin ympäristö",
@@ -189,6 +196,7 @@
"In extra bed": "Oma vuodepaikka",
"Included": "Sisälly hintaan",
"IndoorPool": "Sisäuima-allas",
"Is there anything else you would like us to know before your arrival?": "Onko jotain muuta, mitä haluaisit meidän tietävän ennen saapumistasi?",
"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.",
"Jacuzzi": "Poreallas",
"Join Scandic Friends": "Liity jäseneksi",
@@ -217,6 +225,9 @@
"Log in here": "Kirjaudu sisään",
"Log in/Join": "Kirjaudu sisään/Liittyä",
"Log out": "Kirjaudu ulos",
"Long {long} ∙ Lat {lat}": "Long {long} ∙ Lat {lat}",
"Longitude": "Pituusaste {long}",
"Low floor": "Alhainen kerros",
"MY SAVED CARDS": "MINUN SAVED CARDS",
"Main menu": "Päävalikko",
"Manage preferences": "Asetusten hallinta",
@@ -243,6 +254,7 @@
"My payment cards": "Minun maksukortit",
"My wishes": "Toiveeni",
"Name": "Nimi",
"Near elevator": "Lähellä hissiä",
"Nearby": "Lähistöllä",
"Nearby companies": "Läheiset yritykset",
"New password": "Uusi salasana",
@@ -378,6 +390,8 @@
"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!",
"Sort by": "Lajitteluperuste",
"Special requests": "Erityistoiveet",
"Spice things up": "Mausta asioita",
"Sports": "Urheilu",
"Standard price": "Normaali hinta",
"Stay at HOTEL_NAME | Hotel in DESTINATION": "Majoitu kohteessa {hotelName} | Hotelli kohteessa {destination}",

View File

@@ -18,6 +18,7 @@
"Add Room": "Legg til rom",
"Add code": "Legg til kode",
"Add new card": "Legg til nytt kort",
"Add to calendar": "Legg til i kalenderen",
"Address": "Adresse",
"Adults": "Voksne",
"Age": "Alder",
@@ -41,6 +42,7 @@
"At latest": "Senest",
"At the hotel": "På hotellet",
"Attractions": "Attraksjoner",
"Away from elevator": "Bort fra heisen",
"Back to scandichotels.com": "Tilbake til scandichotels.com",
"Back to top": "Tilbake til toppen",
"Bar": "Bar",
@@ -119,11 +121,13 @@
"Distance to hotel": "Avstand til hotell: {distance} m",
"Do you want to start the day with Scandics famous breakfast buffé?": "Vil du starte dagen med Scandics berømte frokostbuffé?",
"Done": "Ferdig",
"Download invoice": "Last ned faktura",
"Download the Scandic app": "Last ned Scandic-appen",
"Driving directions": "Veibeskrivelser",
"Earn bonus nights & points": "Tjen bonusnetter og poeng",
"Edit": "Redigere",
"Edit profile": "Rediger profil",
"Elevator preference": "Heispreferanse",
"Email": "E-post",
"Email address": "E-postadresse",
"Email address is required": "E-postadresse kreves",
@@ -147,6 +151,7 @@
"First name can't contain any special characters": "Fornavn kan ikke inneholde spesielle tegn",
"First name is required": "Fornavn kreves",
"Flexibility": "Fleksibilitet",
"Floor preferences": "Etasjepreferanser",
"Follow us": "Følg oss",
"Food options": "Matvalg",
"Former Scandic Hotel": "Tidligere Scandic-hotell",
@@ -166,10 +171,12 @@
"Guests & Rooms": "Gjester & rom",
"Gym": "Treningsstudio",
"Hi": "Hei",
"High level": "Høy nivå",
"Highest level": "Høyeste nivå",
"Home": "Hjem",
"Hospital": "Sykehus",
"Hotel": "Hotel",
"Hotel details": "Detaljer om hotellet",
"Hotel facilities": "Hotelfaciliteter",
"Hotel reservation": "Hotellreservasjon",
"Hotel surroundings": "Hotellomgivelser",
@@ -181,12 +188,14 @@
"Hurry up and use them before they expire!": "Skynd deg og bruk dem før de utløper!",
"I accept": "Jeg aksepterer",
"I accept the terms and conditions": "Jeg aksepterer vilkårene",
"I would like to get my booking confirmation via sms": "Jeg vil gjerne motta bekreftelsen av bestillingen min via sms",
"Image gallery": "{name} - Bildegalleri",
"In adults bed": "i voksnes seng",
"In crib": "i sprinkelseng",
"In extra bed": "i ekstraseng",
"Included": "Inkludert",
"IndoorPool": "Innendørs basseng",
"Is there anything else you would like us to know before your arrival?": "Er det noe annet du vil at vi skal vite før ankomsten din?",
"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.",
"Jacuzzi": "Boblebad",
"Join Scandic Friends": "Bli med i Scandic Friends",
@@ -215,6 +224,9 @@
"Log in here": "Logg inn her",
"Log in/Join": "Logg på/Bli med",
"Log out": "Logg ut",
"Long {long} ∙ Lat {lat}": "Long {long} ∙ Lat {lat}",
"Longitude": "Lengde {long}",
"Low floor": "Lav posisjon",
"MY SAVED CARDS": "MINE SAVEDE KORT",
"Main menu": "Hovedmeny",
"Manage preferences": "Administrer preferanser",
@@ -241,6 +253,7 @@
"My payment cards": "Mine betalingskort",
"My wishes": "Mine ønsker",
"Name": "Navn",
"Near elevator": "Nær heisen",
"Nearby": "I nærheten",
"Nearby companies": "Nærliggende selskaper",
"New password": "Nytt passord",
@@ -375,6 +388,8 @@
"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!",
"Sort by": "Sorter etter",
"Special requests": "Spesielle ønsker",
"Spice things up": "Krydre tingene",
"Sports": "Sport",
"Standard price": "Standardpris",
"Stay at HOTEL_NAME | Hotel in DESTINATION": "Bo på {hotelName} | Hotell i {destination}",

View File

@@ -18,6 +18,7 @@
"Add Room": "Lägg till rum",
"Add code": "Lägg till kod",
"Add new card": "Lägg till nytt kort",
"Add to calendar": "Lägg till i kalendern",
"Address": "Adress",
"Adults": "Vuxna",
"Age": "Ålder",
@@ -41,6 +42,7 @@
"At latest": "Senast",
"At the hotel": "På hotellet",
"Attractions": "Sevärdheter",
"Away from elevator": "Bort från hissen",
"Back to scandichotels.com": "Tillbaka till scandichotels.com",
"Back to top": "Tillbaka till toppen",
"Bar": "Bar",
@@ -119,11 +121,13 @@
"Distance to hotel": "Avstånd till hotell: {distance} m",
"Do you want to start the day with Scandics famous breakfast buffé?": "Vill du starta dagen med Scandics berömda frukostbuffé?",
"Done": "Klar",
"Download invoice": "Ladda ner faktura",
"Download the Scandic app": "Ladda ner Scandic-appen",
"Driving directions": "Vägbeskrivningar",
"Earn bonus nights & points": "Tjäna bonusnätter och poäng",
"Edit": "Redigera",
"Edit profile": "Redigera profil",
"Elevator preference": "Hisspreferencer",
"Email": "E-post",
"Email address": "E-postadress",
"Email address is required": "E-postadress är obligatorisk",
@@ -147,6 +151,7 @@
"First name can't contain any special characters": "Förnamn får inte innehålla några specialtecken",
"First name is required": "Förnamn är obligatoriskt",
"Flexibility": "Flexibilitet",
"Floor preferences": "Våningpreferenser",
"Follow us": "Följ oss",
"Food options": "Matval",
"Former Scandic Hotel": "Tidigare Scandichotell",
@@ -166,10 +171,12 @@
"Guests & Rooms": "Gäster & rum",
"Gym": "Gym",
"Hi": "Hej",
"High level": "Högt upp",
"Highest level": "Högsta nivå",
"Home": "Hem",
"Hospital": "Sjukhus",
"Hotel": "Hotell",
"Hotel details": "Detaljer om hotellet",
"Hotel facilities": "Hotellfaciliteter",
"Hotel reservation": "Hotellbokning",
"Hotel surroundings": "Hotellomgivning",
@@ -188,6 +195,7 @@
"In extra bed": "Egen sängplats",
"Included": "Inkluderad",
"IndoorPool": "Inomhuspool",
"Is there anything else you would like us to know before your arrival?": "Är det något mer du vill att vi ska veta innan din ankomst?",
"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.",
"Jacuzzi": "Jacuzzi",
"Join Scandic Friends": "Gå med i Scandic Friends",
@@ -216,6 +224,9 @@
"Log in here": "Logga in här",
"Log in/Join": "Logga in/Gå med",
"Log out": "Logga ut",
"Long {long} ∙ Lat {lat}": "Long {long} ∙ Lat {lat}",
"Longitude": "Longitud {long}",
"Low floor": "Lågt läge",
"MY SAVED CARDS": "MINE SAVEDE KORT",
"Main menu": "Huvudmeny",
"Manage preferences": "Hantera inställningar",
@@ -242,6 +253,7 @@
"My payment cards": "Mina betalningskort",
"My wishes": "Mina önskningar",
"Name": "Namn",
"Near elevator": "Nära hissen",
"Nearby": "I närheten",
"Nearby companies": "Närliggande företag",
"New password": "Nytt lösenord",
@@ -376,6 +388,8 @@
"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!",
"Sort by": "Sortera efter",
"Special requests": "Särskilda önskemål",
"Spice things up": "Krydda upp saker och ting",
"Sports": "Sport",
"Standard price": "Standardpris",
"Stay at HOTEL_NAME | Hotel in DESTINATION": "Bo på {hotelName} | Hotell i {destination}",