From d2ce9c0d7c99a805d506d97d21e178bd101dadde Mon Sep 17 00:00:00 2001 From: Michael Zetterberg Date: Fri, 3 Jan 2025 14:54:46 +0100 Subject: [PATCH] fix(i18n): prepare for Lokalise --- app/[lang]/(live)/(protected)/layout.tsx | 4 +- .../my-pages/@breadcrumbs/[...path]/error.tsx | 11 +- .../(protected)/my-pages/[...path]/error.tsx | 10 +- .../profile/@membershipCards/page.tsx | 41 +++- .../my-pages/profile/@profile/error.tsx | 5 +- .../my-pages/profile/@profile/page.tsx | 31 ++- app/[lang]/(live)/error.tsx | 17 +- .../(live)/middleware-error/[status]/page.tsx | 13 +- .../webview/[contentType]/[uid]/page.tsx | 12 +- app/global-error.tsx | 5 +- components/Blocks/Accordion/index.tsx | 12 +- .../DynamicContent/LoyaltyLevels/index.tsx | 34 ++- .../Friend/MembershipNumber/index.tsx | 9 +- .../DynamicContent/Overview/Friend/index.tsx | 13 +- .../Overview/Stats/ExpiringPoints/index.tsx | 2 +- .../OverviewTable/LevelSummary/index.tsx | 30 ++- .../JourneyTable/ClientTable/Row/index.tsx | 13 +- .../JourneyTable/ClientTable/index.tsx | 18 +- .../ExpiringPointsTable/index.tsx | 11 +- .../Rewards/NextLevel/index.tsx | 2 +- .../Rewards/Redeem/MembershipNumberBadge.tsx | 5 +- .../DynamicContent/Stays/StayCard/index.tsx | 4 +- .../HotelListing/HotelListingItem/index.tsx | 2 +- .../MobileToggleButton/index.tsx | 70 ++++-- .../HotelPage/IntroSection/index.tsx | 4 +- .../Map/DynamicMap/Sidebar/index.tsx | 20 +- .../HotelPage/Map/DynamicMap/index.tsx | 2 +- .../HotelPage/Map/MapCard/index.tsx | 7 +- .../HotelPage/Map/StaticMap/index.tsx | 5 +- .../HotelPage/PreviewImages/index.tsx | 4 +- .../HotelPage/Rooms/RoomCard/index.tsx | 9 +- .../ContentType/HotelPage/Rooms/index.tsx | 8 +- .../ContactInformation/index.tsx | 2 +- .../AccordionAmenities/CheckIn/index.tsx | 14 +- .../Parking/ParkingList/index.tsx | 26 ++- .../Parking/ParkingPrices/index.tsx | 10 +- .../SidePeeks/MeetingsAndConferences/util.ts | 10 +- .../SidePeeks/OpeningHours/index.tsx | 114 ++++++---- .../RestaurantBar/RestaurantBarItem/index.tsx | 2 +- .../HotelPage/SidePeeks/Room/index.tsx | 38 ++-- .../WellnessAndExercise/Facility/index.tsx | 22 +- .../HotelPage/TabNavigation/index.tsx | 5 +- components/DatePicker/index.tsx | 12 +- components/Footer/Details/index.tsx | 12 +- .../FormContent/Voucher/index.tsx | 4 +- .../Forms/BookingWidget/FormContent/index.tsx | 9 +- components/Forms/Signup/index.tsx | 6 +- components/GuestsRoomsPicker/Form.tsx | 6 +- components/GuestsRoomsPicker/index.tsx | 56 +++-- .../Header/MainMenu/MobileMenu/index.tsx | 11 +- .../Header/MainMenu/MyPagesMenu/index.tsx | 5 +- .../MainMenu/MyPagesMenuContent/index.tsx | 10 +- .../Confirmation/index.tsx | 4 +- .../BookingConfirmation/Header/index.tsx | 6 +- .../HotelDetails/index.tsx | 13 +- .../PaymentDetails/index.tsx | 12 +- .../BookingConfirmation/Receipt/index.tsx | 12 +- .../BookingConfirmation/Rooms/Room/index.tsx | 44 +++- components/HotelReservation/Contact/index.tsx | 14 +- .../BedType/BedTypeInfo/index.tsx | 8 +- .../EnterDetails/Breakfast/index.tsx | 6 +- .../Details/JoinScandicFriendsCard/index.tsx | 4 +- .../Details/MemberPriceModal/index.tsx | 2 +- .../EnterDetails/Details/Signup/index.tsx | 5 +- .../Details/Signup/signup.module.css | 4 + .../EnterDetails/Header/index.tsx | 13 +- .../EnterDetails/Payment/PaymentClient.tsx | 13 +- .../EnterDetails/PriceChangeDialog/index.tsx | 2 +- .../SelectedRoom/ToggleSidePeek.tsx | 2 +- .../EnterDetails/SelectedRoom/index.tsx | 12 +- .../Summary/Mobile/BottomSheet/index.tsx | 2 +- .../Summary/PriceDetailsTable/index.tsx | 37 ++-- .../EnterDetails/Summary/UI/index.tsx | 64 ++++-- .../HotelReservation/HotelCard/index.tsx | 11 +- .../ListingHotelCardDialog/index.tsx | 8 +- .../StandaloneHotelCardDialog/index.tsx | 16 +- .../HotelCardListing/index.tsx | 6 +- .../SelectHotel/FilterAndSortModal/index.tsx | 6 +- .../SelectHotel/HotelCount/index.tsx | 3 +- .../SelectRate/BedSelection/index.tsx | 5 +- .../SelectRate/BreakfastSelection/index.tsx | 5 +- .../SelectRate/Details/index.tsx | 5 +- .../SelectRate/HotelInfoCard/index.tsx | 13 +- .../SelectRate/RoomFilter/index.tsx | 18 +- .../FlexibilityOption/PriceList/index.tsx | 15 +- .../RoomSelection/RateSummary/index.tsx | 20 +- .../RoomSelection/RoomCard/index.tsx | 30 ++- .../SelectRate/Rooms/index.tsx | 11 +- .../SelectRate/SelectionCard/index.tsx | 15 +- components/LanguageSwitcher/index.tsx | 9 +- components/Lightbox/FullView.tsx | 1 + .../HotelListingMapContent/index.tsx | 2 +- .../InteractiveMap/HotelMapContent/index.tsx | 12 +- components/Modal/index.tsx | 6 +- components/MyPages/Surprises/Client.tsx | 9 +- components/MyPages/Surprises/Initial.tsx | 4 +- components/MyPages/Surprises/Slide.tsx | 17 +- .../Accordions/CheckInCheckOut.tsx | 18 +- .../HotelSidePeek/Accordions/Parking.tsx | 76 ++++--- .../HotelSidePeek/Accordions/Restaurant.tsx | 7 +- components/SidePeeks/RoomSidePeek/index.tsx | 35 ++- .../TempDesignSystem/Form/Label/index.tsx | 8 +- .../Form/Label/label.module.css | 5 +- .../TempDesignSystem/Form/Label/variants.ts | 5 + .../Form/NewPassword/index.tsx | 27 ++- .../TempDesignSystem/ShowMoreButton/index.tsx | 18 +- components/Webviews/LinkToOverview/index.tsx | 2 +- hooks/booking/usePaymentFailedToast.ts | 8 +- i18n/dictionaries/da.json | 194 ++++++++-------- i18n/dictionaries/de.json | 190 ++++++++-------- i18n/dictionaries/en.json | 208 +++++++++--------- i18n/dictionaries/fi.json | 193 ++++++++-------- i18n/dictionaries/no.json | 194 ++++++++-------- i18n/dictionaries/sv.json | 194 ++++++++-------- server/routers/contentstack/metadata/utils.ts | 2 +- server/routers/hotels/schemas/restaurants.ts | 2 - server/routers/hotels/tempHotelData.json | 12 +- .../hotelPage/sidepeek/restaurantBar.ts | 10 - .../bookingConfirmation/promos.ts | 2 +- types/hotel.ts | 2 - 120 files changed, 1703 insertions(+), 1042 deletions(-) diff --git a/app/[lang]/(live)/(protected)/layout.tsx b/app/[lang]/(live)/(protected)/layout.tsx index c6e4a0a51..45237ee30 100644 --- a/app/[lang]/(live)/(protected)/layout.tsx +++ b/app/[lang]/(live)/(protected)/layout.tsx @@ -5,11 +5,13 @@ import { overview } from "@/constants/routes/myPages" import { getProfile } from "@/lib/trpc/memoizedRequests" import { auth } from "@/auth" +import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" export default async function ProtectedLayout({ children, }: React.PropsWithChildren) { + const intl = await getIntl() const session = await auth() /** * Fallback to make sure every route nested in the @@ -54,7 +56,7 @@ export default async function ProtectedLayout({ console.error(`[layout:protected] unhandled user loading error`) break } - return

Something went wrong!

+ return

{intl.formatMessage({ id: "Something went wrong!" })}

} if (!user) { diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/error.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/error.tsx index d3e703f92..a7d0f4789 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/error.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/error.tsx @@ -1,12 +1,16 @@ "use client" + import * as Sentry from "@sentry/nextjs" import { useEffect } from "react" +import { useIntl } from "react-intl" export default function Error({ error, }: { error: Error & { digest?: string } }) { + const intl = useIntl() + useEffect(() => { if (!error) return @@ -17,7 +21,12 @@ export default function Error({ return (

- Breadcrumbs failed for this page ({error.digest}@{Date.now()}) + {intl.formatMessage( + { id: "Breadcrumbs failed for this page ({errorId})" }, + { + errorId: `${error.digest}@${Date.now()}`, + } + )}

) diff --git a/app/[lang]/(live)/(protected)/my-pages/[...path]/error.tsx b/app/[lang]/(live)/(protected)/my-pages/[...path]/error.tsx index 52c0b0809..3b0bbdbd4 100644 --- a/app/[lang]/(live)/(protected)/my-pages/[...path]/error.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/[...path]/error.tsx @@ -2,12 +2,15 @@ import * as Sentry from "@sentry/nextjs" import { useEffect } from "react" +import { useIntl } from "react-intl" export default function Error({ error, }: { error: Error & { digest?: string } }) { + const intl = useIntl() + useEffect(() => { if (!error) return @@ -18,7 +21,12 @@ export default function Error({ return (

- Error loading this page ({error.digest}@{Date.now()}) + {intl.formatMessage( + { id: "Error loading this page ({errorId})" }, + { + errorId: `${error.digest}@${Date.now()}`, + } + )}

) diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx index 050da40f8..7c516a350 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx @@ -30,12 +30,43 @@ export default async function MembershipCardSlot({ membershipCards.map((card, idx) => (
- Name: {card.membershipType} + {intl.formatMessage( + { id: "Name: {cardMembershipType}" }, + { + cardMembershipType: card.membershipType, + } + )} - Current Points: {card.currentPoints} - Member Since: {card.memberSince} - Number: {card.membershipNumber} - Expiration Date: {card.expirationDate.split("T")[0]} + + {intl.formatMessage( + { id: "Current Points {points, number}" }, + { points: card.currentPoints } + )} + + + {intl.formatMessage( + { id: "Member Since: {value}" }, + { + value: card.memberSince, + } + )} + + + {intl.formatMessage( + { id: "Number: {membershipNumber}" }, + { + membershipNumber: card.membershipNumber, + } + )} + + + {intl.formatMessage( + { id: "Expiration Date: {expirationDate}" }, + { + expirationDate: card.expirationDate.split("T")[0], + } + )} +
))} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx index 79c161abb..409dc9416 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx @@ -2,10 +2,13 @@ import * as Sentry from "@sentry/nextjs" import { useEffect } from "react" +import { useIntl } from "react-intl" import type { ErrorPage } from "@/types/next/error" export default function ProfileError({ error }: ErrorPage) { + const intl = useIntl() + useEffect(() => { if (!error) return @@ -13,5 +16,5 @@ export default function ProfileError({ error }: ErrorPage) { Sentry.captureException(error) }, [error]) - return

Error happened, Profile

+ return

{intl.formatMessage({ id: "Error happened, Profile" })}

} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx index 1ab252f1f..cd97725a3 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx @@ -30,6 +30,24 @@ export default async function Profile({ params }: PageArgs) { return null } + const addressParts = [] + if (user.address.streetAddress) { + addressParts.push(user.address.streetAddress) + } + + if (user.address.city) { + addressParts.push(user.address.city) + } + + if (user.address.country) { + addressParts.push(user.address.country) + } + + const addressOutput = + addressParts.length > 0 + ? addressParts.join(", ") + : intl.formatMessage({ id: "N/A" }) + const defaultLanguage = languages[params.lang] const language = languageSelect.find((l) => l.value === user.language) return ( @@ -90,18 +108,7 @@ export default async function Profile({ params }: PageArgs) { {intl.formatMessage({ id: "Address" })} - - {user.address.streetAddress - ? `${user.address.streetAddress}, ` - : ""} - {user.address.city ? `${user.address.city}, ` : ""} - {user.address.country ? `${user.address.country}` : ""} - {!user.address.streetAddress && - !user.address.city && - !user.address.country - ? "N/A" - : null} - + {addressOutput}
diff --git a/app/[lang]/(live)/error.tsx b/app/[lang]/(live)/error.tsx index 4d1f0ce13..98416b33a 100644 --- a/app/[lang]/(live)/error.tsx +++ b/app/[lang]/(live)/error.tsx @@ -1,19 +1,13 @@ -"use client" // Error components must be Client Components +"use client" + import * as Sentry from "@sentry/nextjs" -import { - useParams, - usePathname, - useRouter, - useSearchParams, -} from "next/navigation" +import { useParams, useRouter, useSearchParams } from "next/navigation" import { startTransition, useEffect, useRef } from "react" import { useIntl } from "react-intl" import { login } from "@/constants/routes/handleAuth" import { SESSION_EXPIRED } from "@/server/errors/trpc" -import { findLang } from "@/utils/languages" - import styles from "./error.module.css" import type { LangParams } from "@/types/params" @@ -63,13 +57,10 @@ export default function Error({ currentSearchParamsRef.current = currentSearchParams }, [searchParams, reset, router]) - const pathname = usePathname() - const lang = findLang(pathname) - return (
- {lang}: {intl.formatMessage({ id: "Something went wrong!" })} + {intl.formatMessage({ id: "Something went wrong!" })}
) diff --git a/app/[lang]/(live)/middleware-error/[status]/page.tsx b/app/[lang]/(live)/middleware-error/[status]/page.tsx index ecbb159a1..89e71843c 100644 --- a/app/[lang]/(live)/middleware-error/[status]/page.tsx +++ b/app/[lang]/(live)/middleware-error/[status]/page.tsx @@ -1,17 +1,26 @@ +import { getIntl } from "@/i18n" import { setLang } from "@/i18n/serverContext" import styles from "./page.module.css" import type { LangParams, LayoutArgs, StatusParams } from "@/types/params" -export default function MiddlewareError({ +export default async function MiddlewareError({ params, }: LayoutArgs) { setLang(params.lang) + const intl = await getIntl() + return (
- Middleware Error {params.lang}: {params.status} + {intl.formatMessage( + { id: "Middleware error {lang}: {status}" }, + { + lang: params.lang, + status: params.status, + } + )}
) } diff --git a/app/[lang]/webview/[contentType]/[uid]/page.tsx b/app/[lang]/webview/[contentType]/[uid]/page.tsx index 54b5fa91b..6b658c28a 100644 --- a/app/[lang]/webview/[contentType]/[uid]/page.tsx +++ b/app/[lang]/webview/[contentType]/[uid]/page.tsx @@ -5,6 +5,7 @@ import { getProfile } from "@/lib/trpc/memoizedRequests" import AccountPage from "@/components/Webviews/AccountPage" import LoyaltyPage from "@/components/Webviews/LoyaltyPage" +import { getIntl } from "@/i18n" import { setLang } from "@/i18n/serverContext" import type { @@ -18,11 +19,12 @@ export default async function ContentTypePage({ params, }: PageArgs) { setLang(params.lang) + const intl = await getIntl() const user = await getProfile() if (!user) { console.log(`[webview:page] unable to load user`) - return

Error: No user could be loaded

+ return

{intl.formatMessage({ id: "Error: No user could be loaded" })}

} if ("error" in user) { @@ -36,9 +38,13 @@ export default async function ContentTypePage({ console.log(`[webview:page] user error, redirecting to: ${redirectURL}`) redirect(redirectURL) case "notfound": - return

Error: user not found

+ return

{intl.formatMessage({ id: "Error: user not found" })}

case "unknown": - return

Unknown error occurred loading user

+ return ( +

+ {intl.formatMessage({ id: "Unknown error occurred loading user" })} +

+ ) default: const u: never = user console.log(`[webview:page] unhandled user loading error`) diff --git a/app/global-error.tsx b/app/global-error.tsx index 1ff7f50d3..e317cfba4 100644 --- a/app/global-error.tsx +++ b/app/global-error.tsx @@ -2,6 +2,7 @@ import * as Sentry from "@sentry/nextjs" import { useEffect } from "react" +import { useIntl } from "react-intl" import styles from "./global-error.module.css" @@ -12,6 +13,8 @@ export default function GlobalError({ }) { console.log({ global_error: error }) + const intl = useIntl() + useEffect(() => { Sentry.captureException(error) }, [error]) @@ -20,7 +23,7 @@ export default function GlobalError({
-

Something went really wrong!

+

{intl.formatMessage({ id: "Something went really wrong!" })}

diff --git a/components/Blocks/Accordion/index.tsx b/components/Blocks/Accordion/index.tsx index edab9dec0..99c191739 100644 --- a/components/Blocks/Accordion/index.tsx +++ b/components/Blocks/Accordion/index.tsx @@ -1,5 +1,7 @@ "use client" + import { useState } from "react" +import { useIntl } from "react-intl" import JsonToHtml from "@/components/JsonToHtml" import SectionContainer from "@/components/Section/Container" @@ -14,6 +16,8 @@ import type { AccordionProps } from "@/types/components/blocks/Accordion" import { HotelHashValues } from "@/types/components/hotelPage/tabNavigation" export default function AccordionSection({ accordion, title }: AccordionProps) { + const intl = useIntl() + const showToggleButton = accordion.length > 5 const [allAccordionsVisible, setAllAccordionsVisible] = useState(!showToggleButton) @@ -44,8 +48,12 @@ export default function AccordionSection({ accordion, title }: AccordionProps) { ) : null} diff --git a/components/Blocks/DynamicContent/LoyaltyLevels/index.tsx b/components/Blocks/DynamicContent/LoyaltyLevels/index.tsx index 8a4583204..e04d1e96e 100644 --- a/components/Blocks/DynamicContent/LoyaltyLevels/index.tsx +++ b/components/Blocks/DynamicContent/LoyaltyLevels/index.tsx @@ -6,7 +6,6 @@ import BiroScript from "@/components/TempDesignSystem/Text/BiroScript" import Caption from "@/components/TempDesignSystem/Text/Caption" import Title from "@/components/TempDesignSystem/Text/Title" import { getIntl } from "@/i18n" -import { getLang } from "@/i18n/serverContext" import SectionWrapper from "../SectionWrapper" @@ -35,9 +34,25 @@ export default async function LoyaltyLevels({ } async function LevelCard({ level }: LevelCardProps) { - const lang = getLang() const intl = await getIntl() - const pointsString = `${level.required_points.toLocaleString(lang)} ${intl.formatMessage({ id: "points" })} ` + + let pointsMsg: React.ReactNode = intl.formatMessage( + { id: "{pointsAmount, number} points" }, + { pointsAmount: level.required_points } + ) + + if (level.required_nights) { + pointsMsg = intl.formatMessage( + { + id: "{pointsAmount, number} points or {nightsAmount, number} nights", + }, + { + pointsAmount: level.required_points, + nightsAmount: level.required_nights, + highlight: (str) => {str}, + } + ) + } return (
@@ -47,18 +62,15 @@ async function LevelCard({ level }: LevelCardProps) { color="primaryLightOnSurfaceAccent" tilted="large" > - {intl.formatMessage({ id: "Level" })} {level.user_facing_tag} + {intl.formatMessage( + { id: "Level {level}" }, + { level: level.user_facing_tag } + )} - {pointsString} - {level.required_nights ? ( - <span className={styles.redText}> - {intl.formatMessage({ id: "or" })} {level.required_nights}{" "} - {intl.formatMessage({ id: "nights" })} - </span> - ) : null} + {pointsMsg}
{level.rewards.map((reward) => ( diff --git a/components/Blocks/DynamicContent/Overview/Friend/MembershipNumber/index.tsx b/components/Blocks/DynamicContent/Overview/Friend/MembershipNumber/index.tsx index 207533a57..6fd7e52d2 100644 --- a/components/Blocks/DynamicContent/Overview/Friend/MembershipNumber/index.tsx +++ b/components/Blocks/DynamicContent/Overview/Friend/MembershipNumber/index.tsx @@ -19,14 +19,15 @@ export default async function MembershipNumber({ return (
- {intl.formatMessage({ id: "Membership ID" })} - {": "} + {intl.formatMessage({ id: "Membership ID: " })} - {membership?.membershipNumber ?? "N/A"} + + {membership?.membershipNumber ?? intl.formatMessage({ id: "N/A" })} + - {membership && ( + {membership?.membershipNumber && ( )} diff --git a/components/Blocks/DynamicContent/Overview/Friend/index.tsx b/components/Blocks/DynamicContent/Overview/Friend/index.tsx index 5b39fa738..d11b4ae81 100644 --- a/components/Blocks/DynamicContent/Overview/Friend/index.tsx +++ b/components/Blocks/DynamicContent/Overview/Friend/index.tsx @@ -24,15 +24,18 @@ export default async function Friend({ } const isHighestLevel = isHighestMembership(membership.membershipLevel) + const lvlMessageHighest = intl.formatMessage({ id: "Highest level" }) + + const lvlMessageLevel = intl.formatMessage( + { id: "Level {level}" }, + { level: membershipLevels[membership.membershipLevel] } + ) + return (
- {intl.formatMessage( - isHighestLevel - ? { id: "Highest floor" } - : { id: `Level ${membershipLevels[membership.membershipLevel]}` } - )} + {isHighestLevel ? lvlMessageHighest : lvlMessageLevel} {intl.formatMessage( - { id: "spendable points expiring by" }, + { id: "{points} spendable points expiring by {date}" }, { points: intl.formatNumber(membership.pointsToExpire), date: d.format(dateFormat), diff --git a/components/Blocks/DynamicContent/OverviewTable/LevelSummary/index.tsx b/components/Blocks/DynamicContent/OverviewTable/LevelSummary/index.tsx index 88e349b90..e97485536 100644 --- a/components/Blocks/DynamicContent/OverviewTable/LevelSummary/index.tsx +++ b/components/Blocks/DynamicContent/OverviewTable/LevelSummary/index.tsx @@ -1,7 +1,5 @@ import { useIntl } from "react-intl" -import useLang from "@/hooks/useLang" - import styles from "./levelSummary.module.css" import type { LevelSummaryProps } from "@/types/components/overviewTable" @@ -10,17 +8,29 @@ export default function LevelSummary({ level, showDescription = true, }: LevelSummaryProps) { - const lang = useLang() const intl = useIntl() + + let pointsMsg: React.ReactNode = intl.formatMessage( + { id: "{pointsAmount, number} points" }, + { pointsAmount: level.required_points } + ) + + if (level.required_nights) { + pointsMsg = intl.formatMessage( + { + id: "{pointsAmount, number} points or {nightsAmount, number} nights", + }, + { + pointsAmount: level.required_points, + nightsAmount: level.required_nights, + highlight: (str) => {str}, + } + ) + } + return (
- - {level.required_points.toLocaleString(lang)} - {"p "} - {level.required_nights - ? `${intl.formatMessage({ id: "or" })} ${level.required_nights} ${intl.formatMessage({ id: "nights" })}` - : ""} - + {pointsMsg} {showDescription && (

{level.description}

)} diff --git a/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/Row/index.tsx b/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/Row/index.tsx index adc072086..9f7dc2bc8 100644 --- a/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/Row/index.tsx +++ b/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/Row/index.tsx @@ -22,12 +22,19 @@ export default function Row({ transaction }: RowProps) { const pathName = usePathname() const isWebview = webviews.includes(pathName) - const nightString = `${transaction.nights} ${transaction.nights === 1 ? intl.formatMessage({ id: "night" }) : intl.formatMessage({ id: "nights" })}` + const nightsMsg = intl.formatMessage( + { + id: "{nightsAmount, plural, one {# night} other {# nights}}", + }, + { + nightsAmount: transaction.nights, + } + ) let description = transaction.hotelName && transaction.city - ? `${transaction.hotelName}, ${transaction.city} ${nightString}` - : `${nightString}` + ? `${transaction.hotelName}, ${transaction.city} ${nightsMsg}` + : `${nightsMsg}` switch (transaction.type) { case Transactions.rewardType.stay: diff --git a/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/index.tsx b/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/index.tsx index cc688b21d..c40429774 100644 --- a/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/index.tsx +++ b/components/Blocks/DynamicContent/Points/EarnAndBurn/JourneyTable/ClientTable/index.tsx @@ -11,16 +11,16 @@ import styles from "./clientTable.module.css" import type { ClientTableProps } from "@/types/components/myPages/myPage/earnAndBurn" -const tableHeadings = [ - "Points", - "Description", - "Booking number", - "Arrival date", -] - export default function ClientTable({ transactions }: ClientTableProps) { const intl = useIntl() + const tableHeadings = [ + intl.formatMessage({ id: "Points" }), + intl.formatMessage({ id: "Description" }), + intl.formatMessage({ id: "Booking number" }), + intl.formatMessage({ id: "Arrival date" }), + ] + return (
@@ -28,9 +28,7 @@ export default function ClientTable({ transactions }: ClientTableProps) { {tableHeadings.map((heading) => ( - - {intl.formatMessage({ id: heading })} - + {heading} ))} diff --git a/components/Blocks/DynamicContent/Points/ExpiringPoints/ExpiringPointsTable/index.tsx b/components/Blocks/DynamicContent/Points/ExpiringPoints/ExpiringPointsTable/index.tsx index 729af9098..89e476f1f 100644 --- a/components/Blocks/DynamicContent/Points/ExpiringPoints/ExpiringPointsTable/index.tsx +++ b/components/Blocks/DynamicContent/Points/ExpiringPoints/ExpiringPointsTable/index.tsx @@ -10,8 +10,6 @@ import useLang from "@/hooks/useLang" import AwardPoints from "../../EarnAndBurn/AwardPoints" -const tableHeadings = ["Points", "Expiration Date"] - export default function ExpiringPointsTable({ points, expirationDate, @@ -23,15 +21,18 @@ export default function ExpiringPointsTable({ const lang = useLang() const expiration = dt(expirationDate).locale(lang).format("DD MMM YYYY") + const tableHeadings = [ + intl.formatMessage({ id: "Points" }), + intl.formatMessage({ id: "Expiration Date" }), + ] + return (
{tableHeadings.map((heading) => ( - - {intl.formatMessage({ id: heading })} - + {heading} ))} diff --git a/components/Blocks/DynamicContent/Rewards/NextLevel/index.tsx b/components/Blocks/DynamicContent/Rewards/NextLevel/index.tsx index cc311048d..9295e4510 100644 --- a/components/Blocks/DynamicContent/Rewards/NextLevel/index.tsx +++ b/components/Blocks/DynamicContent/Rewards/NextLevel/index.tsx @@ -52,7 +52,7 @@ export default async function NextLevelRewardsBlock({
{intl.formatMessage( - { id: "As our" }, + { id: "As our {level}" }, { level: nextLevelRewards.level?.name } )} diff --git a/components/Blocks/DynamicContent/Rewards/Redeem/MembershipNumberBadge.tsx b/components/Blocks/DynamicContent/Rewards/Redeem/MembershipNumberBadge.tsx index ab1adae6e..cc4df078b 100644 --- a/components/Blocks/DynamicContent/Rewards/Redeem/MembershipNumberBadge.tsx +++ b/components/Blocks/DynamicContent/Rewards/Redeem/MembershipNumberBadge.tsx @@ -14,7 +14,10 @@ export default function MembershipNumberBadge({ return (
) diff --git a/components/Blocks/DynamicContent/Stays/StayCard/index.tsx b/components/Blocks/DynamicContent/Stays/StayCard/index.tsx index 59c768156..cb341aad6 100644 --- a/components/Blocks/DynamicContent/Stays/StayCard/index.tsx +++ b/components/Blocks/DynamicContent/Stays/StayCard/index.tsx @@ -1,6 +1,7 @@ "use client" import { useState } from "react" +import { useIntl } from "react-intl" import { dt } from "@/lib/dt" @@ -18,6 +19,7 @@ import type { StayCardProps } from "@/types/components/myPages/stays/stayCard" export default function StayCard({ stay }: StayCardProps) { const lang = useLang() + const intl = useIntl() // TODO: Temporary loading. Remove when current web is deleted. const [loading, setLoading] = useState(false) @@ -55,7 +57,7 @@ export default function StayCard({ stay }: StayCardProps) { - {" - "} + {intl.formatMessage({ id: " - " })} diff --git a/components/Blocks/HotelListing/HotelListingItem/index.tsx b/components/Blocks/HotelListing/HotelListingItem/index.tsx index cd26d13b7..231d71881 100644 --- a/components/Blocks/HotelListing/HotelListingItem/index.tsx +++ b/components/Blocks/HotelListing/HotelListingItem/index.tsx @@ -51,7 +51,7 @@ export default async function HotelListingItem({ - {selectedFromDate} - {selectedToDate} + {intl.formatMessage( + { id: "{selectedFromDate} - {selectedToDate}" }, + { + selectedFromDate, + selectedToDate, + } + )}
@@ -96,17 +125,17 @@ export default function MobileToggleButton({
@@ -132,7 +161,10 @@ export function MobileToggleButtonSkeleton() {
diff --git a/components/ContentType/HotelPage/IntroSection/index.tsx b/components/ContentType/HotelPage/IntroSection/index.tsx index 6dd2356ec..f9c4db7b0 100644 --- a/components/ContentType/HotelPage/IntroSection/index.tsx +++ b/components/ContentType/HotelPage/IntroSection/index.tsx @@ -25,7 +25,7 @@ export default async function IntroSection({ const { streetAddress, city } = address const { distanceToCentre } = location const formattedDistanceText = intl.formatMessage( - { id: "Distance in km to city centre" }, + { id: "{number} km to city centre" }, { number: getSingleDecimal(distanceToCentre / 1000) } ) const lang = getLang() @@ -37,7 +37,7 @@ export default async function IntroSection({ ) const formattedTripAdvisorText = hasTripAdvisorData ? intl.formatMessage( - { id: "Tripadvisor reviews" }, + { id: "{rating} ({count} reviews on Tripadvisor)" }, { rating: tripAdvisor.rating, count: tripAdvisor.numberOfReviews } ) : "" diff --git a/components/ContentType/HotelPage/Map/DynamicMap/Sidebar/index.tsx b/components/ContentType/HotelPage/Map/DynamicMap/Sidebar/index.tsx index d58cb10fc..dd0a0e7c2 100644 --- a/components/ContentType/HotelPage/Map/DynamicMap/Sidebar/index.tsx +++ b/components/ContentType/HotelPage/Map/DynamicMap/Sidebar/index.tsx @@ -83,6 +83,9 @@ export default function Sidebar({ }, 200) } + const viewAsMapMsg = intl.formatMessage({ id: "View as map" }) + const viewAsListMsg = intl.formatMessage({ id: "View as list" }) + return ( <> + ))} diff --git a/components/ContentType/HotelPage/Map/StaticMap/index.tsx b/components/ContentType/HotelPage/Map/StaticMap/index.tsx index b320063a9..231acddb8 100644 --- a/components/ContentType/HotelPage/Map/StaticMap/index.tsx +++ b/components/ContentType/HotelPage/Map/StaticMap/index.tsx @@ -33,7 +33,10 @@ export default async function StaticMap({ width={380} height={mapHeight} zoomLevel={zoomLevel} - altText={intl.formatMessage({ id: "Map of HOTEL_NAME" }, { hotelName })} + altText={intl.formatMessage( + { id: "Map of {hotelName}" }, + { hotelName } + )} mapId={mapId} /> setLightboxIsOpen(false)} diff --git a/components/ContentType/HotelPage/Rooms/RoomCard/index.tsx b/components/ContentType/HotelPage/Rooms/RoomCard/index.tsx index a1054e826..91dfd23e6 100644 --- a/components/ContentType/HotelPage/Rooms/RoomCard/index.tsx +++ b/components/ContentType/HotelPage/Rooms/RoomCard/index.tsx @@ -29,7 +29,10 @@ export function RoomCard({ room }: RoomCardProps) {
@@ -45,7 +48,9 @@ export function RoomCard({ room }: RoomCardProps) { {intl.formatMessage( - { id: "hotelPages.rooms.roomCard.persons" }, + { + id: "{size} ({max, plural, one {{range} person} other {{range} persons}})", + }, { size, max: totalOccupancy.max, diff --git a/components/ContentType/HotelPage/Rooms/index.tsx b/components/ContentType/HotelPage/Rooms/index.tsx index 54c17bfa7..4d5766187 100644 --- a/components/ContentType/HotelPage/Rooms/index.tsx +++ b/components/ContentType/HotelPage/Rooms/index.tsx @@ -54,8 +54,12 @@ export function Rooms({ rooms }: RoomsProps) { ) : null} diff --git a/components/ContentType/HotelPage/SidePeeks/AboutTheHotel/ContactInformation/index.tsx b/components/ContentType/HotelPage/SidePeeks/AboutTheHotel/ContactInformation/index.tsx index d7e4d8a19..33a564ae2 100644 --- a/components/ContentType/HotelPage/SidePeeks/AboutTheHotel/ContactInformation/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/AboutTheHotel/ContactInformation/index.tsx @@ -49,7 +49,7 @@ export default async function ContactInformation({ color="peach80" textDecoration="underline" > - Google Maps + {intl.formatMessage({ id: "Google Maps" })}
diff --git a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx index a39708b07..801cdd988 100644 --- a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx @@ -18,8 +18,18 @@ export default async function CheckInAmenity({ trackingId="amenities:check-in" > {intl.formatMessage({ id: "Times" })} - {`${intl.formatMessage({ id: "Check in from" })}: ${checkInTime}`} - {`${intl.formatMessage({ id: "Check out at latest" })}: ${checkOutTime}`} + + {intl.formatMessage( + { id: "Check in from: {checkInTime}" }, + { checkInTime } + )} + + + {intl.formatMessage( + { id: "Check out at latest: {checkOutTime}" }, + { checkOutTime } + )} + ) } diff --git a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingList/index.tsx b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingList/index.tsx index dd858d9b7..9bc1a30cf 100644 --- a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingList/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingList/index.tsx @@ -13,22 +13,34 @@ export default async function ParkingList({ address, }: ParkingListProps) { const intl = await getIntl() + + const canMakeReservationYesMsg = intl.formatMessage({ + id: "Parking can be reserved in advance: Yes", + }) + const canMakeReservationNoMsg = intl.formatMessage({ + id: "Parking can be reserved in advance: No", + }) + return (
    {numberOfChargingSpaces ? (
  • {intl.formatMessage( - { id: "Number of charging points for electric cars" }, + { id: "Number of charging points for electric cars: {number}" }, { number: numberOfChargingSpaces } )}
  • ) : null} -
  • {`${intl.formatMessage({ id: "Parking can be reserved in advance" })}: ${canMakeReservation ? intl.formatMessage({ id: "Yes" }) : intl.formatMessage({ id: "No" })}`}
  • +
  • + {canMakeReservation + ? canMakeReservationYesMsg + : canMakeReservationNoMsg} +
  • {numberOfParkingSpots ? (
  • {intl.formatMessage( - { id: "Number of parking spots" }, + { id: "Number of parking spots: {number}" }, { number: numberOfParkingSpots } )}
  • @@ -36,13 +48,15 @@ export default async function ParkingList({ {distanceToHotel ? (
  • {intl.formatMessage( - { id: "Distance to hotel" }, - { distance: distanceToHotel } + { id: "Distance to hotel: {distanceInM} m" }, + { distanceInM: distanceToHotel } )}
  • ) : null} {address ? ( -
  • {`${intl.formatMessage({ id: "Address" })}: ${address}`}
  • +
  • + {intl.formatMessage({ id: "Address: {address}" }, { address })} +
  • ) : null}
diff --git a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingPrices/index.tsx b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingPrices/index.tsx index c62d5e6a1..6229b578d 100644 --- a/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingPrices/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/ParkingPrices/index.tsx @@ -47,7 +47,7 @@ export default async function ParkingPrices({ ? freeParking ? intl.formatMessage({ id: "Free parking" }) : formatPrice(intl, parking.amount, currency) - : "N/A"} + : intl.formatMessage({ id: "N/A" })}
{parking.startTime && @@ -58,7 +58,13 @@ export default async function ParkingPrices({ {intl.formatMessage({ id: "From" })} - {parking.startTime}-{parking.endTime} + {intl.formatMessage( + { id: "{parkingStartTime}-{parkingEndTime}" }, + { + parkingStartTime: parking.startTime, + parkingEndTime: parking.endTime, + } + )} )} diff --git a/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/util.ts b/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/util.ts index a4cd1e00d..6beca5a83 100644 --- a/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/util.ts +++ b/components/ContentType/HotelPage/SidePeeks/MeetingsAndConferences/util.ts @@ -29,14 +29,14 @@ export async function getRoomText(roomSizes: number[]) { let roomText if (largestRoom === smallestRoom) { roomText = intl.formatMessage( - { id: "{number} square meters" }, - { number: largestRoom } + { id: "{value} square meters" }, + { value: largestRoom } ) } else if (smallestRoom != null && largestRoom) { { roomText = intl.formatMessage( { - id: "{number} to {number} square meters", + id: "{smallest} to {largest} square meters", }, { largest: largestRoom, smallest: smallestRoom } ) @@ -53,14 +53,14 @@ export async function getSeatingText(roomSeating: number[]) { let seatingText if (biggestSeating === smallestSeating) { seatingText = intl.formatMessage( - { id: "{number} persons" }, + { id: "{value} persons" }, { number: biggestSeating } ) } else if (smallestSeating != null && biggestSeating) { { seatingText = intl.formatMessage( { - id: "{number} to {number} persons", + id: "{lowest} to {highest} persons", }, { highest: biggestSeating, lowest: smallestSeating } ) diff --git a/components/ContentType/HotelPage/SidePeeks/OpeningHours/index.tsx b/components/ContentType/HotelPage/SidePeeks/OpeningHours/index.tsx index a81cc0658..4b07f3ba2 100644 --- a/components/ContentType/HotelPage/SidePeeks/OpeningHours/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/OpeningHours/index.tsx @@ -5,8 +5,6 @@ import { getIntl } from "@/i18n" import styles from "./openingHours.module.css" import type { OpeningHoursProps } from "@/types/components/hotelPage/sidepeek/openingHours" -import { DaysEnum } from "@/types/components/hotelPage/sidepeek/restaurantBar" -import type { RestaurantOpeningHoursDay } from "@/types/hotel" export default async function OpeningHours({ openingHours, @@ -16,45 +14,83 @@ export default async function OpeningHours({ }: OpeningHoursProps) { const intl = await getIntl() - const closed = intl.formatMessage({ id: "Closed" }) - const alwaysOpen = intl.formatMessage({ id: "Always open" }) + const closedMsg = intl.formatMessage({ id: "Closed" }) + const alwaysOpenMsg = intl.formatMessage({ id: "Always open" }) - const days: (keyof typeof openingHours)[] = [ - DaysEnum.Monday, - DaysEnum.Tuesday, - DaysEnum.Wednesday, - DaysEnum.Thursday, - DaysEnum.Friday, - DaysEnum.Saturday, - DaysEnum.Sunday, - ] + // In order + const weekdayDefinitions = [ + { + key: "monday", + label: intl.formatMessage({ id: "monday" }), + }, + { + key: "tuesday", + label: intl.formatMessage({ id: "tuesday" }), + }, + { + key: "wednesday", + label: intl.formatMessage({ id: "wednesday" }), + }, + { + key: "thursday", + label: intl.formatMessage({ id: "thursday" }), + }, + { + key: "friday", + label: intl.formatMessage({ id: "friday" }), + }, + { + key: "saturday", + label: intl.formatMessage({ id: "saturday" }), + }, + { + key: "sunday", + label: intl.formatMessage({ id: "sunday" }), + }, + ] as const - const groupedOpeningHours: { [key: string]: string[] } = {} + const groupedOpeningHours: string[] = [] - days.forEach((day) => { - const today = openingHours[day] as RestaurantOpeningHoursDay - let key: string + let rangeWeekdays: string[] = [] + let rangeValue = "" + for (let i = 0, n = weekdayDefinitions.length; i < n; ++i) { + const weekdayDefinition = weekdayDefinitions[i] + const weekday = openingHours[weekdayDefinition.key] + const label = weekdayDefinition.label + if (weekday) { + let newValue = null - if (today.isClosed) { - key = closed - } else if (today.alwaysOpen) { - key = alwaysOpen - } else { - key = `${today.openingTime}-${today.closingTime}` + if (weekday.alwaysOpen) { + newValue = alwaysOpenMsg + } else if (weekday.isClosed) { + newValue = closedMsg + } else if (weekday.openingTime && weekday.closingTime) { + newValue = `${weekday.openingTime}-${weekday.closingTime}` + } + + if (newValue !== null) { + if (rangeValue === newValue) { + if (rangeWeekdays.length > 1) { + rangeWeekdays.splice(-1, 1, label) // Replace last element + } else { + rangeWeekdays.push(label) + } + } else { + if (rangeValue) { + groupedOpeningHours.push( + `${rangeWeekdays.join("-")}: ${rangeValue}` + ) + } + rangeValue = newValue + rangeWeekdays = [label] + } + } + + if (rangeValue && i === n - 1) { + // Flush everything at the end + groupedOpeningHours.push(`${rangeWeekdays.join("-")}: ${rangeValue}`) + } } - - if (!groupedOpeningHours[key]) { - groupedOpeningHours[key] = [] - } - const formattedDay = day.charAt(0).toUpperCase() + day.slice(1) - groupedOpeningHours[key].push(intl.formatMessage({ id: formattedDay })) - }) - - function formatDayInterval(days: string[]) { - if (days.length === 1) { - return days[0] - } - return `${days[0]}-${days[days.length - 1]}` } return ( @@ -62,10 +98,10 @@ export default async function OpeningHours({
{heading ?? openingHours.name}
- {Object.entries(groupedOpeningHours).map(([time, days]) => { + {groupedOpeningHours.map((groupedOpeningHour) => { return ( - - {`${formatDayInterval(days)}: ${time}`} + + {groupedOpeningHour} ) })} diff --git a/components/ContentType/HotelPage/SidePeeks/RestaurantBar/RestaurantBarItem/index.tsx b/components/ContentType/HotelPage/SidePeeks/RestaurantBar/RestaurantBarItem/index.tsx index 8e842507b..4896849b2 100644 --- a/components/ContentType/HotelPage/SidePeeks/RestaurantBar/RestaurantBarItem/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/RestaurantBar/RestaurantBarItem/index.tsx @@ -98,7 +98,7 @@ export default async function RestaurantBarItem({ ) : null} {ctaUrl ? ( - {`${intl.formatMessage({ id: "Discover" })} ${name}`} + {intl.formatMessage({ id: "Discover {name}" }, { name })} ) : null} diff --git a/components/ContentType/HotelPage/SidePeeks/Room/index.tsx b/components/ContentType/HotelPage/SidePeeks/Room/index.tsx index 4736c89c3..1a6567550 100644 --- a/components/ContentType/HotelPage/SidePeeks/Room/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/Room/index.tsx @@ -28,13 +28,27 @@ export default async function RoomSidePeek({ room }: RoomSidePeekProps) {
{roomSize.min === roomSize.max - ? roomSize.min - : `${roomSize.min} - ${roomSize.max}`} - m².{" "} - {intl.formatMessage( - { id: "booking.accommodatesUpTo" }, - { range: totalOccupancy.range, max: totalOccupancy.max } - )} + ? intl.formatMessage( + { + id: "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}", + }, + { + roomSize: roomSize.min, + max: totalOccupancy.max, + range: totalOccupancy.range, + } + ) + : intl.formatMessage( + { + id: "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}", + }, + { + roomSizeMin: roomSize.min, + roomSizeMax: roomSize.max, + max: totalOccupancy.max, + range: totalOccupancy.range, + } + )}
@@ -44,9 +58,7 @@ export default async function RoomSidePeek({ room }: RoomSidePeekProps) {
-

- {intl.formatMessage({ id: "booking.thisRoomIsEquippedWith" })} -

+

{intl.formatMessage({ id: "This room is equipped with" })}

    {room.roomFacilities @@ -77,10 +89,10 @@ export default async function RoomSidePeek({ room }: RoomSidePeekProps) {
    -

    {intl.formatMessage({ id: "booking.bedOptions" })}

    +

    {intl.formatMessage({ id: "Bed options" })}

    - {intl.formatMessage({ id: "booking.basedOnAvailability" })} + {intl.formatMessage({ id: "Based on availability" })}
      {room.roomTypes.map((roomType) => { @@ -107,7 +119,7 @@ export default async function RoomSidePeek({ room }: RoomSidePeekProps) {
      diff --git a/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/Facility/index.tsx b/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/Facility/index.tsx index cd3b5ddc6..8b25f6f89 100644 --- a/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/Facility/index.tsx +++ b/components/ContentType/HotelPage/SidePeeks/WellnessAndExercise/Facility/index.tsx @@ -27,7 +27,7 @@ export default async function Facility({ data }: FacilityProps) { )}
      - {intl.formatMessage({ id: `${data.type}` })} + {intl.formatMessage({ id: data.type })}
      @@ -36,13 +36,25 @@ export default async function Facility({ data }: FacilityProps) {
      {ordinaryOpeningTimes.alwaysOpen - ? `${intl.formatMessage({ id: "Mon-Fri" })} ${intl.formatMessage({ id: "Always open" })}` - : `${intl.formatMessage({ id: "Mon-Fri" })} ${ordinaryOpeningTimes.openingTime}-${ordinaryOpeningTimes.closingTime}`} + ? intl.formatMessage({ id: "Mon-Fri Always open" }) + : intl.formatMessage( + { id: "Mon-Fri {openingTime}-${closingTime}" }, + { + openingTime: ordinaryOpeningTimes.openingTime, + closingTime: ordinaryOpeningTimes.closingTime, + } + )} {weekendOpeningTimes.alwaysOpen - ? `${intl.formatMessage({ id: "Sat-Sun" })} ${intl.formatMessage({ id: "Always open" })}` - : `${intl.formatMessage({ id: "Sat-Sun" })} ${weekendOpeningTimes.openingTime}-${weekendOpeningTimes.closingTime}`} + ? intl.formatMessage({ id: "Sat-Sun Always open" }) + : intl.formatMessage( + { id: "Sat-Sun {openingTime}-${closingTime}" }, + { + openingTime: weekendOpeningTimes.openingTime, + closingTime: weekendOpeningTimes.closingTime, + } + )}
      diff --git a/components/ContentType/HotelPage/TabNavigation/index.tsx b/components/ContentType/HotelPage/TabNavigation/index.tsx index c8a7d3d37..7fb18b130 100644 --- a/components/ContentType/HotelPage/TabNavigation/index.tsx +++ b/components/ContentType/HotelPage/TabNavigation/index.tsx @@ -39,7 +39,10 @@ export default function TabNavigation({ hash: HotelHashValues.overview, text: intl.formatMessage({ id: "Overview" }), }, - { hash: HotelHashValues.rooms, text: intl.formatMessage({ id: "Rooms" }) }, + { + hash: HotelHashValues.rooms, + text: intl.formatMessage({ id: "Rooms" }), + }, { hash: HotelHashValues.restaurant, text: intl.formatMessage({ id: restaurantTitle }, { count: 1 }), diff --git a/components/DatePicker/index.tsx b/components/DatePicker/index.tsx index d56aaba34..d0d417cb1 100644 --- a/components/DatePicker/index.tsx +++ b/components/DatePicker/index.tsx @@ -1,7 +1,9 @@ "use client" + import { da, de, fi, nb, sv } from "date-fns/locale" import { useCallback, useEffect, useRef, useState } from "react" import { useFormContext, useWatch } from "react-hook-form" +import { useIntl } from "react-intl" import { Lang } from "@/constants/languages" import { dt } from "@/lib/dt" @@ -26,6 +28,8 @@ const locales = { export default function DatePickerForm({ name = "date" }: DatePickerFormProps) { const lang = useLang() + const intl = useIntl() + const [isOpen, setIsOpen] = useState(false) const selectedDate = useWatch({ name }) const { register, setValue } = useFormContext() @@ -131,7 +135,13 @@ export default function DatePickerForm({ name = "date" }: DatePickerFormProps) { > - {selectedFromDate} - {selectedToDate} + {intl.formatMessage( + { id: "{selectedFromDate} - {selectedToDate}" }, + { + selectedFromDate, + selectedToDate, + } + )} diff --git a/components/Footer/Details/index.tsx b/components/Footer/Details/index.tsx index 2471fafca..5d126a20a 100644 --- a/components/Footer/Details/index.tsx +++ b/components/Footer/Details/index.tsx @@ -40,8 +40,10 @@ export default async function FooterDetails() {
      - © {currentYear}{" "} - {intl.formatMessage({ id: "Copyright all rights reserved" })} + {intl.formatMessage( + { id: "© {currentYear} Scandic AB All rights reserved" }, + { currentYear } + )}
      @@ -99,8 +101,10 @@ export async function FooterDetailsSkeleton() {
      - © {currentYear}{" "} - {intl.formatMessage({ id: "Copyright all rights reserved" })} + {intl.formatMessage( + { id: "© {currentYear} Scandic AB All rights reserved" }, + { currentYear } + )}
      diff --git a/components/Forms/BookingWidget/FormContent/Voucher/index.tsx b/components/Forms/BookingWidget/FormContent/Voucher/index.tsx index abb770413..39f6c8653 100644 --- a/components/Forms/BookingWidget/FormContent/Voucher/index.tsx +++ b/components/Forms/BookingWidget/FormContent/Voucher/index.tsx @@ -19,10 +19,10 @@ export default function Voucher() { const bonus = intl.formatMessage({ id: "Use bonus cheque" }) const reward = intl.formatMessage({ id: "Book reward night" }) const disabledBookingOptionsHeader = intl.formatMessage({ - id: "Disabled booking options header", + id: "We're sorry", }) const disabledBookingOptionsText = intl.formatMessage({ - id: "Disabled booking options text", + id: "Codes, cheques and reward nights aren't available on the new website yet.", }) return ( diff --git a/components/Forms/BookingWidget/FormContent/index.tsx b/components/Forms/BookingWidget/FormContent/index.tsx index 8dedd5c57..6a708aba6 100644 --- a/components/Forms/BookingWidget/FormContent/index.tsx +++ b/components/Forms/BookingWidget/FormContent/index.tsx @@ -41,7 +41,9 @@ export default function FormContent({
diff --git a/components/Forms/Signup/index.tsx b/components/Forms/Signup/index.tsx index 4af165ca3..f4b156ec0 100644 --- a/components/Forms/Signup/index.tsx +++ b/components/Forms/Signup/index.tsx @@ -164,9 +164,11 @@ export default function SignupForm({ link, subtitle, title }: SignUpFormProps) { {/* TODO: Update copy once ready */} {intl.formatMessage( - { id: "signupPage.terms" }, { - termsAndConditions: (str) => ( + id: "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.", + }, + { + termsAndConditionsLink: (str) => ( () const roomsValue = useWatch({ name: "rooms" }) - const addRoomLabel = intl.formatMessage({ id: "Add Room" }) + const addRoomLabel = intl.formatMessage({ id: "Add room" }) const doneLabel = intl.formatMessage({ id: "Done" }) const disabledBookingOptionsHeader = intl.formatMessage({ - id: "Disabled booking options header", + id: "We're sorry", }) const disabledBookingOptionsText = intl.formatMessage({ - id: "Disabled adding room", + id: "Adding room is not available on the new website yet.", }) const handleClose = useCallback(async () => { diff --git a/components/GuestsRoomsPicker/index.tsx b/components/GuestsRoomsPicker/index.tsx index d3bb9e68e..262b256d9 100644 --- a/components/GuestsRoomsPicker/index.tsx +++ b/components/GuestsRoomsPicker/index.tsx @@ -137,6 +137,38 @@ function Trigger({ }) { const intl = useIntl() + const parts = [] + + parts.push( + intl.formatMessage( + { id: "{totalRooms, plural, one {# room} other {# rooms}}" }, + { totalRooms: rooms.length } + ) + ) + + parts.push( + intl.formatMessage( + { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, + { totalAdults: rooms.reduce((acc, room) => acc + room.adults, 0) } + ) + ) + + if (rooms.some((room) => room.child.length > 0)) { + parts.push( + intl.formatMessage( + { + id: "{totalChildren, plural, one {# child} other {# children}}", + }, + { + totalChildren: rooms.reduce( + (acc, room) => acc + room.child.length, + 0 + ), + } + ) + ) + } + return ( ) diff --git a/components/Header/MainMenu/MobileMenu/index.tsx b/components/Header/MainMenu/MobileMenu/index.tsx index 702f5c692..a296525a9 100644 --- a/components/Header/MainMenu/MobileMenu/index.tsx +++ b/components/Header/MainMenu/MobileMenu/index.tsx @@ -60,14 +60,19 @@ export default function MobileMenu({ } }, [isHamburgerMenuOpen]) + const closeMsg = intl.formatMessage({ + id: "Close menu", + }) + const openMsg = intl.formatMessage({ + id: "Open menu", + }) + return ( <> ) : null} diff --git a/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx b/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx index 3512d66e1..8bbdba39e 100644 --- a/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx @@ -36,10 +36,10 @@ export default function Confirmation({ )} diff --git a/components/HotelReservation/BookingConfirmation/Header/index.tsx b/components/HotelReservation/BookingConfirmation/Header/index.tsx index f9aee6f71..ec07a4f7f 100644 --- a/components/HotelReservation/BookingConfirmation/Header/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Header/index.tsx @@ -24,7 +24,9 @@ export default function Header({ const intl = useIntl() const text = intl.formatMessage( - { id: "booking.confirmation.text" }, + { + id: "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 contact us.", + }, { emailLink: (str) => ( @@ -57,7 +59,7 @@ export default function Header({
- {intl.formatMessage({ id: "booking.confirmation.title" })} + {intl.formatMessage({ id: "Booking confirmation" })} {hotel.name} diff --git a/components/HotelReservation/BookingConfirmation/HotelDetails/index.tsx b/components/HotelReservation/BookingConfirmation/HotelDetails/index.tsx index 0c1b1dd06..75f50fbb4 100644 --- a/components/HotelReservation/BookingConfirmation/HotelDetails/index.tsx +++ b/components/HotelReservation/BookingConfirmation/HotelDetails/index.tsx @@ -1,4 +1,5 @@ "use client" + import { useIntl } from "react-intl" import Link from "@/components/TempDesignSystem/Link" @@ -23,8 +24,14 @@ export default function HotelDetails({ <div className={styles.hotel}> <Body color="uiTextHighContrast">{hotel.name}</Body> <Body color="uiTextHighContrast"> - {hotel.address.streetAddress}, {hotel.address.zipCode}{" "} - {hotel.address.city} + {intl.formatMessage( + { id: "{streetAddress}, {zipCode} {city}" }, + { + streetAddress: hotel.address.streetAddress, + zipCode: hotel.address.zipCode, + city: hotel.address.city, + } + )} </Body> <Body asChild color="uiTextHighContrast"> <Link @@ -64,7 +71,7 @@ export default function HotelDetails({ <div className={styles.toast}> <Toast variant="info"> <ul className={styles.list}> - <li>N/A</li> + <li>{intl.formatMessage({ id: "N/A" })}</li> </ul> </Toast> </div> diff --git a/components/HotelReservation/BookingConfirmation/PaymentDetails/index.tsx b/components/HotelReservation/BookingConfirmation/PaymentDetails/index.tsx index 9dc818b6f..4353ee348 100644 --- a/components/HotelReservation/BookingConfirmation/PaymentDetails/index.tsx +++ b/components/HotelReservation/BookingConfirmation/PaymentDetails/index.tsx @@ -26,8 +26,16 @@ export default function PaymentDetails({ </Subtitle> <div className={styles.payment}> <Body color="uiTextHighContrast"> - {formatPrice(intl, booking.totalPrice, booking.currencyCode)}{" "} - {intl.formatMessage({ id: "has been paid" })} + {intl.formatMessage( + { id: "{amount} has been paid" }, + { + amount: formatPrice( + intl, + booking.totalPrice, + booking.currencyCode + ), + } + )} </Body> <Body color="uiTextHighContrast"> {dt(booking.createDateTime) diff --git a/components/HotelReservation/BookingConfirmation/Receipt/index.tsx b/components/HotelReservation/BookingConfirmation/Receipt/index.tsx index 888e31bb1..3e0b0e702 100644 --- a/components/HotelReservation/BookingConfirmation/Receipt/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Receipt/index.tsx @@ -1,4 +1,5 @@ "use client" + import { notFound } from "next/navigation" import { useIntl } from "react-intl" @@ -47,7 +48,7 @@ export default function Receipt({ {booking.rateDefinition.isMemberRate ? ( <div className={styles.memberPrice}> <Body color="uiTextPlaceholder"> - <s>N/A</s> + <s>{intl.formatMessage({ id: "N/A" })}</s> </Body> <Body color="red"> {formatPrice(intl, booking.roomPrice, booking.currencyCode)} @@ -60,7 +61,7 @@ export default function Receipt({ )} <Caption color="uiTextMediumContrast"> {intl.formatMessage( - { id: "booking.adults" }, + { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, { totalAdults: booking.adults, } @@ -156,7 +157,12 @@ export default function Receipt({ <ChevronRightSmallIcon /> </Button> <Caption color="uiTextMediumContrast"> - {intl.formatMessage({ id: "Approx." })} N/A EUR + {intl.formatMessage( + { id: "Approx. {value}" }, + { + value: "N/A EUR", + } + )} </Caption> </div> </div> diff --git a/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx b/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx index 3d81e9511..c739231de 100644 --- a/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Rooms/Room/index.tsx @@ -1,4 +1,5 @@ "use client" + import { useIntl } from "react-intl" import { dt } from "@/lib/dt" @@ -23,6 +24,7 @@ export default function Room({ booking, img, roomName }: RoomProps) { const intl = useIntl() const lang = useLang() + const guestName = `${booking.guest.firstName} ${booking.guest.lastName}` const fromDate = dt(booking.checkInDate).locale(lang) const toDate = dt(booking.checkOutDate).locale(lang) return ( @@ -33,7 +35,12 @@ export default function Room({ booking, img, roomName }: RoomProps) { {intl.formatMessage({ id: "Room" })} 1 </Subtitle> */} <Subtitle color="uiTextHighContrast" type="two"> - {`${intl.formatMessage({ id: "Reservation number" })} ${booking.confirmationNumber}`} + {intl.formatMessage( + { id: "Reservation number {value}" }, + { + value: booking.confirmationNumber, + } + )} </Subtitle> </div> <div className={styles.benefits}> @@ -81,7 +88,13 @@ export default function Room({ booking, img, roomName }: RoomProps) { {intl.formatMessage({ id: "Check-in" })} </Body> <Body color="uiTextHighContrast"> - {`${fromDate.format("ddd, D MMM")} ${intl.formatMessage({ id: "from" })} ${fromDate.format("HH:mm")}`} + {intl.formatMessage( + { id: "{checkInDate} from {checkInTime}" }, + { + checkInDate: fromDate.format("ddd, D MMM"), + checkInTime: fromDate.format("HH:mm"), + } + )} </Body> </li> <li className={styles.listItem}> @@ -89,14 +102,22 @@ export default function Room({ booking, img, roomName }: RoomProps) { {intl.formatMessage({ id: "Check-out" })} </Body> <Body color="uiTextHighContrast"> - {`${toDate.format("ddd, D MMM")} ${intl.formatMessage({ id: "from" })} ${toDate.format("HH:mm")}`} + {intl.formatMessage( + { id: "{checkOutDate} from {checkOutTime}" }, + { + checkOutDate: toDate.format("ddd, D MMM"), + checkOutTime: toDate.format("HH:mm"), + } + )} </Body> </li> <li className={styles.listItem}> <Body color="uiTextPlaceholder"> {intl.formatMessage({ id: "Breakfast" })} </Body> - <Body color="uiTextHighContrast">N/A</Body> + <Body color="uiTextHighContrast"> + {intl.formatMessage({ id: "N/A" })} + </Body> </li> <li className={styles.listItem}> <Body color="uiTextPlaceholder"> @@ -110,19 +131,24 @@ export default function Room({ booking, img, roomName }: RoomProps) { <Body color="uiTextPlaceholder"> {intl.formatMessage({ id: "Rebooking" })} </Body> - <Body color="uiTextHighContrast">N/A</Body> + <Body color="uiTextHighContrast"> + {intl.formatMessage({ id: "N/A" })} + </Body> </li> </ul> <div className={styles.guest}> <Body color="uiTextPlaceholder"> {intl.formatMessage({ id: "Main guest" })} </Body> - <Body color="uiTextHighContrast"> - {`${booking.guest.firstName} ${booking.guest.lastName}`} - </Body> + <Body color="uiTextHighContrast">{guestName}</Body> {booking.guest.membershipNumber ? ( <Body color="uiTextHighContrast"> - {`${intl.formatMessage({ id: "Friend no." })} ${booking.guest.membershipNumber}`} + {intl.formatMessage( + { id: "Friend no. {value}" }, + { + value: booking.guest.membershipNumber, + } + )} </Body> ) : null} {booking.guest.phoneNumber ? ( diff --git a/components/HotelReservation/Contact/index.tsx b/components/HotelReservation/Contact/index.tsx index e1b10c4e0..d5a5d9bda 100644 --- a/components/HotelReservation/Contact/index.tsx +++ b/components/HotelReservation/Contact/index.tsx @@ -16,6 +16,9 @@ export default function Contact({ hotel }: ContactProps) { const lang = useLang() const intl = useIntl() + const addressStr = `${hotel.address.streetAddress}, ` + const cityStr = hotel.address.city + return ( <section className={styles.wrapper}> <address className={styles.address}> @@ -24,8 +27,11 @@ export default function Contact({ hotel }: ContactProps) { <Body textTransform="bold"> {intl.formatMessage({ id: "Address" })} </Body> - <Body>{`${hotel.address.streetAddress}, `}</Body> - <Body>{hotel.address.city}</Body> + <Body> + {addressStr} + <br /> + {cityStr} + </Body> </li> <li> <Body textTransform="bold"> @@ -34,7 +40,9 @@ export default function Contact({ hotel }: ContactProps) { <Link href={`https://www.google.com/maps/dir/?api=1&destination=${hotel.location.latitude},${hotel.location.longitude}`} > - <span className={styles.link}>Google Maps</span> + <span className={styles.link}> + {intl.formatMessage({ id: "Google Maps" })} + </span> </Link> </li> <li> diff --git a/components/HotelReservation/EnterDetails/BedType/BedTypeInfo/index.tsx b/components/HotelReservation/EnterDetails/BedType/BedTypeInfo/index.tsx index 2dd696349..641b73f01 100644 --- a/components/HotelReservation/EnterDetails/BedType/BedTypeInfo/index.tsx +++ b/components/HotelReservation/EnterDetails/BedType/BedTypeInfo/index.tsx @@ -24,12 +24,10 @@ export default function BedTypeInfo({ hasMultipleBedTypes }: BedTypeInfoProps) { id: "Extra bed will be provided additionally", }) + const combinedStr = `${availabilityText}. ${extraBedText}` + if (hasMultipleBedTypes && hasChildWithExtraBed) { - return ( - <Body> - {availabilityText}. {extraBedText} - </Body> - ) + return <Body>{combinedStr}</Body> } if (hasMultipleBedTypes) { diff --git a/components/HotelReservation/EnterDetails/Breakfast/index.tsx b/components/HotelReservation/EnterDetails/Breakfast/index.tsx index bd69ad5f6..141f206d0 100644 --- a/components/HotelReservation/EnterDetails/Breakfast/index.tsx +++ b/components/HotelReservation/EnterDetails/Breakfast/index.tsx @@ -90,7 +90,9 @@ export default function Breakfast({ packages }: BreakfastProps) { subtitle={ pkg.code === BreakfastPackageEnum.FREE_MEMBER_BREAKFAST ? intl.formatMessage<React.ReactNode>( - { id: "breakfast.price.free" }, + { + id: "<strikethrough>{amount}</strikethrough> <free>0 {currency}</free>/night per adult", + }, { amount: formatPrice( intl, @@ -103,7 +105,7 @@ export default function Breakfast({ packages }: BreakfastProps) { } ) : intl.formatMessage( - { id: "breakfast.price" }, + { id: "{amount}/night per adult" }, { amount: formatPrice( intl, diff --git a/components/HotelReservation/EnterDetails/Details/JoinScandicFriendsCard/index.tsx b/components/HotelReservation/EnterDetails/Details/JoinScandicFriendsCard/index.tsx index 2fe025cd1..406b2a03b 100644 --- a/components/HotelReservation/EnterDetails/Details/JoinScandicFriendsCard/index.tsx +++ b/components/HotelReservation/EnterDetails/Details/JoinScandicFriendsCard/index.tsx @@ -89,10 +89,10 @@ export default function JoinScandicFriendsCard({ <Footnote color="uiTextPlaceholder"> {intl.formatMessage<React.ReactNode>( { - id: "signup.terms", + id: "By signing up you accept the Scandic Friends <termsAndConditionsLink>Terms and Conditions</termsAndConditionsLink>. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service", }, { - termsLink: (str) => ( + termsAndConditionsLink: (str) => ( <Link variant="default" textDecoration="underline" diff --git a/components/HotelReservation/EnterDetails/Details/MemberPriceModal/index.tsx b/components/HotelReservation/EnterDetails/Details/MemberPriceModal/index.tsx index 63822e12f..214b6e794 100644 --- a/components/HotelReservation/EnterDetails/Details/MemberPriceModal/index.tsx +++ b/components/HotelReservation/EnterDetails/Details/MemberPriceModal/index.tsx @@ -57,7 +57,7 @@ export default function MemberPriceModal({ )} </div> <Button intent="primary" theme="base" onClick={() => setIsOpen(false)}> - OK + {intl.formatMessage({ id: "OK" })} </Button> </div> </Modal> diff --git a/components/HotelReservation/EnterDetails/Details/Signup/index.tsx b/components/HotelReservation/EnterDetails/Details/Signup/index.tsx index 85559aa4c..5e6e9b95a 100644 --- a/components/HotelReservation/EnterDetails/Details/Signup/index.tsx +++ b/components/HotelReservation/EnterDetails/Details/Signup/index.tsx @@ -12,7 +12,6 @@ import useLang from "@/hooks/useLang" import styles from "./signup.module.css" export default function Signup({ name }: { name: string }) { - const lang = useLang() const intl = useIntl() const [isJoinChecked, setIsJoinChecked] = useState(false) @@ -35,7 +34,9 @@ export default function Signup({ name }: { name: string }) { <div className={styles.dateField}> <header> <Caption type="bold"> - {intl.formatMessage({ id: "Birth date" })} * + <span className={styles.required}> + {intl.formatMessage({ id: "Birth date" })} + </span> </Caption> </header> <DateSelect name="dateOfBirth" registerOptions={{ required: true }} /> diff --git a/components/HotelReservation/EnterDetails/Details/Signup/signup.module.css b/components/HotelReservation/EnterDetails/Details/Signup/signup.module.css index 1db11dfb8..de1020941 100644 --- a/components/HotelReservation/EnterDetails/Details/Signup/signup.module.css +++ b/components/HotelReservation/EnterDetails/Details/Signup/signup.module.css @@ -13,3 +13,7 @@ display: grid; gap: var(--Spacing-x1); } + +.required:after { + content: " *"; +} diff --git a/components/HotelReservation/EnterDetails/Header/index.tsx b/components/HotelReservation/EnterDetails/Header/index.tsx index beeb1174e..5c57d7ad2 100644 --- a/components/HotelReservation/EnterDetails/Header/index.tsx +++ b/components/HotelReservation/EnterDetails/Header/index.tsx @@ -15,6 +15,9 @@ export default async function HotelHeader({ hotelData }: HotelHeaderProps) { const hotel = hotelData.data.attributes const image = hotel.hotelContent?.images + + const addressStr = `${hotel.address.streetAddress}, ${hotel.address.city}` + return ( <header className={styles.header}> <Image @@ -30,14 +33,12 @@ export default async function HotelHeader({ hotelData }: HotelHeaderProps) { <Title as="h1" level="h1" color="white" className={styles.title}> {hotel.name} -
-
+
+
- + diff --git a/components/HotelReservation/EnterDetails/Payment/PaymentClient.tsx b/components/HotelReservation/EnterDetails/Payment/PaymentClient.tsx index d4aa83f14..412ab3814 100644 --- a/components/HotelReservation/EnterDetails/Payment/PaymentClient.tsx +++ b/components/HotelReservation/EnterDetails/Payment/PaymentClient.tsx @@ -160,7 +160,7 @@ export default function PaymentClient({ (errorMessage: string) => { toast.error( intl.formatMessage({ - id: "payment.error.failed", + id: "We had an issue processing your booking. Please try again. No charges have been made.", }) ) const currentPaymentMethod = methods.getValues("paymentMethod") @@ -312,10 +312,6 @@ export default function PaymentClient({ return } - const guaranteeing = intl.formatMessage({ id: "guaranteeing" }) - const paying = intl.formatMessage({ id: "paying" }) - const paymentVerb = mustBeGuaranteed ? guaranteeing : paying - return ( <> @@ -387,11 +383,10 @@ export default function PaymentClient({ + {formatPrice( intl, diff --git a/components/HotelReservation/EnterDetails/Summary/PriceDetailsTable/index.tsx b/components/HotelReservation/EnterDetails/Summary/PriceDetailsTable/index.tsx index 6344c3ed9..62a5916b1 100644 --- a/components/HotelReservation/EnterDetails/Summary/PriceDetailsTable/index.tsx +++ b/components/HotelReservation/EnterDetails/Summary/PriceDetailsTable/index.tsx @@ -104,10 +104,17 @@ export default function PriceDetailsTable({ {children?.length ? ( ) : null} @@ -131,17 +142,17 @@ export default function PriceDetailsTable({
- {`${intl.formatMessage({ id: "Crib (child)" })} × ${childBedCrib}`} + {intl.formatMessage( + { id: "Crib (child) × {count}" }, + { count: childBedCrib } + )}
@@ -294,7 +310,9 @@ export default function SummaryUI({
@@ -345,11 +363,15 @@ export default function SummaryUI({ {totalPrice.requested && ( )} diff --git a/components/HotelReservation/HotelCard/index.tsx b/components/HotelReservation/HotelCard/index.tsx index 99ce75f42..b5a95e38c 100644 --- a/components/HotelReservation/HotelCard/index.tsx +++ b/components/HotelReservation/HotelCard/index.tsx @@ -1,4 +1,5 @@ "use client" + import { useParams } from "next/dist/client/components/navigation" import { memo, useCallback } from "react" import { useIntl } from "react-intl" @@ -64,6 +65,8 @@ function HotelCard({ state, }) + const addressStr = `${hotelData.address.streetAddress}, ${hotelData.address.city}` + return (
-
+
@@ -121,7 +122,7 @@ function HotelCard({ } {memberPrice && ( - {memberPrice} {currency} + {intl.formatMessage( + { id: "{price} {currency}" }, + { + price: memberPrice, + currency, + } + )} )} diff --git a/components/HotelReservation/HotelCardDialog/StandaloneHotelCardDialog/index.tsx b/components/HotelReservation/HotelCardDialog/StandaloneHotelCardDialog/index.tsx index 3ea839626..a1d33785a 100644 --- a/components/HotelReservation/HotelCardDialog/StandaloneHotelCardDialog/index.tsx +++ b/components/HotelReservation/HotelCardDialog/StandaloneHotelCardDialog/index.tsx @@ -88,7 +88,13 @@ export default function StandaloneHotelCardDialog({ {publicPrice && ( - {publicPrice} {currency} + {intl.formatMessage( + { id: "{price} {currency}" }, + { + price: publicPrice, + currency, + } + )} /{intl.formatMessage({ id: "night" })} @@ -100,7 +106,13 @@ export default function StandaloneHotelCardDialog({ color="red" className={styles.memberPrice} > - {memberPrice} {currency} + {intl.formatMessage( + { id: "{price} {currency}" }, + { + price: memberPrice, + currency, + } + )} /{intl.formatMessage({ id: "night" })} diff --git a/components/HotelReservation/HotelCardListing/index.tsx b/components/HotelReservation/HotelCardListing/index.tsx index 353bf2588..2c192a937 100644 --- a/components/HotelReservation/HotelCardListing/index.tsx +++ b/components/HotelReservation/HotelCardListing/index.tsx @@ -81,8 +81,10 @@ export default function HotelCardListing({ ) : activeFilters ? ( ) : null} {showBackToTop && ( diff --git a/components/HotelReservation/SelectHotel/FilterAndSortModal/index.tsx b/components/HotelReservation/SelectHotel/FilterAndSortModal/index.tsx index f1d3d9751..7acf56fd9 100644 --- a/components/HotelReservation/SelectHotel/FilterAndSortModal/index.tsx +++ b/components/HotelReservation/SelectHotel/FilterAndSortModal/index.tsx @@ -139,8 +139,10 @@ export default function FilterAndSortModal({ onClick={() => handleApplyFiltersAndSorting(close)} > {intl.formatMessage( - { id: "See results" }, - { count: resultCount } + { id: "See results ({ count })" }, + { + count: resultCount, + } )} diff --git a/components/HotelReservation/SelectRate/BreakfastSelection/index.tsx b/components/HotelReservation/SelectRate/BreakfastSelection/index.tsx index 142c246b1..c20a46fee 100644 --- a/components/HotelReservation/SelectRate/BreakfastSelection/index.tsx +++ b/components/HotelReservation/SelectRate/BreakfastSelection/index.tsx @@ -1,5 +1,7 @@ "use client" + import { useRouter, useSearchParams } from "next/navigation" +import { useIntl } from "react-intl" import SelectionCard from "../SelectionCard" @@ -11,6 +13,7 @@ export default function BreakfastSelection({ alternatives, nextPath, }: BreakfastSelectionProps) { + const intl = useIntl() const router = useRouter() const searchParams = useSearchParams() @@ -49,7 +52,7 @@ export default function BreakfastSelection({ diff --git a/components/HotelReservation/SelectRate/Details/index.tsx b/components/HotelReservation/SelectRate/Details/index.tsx index fe0c7af3c..bf4b5e0c4 100644 --- a/components/HotelReservation/SelectRate/Details/index.tsx +++ b/components/HotelReservation/SelectRate/Details/index.tsx @@ -1,5 +1,7 @@ "use client" + import { useSearchParams } from "next/navigation" +import { useIntl } from "react-intl" import Button from "@/components/TempDesignSystem/Button" @@ -8,12 +10,13 @@ import styles from "./details.module.css" import type { DetailsProps } from "@/types/components/hotelReservation/selectRate/section" export default function Details({ nextPath }: DetailsProps) { + const intl = useIntl() const searchParams = useSearchParams() return (
- +
) diff --git a/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx b/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx index 72bd42b25..e72dbfcab 100644 --- a/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx +++ b/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx @@ -70,7 +70,18 @@ export default async function HotelInfoCard({
{hotelAttributes.hotelContent.texts.descriptions.medium} diff --git a/components/HotelReservation/SelectRate/RoomFilter/index.tsx b/components/HotelReservation/SelectRate/RoomFilter/index.tsx index 70752b69b..5e06d2cab 100644 --- a/components/HotelReservation/SelectRate/RoomFilter/index.tsx +++ b/components/HotelReservation/SelectRate/RoomFilter/index.tsx @@ -84,8 +84,12 @@ export default function RoomFilter({
{intl.formatMessage( - { id: "Room types available" }, - { numberOfRooms } + { + id: "{numberOfRooms, plural, one {# room type} other {# room types}} available", + }, + { + numberOfRooms, + } )}
@@ -117,8 +121,12 @@ export default function RoomFilter({ @@ -138,7 +146,7 @@ export default function RoomFilter({ ) : ( - {intl.formatMessage({ id: "n/a" })} + {intl.formatMessage({ id: "N/A" })} )} @@ -112,7 +112,7 @@ export default function PriceList({ ) : ( - - {intl.formatMessage({ id: "Currency Code" })} + - )} @@ -126,9 +126,14 @@ export default function PriceList({
diff --git a/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx b/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx index 0def76307..f26c4da87 100644 --- a/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx +++ b/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx @@ -80,15 +80,15 @@ export default function RateSummary({ const showMemberDiscountBanner = member && !isUserLoggedIn const summaryPriceText = `${intl.formatMessage( - { id: "booking.nights" }, + { id: "{totalNights, plural, one {# night} other {# nights}}" }, { totalNights: nights } )}, ${intl.formatMessage( - { id: "booking.adults" }, + { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, { totalAdults: roomsAvailability.occupancy?.adults } )}${ roomsAvailability.occupancy?.children?.length ? `, ${intl.formatMessage( - { id: "booking.children" }, + { id: "{totalChildren, plural, one {# child} other {# children}}" }, { totalChildren: roomsAvailability.occupancy.children.length } )}` : "" @@ -136,11 +136,15 @@ export default function RateSummary({ {totalPriceToShow?.requestedPrice ? ( - {intl.formatMessage({ id: "Approx." })}{" "} - {formatPrice( - intl, - totalPriceToShow.requestedPrice.price, - totalPriceToShow.requestedPrice.currency + {intl.formatMessage( + { id: "Approx. {value}" }, + { + value: formatPrice( + intl, + totalPriceToShow.requestedPrice.price, + totalPriceToShow.requestedPrice.currency + ), + } )} ) : null} diff --git a/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx b/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx index cdf2fcc2f..51088fad3 100644 --- a/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx +++ b/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx @@ -118,10 +118,12 @@ export default function RoomCard({ {roomConfiguration.roomsLeft > 0 && roomConfiguration.roomsLeft < 5 && ( - {`${roomConfiguration.roomsLeft} ${intl.formatMessage({ id: "Left" })}`} + + {intl.formatMessage( + { id: "{amount, number} left" }, + { amount: roomConfiguration.roomsLeft } + )} + )} {roomConfiguration.features @@ -150,7 +152,7 @@ export default function RoomCard({ )}
diff --git a/components/HotelReservation/SelectRate/Rooms/index.tsx b/components/HotelReservation/SelectRate/Rooms/index.tsx index 90e2663a1..f879c1862 100644 --- a/components/HotelReservation/SelectRate/Rooms/index.tsx +++ b/components/HotelReservation/SelectRate/Rooms/index.tsx @@ -1,6 +1,7 @@ "use client" import { useCallback, useEffect, useMemo, useState } from "react" +import { useIntl } from "react-intl" import RoomFilter from "../RoomFilter" import RoomSelection from "../RoomSelection" @@ -27,6 +28,8 @@ export default function Rooms({ hotelType, isUserLoggedIn, }: SelectRateProps) { + const intl = useIntl() + const visibleRooms: RoomConfiguration[] = useMemo(() => { const deduped = filterDuplicateRoomTypesByLowestPrice( roomsAvailability.roomConfigurations @@ -59,27 +62,27 @@ export default function Rooms({ () => [ { code: RoomPackageCodeEnum.ACCESSIBILITY_ROOM, - description: "Accessible Room", + description: intl.formatMessage({ id: "Accessible Room" }), itemCode: availablePackages.find( (pkg) => pkg.code === RoomPackageCodeEnum.ACCESSIBILITY_ROOM )?.itemCode, }, { code: RoomPackageCodeEnum.ALLERGY_ROOM, - description: "Allergy Room", + description: intl.formatMessage({ id: "Allergy Room" }), itemCode: availablePackages.find( (pkg) => pkg.code === RoomPackageCodeEnum.ALLERGY_ROOM )?.itemCode, }, { code: RoomPackageCodeEnum.PET_ROOM, - description: "Pet Room", + description: intl.formatMessage({ id: "Pet Room" }), itemCode: availablePackages.find( (pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM )?.itemCode, }, ], - [availablePackages] + [availablePackages, intl] ) const handleFilter = useCallback( diff --git a/components/HotelReservation/SelectRate/SelectionCard/index.tsx b/components/HotelReservation/SelectRate/SelectionCard/index.tsx index 00385c91c..47b15bd74 100644 --- a/components/HotelReservation/SelectRate/SelectionCard/index.tsx +++ b/components/HotelReservation/SelectRate/SelectionCard/index.tsx @@ -30,15 +30,20 @@ export default function SelectionCard({
{membersPrice && ( )} diff --git a/components/LanguageSwitcher/index.tsx b/components/LanguageSwitcher/index.tsx index 7eb47c90c..5d5434c75 100644 --- a/components/LanguageSwitcher/index.tsx +++ b/components/LanguageSwitcher/index.tsx @@ -77,16 +77,15 @@ export default function LanguageSwitcher({ const classNames = languageSwitcherVariants({ position }) + const closeMsg = intl.formatMessage({ id: "Close language menu" }) + const openMsg = intl.formatMessage({ id: "Open language menu" }) + return (
diff --git a/components/Modal/index.tsx b/components/Modal/index.tsx index 8ea3e5312..242309d2f 100644 --- a/components/Modal/index.tsx +++ b/components/Modal/index.tsx @@ -38,6 +38,7 @@ function InnerModal({ subtitle, }: PropsWithChildren) { const intl = useIntl() + function modalStateHandler(newAnimationState: AnimationState) { setAnimation((currentAnimationState) => newAnimationState === AnimationStateEnum.hidden && @@ -72,7 +73,10 @@ function InnerModal({ animate={animation} initial={"hidden"} > - + {({ close }) => ( <>
diff --git a/components/MyPages/Surprises/Client.tsx b/components/MyPages/Surprises/Client.tsx index f2adf4186..0c6629a26 100644 --- a/components/MyPages/Surprises/Client.tsx +++ b/components/MyPages/Surprises/Client.tsx @@ -42,7 +42,9 @@ export default function SurprisesNotification({ toast.success( <> {intl.formatMessage( - { id: "Gift(s) added to your benefits" }, + { + id: "{amount, plural, one {Gift} other {Gifts}} added to your benefits", + }, { amount: surprises.length } )}
@@ -117,7 +119,10 @@ export default function SurprisesNotification({ }} onAnimationComplete={confetti} > - + {({ close }) => { return ( <> diff --git a/components/MyPages/Surprises/Initial.tsx b/components/MyPages/Surprises/Initial.tsx index 8e3a60b9c..5a796644f 100644 --- a/components/MyPages/Surprises/Initial.tsx +++ b/components/MyPages/Surprises/Initial.tsx @@ -18,7 +18,7 @@ export default function Initial({ totalSurprises, onOpen }: InitialProps) { <> {intl.formatMessage( { - id: "You have # gifts waiting for you!", + id: "You have {amount} gifts waiting for you!", }, { amount: totalSurprises, @@ -52,7 +52,7 @@ export default function Initial({ totalSurprises, onOpen }: InitialProps) { > {intl.formatMessage( { - id: "Open gift(s)", + id: "Open {amount, plural, one {gift} other {gifts}}", }, { amount: totalSurprises } )} diff --git a/components/MyPages/Surprises/Slide.tsx b/components/MyPages/Surprises/Slide.tsx index 2a4173fca..b0108b0b5 100644 --- a/components/MyPages/Surprises/Slide.tsx +++ b/components/MyPages/Surprises/Slide.tsx @@ -23,25 +23,30 @@ export default function Slide({ surprise, membershipNumber }: SlideProps) { }, dt() ) + return ( {surprise.description}
diff --git a/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx b/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx index 58491f084..40375c8b0 100644 --- a/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx +++ b/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx @@ -16,8 +16,22 @@ export default function CheckinCheckOut({ checkin }: CheckInCheckOutProps) { variant="sidepeek" > {intl.formatMessage({ id: "Hours" })} - {`${intl.formatMessage({ id: "Check in from" })}: ${checkin.checkInTime}`} - {`${intl.formatMessage({ id: "Check out at latest" })}: ${checkin.checkOutTime}`} + + {intl.formatMessage( + { id: "Check in from: {checkInTime}" }, + { + checkInTime: checkin.checkInTime, + } + )} + + + {intl.formatMessage( + { id: "Check out at latest: {checkOutTime}" }, + { + checkOutTime: checkin.checkOutTime, + } + )} + ) } diff --git a/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx b/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx index c172e2f7c..e16f2ba6e 100644 --- a/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx +++ b/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx @@ -11,6 +11,7 @@ import { IconName } from "@/types/components/icon" export default function Parking({ parking }: ParkingProps) { const intl = useIntl() + return ( - {parking.map((p) => ( -
- - {`${intl.formatMessage({ id: p.type })} ${p?.name ? ` (${p.name})` : ""}`} - -
    - {p?.address && ( -
  • - - {`${intl.formatMessage({ id: "Address" })}: ${p.address}`} -
  • - )} - {p?.numberOfParkingSpots !== undefined && ( -
  • - - {intl.formatMessage( - { id: "Number of parking spots" }, - { number: p.numberOfParkingSpots } - )} -
  • - )} - {p?.numberOfChargingSpaces !== undefined && ( -
  • - - {intl.formatMessage( - { id: "Number of charging points for electric cars" }, - { number: p.numberOfChargingSpaces } - )} -
  • - )} -
-
- ))} + {parking.map((p) => { + const title = `${p.type}${p.name ? ` (${p.name})` : ""}` + + return ( +
+ {title} +
    + {p.address !== undefined && ( +
  • + $ + {intl.formatMessage( + { id: "Address: {address}" }, + { + address: p.address, + } + )} +
  • + )} + {p.numberOfParkingSpots !== undefined && ( +
  • + + {intl.formatMessage( + { id: "Number of parking spots: {number}" }, + { number: p.numberOfParkingSpots } + )} +
  • + )} + {p.numberOfChargingSpaces !== undefined && ( +
  • + + {intl.formatMessage( + { + id: "Number of charging points for electric cars: {number}", + }, + { number: p.numberOfChargingSpaces } + )} +
  • + )} +
+
+ ) + })}
) } diff --git a/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx b/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx index aaf605a4f..23a380ef6 100644 --- a/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx +++ b/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx @@ -13,7 +13,12 @@ export default function Restaurant({ return ( diff --git a/components/SidePeeks/RoomSidePeek/index.tsx b/components/SidePeeks/RoomSidePeek/index.tsx index 86a1bb592..586e26ecf 100644 --- a/components/SidePeeks/RoomSidePeek/index.tsx +++ b/components/SidePeeks/RoomSidePeek/index.tsx @@ -21,6 +21,7 @@ export default function RoomSidePeek({ const intl = useIntl() const roomSize = room.roomSize + const totalOccupancy = room.occupancy const roomDescription = room.descriptions.medium const images = room.images @@ -34,13 +35,27 @@ export default function RoomSidePeek({
{roomSize.min === roomSize.max - ? roomSize.min - : `${roomSize.min} - ${roomSize.max}`} - m².{" "} - {intl.formatMessage( - { id: "booking.accommodatesUpTo" }, - { max: room.totalOccupancy.max, range: room.totalOccupancy.range } - )} + ? intl.formatMessage( + { + id: "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}", + }, + { + roomSize: roomSize.min, + max: room.totalOccupancy.max, + range: room.totalOccupancy.range, + } + ) + : intl.formatMessage( + { + id: "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}", + }, + { + roomSizeMin: roomSize.min, + roomSizeMax: roomSize.max, + max: room.totalOccupancy.max, + range: room.totalOccupancy.range, + } + )}
@@ -49,7 +64,7 @@ export default function RoomSidePeek({
- {intl.formatMessage({ id: "booking.thisRoomIsEquippedWith" })} + {intl.formatMessage({ id: "This room is equipped with" })}
    {room.roomFacilities @@ -79,10 +94,10 @@ export default function RoomSidePeek({
- {intl.formatMessage({ id: "booking.bedOptions" })} + {intl.formatMessage({ id: "Bed options" })} - {intl.formatMessage({ id: "booking.basedOnAvailability" })} + {intl.formatMessage({ id: "Based on availability" })}
    {room.roomTypes.map((roomType) => { diff --git a/components/TempDesignSystem/Form/Label/index.tsx b/components/TempDesignSystem/Form/Label/index.tsx index f45770897..89a46aa04 100644 --- a/components/TempDesignSystem/Form/Label/index.tsx +++ b/components/TempDesignSystem/Form/Label/index.tsx @@ -11,10 +11,8 @@ export default function Label({ const classNames = labelVariants({ className, size, + required, }) - return ( - - {children} {required ? "*" : ""} - - ) + + return {children} } diff --git a/components/TempDesignSystem/Form/Label/label.module.css b/components/TempDesignSystem/Form/Label/label.module.css index 645f62f2f..3b124fa3d 100644 --- a/components/TempDesignSystem/Form/Label/label.module.css +++ b/components/TempDesignSystem/Form/Label/label.module.css @@ -24,6 +24,10 @@ span.discreet { order: unset; } +span.required:after { + content: " *"; +} + /* Handle input and textarea fields */ input:active ~ .label, input:not(:placeholder-shown) ~ .label, @@ -64,7 +68,6 @@ textarea:disabled ~ .label, :global(.select-container)[data-open="true"] .label:not(.discreet), :global(.react-aria-SelectValue):has(:nth-child(2)) .label:not(.discreet), :global(.select-button):active .label:not(.discreet) { - display: grid; font-size: 12px; margin-bottom: var(--Spacing-x-half); } diff --git a/components/TempDesignSystem/Form/Label/variants.ts b/components/TempDesignSystem/Form/Label/variants.ts index 0e9e79f83..e9e354a00 100644 --- a/components/TempDesignSystem/Form/Label/variants.ts +++ b/components/TempDesignSystem/Form/Label/variants.ts @@ -9,8 +9,13 @@ export const labelVariants = cva(styles.label, { regular: styles.regular, discreet: styles.discreet, }, + required: { + true: styles.required, + false: "", + }, }, defaultVariants: { size: "regular", + required: false, }, }) diff --git a/components/TempDesignSystem/Form/NewPassword/index.tsx b/components/TempDesignSystem/Form/NewPassword/index.tsx index f7c5d4c22..8affe22e6 100644 --- a/components/TempDesignSystem/Form/NewPassword/index.tsx +++ b/components/TempDesignSystem/Form/NewPassword/index.tsx @@ -124,15 +124,32 @@ function PasswordValidation({ function getErrorMessage(key: PasswordValidatorKey) { switch (key) { case "length": - return `10 ${intl.formatMessage({ id: "to" })} 40 ${intl.formatMessage({ id: "characters" })}` + return intl.formatMessage( + { + id: "{min} to {max} characters", + }, + { + min: 10, + max: 40, + } + ) case "hasUppercase": - return `1 ${intl.formatMessage({ id: "uppercase letter" })}` + return intl.formatMessage( + { id: "{count} uppercase letter" }, + { count: 1 } + ) case "hasLowercase": - return `1 ${intl.formatMessage({ id: "lowercase letter" })}` + return intl.formatMessage( + { id: "{count} lowercase letter" }, + { count: 1 } + ) case "hasNumber": - return `1 ${intl.formatMessage({ id: "number" })}` + return intl.formatMessage({ id: "{count} number" }, { count: 1 }) case "hasSpecialChar": - return `1 ${intl.formatMessage({ id: "special character" })}` + return intl.formatMessage( + { id: "{count} special character" }, + { count: 1 } + ) } } diff --git a/components/TempDesignSystem/ShowMoreButton/index.tsx b/components/TempDesignSystem/ShowMoreButton/index.tsx index 9ac8c57c9..50e2bd457 100644 --- a/components/TempDesignSystem/ShowMoreButton/index.tsx +++ b/components/TempDesignSystem/ShowMoreButton/index.tsx @@ -16,8 +16,8 @@ export default function ShowMoreButton({ intent, disabled, showLess, - textShowMore = "Show more", - textShowLess = "Show less", + textShowMore, + textShowLess, loadMoreData, }: ShowMoreButtonProps) { const intl = useIntl() @@ -26,6 +26,18 @@ export default function ShowMoreButton({ intent, }) + if (!textShowMore) { + textShowMore = intl.formatMessage({ + id: "Show more", + }) + } + + if (!textShowLess) { + textShowLess = intl.formatMessage({ + id: "Show less", + }) + } + return (
    ) diff --git a/components/Webviews/LinkToOverview/index.tsx b/components/Webviews/LinkToOverview/index.tsx index a990d9fce..b74c3cf58 100644 --- a/components/Webviews/LinkToOverview/index.tsx +++ b/components/Webviews/LinkToOverview/index.tsx @@ -16,7 +16,7 @@ export default async function LinkToOverview() { const overviewHref = `${overview[getLang()]}?${searchParams.toString()}` return ( - {" "} + {intl.formatMessage({ id: "Go back to overview" })} ) diff --git a/hooks/booking/usePaymentFailedToast.ts b/hooks/booking/usePaymentFailedToast.ts index 806c3d5a2..a5b87a235 100644 --- a/hooks/booking/usePaymentFailedToast.ts +++ b/hooks/booking/usePaymentFailedToast.ts @@ -22,9 +22,13 @@ export function usePaymentFailedToast() { (errorCode: PaymentErrorCodeEnum) => { switch (errorCode) { case PaymentErrorCodeEnum.Cancelled: - return intl.formatMessage({ id: "payment.error.cancelled" }) + return intl.formatMessage({ + id: "You have now cancelled your payment.", + }) default: - return intl.formatMessage({ id: "payment.error.failed" }) + return intl.formatMessage({ + id: "We had an issue processing your booking. Please try again. No charges have been made.", + }) } }, [intl] diff --git a/i18n/dictionaries/da.json b/i18n/dictionaries/da.json index a37354cdb..ace572018 100644 --- a/i18n/dictionaries/da.json +++ b/i18n/dictionaries/da.json @@ -1,6 +1,7 @@ { "Included (based on availability)": "Inkluderet (baseret på tilgængelighed)", "Total price (incl VAT)": "Samlet pris (inkl. moms)", + "{amount} 0 {currency}/night per adult": "{amount} 0 {currency}/nat per voksen", "A destination or hotel name is needed to be able to search for a hotel room.": "Et destinations- eller hotelnavn er nødvendigt for at kunne søge efter et hotelværelse.", "A photo of the room": "Et foto af værelset", "ACCE": "Tilgængelighed", @@ -14,11 +15,13 @@ "Accessible Room": "Tilgængelighedsrum", "Active": "Aktiv", "Activities": "Aktiviteter", - "Add Room": "Tilføj værelse", "Add code": "Tilføj kode", "Add new card": "Tilføj nyt kort", + "Add room": "Tilføj værelse", "Add to calendar": "Tilføj til kalender", + "Adding room is not available on the new website yet.": "Tilføjelse af rum er endnu ikke tilgængelig på den nye hjemmeside.", "Address": "Adresse", + "Address: {address}": "Adresse: {address}", "Adults": "voksne", "Age": "Alder", "Airport": "Lufthavn", @@ -33,11 +36,12 @@ "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 {value}.": "Ca. {value}", "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 our": "Som vores {level}", "As our Close Friend": "Som vores nære ven", + "As our {level}": "Som vores {level}", "At latest": "Senest", "At the hotel": "På hotellet", "Attractions": "Attraktioner", @@ -47,12 +51,14 @@ "Bar": "Bar", "Based on availability": "Baseret på tilgængelighed", "Bed": "Seng type", + "Bed options": "Sengemuligheder", "Bed type": "Seng type", "Birth date": "Fødselsdato", "Book": "Book", "Book a table online": "Book et bord online", "Book parking": "Book parkering", "Book reward night": "Book bonusnat", + "Booking confirmation": "Booking bekræftelse", "Booking number": "Bookingnummer", "Breakfast": "Morgenmad", "Breakfast buffet": "Morgenbuffet", @@ -64,12 +70,15 @@ "Breakfast selection in next step.": "Valg af morgenmad i næste trin.", "Bus terminal": "Busstation", "Business": "Forretning", + "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.": "Ved at acceptere vilkårene og betingelserne for Scandic Friends, forstår jeg, at mine personlige oplysninger vil blive behandlet i overensstemmelse med Scandics privatlivspolitik.", + "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.": "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.", + "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service": "Ved at tilmelde dig accepterer du Scandic Friends vilkår og betingelser. Dit medlemskab er gyldigt indtil videre, og du kan til enhver tid opsige dit medlemskab ved at sende en e-mail til Scandics kundeservice", "Cancel": "Afbestille", "Change room": "Skift værelse", "Check in": "Check ind", - "Check in from": "Indtjekning fra", + "Check in from: {checkInTime}": "Indtjekning fra: {checkInTime}", "Check out": "Check ud", - "Check out at latest": "Udtjekning senest", + "Check out at latest: {checkOutTime}": "Udtjekning senest: {checkOutTime}", "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.", "Check-in/Check-out": "Indtjekning/Udtjekning", "Children": "børn", @@ -88,6 +97,7 @@ "Close the map": "Luk kortet", "Closed": "Lukket", "Code / Voucher": "Bookingkoder / voucher", + "Codes, cheques and reward nights aren't available on the new website yet.": "Koder, checks og bonusnætter er endnu ikke tilgængelige på den nye hjemmeside.", "Coming up": "Er lige om hjørnet", "Compare all levels": "Sammenlign alle niveauer", "Complete booking": "Fuldfør bookingen", @@ -96,7 +106,6 @@ "Contact information": "Kontaktoplysninger", "Contact us": "Kontakt os", "Continue": "Blive ved", - "Copyright all rights reserved": "Scandic AB Alle rettigheder forbeholdes", "Could not find requested resource": "Kunne ikke finde den anmodede ressource", "Country": "Land", "Country code": "Landekode", @@ -104,8 +113,7 @@ "Creative spaces for meetings": "Kreative rum til møder", "Credit card": "Kreditkort", "Credit card deleted successfully": "Kreditkort blev slettet", - "Crib (child)": "Kørestol (barn)", - "Currency Code": "DKK", + "Crib (child) × {count}": "Kørestol (barn) × {count}", "Current password": "Nuværende kodeord", "Customer service": "Kundeservice", "Date of Birth": "Fødselsdato", @@ -114,15 +122,11 @@ "Destination": "Destination", "Destinations & hotels": "Destinationer & hoteller", "Details": "Detaljer", - "Disabled adding room": "Tilføjelse af rum er endnu ikke tilgængelig på den nye hjemmeside.", - "Disabled booking options header": "Vi beklager", - "Disabled booking options text": "Koder, checks og bonusnætter er endnu ikke tilgængelige på den nye hjemmeside.", "Discard changes": "Kassér ændringer", "Discard unsaved changes?": "Slette ændringer, der ikke er gemt?", "Discover": "Opdag", - "Distance in km to city centre": "{number} km til centrum", "Distance to city centre": "Afstand til centrum", - "Distance to hotel": "Afstand til hotel: {distance} m", + "Distance to hotel: {distanceInM} m": "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", @@ -139,14 +143,15 @@ "Enter destination or hotel": "Indtast destination eller hotel", "Enter your details": "Indtast dine oplysninger", "Events that make an impression": "Events that make an impression", - "Expires at the earliest": "Udløber tidligst {date}", + "Expires at the earliest {expirationDate}": "Udløber tidligst {expirationDate}", "Explore all levels and benefits": "Udforsk alle niveauer og fordele", "Explore nearby": "Udforsk i nærheden", - "Extra bed (child)": "Ekstra seng (barn)", + "Extra bed (child) × {count}": "Ekstra seng (barn) × {count}", "Extra bed will be provided additionally": "Der vil blive stillet en ekstra seng til rådighed", "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.", + "Failed to verify membership": "Medlemskab ikke verificeret", "Fair": "Messe", "Filter": "Filter", "Filter and sort": "Filtrer og sorter", @@ -169,17 +174,16 @@ "Garage": "Garage", "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", - "Go to My Benefits": "Gå til ‘Mine fordele’", + "Go to My Benefits": "Gå til 'Mine fordele'", "Guarantee booking with credit card": "Garantere booking med kreditkort", "Guest information": "Gæsteinformation", "Guests & Rooms": "Gæster & værelser", "Gym": "Fitnesscenter", - "Hi": "Hei", + "Hi {firstName}!": "Hei {firstName}!", "High floor": "Højt niveau", - "Highest floor": "Højeste niveau", + "Highest level": "Højeste niveau", "Home": "Hjem", "Hospital": "Hospital", "Hotel": "Hotel", @@ -187,7 +191,6 @@ "Hotel facilities": "Hotel faciliteter", "Hotel reservation": "Hotel reservation", "Hotel surroundings": "Hotel omgivelser", - "Hotel(s)": "{amount} {amount, plural, one {hotel} other {hoteller}}", "Hotels": "Hoteller", "Hours": "Tider", "How do you want to sleep?": "Hvordan vil du sove?", @@ -196,7 +199,6 @@ "I accept": "Jeg accepterer", "I accept the terms and conditions": "Jeg accepterer vilkårene", "I would like to get my booking confirmation via sms": "Jeg vil gerne få min booking bekræftelse via SMS", - "Image gallery": "{name} - Billedgalleri", "In adults bed": "i de voksnes seng", "In crib": "i tremmeseng", "In extra bed": "i ekstra seng", @@ -204,6 +206,7 @@ "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.", + "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.": "Det ser ud til, at ingen hoteller matcher dine filtre. Prøv at justere din søgning for at finde det perfekte ophold.", "Jacuzzi": "Jacuzzi", "Join Scandic Friends": "Tilmeld dig Scandic Friends", "Join at no cost": "Tilmeld dig uden omkostninger", @@ -215,7 +218,6 @@ "Last name can't contain any special characters": "Efternavn kan ikke indeholde specielle tegn", "Last name is required": "Efternavn er påkrævet", "Latest searches": "Seneste søgninger", - "Left": "tilbage", "Level": "Niveau", "Level 1": "Niveau 1", "Level 2": "Niveau 2", @@ -225,6 +227,7 @@ "Level 6": "Niveau 6", "Level 7": "Niveau 7", "Level up to unlock": "Stig i niveau for at låse op", + "Level {level}": "Niveau {level}", "Location": "Beliggenhed", "Locations": "Placeringer", "Log in": "Log på", @@ -232,27 +235,29 @@ "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", "Map": "Kort", - "Map of HOTEL_NAME": "Map of {hotelName}", + "Map of {hotelName}": "Map of {hotelName}", "Marketing city": "Marketing by", + "Max {max, plural, one {{range} guest} other {{range} guests}}": "Maks {max, plural, one {{range} gæst} other {{range} gæster}}", "Meetings & Conferences": "Møder & Konferencer", "Member price": "Medlemspris", "Member price activated": "Medlemspris aktiveret", "Member price from": "Medlemspris fra", - "Members": "Medlemmer", - "Membership ID": "Medlems-id", + "Members {price}/night": "Medlemmer {price}/nat", "Membership ID copied to clipboard": "Medlems-ID kopieret til udklipsholder", + "Membership ID {id}": "Medlems-id {id}", + "Membership ID: {id}": "Medlems-id: {id}", "Membership cards": "Medlemskort", "Membership terms and conditions": "Medlemsvilkår og -betingelser", "Menu": "Menu", "Menus": "Menukort", "Modify": "Ændre", - "Mon-Fri": "Man-Fre", + "Mon-Fri Always open": "Man-Fre Altid åben", + "Mon-Fri {openingTime}-${closingTime}": "Man-Fre {openingTime}-${closingTime}", "Monday": "Mandag", "Month": "Måned", "Museum": "Museum", @@ -263,6 +268,7 @@ "My payment cards": "Mine betalingskort", "My wishes": "Mine ønsker", "Name": "Navn", + "Name: {cardMembershipType}": "Navn: {cardMembershipType}", "Near elevator": "Tæt på elevator", "Nearby": "I nærheden", "Nearby companies": "Nærliggende virksomheder", @@ -273,6 +279,7 @@ "No availability": "Ingen tilgængelighed", "No breakfast": "Ingen morgenmad", "No content published": "Intet indhold offentliggjort", + "No hotels match your filters": "Ingen rum matchede dine filtre.", "No matching location found": "Der blev ikke fundet nogen matchende placering", "No preference": "Ingen præference", "No prices available": "Ingen tilgængelige priser", @@ -283,18 +290,18 @@ "Non-refundable": "Ikke-refunderbart", "Nordic Swan Ecolabel": "Svanemærket", "Not found": "Ikke fundet", - "Nr night, nr adult": "{nights, number} nat, {adults, number} voksen", - "Number of charging points for electric cars": "Antal ladepunkter til elbiler: {number}", - "Number of parking spots": "Antal parkeringspladser: {number}", + "Number of charging points for electric cars: {number}": "Antal ladepunkter til elbiler: {number}", + "Number of parking spots: {number}": "Antal parkeringspladser: {number}", + "OK": "OK", "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER", "On your journey": "På din rejse", "Only pay {amount}": "Betal kun {amount}", "Open": "Åben", - "Open gift(s)": "Åbne {amount, plural, one {gave} other {gaver}}", "Open image gallery": "Åbn billedgalleri", "Open language menu": "Åbn sprogmenuen", "Open menu": "Åbn menuen", "Open my pages menu": "Åbn mine sider menuen", + "Open {amount, plural, one {gift} other {gifts}}": "Åbne {amount, plural, one {gave} other {gaver}}", "Opening hours": "Åbningstider", "Outdoor": "Udendørs", "OutdoorPool": "Udendørs pool", @@ -328,6 +335,8 @@ "Previous victories": "Tidligere sejre", "Price": "Pris", "Price details": "Prisoplysninger", + "Price excluding VAT": "Pris ekskl. moms", + "Price including VAT": "Pris inkl. moms", "Price per 24 hours": "Pris per 24 timer", "Price per day": "Pris per dag", "Price per night": "Pris per nat", @@ -347,16 +356,15 @@ "Relax": "Slap af", "Remove card from member profile": "Fjern kortet fra medlemsprofilen", "Request bedtype": "Anmod om sengetype", - "Restaurant": "{count, plural, one {Restaurant} other {Restauranter}}", "Restaurant & Bar": "Restaurant & Bar", "Restaurants & Bars": "Restaurants & Bars", "Retype new password": "Gentag den nye adgangskode", "Room & Terms": "Værelse & Vilkår", "Room facilities": "Værelsesfaciliteter", - "Room types available": "{numberOfRooms, plural, one {# room type} other {# room types}} tilgængelig", "Rooms": "Værelser", "Rooms & Guests": "Værelser & gæster", - "Sat-Sun": "Lør-Søn", + "Sat-Sun Always open": "Lør-Søn Altid åben", + "Sat-Sun {openingTime}-${closingTime}": "Lør-Søn {openingTime}-${closingTime}", "Saturday": "Lørdag", "Sauna": "Sauna", "Sauna and gym": "Sauna and gym", @@ -371,7 +379,7 @@ "See less FAQ": "Se mindre FAQ", "See map": "Vis kort", "See on map": "Se på kort", - "See results": "Se resultater ({ count })", + "See results ({ count })": "Se resultater ({ count })", "See room details": "Se værelsesdetaljer", "See rooms": "Se værelser", "Select a country": "Vælg et land", @@ -383,6 +391,7 @@ "Select hotel": "Vælg hotel", "Select language": "Vælg sprog", "Select payment method": "Vælg betalingsmetode", + "Select room": "Zimmer auswählen", "Select your language": "Vælg dit sprog", "Shopping": "Shopping", "Shopping & Dining": "Shopping & Spisning", @@ -405,16 +414,19 @@ "Spice things up": "Krydre tingene", "Sports": "Sport", "Standard price": "Standardpris", - "Stay at HOTEL_NAME | Hotel in DESTINATION": "Bo på {hotelName} | Hotel i {destination}", + "Stay at {hotelName} | Hotel in {destination}": "Bo på {hotelName} | Hotel i {destination}", "Street": "Gade", + "Submit": "Submit", "Successfully updated profile!": "Profilen er opdateret med succes!", "Summary": "Opsummering", "Sunday": "Søndag", "Surprise!": "Overraskelse!", + "Surprises": "Surprises", "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", + "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 contact us.": "Tak fordi du bookede hos os! Vi glæder os til at byde dig velkommen og håber du får et behageligt ophold. Hvis du har spørgsmål eller har brug for at foretage ændringer i din reservation, bedes du kontakte os.", "The new price is": "Nyprisen er", "The price has increased": "Prisen er steget", "The price has increased since you selected your room.": "Prisen er steget, efter at du har valgt dit værelse.", @@ -422,7 +434,8 @@ "There are no rooms available that match your request": "Der er ingen ledige værelser, der matcher din anmodning", "There are no rooms available that match your request.": "Der er ingen værelser tilgængelige, der matcher din forespørgsel.", "There are no transactions to display": "Der er ingen transaktioner at vise", - "Things nearby HOTEL_NAME": "Ting i nærheden af {hotelName}", + "Things nearby {hotelName}": "Ting i nærheden af {hotelName}", + "This room is equipped with": "Dette værelse er udstyret med", "This room is not available": "Dette værelse er ikke tilgængeligt", "Thursday": "Torsdag", "Times": "Tider", @@ -437,22 +450,23 @@ "Transactions": "Transaktioner", "Transportations": "Transport", "TripAdvisor rating": "TripAdvisor vurdering", - "Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)", "Tuesday": "Tirsdag", "Type of bed": "Sengtype", "Type of room": "Værelsestype", "Use bonus cheque": "Brug Bonus Cheque", "Use code/voucher": "Brug kode/voucher", "User information": "Brugeroplysninger", + "VAT {vat}%": "Moms {vat}%", "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 had an issue processing your booking. Please try again. No charges have been made.": "Vi havde et problem med at behandle din booking. Prøv venligst igen. Ingen gebyrer er blevet opkrævet.", "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!", + "We're sorry": "Vi beklager", "Wednesday": "Onsdag", "Weekday": "Ugedag", "Weekday prices": "Ugedagspriser", @@ -476,11 +490,13 @@ "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 can still book the room but you need to confirm that you accept the new price": "Du kan stadig booke værelset, men du skal bekræfte, at du accepterer den nye pris", "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 {amount} 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’", + "You have now cancelled your payment.": "Du har nu annulleret din betaling.", + "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 booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.": "Din booking er bekræftet, men vi kunne ikke verificere dit medlemskab. Hvis du har booket med et medlemstilbud, skal du enten vise dit eksisterende medlemskab ved check-in, blive medlem eller betale prisdifferencen ved check-in. Tilmelding er foretrukket online før opholdet.", "Your card was successfully removed!": "Dit kort blev fjernet!", "Your card was successfully saved!": "Dit kort blev gemt!", "Your current level": "Dit nuværende niveau", @@ -494,64 +510,62 @@ "Zoom in": "Zoom ind", "Zoom out": "Zoom ud", "as of today": "pr. dags dato", - "booking.accommodatesUpTo": "Plads til {max, plural, one {{range} person} other {op til {range} personer}}", - "booking.adults": "{totalAdults, plural, one {# voksen} other {# voksne}}", - "booking.adults.breakfasts": "{totalAdults, plural, one {# voksen} other {# voksne}}, {totalBreakfasts, plural, one {# morgenmad} other {# morgenmad}}", - "booking.basedOnAvailability": "Baseret på tilgængelighed", - "booking.bedOptions": "Sengemuligheder", - "booking.children": "{totalChildren, plural, one {# barn} other {# børn}}", - "booking.children.breakfasts": "{totalChildren, plural, one {# barn} other {# børn}}, {totalBreakfasts, plural, one {# morgenmad} other {# morgenmad}}", - "booking.confirmation.membershipInfo.heading": "Medlemskab ikke verificeret", - "booking.confirmation.membershipInfo.text": "Din booking er bekræftet, men vi kunne ikke verificere dit medlemskab. Hvis du har booket med et medlemstilbud, skal du enten vise dit eksisterende medlemskab ved check-in, blive medlem eller betale prisdifferencen ved check-in. Tilmelding er foretrukket online før opholdet.", "booking.confirmation.text": "Tak fordi du bookede hos os! Vi glæder os til at byde dig velkommen og håber du får et behageligt ophold. Hvis du har spørgsmål eller har brug for at foretage ændringer i din reservation, bedes du kontakte os.", "booking.confirmation.title": "Booking bekræftelse", "booking.guests": "Maks {max, plural, one {{range} gæst} other {{range} gæster}}", - "booking.nights": "{totalNights, plural, one {# nat} other {# nætter}}", - "booking.rooms": "{totalRooms, plural, one {# værelse} other {# værelser}}", "booking.selectRoom": "Zimmer auswählen", - "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", - "booking.vat": "Moms {vat}%", - "booking.vat.excl": "Pris ekskl. moms", - "booking.vat.incl": "Pris inkl. moms", - "breakfast.price": "{amount}/nat per voksen", - "breakfast.price.free": "{amount} 0 {currency}/nat per voksen", - "by": "inden", - "characters": "tegn", - "filters.nohotel.heading": "Ingen rum matchede dine filtre.", - "filters.nohotel.text": "Det ser ud til, at ingen hoteller matcher dine filtre. Prøv at justere din søgning for at finde det perfekte ophold.", - "from": "fra", - "guaranteeing": "garanti", - "guest": "gæst", - "guests": "gæster", - "hotelPages.rooms.roomCard.persons": "{size} ({max, plural, one {{range} person} other {{range} 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:", + "friday": "fredag", + "monday": "mandag", "night": "nat", - "nights": "nætter", - "number": "nummer", - "or": "eller", - "paying": "betaler ", - "payment.error.abandoned": "Vi havde et problem med at behandle din booking. Prøv venligst igen. Ingen gebyrer er blevet opkrævet.", - "payment.error.cancelled": "Du har nu annulleret din betaling.", - "payment.error.failed": "Vi havde et problem med at behandle din booking. Prøv venligst igen. Ingen gebyrer er blevet opkrævet.", "points": "Point", - "room type": "værelsestype", - "room types": "værelsestyper", - "signup.terms": "Ved at tilmelde dig accepterer du Scandic Friends vilkår og betingelser. Dit medlemskab er gyldigt indtil videre, og du kan til enhver tid opsige dit medlemskab ved at sende en e-mail til Scandics kundeservice", - "signupPage.terms": "Ved at acceptere vilkårene og betingelserne for Scandic Friends, forstår jeg, at mine personlige oplysninger vil blive behandlet i overensstemmelse med Scandics privatlivspolitik.", - "special character": "speciel karakter", - "spendable points expiring by": "{points} Brugbare point udløber den {date}", - "to": "til", - "uppercase letter": "stort bogstav", + "saturday": "lørdag", + "sunday": "søndag", + "thursday": "torsdag", + "tuesday": "tirsdag", + "wednesday": "onsdag", + "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center": "{address}, {city} ∙ {distanceToCityCentreInKm} km til byens centrum", + "{amount, number} left": "{amount, number} tilbage", + "{amount, plural, one {Gift} other {Gifts}} added to your benefits": "{amount, plural, one {Gave} other {Gaver}} tilføjet til dine fordele", "{amount} out of {total}": "{amount} ud af {total}", + "{amount} {amount, plural, one {hotel} other {hotels}}": "{amount} {amount, plural, one {hotel} other {hoteller}}", + "{amount}/night per adult": "{amount}/nat per voksen", "{card} ending with {cardno}": "{card} slutter med {cardno}", + "{checkInDate} from {checkInTime}": "{checkInDate} fra {checkInTime}", + "{checkOutDate} from {checkOutTime}": "{checkOutDate} fra {checkOutTime}", + "{count} lowercase letter": "{count} lille bogstav", + "{count} number": "{count} nummer", + "{count} special character": "{count} speciel karakter", + "{count} uppercase letter": "{count} stort bogstav", "{difference}{amount} {currency}": "{difference}{amount} {currency}", - "{number} persons": "{number} Personen", - "{number} square meters": "{number} Quadratmeter", - "{number} to {number} persons": "{lowest} bis {highest} Personen", - "{number} to {number} square meters": "{smallest} bis {largest} Quadratmeter" + "{distanceInKm} km": "{distanceInKm} km", + "{lowest} to {highest} persons": "{lowest} bis {highest} Personen", + "{min} to {max} characters": "{min} til {max} tegn", + "{numberOfRooms, plural, one {# room type} other {# room types}} available": "{numberOfRooms, plural, one {# room type} other {# room types}} tilgængelig", + "{number} km to city centre": "{number} km til centrum", + "{pointsAmount, number} points": "{pointsAmount, number} point", + "{points} spendable points expiring by {date}": "{points} Brugbare point udløber den {date}", + "{price} {currency}": "{price} {currency}", + "{price}/night": "{price}/nat", + "{publicPrice}/{memberPrice} {currency}": "{publicPrice}/{memberPrice} {currency}", + "{rating} ({count} reviews on Tripadvisor)": "{rating} ({count} anmeldelser på Tripadvisor)", + "{roomSizeMin} - {roomSizeMax} m²": "{roomSizeMin} - {roomSizeMax} m²", + "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSizeMin} - {roomSizeMax} m². Plads til {max, plural, one {{range} person} other {op til {range} personer}}", + "{roomSize} m²": "{roomSize} m²", + "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSize} m². Plads til {max, plural, one {{range} person} other {op til {range} personer}}", + "{roomType} {rateDescription}": "{roomType} {rateDescription}", + "{selectedFromDate} - {selectedToDate}": "{selectedFromDate} - {selectedToDate}", + "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}": "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + "{size} ({max, plural, one {{range} person} other {{range} persons}})": "{size} ({max, plural, one {{range} person} other {{range} personer}})", + "{smallest} to {largest} square meters": "{smallest} bis {largest} Quadratmeter", + "{title} - Image gallery": "{title} - Billedgalleri", + "{totalAdults, plural, one {# adult} other {# adults}}": "{totalAdults, plural, one {# voksen} other {# voksne}}", + "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}": "{totalBreakfasts, plural, one {# morgenmad} other {# morgenmad}}", + "{totalChildren, plural, one {# child} other {# children}}": "{totalChildren, plural, one {# barn} other {# børn}}", + "{totalNights, plural, one {# night} other {# nights}}": "{totalNights, plural, one {# nat} other {# nætter}}", + "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}": "{totalRestaurants, plural, one {Restaurant} other {Restauranter}}", + "{totalRooms, plural, one {# room} other {# rooms}}": "{totalRooms, plural, one {# værelse} other {# værelser}}", + "{value} persons": "{number} Personen", + "{value} square meters": "{number} Quadratmeter", + "© {currentYear} Scandic AB All rights reserved": "© {currentYear} Scandic AB Alle rettigheder forbeholdes" } diff --git a/i18n/dictionaries/de.json b/i18n/dictionaries/de.json index 2a31ba6b6..9f00e1a16 100644 --- a/i18n/dictionaries/de.json +++ b/i18n/dictionaries/de.json @@ -1,6 +1,7 @@ { "Included (based on availability)": "Inbegriffen (je nach Verfügbarkeit)", "Total price (incl VAT)": "Gesamtpreis (inkl. MwSt.)", + "{amount} 0 {currency}/night per adult": "{amount} 0 {currency}/Nacht pro Erwachsenem", "A destination or hotel name is needed to be able to search for a hotel room.": "Ein Reiseziel oder Hotelname wird benötigt, um nach einem Hotelzimmer suchen zu können.", "A photo of the room": "Ein Foto des Zimmers", "ACCE": "Zugänglichkeit", @@ -14,11 +15,13 @@ "Accessible Room": "Barrierefreies Zimmer", "Active": "Aktiv", "Activities": "Aktivitäten", - "Add Room": "Zimmer hinzufügen", "Add code": "Code hinzufügen", "Add new card": "Neue Karte hinzufügen", + "Add room": "Zimmer hinzufügen", "Add to calendar": "Zum Kalender hinzufügen", + "Adding room is not available on the new website yet.": "Zum Hinzufügen eines Zimmers ist derzeit nicht möglich.", "Address": "Adresse", + "Address: {address}": "Adresse: {address}", "Adults": "Erwachsene", "Age": "Alter", "Airport": "Flughafen", @@ -33,11 +36,12 @@ "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 {value}.": "Ca. {value}", "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 our": "Als unser {level}", "As our Close Friend": "Als unser enger Freund", + "As our {level}": "Als unser {level}", "At latest": "Spätestens", "At the hotel": "Im Hotel", "Attraction": "Attraktion", @@ -47,12 +51,14 @@ "Bar": "Bar", "Based on availability": "Je nach Verfügbarkeit", "Bed": "Bettentyp", + "Bed options": "Bettoptionen", "Bed type": "Bettentyp", "Birth date": "Geburtsdatum", "Book": "Buchen", "Book a table online": "Tisch online buchen", "Book parking": "Parkplatz buchen", "Book reward night": "Bonusnacht buchen", + "Booking confirmation": "Buchungsbestätigung", "Booking number": "Buchungsnummer", "Breakfast": "Frühstück", "Breakfast buffet": "Frühstücksbuffet", @@ -64,12 +70,15 @@ "Breakfast selection in next step.": "Frühstücksauswahl in nächsten Schritt.", "Bus terminal": "Busbahnhof", "Business": "Geschäft", + "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.": "Mit der Annahme der Allgemeinen Geschäftsbedingungen für Scandic Friends erkläre ich mich damit einverstanden, dass meine persönlichen Daten in Übereinstimmung mit der Datenschutzrichtlinie von Scandic verarbeitet werden.", + "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.": "Mit der Zahlung über eine der verfügbaren Zahlungsmethoden akzeptiere ich die Buchungsbedingungen und die allgemeinen Geschäftsbedingungen und verstehe, dass Scandic meine personenbezogenen Daten im Zusammenhang mit dieser Buchung gemäß der Scandic Datenschutzrichtlinie verarbeitet. Ich akzeptiere, dass Scandic während meines Aufenthalts eine gültige Kreditkarte für eventuelle Rückerstattungen benötigt.", + "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service": "Mit Ihrer Anmeldung akzeptieren Sie die Allgemeinen Geschäftsbedingungen von Scandic Friends. Ihre Mitgliedschaft ist bis auf Weiteres gültig und Sie können sie jederzeit kündigen, indem Sie eine E-Mail an den Kundenservice von Scandic senden.", "Cancel": "Stornieren", "Change room": "Zimmer ändern", "Check in": "Einchecken", - "Check in from": "Check-in ab", + "Check in from: {checkInTime}": "Check-in ab: {checkInTime}", "Check out": "Auschecken", - "Check out at latest": "Check-out spätestens", + "Check out at latest: {checkOutTime}": "Check-out spätestens: {checkOutTime}", "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.", "Check-in/Check-out": "Einchecken/Auschecken", "Children": "Kinder", @@ -88,6 +97,7 @@ "Close the map": "Karte schließen", "Closed": "Geschlossen", "Code / Voucher": "Buchungscodes / Gutscheine", + "Codes, cheques and reward nights aren't available on the new website yet.": "Codes, Schecks und Bonusnächte sind auf der neuen Website noch nicht verfügbar.", "Coming up": "Demnächst", "Compare all levels": "Vergleichen Sie alle Levels", "Complete booking": "Buchung abschließen", @@ -96,7 +106,6 @@ "Contact information": "Kontaktinformationen", "Contact us": "Kontaktieren Sie uns", "Continue": "Weitermachen", - "Copyright all rights reserved": "Scandic AB Alle Rechte vorbehalten", "Could not find requested resource": "Die angeforderte Ressource konnte nicht gefunden werden.", "Country": "Land", "Country code": "Landesvorwahl", @@ -104,8 +113,7 @@ "Creative spaces for meetings": "Kreative Räume für Meetings", "Credit card": "Kreditkarte", "Credit card deleted successfully": "Kreditkarte erfolgreich gelöscht", - "Crib (child)": "Kinderbett (Kind)", - "Currency Code": "EUR", + "Crib (child) × {count}": "Kinderbett (Kind) × {count}", "Current password": "Aktuelles Passwort", "Customer service": "Kundendienst", "Date of Birth": "Geburtsdatum", @@ -114,15 +122,11 @@ "Destination": "Bestimmungsort", "Destinations & hotels": "Reiseziele & Hotels", "Details": "Details", - "Disabled adding room": "Zum Hinzufügen eines Zimmers ist derzeit nicht möglich.", - "Disabled booking options header": "Es tut uns leid", - "Disabled booking options text": "Codes, Schecks und Bonusnächte sind auf der neuen Website noch nicht verfügbar.", "Discard changes": "Änderungen verwerfen", "Discard unsaved changes?": "Nicht gespeicherte Änderungen verwerfen?", "Discover": "Entdecken", - "Distance in km to city centre": "{number} km zum Stadtzentrum", "Distance to city centre": "Entfernung zum Stadtzentrum", - "Distance to hotel": "Entfernung zum Hotel: {distance} m", + "Distance to hotel: {distanceInM} m": "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", @@ -139,14 +143,15 @@ "Enter destination or hotel": "Reiseziel oder Hotel eingeben", "Enter your details": "Geben Sie Ihre Daten ein", "Events that make an impression": "Events that make an impression", - "Expires at the earliest": "Läuft frühestens am {date} ab", + "Expires at the earliest {expirationDate}": "Läuft frühestens am {expirationDate} ab", "Explore all levels and benefits": "Entdecken Sie alle Levels und Vorteile", "Explore nearby": "Erkunden Sie die Umgebung", - "Extra bed (child)": "Ekstra seng (Kind)", + "Extra bed (child) × {count}": "Ekstra seng (Kind) × {count}", "Extra bed will be provided additionally": "Ein zusätzliches Bett wird bereitgestellt", "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.", + "Failed to verify membership": "Medlemskab nicht verifiziert", "Fair": "Messe", "Filter": "Filter", "Filter and sort": "Filtern und sortieren", @@ -169,7 +174,6 @@ "Garage": "Garage", "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", "Go to My Benefits": "Gehen Sie zu „Meine Vorteile“", @@ -177,9 +181,9 @@ "Guest information": "Informationen für Gäste", "Guests & Rooms": "Gäste & Zimmer", "Gym": "Fitnessstudio", - "Hi": "Hallo", + "Hi {firstName}!": "Hallo {firstName}!", "High floor": "Hohes Level", - "Highest floor": "Höchstes Level", + "Highest level": "Höchstes Level", "Home": "Heim", "Hospital": "Krankenhaus", "Hotel": "Hotel", @@ -187,7 +191,6 @@ "Hotel facilities": "Hotel-Infos", "Hotel reservation": "Hotelreservierung", "Hotel surroundings": "Umgebung des Hotels", - "Hotel(s)": "{amount} {amount, plural, one {hotel} other {hotels}}", "Hotels": "Hotels", "Hours": "Zeiten", "How do you want to sleep?": "Wie möchtest du schlafen?", @@ -196,7 +199,6 @@ "I accept": "Ich akzeptiere", "I accept the terms and conditions": "Ich akzeptiere die Geschäftsbedingungen", "I would like to get my booking confirmation via sms": "Ich möchte meine Buchungsbestätigung per SMS erhalten", - "Image gallery": "{name} - Bildergalerie", "In adults bed": "Im Bett der Eltern", "In crib": "im Kinderbett", "In extra bed": "im zusätzlichen Bett", @@ -204,6 +206,7 @@ "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.", + "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.": "Es scheint, dass keine Hotels Ihren Filtern entsprechen. Versuchen Sie, Ihre Suche anzupassen, um den perfekten Aufenthalt zu finden.", "Jacuzzi": "Whirlpool", "Join Scandic Friends": "Treten Sie Scandic Friends bei", "Join at no cost": "Kostenlos beitreten", @@ -215,7 +218,6 @@ "Last name can't contain any special characters": "Der Nachname darf keine Sonderzeichen enthalten", "Last name is required": "Nachname ist erforderlich", "Latest searches": "Letzte Suchanfragen", - "Left": "übrig", "Level": "Level", "Level 1": "Level 1", "Level 2": "Level 2", @@ -225,6 +227,7 @@ "Level 6": "Level 6", "Level 7": "Level 7", "Level up to unlock": "Zum Freischalten aufsteigen", + "Level {level}": "Level {level}", "Location": "Ort", "Locations": "Orte", "Log in": "Anmeldung", @@ -232,26 +235,28 @@ "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", "Map": "Karte", - "Map of HOTEL_NAME": "Map of {hotelName}", + "Map of {hotelName}": "Map of {hotelName}", "Marketing city": "Marketingstadt", + "Max {max, plural, one {{range} guest} other {{range} guests}}": "Max {max, plural, one {{range} gast} other {{range} gäste}}", "Meetings & Conferences": "Tagungen & Konferenzen", "Member price": "Mitgliederpreis", "Member price activated": "Mitgliederpreis aktiviert", "Member price from": "Mitgliederpreis ab", - "Members": "Mitglieder", - "Membership ID": "Mitglieds-ID", + "Members {price}/night": "Mitglieder {price}/nacht", "Membership ID copied to clipboard": "Mitglieds-ID in die Zwischenablage kopiert", + "Membership ID {id}": "Mitglieds-ID {id}", + "Membership ID: {id}": "Mitglieds-ID: {id}", "Membership cards": "Mitgliedskarten", "Menu": "Menü", "Menus": "Menüs", "Modify": "Ändern", - "Mon-Fri": "Mo-Fr", + "Mon-Fri Always open": "Mo-Fr Immer geöffnet", + "Mon-Fri {openingTime}-${closingTime}": "Mo-Fr {openingTime}-${closingTime}", "Monday": "Montag", "Month": "Monat", "Museum": "Museum", @@ -262,6 +267,7 @@ "My payment cards": "Meine Zahlungskarten", "My wishes": "Meine Wünsche", "Name": "Name", + "Name: {cardMembershipType}": "Name: {cardMembershipType}", "Near elevator": "In der Nähe des Aufzugs", "Nearby": "In der Nähe", "Nearby companies": "Nahe gelegene Unternehmen", @@ -272,6 +278,7 @@ "No availability": "Keine Verfügbarkeit", "No breakfast": "Kein Frühstück", "No content published": "Kein Inhalt veröffentlicht", + "No hotels match your filters": "Kein Zimmer entspricht Ihren Filtern.", "No matching location found": "Kein passender Standort gefunden", "No preference": "Keine Präferenz", "No prices available": "Keine Preise verfügbar", @@ -282,18 +289,18 @@ "Non-refundable": "Nicht erstattungsfähig", "Nordic Swan Ecolabel": "Nordic Swan Ecolabel", "Not found": "Nicht gefunden", - "Nr night, nr adult": "{nights, number} Nacht, {adults, number} Erwachsener", - "Number of charging points for electric cars": "Anzahl der Ladestationen für Elektroautos: {number}", - "Number of parking spots": "Anzahl der Parkplätze: {number}", + "Number of charging points for electric cars: {number}": "Anzahl der Ladestationen für Elektroautos: {number}", + "Number of parking spots: {number}": "Anzahl der Parkplätze: {number}", + "OK": "OK", "OTHER PAYMENT METHODS": "ANDERE BEZAHLMETHODE", "On your journey": "Auf deiner Reise", "Only pay {amount}": "Nur bezahlen {amount}", "Open": "Offen", - "Open gift(s)": "{amount, plural, one {Geschenk} other {Geschenke}} öffnen", "Open image gallery": "Bildergalerie öffnen", "Open language menu": "Sprachmenü öffnen", "Open menu": "Menü öffnen", "Open my pages menu": "Meine Seiten Menü öffnen", + "Open {amount, plural, one {gift} other {gifts}}": "{amount, plural, one {Geschenk} other {Geschenke}} öffnen", "Opening hours": "Öffnungszeiten", "Outdoor": "Im Freien", "OutdoorPool": "Außenpool", @@ -327,6 +334,8 @@ "Previous victories": "Bisherige Siege", "Price": "Preis", "Price details": "Preisdetails", + "Price excluding VAT": "Preis ohne MwSt.", + "Price including VAT": "Preis inkl. MwSt.", "Price per 24 hours": "Preis pro 24 Stunden", "Price per day": "Preis pro Tag", "Price per night": "Preis pro Nacht", @@ -346,17 +355,16 @@ "Relax": "Entspannen", "Remove card from member profile": "Karte aus dem Mitgliedsprofil entfernen", "Request bedtype": "Bettentyp anfragen", - "Restaurant": "{count, plural, one {Restaurant} other {Restaurants}}", "Restaurant & Bar": "Restaurant & Bar", "Restaurants & Bars": "Restaurants & Bars", "Retype new password": "Neues Passwort erneut eingeben", "Room": "Zimmer", "Room & Terms": "Zimmer & Bedingungen", "Room facilities": "Zimmerausstattung", - "Room types available": "{numberOfRooms, plural, one {# room type} other {# room types}} verfügbar", "Rooms": "Räume", "Rooms & Guests": "Zimmer & Gäste", - "Sat-Sun": "Sa-So", + "Sat-Sun Always open": "Sa-So Immer geöffnet", + "Sat-Sun {openingTime}-${closingTime}": "Sa-So {openingTime}-${closingTime}", "Saturday": "Samstag", "Sauna": "Sauna", "Sauna and gym": "Sauna and gym", @@ -371,7 +379,7 @@ "See less FAQ": "Weniger anzeigen FAQ", "See map": "Karte anzeigen", "See on map": "Karte ansehen", - "See results": "Ergebnisse anzeigen ({ count })", + "See results ({ count })": "Ergebnisse anzeigen ({ count })", "See room details": "Zimmerdetails ansehen", "See rooms": "Zimmer ansehen", "Select a country": "Wähle ein Land", @@ -383,6 +391,7 @@ "Select hotel": "Hotel auswählen", "Select language": "Sprache auswählen", "Select payment method": "Zahlungsart auswählen", + "Select room": "Vælg værelse", "Select your language": "Wählen Sie Ihre Sprache", "Shopping": "Einkaufen", "Shopping & Dining": "Einkaufen & Essen", @@ -405,23 +414,27 @@ "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}", + "Stay at {hotelName} | Hotel in {destination}": "Übernachten Sie im {hotelName} | Hotel in {destination}", "Street": "Straße", + "Submit": "Submit", "Successfully updated profile!": "Profil erfolgreich aktualisiert!", "Summary": "Zusammenfassung", "Sunday": "Sonntag", "Surprise!": "Überraschung!", + "Surprises": "Surprises", "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", + "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 contact us.": "Vielen Dank, dass Sie bei uns gebucht haben! Wir freuen uns, Sie bei uns begrüßen zu dürfen und wünschen Ihnen einen angenehmen Aufenthalt. Wenn Sie Fragen haben oder Änderungen an Ihrer Buchung vornehmen müssen, kontaktieren Sie uns bitte..", "The new price is": "Der neue Preis beträgt", "The price has increased": "Der Preis ist gestiegen", "The price has increased since you selected your room.": "Der Preis ist gestiegen, nachdem Sie Ihr Zimmer ausgewählt haben.", "Theatre": "Theater", "There are no rooms available that match your request.": "Es sind keine Zimmer verfügbar, die Ihrer Anfrage entsprechen.", "There are no transactions to display": "Es sind keine Transaktionen zum Anzeigen vorhanden", - "Things nearby HOTEL_NAME": "Dinge in der Nähe von {hotelName}", + "Things nearby {hotelName}": "Dinge in der Nähe von {hotelName}", + "This room is equipped with": "Dieses Zimmer ist ausgestattet mit", "This room is not available": "Dieses Zimmer ist nicht verfügbar", "Thursday": "Donnerstag", "Times": "Zeiten", @@ -436,22 +449,23 @@ "Transactions": "Transaktionen", "Transportations": "Transportmittel", "TripAdvisor rating": "TripAdvisor-Bewertung", - "Tripadvisor reviews": "{rating} ({count} Bewertungen auf Tripadvisor)", "Tuesday": "Dienstag", "Type of bed": "Bettentyp", "Type of room": "Zimmerart", "Use bonus cheque": "Bonusscheck nutzen", "Use code/voucher": "Code/Gutschein nutzen", "User information": "Nutzerinformation", + "VAT {vat}%": "MwSt. {vat}%", "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 had an issue processing your booking. Please try again. No charges have been made.": "Wir hatten ein Problem beim Verarbeiten Ihrer Buchung. Bitte versuchen Sie es erneut. Es wurden keine Gebühren erhoben.", "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!", + "We're sorry": "Es tut uns leid", "Wednesday": "Mittwoch", "Weekday": "Wochentag", "Weekday prices": "Wochentagspreise", @@ -475,11 +489,13 @@ "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 can still book the room but you need to confirm that you accept the new price": "Sie können das Zimmer noch buchen, aber Sie müssen bestätigen, dass Sie die neue Preis akzeptieren", "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 {amount} 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 have now cancelled your payment.": "Sie haben jetzt Ihre Zahlung abgebrochen.", "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 booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.": "Ihre Buchung ist bestätigt, aber wir konnten Ihr Mitglied nicht verifizieren. Wenn Sie mit einem Mitgliederrabatt gebucht haben, müssen Sie entweder Ihr vorhandenes Mitgliedschaftsnummer bei der Anreise präsentieren, ein Mitglied werden oder die Preisdifferenz bei der Anreise bezahlen. Die Anmeldung ist vorzugsweise online vor der Aufenthaltsdauer erfolgreich.", "Your card was successfully removed!": "Ihre Karte wurde erfolgreich entfernt!", "Your card was successfully saved!": "Ihre Karte wurde erfolgreich gespeichert!", "Your current level": "Ihr aktuelles Level", @@ -493,64 +509,62 @@ "Zoom in": "Vergrößern", "Zoom out": "Verkleinern", "as of today": "Stand heute", - "booking.accommodatesUpTo": "Bietet Platz für {max, plural, one {{range} Person } other {bis zu {range} Personen}}", - "booking.adults": "{totalAdults, plural, one {# erwachsene} other {# erwachsene}}", - "booking.adults.breakfasts": "{totalAdults, plural, one {# erwachsene} other {# erwachsene}}, {totalBreakfasts, plural, one {# frühstück} other {# frühstücke}}", - "booking.basedOnAvailability": "Abhängig von der Verfügbarkeit", - "booking.bedOptions": "Bettoptionen", - "booking.children": "{totalChildren, plural, one {# kind} other {# kinder}}", - "booking.children.breakfasts": "{totalChildren, plural, one {# kind} other {# kinder}}, {totalBreakfasts, plural, one {# frühstück} other {# frühstücke}}", - "booking.confirmation.membershipInfo.heading": "Medlemskab nicht verifiziert", - "booking.confirmation.membershipInfo.text": "Ihre Buchung ist bestätigt, aber wir konnten Ihr Mitglied nicht verifizieren. Wenn Sie mit einem Mitgliederrabatt gebucht haben, müssen Sie entweder Ihr vorhandenes Mitgliedschaftsnummer bei der Anreise präsentieren, ein Mitglied werden oder die Preisdifferenz bei der Anreise bezahlen. Die Anmeldung ist vorzugsweise online vor der Aufenthaltsdauer erfolgreich.", "booking.confirmation.text": "Vielen Dank, dass Sie bei uns gebucht haben! Wir freuen uns, Sie bei uns begrüßen zu dürfen und wünschen Ihnen einen angenehmen Aufenthalt. Wenn Sie Fragen haben oder Änderungen an Ihrer Buchung vornehmen müssen, kontaktieren Sie uns bitte..", "booking.confirmation.title": "Buchungsbestätigung", "booking.guests": "Max {max, plural, one {{range} gast} other {{range} gäste}}", - "booking.nights": "{totalNights, plural, one {# nacht} other {# Nächte}}", - "booking.rooms": "{totalRooms, plural, one {# zimmer} other {# räume}}", "booking.selectRoom": "Vælg værelse", - "booking.terms": "Mit der Zahlung über eine der verfügbaren Zahlungsmethoden akzeptiere ich die Buchungsbedingungen und die allgemeinen Geschäftsbedingungen und verstehe, dass Scandic meine personenbezogenen Daten im Zusammenhang mit dieser Buchung gemäß der Scandic Datenschutzrichtlinie verarbeitet. Ich akzeptiere, dass Scandic während meines Aufenthalts eine gültige Kreditkarte für eventuelle Rückerstattungen benötigt.", "booking.thisRoomIsEquippedWith": "Dieses Zimmer ist ausgestattet mit", - "booking.vat": "MwSt. {vat}%", - "booking.vat.excl": "Preis ohne MwSt.", - "booking.vat.incl": "Preis inkl. MwSt.", - "breakfast.price": "{amount}/Nacht pro Erwachsenem", - "breakfast.price.free": "{amount} 0 {currency}/Nacht pro Erwachsenem", - "by": "bis", - "characters": "figuren", - "filters.nohotel.heading": "Kein Zimmer entspricht Ihren Filtern.", - "filters.nohotel.text": "Es scheint, dass keine Hotels Ihren Filtern entsprechen. Versuchen Sie, Ihre Suche anzupassen, um den perfekten Aufenthalt zu finden.", - "from": "aus", - "guaranteeing": "garantiert", - "guest": "gast", - "guests": "gäste", - "hotelPages.rooms.roomCard.persons": "{size} ({max, plural, one {{range} person} other {{range} 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:", + "friday": "freitag", + "monday": "montag", "night": "nacht", - "nights": "Nächte", - "number": "nummer", - "or": "oder", - "paying": "bezahlt", - "payment.error.abandoned": "Wir hatten ein Problem beim Verarbeiten Ihrer Buchung. Bitte versuchen Sie es erneut. Es wurden keine Gebühren erhoben.", - "payment.error.cancelled": "Sie haben jetzt Ihre Zahlung abgebrochen.", - "payment.error.failed": "Wir hatten ein Problem beim Verarbeiten Ihrer Buchung. Bitte versuchen Sie es erneut. Es wurden keine Gebühren erhoben.", "points": "Punkte", - "room type": "zimmerart", - "room types": "zimmerarten", - "signup.terms": "Mit Ihrer Anmeldung akzeptieren Sie die Allgemeinen Geschäftsbedingungen von Scandic Friends. Ihre Mitgliedschaft ist bis auf Weiteres gültig und Sie können sie jederzeit kündigen, indem Sie eine E-Mail an den Kundenservice von Scandic senden.", - "signupPage.terms": "Mit der Annahme der Allgemeinen Geschäftsbedingungen für Scandic Friends erkläre ich mich damit einverstanden, dass meine persönlichen Daten in Übereinstimmung mit der Datenschutzrichtlinie von Scandic verarbeitet werden.", - "special character": "sonderzeichen", - "spendable points expiring by": "{points} Einlösbare punkte verfallen bis zum {date}", - "to": "zu", - "uppercase letter": "großbuchstabe", + "saturday": "samstag", + "sunday": "sonntag", + "thursday": "donnerstag", + "tuesday": "dienstag", + "wednesday": "mittwoch", + "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center": "{address}, {city} ∙ {distanceToCityCentreInKm} km bis zum Stadtzentrum", + "{amount, number} left": "{amount, number} übrig", + "{amount, plural, one {Gift} other {Gifts}} added to your benefits": "{amount, plural, one {Geschenk zu Ihren Vorteilen hinzugefügt} other {Geschenke, die zu Ihren Vorteilen hinzugefügt werden}}", "{amount} out of {total}": "{amount} von {total}", + "{amount} {amount, plural, one {hotel} other {hotels}}": "{amount} {amount, plural, one {hotel} other {hotels}}", + "{amount}/night per adult": "{amount}/Nacht pro Erwachsenem", "{card} ending with {cardno}": "{card} endet mit {cardno}", + "{checkInDate} from {checkInTime}": "{checkInDate} aus {checkInTime}", + "{checkOutDate} from {checkOutTime}": "{checkOutDate} aus {checkOutTime}", + "{count} lowercase letter": "{count} Kleinbuchstabe", + "{count} number": "{count} nummer", + "{count} special character": "{count} sonderzeichen", + "{count} uppercase letter": "{count} großbuchstabe", "{difference}{amount} {currency}": "{difference}{amount} {currency}", - "{number} persons": "{number} personer", - "{number} square meters": "{number} kvadratmeter", - "{number} to {number} persons": "{lowest} til {highest} personer", - "{number} to {number} square meters": "{smallest} til {largest} kvadratmeter" + "{distanceInKm} km": "{distanceInKm} km", + "{lowest} to {highest} persons": "{lowest} til {highest} personer", + "{min} to {max} characters": "{min} zu {max} figuren", + "{numberOfRooms, plural, one {# room type} other {# room types}} available": "{numberOfRooms, plural, one {# room type} other {# room types}} verfügbar", + "{number} km to city centre": "{number} km zum Stadtzentrum", + "{pointsAmount, number} points": "{pointsAmount, number} punkte", + "{points} spendable points expiring by {date}": "{points} Einlösbare punkte verfallen bis zum {date}", + "{price} {currency}": "{price} {currency}", + "{price}/night": "{price}/nacht", + "{publicPrice}/{memberPrice} {currency}": "{publicPrice}/{memberPrice} {currency}", + "{rating} ({count} reviews on Tripadvisor)": "{rating} ({count} Bewertungen auf Tripadvisor)", + "{roomSizeMin} - {roomSizeMax} m²": "{roomSizeMin} - {roomSizeMax} m²", + "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSizeMin} - {roomSizeMax} m². Bietet Platz für {max, plural, one {{range} Person } other {bis zu {range} Personen}}", + "{roomSize} m²": "{roomSize} m²", + "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSize} m². Bietet Platz für {max, plural, one {{range} Person } other {bis zu {range} Personen}}", + "{roomType} {rateDescription}": "{roomType} {rateDescription}", + "{selectedFromDate} - {selectedToDate}": "{selectedFromDate} - {selectedToDate}", + "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}": "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + "{size} ({max, plural, one {{range} person} other {{range} persons}})": "{size} ({max, plural, one {{range} person} other {{range} personen}})", + "{smallest} to {largest} square meters": "{smallest} til {largest} kvadratmeter", + "{title} - Image gallery": "{title} - Bildergalerie", + "{totalAdults, plural, one {# adult} other {# adults}}": "{totalAdults, plural, one {# erwachsene} other {# erwachsene}}", + "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}": "{totalBreakfasts, plural, one {# frühstück} other {# frühstücke}}", + "{totalChildren, plural, one {# child} other {# children}}": "{totalChildren, plural, one {# kind} other {# kinder}}", + "{totalNights, plural, one {# night} other {# nights}}": "{totalNights, plural, one {# nacht} other {# Nächte}}", + "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}": "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}", + "{totalRooms, plural, one {# room} other {# rooms}}": "{totalRooms, plural, one {# zimmer} other {# räume}}", + "{value} persons": "{number} personer", + "{value} square meters": "{number} kvadratmeter", + "© {currentYear} Scandic AB All rights reserved": "© {currentYear} Scandic AB Alle Rechte vorbehalten" } diff --git a/i18n/dictionaries/en.json b/i18n/dictionaries/en.json index 1687e4da8..6044fa61c 100644 --- a/i18n/dictionaries/en.json +++ b/i18n/dictionaries/en.json @@ -1,6 +1,7 @@ { "Included (based on availability)": "Included (based on availability)", "Total price (incl VAT)": "Total price (incl VAT)", + "{amount} 0 {currency}/night per adult": "{amount} 0 {currency}/night per adult", "A destination or hotel name is needed to be able to search for a hotel room.": "A destination or hotel name is needed to be able to search for a hotel room.", "A photo of the room": "A photo of the room", "ACCE": "Accessibility", @@ -14,11 +15,13 @@ "Accessible Room": "Accessibility room", "Active": "Active", "Activities": "Activities", - "Add Room": "Add room", "Add code": "Add code", "Add new card": "Add new card", + "Add room": "Add room", "Add to calendar": "Add to calendar", + "Adding room is not available on the new website yet.": "Adding room is not available on the new website yet.", "Address": "Address", + "Address: {address}": "Address: {address}", "Adults": "Adults", "Age": "Age", "Airport": "Airport", @@ -34,10 +37,11 @@ "An error occurred. Please try again.": "An error occurred. Please try again.", "Any changes you've made will be lost.": "Any changes you've made will be lost.", "Approx.": "Approx.", + "Approx. {value}": "Approx. {value}", "Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?": "Are you sure you want to remove the card ending with {lastFourDigits} from your member profile?", "Arrival date": "Arrival date", - "As our": "As our {level}", "As our Close Friend": "As our Close Friend", + "As our {level}": "As our {level}", "At latest": "At latest", "At the hotel": "At the hotel", "Attractions": "Attractions", @@ -47,6 +51,7 @@ "Bar": "Bar", "Based on availability": "Based on availability", "Bed": "Bed", + "Bed options": "Bed options", "Bed type": "Bed type", "Birth date": "Birth date", "Book": "Book", @@ -56,6 +61,7 @@ "Book reward night": "Book reward night", "Book your next stay": "Book your next stay", "Booking": "Booking", + "Booking confirmation": "Booking confirmation", "Booking number": "Booking number", "Breakfast": "Breakfast", "Breakfast buffet": "Breakfast buffet", @@ -67,13 +73,16 @@ "Breakfast selection in next step.": "Breakfast selection in next step.", "Bus terminal": "Bus terminal", "Business": "Business", + "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.": "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.", + "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.": "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.", + "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service": "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service", "Cancel": "Cancel", "Cancellation policy": "Cancellation policy", "Change room": "Change room", "Check in": "Check in", - "Check in from": "Check in from", + "Check in from: {checkInTime}": "Check in from: {checkInTime}", "Check out": "Check out", - "Check out at latest": "Check out at latest", + "Check out at latest: {checkOutTime}": "Check out at latest: {checkOutTime}", "Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.": "Check out the credit cards saved to your profile. Pay with a saved card when signed in for a smoother web experience.", "Check-in": "Check-in", "Check-in/Check-out": "Check-in/Check-out", @@ -95,6 +104,7 @@ "Close the map": "Close the map", "Closed": "Closed", "Code / Voucher": "Code / Voucher", + "Codes, cheques and reward nights aren't available on the new website yet.": "Codes, cheques and reward nights aren't available on the new website yet.", "Coming up": "Coming up", "Compare all levels": "Compare all levels", "Complete booking": "Complete booking", @@ -105,7 +115,6 @@ "Continue": "Continue", "Copied to clipboard": "Copied to clipboard", "Copy promotion code": "Copy promotion code", - "Copyright all rights reserved": "Scandic AB All rights reserved", "Could not find requested resource": "Could not find requested resource", "Country": "Country", "Country code": "Country code", @@ -113,8 +122,7 @@ "Creative spaces for meetings": "Creative spaces for meetings", "Credit card": "Credit card", "Credit card deleted successfully": "Credit card deleted successfully", - "Crib (child)": "Crib (child)", - "Currency Code": "EUR", + "Crib (child) × {count}": "Crib (child) × {count}", "Current password": "Current password", "Customer service": "Customer service", "Date of Birth": "Date of Birth", @@ -123,16 +131,13 @@ "Destination": "Destination", "Destinations & hotels": "Destinations & hotels", "Details": "Details", - "Disabled adding room": "Adding room is not available on the new website yet.", - "Disabled booking options header": "We're sorry", - "Disabled booking options text": "Codes, cheques and reward nights aren't available on the new website yet.", + "Dialog": "Dialog", "Discard changes": "Discard changes", "Discard unsaved changes?": "Discard unsaved changes?", "Discover": "Discover", "Discover the little extra touches to make your upcoming stay even more unforgettable.": "Discover the little extra touches to make your upcoming stay even more unforgettable.", - "Distance in km to city centre": "{number} km to city centre", "Distance to city centre": "Distance to city centre", - "Distance to hotel": "Distance to hotel: {distance} m", + "Distance to hotel: {distanceInM} m": "Distance to hotel: {distanceInM} m", "Do you want to start the day with Scandics famous breakfast buffé?": "Do you want to start the day with Scandics famous breakfast buffé?", "Done": "Done", "Download invoice": "Download invoice", @@ -149,14 +154,15 @@ "Enter destination or hotel": "Enter destination or hotel", "Enter your details": "Enter your details", "Events that make an impression": "Events that make an impression", - "Expires at the earliest": "Expires at the earliest {date}", + "Expires at the earliest {expirationDate}": "Expires at the earliest {expirationDate}", "Explore all levels and benefits": "Explore all levels and benefits", "Explore nearby": "Explore nearby", - "Extra bed (child)": "Extra bed (child)", + "Extra bed (child) × {count}": "Extra bed (child) × {count}", "Extra bed will be provided additionally": "Extra bed will be provided additionally", "Extras to your booking": "Extras to your booking", "FAQ": "FAQ", "Failed to delete credit card, please try again later.": "Failed to delete credit card, please try again later.", + "Failed to verify membership": "Failed to verify membership", "Fair": "Fair", "Filter": "Filter", "Filter and sort": "Filter and sort", @@ -176,26 +182,24 @@ "Free rebooking": "Free rebooking", "Free until": "Free until", "Friday": "Friday", - "Friend no.": "Friend no.", + "Friend no. {value}": "Friend no. {value}", "From": "From", "Garage": "Garage", "Get inspired": "Get inspired", "Get inspired and start dreaming beyond your next trip. Explore more Scandic destinations.": "Get inspired and start dreaming beyond your next trip. Explore more Scandic destinations.", "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": "Go back", "Go back to edit": "Go back to edit", "Go back to overview": "Go back to overview", "Go to My Benefits": "Go to My Benefits", "Go to profile": "Go to profile", "Guarantee booking with credit card": "Guarantee booking with credit card", - "Guest": "Guest", "Guest information": "Guest information", "Guests & Rooms": "Guests & Rooms", "Gym": "Gym", - "Hi": "Hi", + "Hi {firstName}!": "Hi {firstName}!", "High floor": "High floor", - "Highest floor": "Highest floor", + "Highest level": "Highest level", "Home": "Home", "Hospital": "Hospital", "Hotel": "Hotel", @@ -203,7 +207,6 @@ "Hotel facilities": "Hotel facilities", "Hotel reservation": "Hotel reservation", "Hotel surroundings": "Hotel surroundings", - "Hotel(s)": "{amount} {amount, plural, one {hotel} other {hotels}}", "Hotels": "Hotels", "Hours": "Hours", "How do you want to sleep?": "How do you want to sleep?", @@ -212,7 +215,6 @@ "I accept": "I accept", "I accept the terms and conditions": "I accept the terms and conditions", "I would like to get my booking confirmation via sms": "I would like to get my booking confirmation via sms", - "Image gallery": "{name} - Image gallery", "In adults bed": "In adults bed", "In crib": "In crib", "In extra bed": "In extra bed", @@ -220,6 +222,7 @@ "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.", + "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.": "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.", "Jacuzzi": "Jacuzzi", "Join Scandic Friends": "Join Scandic Friends", "Join at no cost": "Join at no cost", @@ -231,8 +234,6 @@ "Last name can't contain any special characters": "Last name can't contain any special characters", "Last name is required": "Last name is required", "Latest searches": "Latest searches", - "Latitude": "Latitude {lat}", - "Left": "left", "Level": "Level", "Level 1": "Level 1", "Level 2": "Level 2", @@ -242,6 +243,7 @@ "Level 6": "Level 6", "Level 7": "Level 7", "Level up to unlock": "Level up to unlock", + "Level {level}": "Level {level}", "Location": "Location", "Locations": "Locations", "Log in": "Log in", @@ -249,7 +251,6 @@ "Log in/Join": "Log in/Join", "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", @@ -257,16 +258,19 @@ "Manage booking": "Manage booking", "Manage preferences": "Manage preferences", "Map": "Map", - "Map of HOTEL_NAME": "Map of {hotelName}", + "Map of {hotelName}": "Map of {hotelName}", "Marketing city": "Marketing city", + "Max {max, plural, one {{range} guest} other {{range} guests}}": "Max {max, plural, one {{range} guest} other {{range} guests}}", "Meetings & Conferences": "Meetings & Conferences", "Member discount": "Member discount", "Member price": "Member price", "Member price activated": "Member price activated", "Member price from": "Member price from", "Members": "Members", - "Membership ID": "Membership ID", + "Members {price}/night": "Members {price}/night", "Membership ID copied to clipboard": "Membership ID copied to clipboard", + "Membership ID {id}": "Membership ID {id}", + "Membership ID: {id}": "Membership ID: {id}", "Membership benefits applied": "Membership benefits applied", "Membership cards": "Membership cards", "Membership no": "Membership no", @@ -274,7 +278,8 @@ "Menu": "Menu", "Menus": "Menus", "Modify": "Modify", - "Mon-Fri": "Mon-Fri", + "Mon-Fri Always open": "Mon-Fri Always open", + "Mon-Fri {openingTime}-${closingTime}": "Mon-Fri {openingTime}-${closingTime}", "Monday": "Monday", "Month": "Month", "Museum": "Museum", @@ -285,6 +290,7 @@ "My payment cards": "My payment cards", "My wishes": "My wishes", "Name": "Name", + "Name: {cardMembershipType}": "Name: {cardMembershipType}", "Near elevator": "Near elevator", "Nearby": "Nearby", "Nearby companies": "Nearby companies", @@ -295,6 +301,7 @@ "No availability": "No availability", "No breakfast": "No breakfast", "No content published": "No content published", + "No hotels match your filters": "No hotels match your filters", "No matching location found": "No matching location found", "No membership benefits applied": "No membership benefits applied", "No preference": "No preference", @@ -306,18 +313,18 @@ "Non-refundable": "Non-refundable", "Nordic Swan Ecolabel": "Nordic Swan Ecolabel", "Not found": "Not found", - "Nr night, nr adult": "{nights, number} night, {adults, number} adult", - "Number of charging points for electric cars": "Number of charging points for electric cars: {number}", - "Number of parking spots": "Number of parking spots: {number}", + "Number of charging points for electric cars: {number}": "Number of charging points for electric cars: {number}", + "Number of parking spots: {number}": "Number of parking spots: {number}", + "OK": "OK", "OTHER PAYMENT METHODS": "OTHER PAYMENT METHODS", "On your journey": "On your journey", "Only pay {amount}": "Only pay {amount}", "Open": "Open", - "Open gift(s)": "Open {amount, plural, one {gift} other {gifts}}", "Open image gallery": "Open image gallery", "Open language menu": "Open language menu", "Open menu": "Open menu", "Open my pages menu": "Open my pages menu", + "Open {amount, plural, one {gift} other {gifts}}": "Open {amount, plural, one {gift} other {gifts}}", "Opening hours": "Opening hours", "Outdoor": "Outdoor", "OutdoorPool": "Outdoor pool", @@ -357,7 +364,9 @@ "Price": "Price", "Price details": "Price details", "Price excl VAT": "Price excl VAT", + "Price excluding VAT": "Price excluding VAT", "Price incl VAT": "Price incl VAT", + "Price including VAT": "Price including VAT", "Price per 24 hours": "Price per 24 hours", "Price per day": "Price per day", "Price per night": "Price per night", @@ -382,19 +391,18 @@ "Relax": "Relax", "Remove card from member profile": "Remove card from member profile", "Request bedtype": "Request bedtype", - "Reservation number": "Reservation number", + "Reservation number {value}": "Reservation number {value}", "Reservation policy": "Reservation policy", - "Restaurant": "{count, plural, one {Restaurant} other {Restaurants}}", "Restaurant & Bar": "Restaurant & Bar", "Restaurants & Bars": "Restaurants & Bars", "Retype new password": "Retype new password", "Room": "Room", "Room & Terms": "Room & Terms", "Room facilities": "Room facilities", - "Room types available": "{numberOfRooms, plural, one {# room type} other {# room types}} available", "Rooms": "Rooms", "Rooms & Guests": "Rooms & Guests", - "Sat-Sun": "Sat-Sun", + "Sat-Sun Always open": "Sat-Sun Always open", + "Sat-Sun {openingTime}-${closingTime}": "Sat-Sun {openingTime}-${closingTime}", "Saturday": "Saturday", "Sauna": "Sauna", "Sauna and gym": "Sauna and gym", @@ -410,7 +418,7 @@ "See less FAQ": "See less FAQ", "See map": "See map", "See on map": "See on map", - "See results": "See results ({ count })", + "See results ({ count })": "See results ({ count })", "See room details": "See room details", "See rooms": "See rooms", "See you soon!": "See you soon!", @@ -423,6 +431,7 @@ "Select hotel": "Select hotel", "Select language": "Select language", "Select payment method": "Select payment method", + "Select room": "Select room", "Select your language": "Select your language", "Shopping": "Shopping", "Shopping & Dining": "Shopping & Dining", @@ -445,23 +454,27 @@ "Spice things up": "Spice things up", "Sports": "Sports", "Standard price": "Standard price", - "Stay at HOTEL_NAME | Hotel in DESTINATION": "Stay at {hotelName} | Hotel in {destination}", + "Stay at {hotelName} | Hotel in {destination}": "Stay at {hotelName} | Hotel in {destination}", "Street": "Street", + "Submit": "Submit", "Successfully updated profile!": "Successfully updated profile!", "Summary": "Summary", "Sunday": "Sunday", "Surprise!": "Surprise!", + "Surprises": "Surprises", "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", "Thank you": "Thank you", + "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 contact us.": "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 contact us.", "The new price is": "The new price is", "The price has increased": "The price has increased", "The price has increased since you selected your room.": "The price has increased since you selected your room.", "Theatre": "Theatre", "There are no rooms available that match your request.": "There are no rooms available that match your request.", "There are no transactions to display": "There are no transactions to display", - "Things nearby HOTEL_NAME": "Things nearby {hotelName}", + "Things nearby {hotelName}": "Things nearby {hotelName}", + "This room is equipped with": "This room is equipped with", "This room is not available": "This room is not available", "Thursday": "Thursday", "Times": "Times", @@ -476,7 +489,6 @@ "Transactions": "Transactions", "Transportations": "Transportations", "TripAdvisor rating": "TripAdvisor rating", - "Tripadvisor reviews": "{rating} ({count} reviews on Tripadvisor)", "Tuesday": "Tuesday", "Type of bed": "Type of bed", "Type of room": "Type of room", @@ -485,6 +497,7 @@ "User information": "User information", "VAT": "VAT", "VAT amount": "VAT amount", + "VAT {vat}%": "VAT {vat}%", "View and buy add-ons": "View and buy add-ons", "View as list": "View as list", "View as map": "View as map", @@ -494,9 +507,10 @@ "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 had an issue processing your booking. Please try again. No charges have been made.": "We had an issue processing your booking. Please try again. No charges have been made.", "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!", + "We're sorry": "We're sorry", "Wednesday": "Wednesday", "Weekday": "Weekday", "Weekday prices": "Weekday prices", @@ -521,11 +535,13 @@ "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 can still book the room but you need to confirm that you accept the new price": "You can still book the room but you need to confirm that you accept the new price", "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 {amount} 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’", + "You have now cancelled your payment.": "You have now cancelled your payment.", + "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 booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.": "Your booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.", "Your card was successfully removed!": "Your card was successfully removed!", "Your card was successfully saved!": "Your card was successfully saved!", "Your current level": "Your current level", @@ -540,67 +556,61 @@ "Zoom in": "Zoom in", "Zoom out": "Zoom out", "as of today": "as of today", - "booking.accommodatesUpTo": "Accommodates up to {max, plural, one {{range} person} other {{range} people}}", - "booking.adults": "{totalAdults, plural, one {# adult} other {# adults}}", - "booking.adults.breakfasts": "{totalAdults, plural, one {# adult} other {# adults}}, {totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}", - "booking.basedOnAvailability": "Based on availability", - "booking.bedOptions": "Bed options", - "booking.children": "{totalChildren, plural, one {# child} other {# children}}", - "booking.children.breakfasts": "{totalChildren, plural, one {# child} other {# children}}, {totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}", - "booking.confirmation.membershipInfo.heading": "Failed to verify membership", - "booking.confirmation.membershipInfo.text": "Your booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.", - "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 contact us.", - "booking.confirmation.title": "Booking confirmation", - "booking.guests": "Max {max, plural, one {{range} guest} other {{range} guests}}", - "booking.nights": "{totalNights, plural, one {# night} other {# nights}}", - "booking.rooms": "{totalRooms, plural, one {# room} other {# rooms}}", "booking.selectRoom": "Select room", - "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", - "booking.vat": "VAT {vat}%", - "booking.vat.excl": "Price excluding VAT", - "booking.vat.incl": "Price including VAT", - "breakfast.price": "{amount}/night per adult", - "breakfast.price.free": "{amount} 0 {currency}/night per adult", - "by": "by", - "characters": "characters", - "filters.nohotel.heading": "No hotels match your filters", - "filters.nohotel.text": "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.", - "from": "from", - "guaranteeing": "guaranteeing", - "guest": "guest", - "guest.paid": "{amount} {currency} has been paid", - "guests": "guests", - "has been paid": "has been paid", - "hotelPages.rooms.roomCard.persons": "{size} ({max, plural, one {{range} person} other {{range} persons}})", - "hotelPages.rooms.roomCard.seeRoomDetails": "See room details", - "km to city center": "km to city center", - "lowercase letter": "lowercase letter", - "membership.no": "Scandic Friends No. {membershipNumber}", - "n/a": "n/a", - "next level:": "next level:", + "friday": "friday", + "monday": "monday", "night": "night", - "nights": "nights", - "number": "number", - "or": "or", - "paying": "paying", - "payment.error.abandoned": "We had an issue processing your booking. Please try again. No charges have been made.", - "payment.error.cancelled": "You have now cancelled your payment.", - "payment.error.failed": "We had an issue processing your booking. Please try again. No charges have been made.", - "points": "Points", - "room type": "room type", - "room types": "room types", - "signup.terms": "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic’s customer service", - "signupPage.terms": "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.", - "special character": "special character", - "spendable points expiring by": "{points} spendable points expiring by {date}", - "to": "to", - "uppercase letter": "uppercase letter", + "points": "points", + "saturday": "saturday", + "sunday": "sunday", + "thursday": "thursday", + "tuesday": "tuesday", + "wednesday": "wednesday", + "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center": "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center", + "{amount, number} left": "{amount, number} left", + "{amount, plural, one {Gift} other {Gifts}} added to your benefits": "{amount, plural, one {Gift} other {Gifts}} added to your benefits", + "{amount} has been paid": "{amount} has been paid", "{amount} out of {total}": "{amount} out of {total}", + "{amount} {amount, plural, one {hotel} other {hotels}}": "{amount} {amount, plural, one {hotel} other {hotels}}", + "{amount}/night per adult": "{amount}/night per adult", "{card} ending with {cardno}": "{card} ending with {cardno}", + "{checkInDate} from {checkInTime}": "{checkInDate} from {checkInTime}", + "{checkOutDate} from {checkOutTime}": "{checkOutDate} from {checkOutTime}", + "{count} lowercase letter": "{count} lowercase letter", + "{count} number": "{count} number", + "{count} special character": "{count} special character", + "{count} uppercase letter": "{count} uppercase letter", "{difference}{amount} {currency}": "{difference}{amount} {currency}", - "{number} persons": "{number} persons", - "{number} square meters": "{number} square meters", - "{number} to {number} persons": "{lowest} to {highest} persons", - "{number} to {number} square meters": "{smallest} to {largest} square meters" + "{distanceInKm} km": "{distanceInKm} km", + "{lowest} to {highest} persons": "{lowest} to {highest} persons", + "{min} to {max} characters": "{min} to {max} characters", + "{numberOfRooms, plural, one {# room type} other {# room types}} available": "{numberOfRooms, plural, one {# room type} other {# room types}} available", + "{number} km to city centre": "{number} km to city centre", + "{pointsAmount, number} points": "{pointsAmount, number} points", + "{points} spendable points expiring by {date}": "{points} spendable points expiring by {date}", + "{price} {currency}": "{price} {currency}", + "{price}/night": "{price}/night", + "{publicPrice}/{memberPrice} {currency}": "{publicPrice}/{memberPrice} {currency}", + "{rating} ({count} reviews on Tripadvisor)": "{rating} ({count} reviews on Tripadvisor)", + "{roomSizeMin} - {roomSizeMax} m²": "{roomSizeMin} - {roomSizeMax} m²", + "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}", + "{roomSize} m²": "{roomSize} m²", + "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}", + "{roomType} {rateDescription}": "{roomType} {rateDescription}", + "{selectedFromDate} - {selectedToDate}": "{selectedFromDate} - {selectedToDate}", + "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}": "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + "{selectedFromDate} {selectedToDate} ({totalNights})": "{selectedFromDate} {selectedToDate} ({totalNights})", + "{size} ({max, plural, one {{range} person} other {{range} persons}})": "{size} ({max, plural, one {{range} person} other {{range} persons}})", + "{smallest} to {largest} square meters": "{smallest} to {largest} square meters", + "{title} - Image gallery": "{title} - Image gallery", + "{totalAdults, plural, one {# adult} other {# adults}}": "{totalAdults, plural, one {# adult} other {# adults}}", + "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}": "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}", + "{totalChildren, plural, one {# child} other {# children}}": "{totalChildren, plural, one {# child} other {# children}}", + "{totalNights, plural, one {# night} other {# nights}}": "{totalNights, plural, one {# night} other {# nights}}", + "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}": "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}", + "{totalRooms, plural, one {# room} other {# rooms}}": "{totalRooms, plural, one {# room} other {# rooms}}", + "{value} persons": "{value} persons", + "{value} square meters": "{value} square meters", + "© {currentYear} Scandic AB All rights reserved": "© {currentYear} Scandic AB All rights reserved" } diff --git a/i18n/dictionaries/fi.json b/i18n/dictionaries/fi.json index cc5291366..4f1d96385 100644 --- a/i18n/dictionaries/fi.json +++ b/i18n/dictionaries/fi.json @@ -1,6 +1,7 @@ { "Included (based on availability)": "Sisältyy (saatavuuden mukaan)", "Total price (incl VAT)": "Kokonaishinta (sis. ALV)", + "{amount} 0 {currency}/night per adult": "{amount} 0 {currency}/yötä aikuista kohti", "A destination or hotel name is needed to be able to search for a hotel room.": "Kohteen tai hotellin nimi tarvitaan, jotta hotellihuonetta voidaan hakea.", "A photo of the room": "Kuva huoneesta", "ACCE": "Saavutettavuus", @@ -14,11 +15,13 @@ "Accessible Room": "Esteetön huone", "Active": "Aktiivinen", "Activities": "Aktiviteetit", - "Add Room": "Lisää huone", "Add code": "Lisää koodi", "Add new card": "Lisää uusi kortti", + "Add room": "Lisää huone", "Add to calendar": "Lisää kalenteriin", + "Adding room is not available on the new website yet.": "Lisäämään huone on vielä saatavilla uudella verkkosivustolla.", "Address": "Osoite", + "Address: {address}": "Osoite: {address}", "Adults": "Aikuista", "Age": "Ikä", "Airport": "Lentokenttä", @@ -34,10 +37,11 @@ "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.", + "Approx. {value}": "N. {value}", "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 our": "{level}-etu", "As our Close Friend": "Läheisenä ystävänämme", + "As our {level}": "{level}-etu", "At latest": "Viimeistään", "At the hotel": "Hotellissa", "Attractions": "Nähtävyydet", @@ -47,12 +51,14 @@ "Bar": "Bar", "Based on availability": "Saatavuuden mukaan", "Bed": "Vuodetyyppi", + "Bed options": "Vuodevaihtoehdot", "Bed type": "Vuodetyyppi", "Birth date": "Syntymäaika", "Book": "Varaa", "Book a table online": "Varaa pöytä verkossa", "Book parking": "Varaa pysäköinti", "Book reward night": "Kirjapalkinto-ilta", + "Booking confirmation": "Varausvahvistus", "Booking number": "Varausnumero", "Breakfast": "Aamiainen", "Breakfast buffet": "Aamiaisbuffet", @@ -64,12 +70,15 @@ "Breakfast selection in next step.": "Aamiaisvalinta seuraavassa vaiheessa.", "Bus terminal": "Bussiasema", "Business": "Business", + "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.": "Kyllä, hyväksyn Scandic Friends -jäsenyyttä koskevat ehdot ja ymmärrän, että Scandic käsittelee henkilötietojani Scandicin Tietosuojaselosteen mukaisesti.", + "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.": "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.", + "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service": "Rekisteröitymällä hyväksyt Scandic Friendsin käyttöehdot. Jäsenyytesi on voimassa toistaiseksi ja voit lopettaa jäsenyytesi milloin tahansa lähettämällä sähköpostia Scandicin asiakaspalveluun", "Cancel": "Peruuttaa", "Change room": "Vaihda huonetta", "Check in": "Sisäänkirjautuminen", - "Check in from": "Sisäänkirjautuminen alkaen", + "Check in from: {checkInTime}": "Sisäänkirjautuminen alkaen: {checkInTime}", "Check out": "Uloskirjautuminen", - "Check out at latest": "Uloskirjautuminen viimeistään", + "Check out at latest: {checkOutTime}": "Uloskirjautuminen viimeistään: {checkOutTime}", "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.", "Check-in/Check-out": "Sisäänkirjautuminen/Uloskirjautuminen", "Children": "Lasta", @@ -88,6 +97,7 @@ "Close the map": "Sulje kartta", "Closed": "Suljettu", "Code / Voucher": "Varauskoodit / kupongit", + "Codes, cheques and reward nights aren't available on the new website yet.": "Koodit, sekit ja palkintoillat eivät ole vielä saatavilla uudella verkkosivustolla.", "Coming up": "Tulossa", "Compare all levels": "Vertaa kaikkia tasoja", "Complete booking": "Täydennä varaus", @@ -96,7 +106,6 @@ "Contact information": "Yhteystiedot", "Contact us": "Ota meihin yhteyttä", "Continue": "Jatkaa", - "Copyright all rights reserved": "Scandic AB Kaikki oikeudet pidätetään", "Could not find requested resource": "Pyydettyä resurssia ei löytynyt", "Country": "Maa", "Country code": "Maatunnus", @@ -104,8 +113,7 @@ "Creative spaces for meetings": "Luovia tiloja kokouksille", "Credit card": "Luottokortti", "Credit card deleted successfully": "Luottokortti poistettu onnistuneesti", - "Crib (child)": "Körkkä (lasta)", - "Currency Code": "EUR", + "Crib (child) × {count}": "Körkkä (lasta) × {count}", "Current password": "Nykyinen salasana", "Customer service": "Asiakaspalvelu", "Date of Birth": "Syntymäaika", @@ -114,15 +122,11 @@ "Destination": "Kohde", "Destinations & hotels": "Kohteet ja hotellit", "Details": "Tiedot", - "Disabled adding room": "Lisäämään huone on vielä saatavilla uudella verkkosivustolla.", - "Disabled booking options header": "Olemme pahoillamme", - "Disabled booking options text": "Koodit, sekit ja palkintoillat eivät ole vielä saatavilla uudella verkkosivustolla.", "Discard changes": "Hylkää muutokset", "Discard unsaved changes?": "Hylkäätkö tallentamattomat muutokset?", "Discover": "Löydä", - "Distance in km to city centre": "{number} km Etäisyys kaupunkiin", "Distance to city centre": "Etäisyys kaupungin keskustaan", - "Distance to hotel": "Etäisyys hotelliin: {distance} m", + "Distance to hotel: {distanceInM} m": "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", @@ -139,14 +143,15 @@ "Enter destination or hotel": "Anna kohde tai hotelli", "Enter your details": "Anna tietosi", "Events that make an impression": "Events that make an impression", - "Expires at the earliest": "Päättyy aikaisintaan {date}", + "Expires at the earliest {expirationDate}": "Päättyy aikaisintaan {expirationDate}", "Explore all levels and benefits": "Tutustu kaikkiin tasoihin ja etuihin", "Explore nearby": "Tutustu lähialueeseen", - "Extra bed (child)": "Lisävuode (lasta)", + "Extra bed (child) × {count}": "Lisävuode (lasta) × {count}", "Extra bed will be provided additionally": "Lisävuode toimitetaan erikseen", "Extras to your booking": "Varauksessa lisäpalveluita", "FAQ": "Usein kysytyt kysymykset", "Failed to delete credit card, please try again later.": "Luottokortin poistaminen epäonnistui, yritä myöhemmin uudelleen.", + "Failed to verify membership": "Jäsenyys ei verifioitu", "Fair": "Messukeskus", "Filter": "Suodatin", "Filter and sort": "Suodata ja lajittele", @@ -169,17 +174,16 @@ "Garage": "Autotalli", "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", - "Go to My Benefits": "Siirry kohtaan ‘Omat edut’", + "Go to My Benefits": "Siirry kohtaan 'Omat edut'", "Guarantee booking with credit card": "Varmista varaus luottokortilla", "Guest information": "Vieraan tiedot", "Guests & Rooms": "Vieraat & Huoneet", "Gym": "Kuntosali", - "Hi": "Hi", + "Hi {firstName}!": "Hi {firstName}!", "High floor": "Korkea taso", - "Highest floor": "Korkein taso", + "Highest level": "Korkein taso", "Home": "Kotiin", "Hospital": "Sairaala", "Hotel": "Hotelli", @@ -187,7 +191,6 @@ "Hotel facilities": "Hotellin palvelut", "Hotel reservation": "Hotellivaraukset", "Hotel surroundings": "Hotellin ympäristö", - "Hotel(s)": "{amount} {amount, plural, one {hotelli} other {hotellit}}", "Hotels": "Hotellit", "Hours": "Ajat", "How do you want to sleep?": "Kuinka haluat nukkua?", @@ -196,7 +199,6 @@ "I accept": "Hyväksyn", "I accept the terms and conditions": "Hyväksyn käyttöehdot", "I would like to get my booking confirmation via sms": "Haluan saada varauksen vahvistuksen SMS-viestillä", - "Image gallery": "{name} - Kuvagalleria", "In adults bed": "Aikuisten vuoteessa", "In crib": "Pinnasängyssä", "In extra bed": "Oma vuodepaikka", @@ -204,6 +206,7 @@ "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.", + "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.": "Näyttää siltä, ​​että mikään hotelli ei vastaa suodattimiasi. Yritä muokata hakuasi löytääksesi täydellisen oleskelun.", "Jacuzzi": "Poreallas", "Join Scandic Friends": "Liity jäseneksi", "Join at no cost": "Liity maksutta", @@ -215,7 +218,6 @@ "Last name can't contain any special characters": "Sukunimi ei voi sisältää erikoismerkkejä", "Last name is required": "Sukunimi vaaditaan", "Latest searches": "Viimeisimmät haut", - "Left": "jäljellä", "Level": "Level", "Level 1": "Taso 1", "Level 2": "Taso 2", @@ -225,6 +227,7 @@ "Level 6": "Taso 6", "Level 7": "Taso 7", "Level up to unlock": "Nosta taso avataksesi lukituksen", + "Level {level}": "Taso {level}", "Location": "Sijainti", "Locations": "Sijainnit", "Log in": "Kirjaudu sisään", @@ -232,27 +235,29 @@ "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", "Map": "Kartta", - "Map of HOTEL_NAME": "Map of {hotelName}", + "Map of {hotelName}": "Map of {hotelName}", "Marketing city": "Markkinointikaupunki", + "Max {max, plural, one {{range} guest} other {{range} guests}}": "Max {max, plural, one {{range} vieras} other {{range} vieraita}}", "Meetings & Conferences": "Kokoukset & Konferenssit", "Member price": "Jäsenhinta", "Member price activated": "Jäsenhinta aktivoitu", "Member price from": "Jäsenhinta alkaen", - "Members": "Jäsenet", - "Membership ID": "Jäsentunnus", + "Members {price}/night": "Jäsenet {price}/yö", "Membership ID copied to clipboard": "Jäsenyystunnus kopioitu leikepöydälle", + "Membership ID {id}": "Jäsentunnus {id}", + "Membership ID: {id}": "Jäsentunnus: {id}", "Membership cards": "Jäsenkortit", "Membership terms and conditions": "Jäsenehdot ja -säännöt", "Menu": "Valikko", "Menus": "Valikot", "Modify": "Muokkaa", - "Mon-Fri": "Ma-Pe", + "Mon-Fri Always open": "Ma-Pe Aina auki", + "Mon-Fri {openingTime}-${closingTime}": "Ma-Pe {openingTime}-${closingTime}", "Monday": "Maanantai", "Month": "Kuukausi", "Museum": "Museo", @@ -263,6 +268,7 @@ "My payment cards": "Minun maksukortit", "My wishes": "Toiveeni", "Name": "Nimi", + "Name: {cardMembershipType}": "Nimi: {cardMembershipType}", "Near elevator": "Lähellä hissiä", "Nearby": "Lähistöllä", "Nearby companies": "Läheiset yritykset", @@ -273,6 +279,7 @@ "No availability": "Ei saatavuutta", "No breakfast": "Ei aamiaista", "No content published": "Ei julkaistua sisältöä", + "No hotels match your filters": "Yksikään huone ei vastannut suodattimiasi", "No matching location found": "Vastaavaa sijaintia ei löytynyt", "No preference": "Ei toivetta", "No prices available": "Hintoja ei ole saatavilla", @@ -283,18 +290,18 @@ "Non-refundable": "Ei palautettavissa", "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 of charging points for electric cars": "Sähköautojen latauspisteiden määrä: {number}", - "Number of parking spots": "Pysäköintipaikkojen määrä: {number}", + "Number of charging points for electric cars: {number}": "Sähköautojen latauspisteiden määrä: {number}", + "Number of parking spots: {number}": "Pysäköintipaikkojen määrä: {number}", + "OK": "OK", "OTHER PAYMENT METHODS": "MUISE KORT", "On your journey": "Matkallasi", "Only pay {amount}": "Vain maksaa {amount}", "Open": "Avata", - "Open gift(s)": "{amount, plural, one {Avoin lahja} other {Avoimet lahjat}}", "Open image gallery": "Avaa kuvagalleria", "Open language menu": "Avaa kielivalikko", "Open menu": "Avaa valikko", "Open my pages menu": "Avaa omat sivut -valikko", + "Open {amount, plural, one {gift} other {gifts}}": "{amount, plural, one {Avoin lahja} other {Avoimet lahjat}}", "Opening hours": "Aukioloajat", "Outdoor": "Ulkona", "OutdoorPool": "Ulkouima-allas", @@ -328,6 +335,8 @@ "Previous victories": "Edelliset voitot", "Price": "Hinta", "Price details": "Hintatiedot", + "Price excluding VAT": "ALV ei sisälly hintaan", + "Price including VAT": "ALV sisältyy hintaan", "Price per 24 hours": "Hinta per 24 tuntia", "Price per day": "Hinta per päivä", "Price per night": "Hinta per yö", @@ -347,17 +356,16 @@ "Relax": "Rentoutua", "Remove card from member profile": "Poista kortti jäsenprofiilista", "Request bedtype": "Pyydä sänkytyyppiä", - "Restaurant": "{count, plural, one {Ravintola} other {Ravintolat}}", "Restaurant & Bar": "Ravintola & Baari", "Restaurants & Bars": "Restaurants & Bars", "Retype new password": "Kirjoita uusi salasana uudelleen", "Room & Terms": "Huone & Ehdot", "Room facilities": "Huoneen varustelu", - "Room types available": "{numberOfRooms, plural, one {# room type} other {# room types}} saatavilla", "Rooms": "Huoneet", "Rooms & Guests": "Huoneet & Vieraat", "Rooms & Guestss": "Huoneet & Vieraat", - "Sat-Sun": "La-Su", + "Sat-Sun Always open": "La-Su Aina auki", + "Sat-Sun {openingTime}-${closingTime}": "La-Su {openingTime}-${closingTime}", "Saturday": "Lauantai", "Sauna": "Sauna", "Sauna and gym": "Sauna and gym", @@ -372,7 +380,7 @@ "See less FAQ": "Katso vähemmän UKK", "See map": "Näytä kartta", "See on map": "Näytä kartalla", - "See results": "Katso tulokset ({ count })", + "See results ({ count })": "Katso tulokset ({ count })", "See room details": "Katso huoneen tiedot", "See rooms": "Katso huoneet", "Select a country": "Valitse maa", @@ -384,6 +392,7 @@ "Select hotel": "Valitse hotelli", "Select language": "Valitse kieli", "Select payment method": "Valitse maksutapa", + "Select room": "Valitse huone", "Select your language": "Valitse kieli", "Shopping": "Ostokset", "Shopping & Dining": "Ostokset & Ravintolat", @@ -406,25 +415,28 @@ "Spice things up": "Mausta asioita", "Sports": "Urheilu", "Standard price": "Normaali hinta", - "Stay at HOTEL_NAME | Hotel in DESTINATION": "Majoitu kohteessa {hotelName} | Hotelli kohteessa {destination}", + "Stay at {hotelName} | Hotel in {destination}": "Majoitu kohteessa {hotelName} | Hotelli kohteessa {destination}", "Street": "Katu", + "Submit": "Submit", "Successfully updated profile!": "Profiilin päivitys onnistui!", "Summary": "Yhteenveto", "Sunday": "Sunnuntai", "Surprise!": "Yllätys!", + "Surprises": "Surprises", "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": "Säännöt ja ehdot", "Thank you": "Kiitos", + "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 contact us.": "Kiitos, että teit varauksen meiltä! Toivotamme sinut tervetulleeksi ja toivomme sinulle miellyttävää oleskelua. Jos sinulla on kysyttävää tai haluat tehdä muutoksia varaukseesi, ota meihin yhteyttä.", "The new price is": "Uusi hinta on", "The price has increased": "Hinta on noussut", "The price has increased since you selected your room.": "Hinta on noussut, koska valitsit huoneen.", "Theatre": "Teatteri", "There are no rooms available that match your request.": "Ei huoneita saatavilla, jotka vastaavat pyyntöäsi.", "There are no transactions to display": "Näytettäviä tapahtumia ei ole", - "Things nearby HOTEL_NAME": "Lähellä olevia asioita {hotelName}", + "Things nearby {hotelName}": "Lähellä olevia asioita {hotelName}", + "This room is equipped with": "Tämä huone on varustettu", "This room is not available": "Tämä huone ei ole käytettävissä", - "Thursday": "Torstai", "Times": "Ajat", "To get the member price {price}, log in or join when completing the booking.": "Jäsenhintaan saavat sisäänkirjautuneet tai liittyneet jäsenet.", "To secure your reservation, we kindly ask you to provide your payment card details. Rest assured, no charges will be made at this time.": "Varmistaaksesi varauksen, pyydämme sinua antamaan meille maksukortin tiedot. Varmista, että ei veloiteta maksusi tällä hetkellä.", @@ -437,22 +449,23 @@ "Transactions": "Tapahtumat", "Transportations": "Kuljetukset", "TripAdvisor rating": "TripAdvisor-luokitus", - "Tripadvisor reviews": "{rating} ({count} arvostelua TripAdvisorissa)", "Tuesday": "Tiistai", "Type of bed": "Vuodetyyppi", "Type of room": "Huonetyyppi", "Use bonus cheque": "Käytä bonussekkiä", "Use code/voucher": "Käytä koodia/voucheria", "User information": "Käyttäjän tiedot", + "VAT {vat}%": "ALV {vat}%", "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 had an issue processing your booking. Please try again. No charges have been made.": "Meillä oli ongelma varauksen käsittelyssä. Yritä uudelleen. Ei maksuja on tehty.", "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!", + "We're sorry": "Olemme pahoillamme", "Wednesday": "Keskiviikko", "Weekday": "Arkipäivä", "Weekday prices": "Arkisin hinnat", @@ -476,9 +489,11 @@ "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 can still book the room but you need to confirm that you accept the new price": "Voit vielä bookea huoneen, mutta sinun on vahvistettava, että hyväksyt uuden hinnan", "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 {amount} 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 have now cancelled your payment.": "Sinut nyt peruutit maksun.", + "Your booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.": "Varauksesi on vahvistettu, mutta jäsenyytesi ei voitu vahvistaa. Jos olet bookeutunut jäsenyysalennoilla, sinun on joko esitettävä olemassa olevan jäsenyysnumero tarkistukseen, tulla jäseneksi tai maksamaan hinnan eron hotellissa. Jäsenyyden tilittäminen on suositeltavampaa tehdä verkkoon ennen majoittumista.", "Your card was successfully removed!": "Korttisi poistettiin onnistuneesti!", "Your card was successfully saved!": "Korttisi tallennettu onnistuneesti!", "Your current level": "Nykyinen tasosi", @@ -492,64 +507,62 @@ "Zoom in": "Lähennä", "Zoom out": "Loitonna", "as of today": "tänään", - "booking.accommodatesUpTo": "Huoneeseen {max, plural, one {{range} henkilö} other {mahtuu enintään {range} henkilöä}", - "booking.adults": "{totalAdults, plural, one {# aikuinen} other {# aikuiset}}", - "booking.adults.breakfasts": "{totalAdults, plural, one {# aikuinen} other {# aikuiset}}, {totalBreakfasts, plural, one {# aamiainen} other {# aamiaista}}", - "booking.basedOnAvailability": "Saatavuuden mukaan", - "booking.bedOptions": "Vuodevaihtoehdot", - "booking.children": "{totalChildren, plural, one {# lapsi} other {# lasta}}", - "booking.children.breakfasts": "{totalChildren, plural, one {# lapsi} other {# lasta}}, {totalBreakfasts, plural, one {# aamiainen} other {# aamiaista}}", - "booking.confirmation.membershipInfo.heading": "Jäsenyys ei verifioitu", - "booking.confirmation.membershipInfo.text": "Varauksesi on vahvistettu, mutta jäsenyytesi ei voitu vahvistaa. Jos olet bookeutunut jäsenyysalennoilla, sinun on joko esitettävä olemassa olevan jäsenyysnumero tarkistukseen, tulla jäseneksi tai maksamaan hinnan eron hotellissa. Jäsenyyden tilittäminen on suositeltavampaa tehdä verkkoon ennen majoittumista.", "booking.confirmation.text": "Kiitos, että teit varauksen meiltä! Toivotamme sinut tervetulleeksi ja toivomme sinulle miellyttävää oleskelua. Jos sinulla on kysyttävää tai haluat tehdä muutoksia varaukseesi, ota meihin yhteyttä.", "booking.confirmation.title": "Varausvahvistus", "booking.guests": "Max {max, plural, one {{range} vieras} other {{range} vieraita}}", - "booking.nights": "{totalNights, plural, one {# yö} other {# yötä}}", - "booking.rooms": "{totalRooms, plural, one {# huone} other {# sviitti}}", "booking.selectRoom": "Valitse huone", - "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", - "booking.vat": "ALV {vat}%", - "booking.vat.excl": "ALV ei sisälly hintaan", - "booking.vat.incl": "ALV sisältyy hintaan", - "breakfast.price": "{amount}/yötä aikuista kohti", - "breakfast.price.free": "{amount} 0 {currency}/yötä aikuista kohti", - "by": "mennessä", - "characters": "hahmoja", - "filters.nohotel.heading": "Yksikään huone ei vastannut suodattimiasi", - "filters.nohotel.text": "Näyttää siltä, ​​että mikään hotelli ei vastaa suodattimiasi. Yritä muokata hakuasi löytääksesi täydellisen oleskelun.", - "from": "alkaen", - "guaranteeing": "varmistetaan", - "guest": "Vieras", - "guests": "Vieraita", - "hotelPages.rooms.roomCard.persons": "{size} ({max, plural, one {{range} henkilö} other {{range} 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:", + "friday": "perjantai", + "monday": "maanantai", "night": "yö", - "nights": "yötä", - "number": "määrä", - "or": "tai", - "paying": "maksaa", - "payment.error.abandoned": "Meillä oli ongelma varauksen käsittelyssä. Yritä uudelleen. Ei maksuja on tehty.", - "payment.error.cancelled": "Sinut nyt peruutit maksun.", - "payment.error.failed": "Meillä oli ongelma varauksen käsittelyssä. Yritä uudelleen. Ei maksuja on tehty.", "points": "pistettä", - "room type": "huonetyyppi", - "room types": "huonetyypit", - "signup.terms": "Rekisteröitymällä hyväksyt Scandic Friendsin käyttöehdot. Jäsenyytesi on voimassa toistaiseksi ja voit lopettaa jäsenyytesi milloin tahansa lähettämällä sähköpostia Scandicin asiakaspalveluun", - "signupPage.terms": "Kyllä, hyväksyn Scandic Friends -jäsenyyttä koskevat ehdot ja ymmärrän, että Scandic käsittelee henkilötietojani Scandicin Tietosuojaselosteen mukaisesti.", - "special character": "erikoishahmo", - "spendable points expiring by": "{points} pistettä vanhenee {date} mennessä", - "to": "to", - "uppercase letter": "iso kirjain", + "saturday": "lauantai", + "sunday": "sunnuntai", + "thursday": "torstai", + "tuesday": "tiistai", + "wednesday": "keskiviikko", + "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center": "{address}, {city} ∙ {distanceToCityCentreInKm} km keskustaan", + "{amount, number} left": "{amount, number} jäljellä", + "{amount, plural, one {Gift} other {Gifts}} added to your benefits": "{amount, plural, one {Lahja} other {Lahjat}} lisätty etuusi", "{amount} out of {total}": "{amount}/{total}", + "{amount} {amount, plural, one {hotel} other {hotels}}": "{amount} {amount, plural, one {hotelli} other {hotellit}}", + "{amount}/night per adult": "{amount}/yötä aikuista kohti", "{card} ending with {cardno}": "{card} päättyen {cardno}", + "{checkInDate} from {checkInTime}": "{checkInDate} alkaen {checkInTime}", + "{checkOutDate} from {checkOutTime}": "{checkOutDate} alkaen {checkOutTime}", + "{count} lowercase letter": "{count} pien kirjain", + "{count} number": "{count} määrä", + "{count} special character": "{count} erikoishahmo", + "{count} uppercase letter": "{count} iso kirjain", "{difference}{amount} {currency}": "{difference}{amount} {currency}", - "{number} persons": "{number} henkilöä", - "{number} square meters": "{number} neliömetriä", - "{number} to {number} persons": "{lowest} - {highest} henkilöä", - "{number} to {number} square meters": "{smallest} - {largest} neliömetriä" + "{distanceInKm} km": "{distanceInKm} km", + "{lowest} to {highest} persons": "{lowest} - {highest} henkilöä", + "{min} to {max} characters": "{min} to {max} hahmoja", + "{numberOfRooms, plural, one {# room type} other {# room types}} available": "{numberOfRooms, plural, one {# room type} other {# room types}} saatavilla", + "{number} km to city centre": "{number} km Etäisyys kaupunkiin", + "{pointsAmount, number} points": "{pointsAmount, number} pistettä", + "{points} spendable points expiring by {date}": "{points} pistettä vanhenee {date} mennessä", + "{price} {currency}": "{price} {currency}", + "{price}/night": "{price}/yö", + "{publicPrice}/{memberPrice} {currency}": "{publicPrice}/{memberPrice} {currency}", + "{rating} ({count} reviews on Tripadvisor)": "{rating} ({count} arvostelua TripAdvisorissa)", + "{roomSizeMin} - {roomSizeMax} m²": "{roomSizeMin} - {roomSizeMax} m²", + "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSizeMin} - {roomSizeMax} m². Huoneeseen {max, plural, one {{range} henkilö} other {mahtuu enintään {range} henkilöä}", + "{roomSize} m²": "{roomSize} m²", + "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSize} m². Huoneeseen {max, plural, one {{range} henkilö} other {mahtuu enintään {range} henkilöä}", + "{roomType} {rateDescription}": "{roomType} {rateDescription}", + "{selectedFromDate} - {selectedToDate}": "{selectedFromDate} - {selectedToDate}", + "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}": "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + "{size} ({max, plural, one {{range} person} other {{range} persons}})": "{size} ({max, plural, one {{range} henkilö} other {{range} Henkilöä}})", + "{smallest} to {largest} square meters": "{smallest} - {largest} neliömetriä", + "{title} - Image gallery": "{title} - Kuvagalleria", + "{totalAdults, plural, one {# adult} other {# adults}}": "{totalAdults, plural, one {# aikuinen} other {# aikuiset}}", + "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}": "{totalBreakfasts, plural, one {# aamiainen} other {# aamiaista}}", + "{totalChildren, plural, one {# child} other {# children}}": "{totalChildren, plural, one {# lapsi} other {# lasta}}", + "{totalNights, plural, one {# night} other {# nights}}": "{totalNights, plural, one {# yö} other {# yötä}}", + "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}": "{totalRestaurants, plural, one {Ravintola} other {Ravintolat}}", + "{totalRooms, plural, one {# room} other {# rooms}}": "{totalRooms, plural, one {# huone} other {# sviitti}}", + "{value} persons": "{number} henkilöä", + "{value} square meters": "{number} neliömetriä", + "© {currentYear} Scandic AB All rights reserved": "© {currentYear} Scandic AB Kaikki oikeudet pidätetään" } diff --git a/i18n/dictionaries/no.json b/i18n/dictionaries/no.json index 5e6995716..d7251993c 100644 --- a/i18n/dictionaries/no.json +++ b/i18n/dictionaries/no.json @@ -1,6 +1,7 @@ { "Included (based on availability)": "Inkludert (basert på tilgjengelighet)", "Total price (incl VAT)": "Totalpris (inkl. mva)", + "{amount} 0 {currency}/night per adult": "{amount} 0 {currency}/natt per voksen", "A destination or hotel name is needed to be able to search for a hotel room.": "Et reisemål eller hotellnavn er nødvendig for å kunne søke etter et hotellrom.", "A photo of the room": "Et bilde av rommet", "ACCE": "Tilgjengelighet", @@ -14,11 +15,13 @@ "Accessible Room": "Tilgjengelighetsrom", "Active": "Aktiv", "Activities": "Aktiviteter", - "Add Room": "Legg til rom", "Add code": "Legg til kode", "Add new card": "Legg til nytt kort", + "Add room": "Legg til rom", "Add to calendar": "Legg til i kalenderen", + "Adding room is not available on the new website yet.": "Legg til rom er enda ikke tilgjengelig på den nye nettsiden.", "Address": "Adresse", + "Address: {address}": "Adresse: {address}", "Adults": "Voksne", "Age": "Alder", "Airport": "Flyplass", @@ -34,10 +37,11 @@ "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.", + "Approx. {value}": "Ca. {value}", "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 our": "Som vår {level}", "As our Close Friend": "Som vår nære venn", + "As our {level}": "Som vår {level}", "At latest": "Senest", "At the hotel": "På hotellet", "Attractions": "Attraksjoner", @@ -47,12 +51,14 @@ "Bar": "Bar", "Based on availability": "Basert på tilgjengelighet", "Bed": "Seng type", + "Bed options": "Sengemuligheter", "Bed type": "Seng type", "Birth date": "Fødselsdato", "Book": "Bestill", "Book a table online": "Bestill bord online", "Book parking": "Bestill parkering", "Book reward night": "Bestill belønningskveld", + "Booking confirmation": "Bestillingsbekreftelse", "Booking number": "Bestillingsnummer", "Breakfast": "Frokost", "Breakfast buffet": "Breakfast buffet", @@ -64,12 +70,15 @@ "Breakfast selection in next step.": "Frokostvalg i neste steg.", "Bus terminal": "Bussterminal", "Business": "Forretnings", + "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.": "Ved å akseptere vilkårene og betingelsene for Scandic Friends, er jeg inneforstått med at mine personopplysninger vil bli behandlet i samsvar med Scandics personvernpolicy.", + "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.": "Ved å betale med en av de tilgjengelige betalingsmetodene godtar jeg vilkårene og betingelsene for denne bestillingen og de generelle vilkårene, og forstår at Scandic vil behandle mine personopplysninger i forbindelse med denne bestillingen i henhold til Scandics personvernpolicy. Jeg aksepterer at Scandic krever et gyldig kredittkort under mitt besøk i tilfelle noe blir refundert.", + "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service": "Ved å registrere deg godtar du Scandic Friends vilkår og betingelser. Medlemskapet ditt er gyldig inntil videre, og du kan si opp medlemskapet ditt når som helst ved å sende en e-post til Scandics kundeservice", "Cancel": "Avbryt", "Change room": "Endre rom", "Check in": "Sjekk inn", - "Check in from": "Innsjekking fra", + "Check in from: {checkInTime}": "Innsjekking fra: {checkInTime}", "Check out": "Sjekk ut", - "Check out at latest": "Utsjekking senest", + "Check out at latest: {checkOutTime}": "Utsjekking senest: {checkOutTime}", "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.", "Check-in/Check-out": "Innsjekking/Utsjekking", "Children": "Barn", @@ -88,6 +97,7 @@ "Close the map": "Lukk kartet", "Closed": "Stengt", "Code / Voucher": "Bestillingskoder / kuponger", + "Codes, cheques and reward nights aren't available on the new website yet.": "Koder, checks og belønningsnætter er enda ikke tilgjengelige på den nye nettsiden.", "Coming up": "Kommer opp", "Compare all levels": "Sammenlign alle nivåer", "Complete booking": "Fullfør reservasjonen", @@ -96,15 +106,13 @@ "Contact information": "Kontaktinformasjon", "Contact us": "Kontakt oss", "Continue": "Fortsette", - "Copyright all rights reserved": "Scandic AB Alle rettigheter forbeholdt", "Could not find requested resource": "Kunne ikke finne den forespurte ressursen", "Country": "Land", "Country code": "Landskode", "Country is required": "Land kreves", "Creative spaces for meetings": "Kreative rom for møter", "Credit card deleted successfully": "Kredittkort slettet", - "Crib (child)": "Kørestol (barn)", - "Currency Code": "NOK", + "Crib (child) × {count}": "Kørestol (barn) × {count}", "Current password": "Nåværende passord", "Customer service": "Kundeservice", "Date of Birth": "Fødselsdato", @@ -113,15 +121,11 @@ "Destination": "Destinasjon", "Destinations & hotels": "Destinasjoner og hoteller", "Details": "Detaljer", - "Disabled adding room": "Legg til rom er enda ikke tilgjengelig på den nye nettsiden.", - "Disabled booking options header": "Vi beklager", - "Disabled booking options text": "Koder, checks og belønningsnætter er enda ikke tilgjengelige på den nye nettsiden.", "Discard changes": "Forkaste endringer", "Discard unsaved changes?": "Forkaste endringer som ikke er lagret?", "Discover": "Oppdag", - "Distance in km to city centre": "{number} km til sentrum", "Distance to city centre": "Avstand til sentrum", - "Distance to hotel": "Avstand til hotell: {distance} m", + "Distance to hotel: {distanceInM} m": "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", @@ -138,14 +142,15 @@ "Enter destination or hotel": "Skriv inn destinasjon eller hotell", "Enter your details": "Skriv inn detaljene dine", "Events that make an impression": "Events that make an impression", - "Expires at the earliest": "Utløper tidligst {date}", + "Expires at the earliest {expirationDate}": "Utløper tidligst {expirationDate}", "Explore all levels and benefits": "Utforsk alle nivåer og fordeler", "Explore nearby": "Utforsk i nærheten", - "Extra bed (child)": "Ekstra seng (barn)", + "Extra bed (child) × {count}": "Ekstra seng (barn) × {count}", "Extra bed will be provided additionally": "Ekstra seng vil bli tilgjengelig", "Extras to your booking": "Tilvalg til bestillingen din", "FAQ": "Ofte stilte spørsmål", "Failed to delete credit card, please try again later.": "Kunne ikke slette kredittkortet, prøv igjen senere.", + "Failed to verify membership": "Medlemskap ikke verifisert", "Fair": "Messe", "Filter": "Filter", "Filter and sort": "Filtrer og sorter", @@ -168,17 +173,16 @@ "Garage": "Garasje", "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", - "Go to My Benefits": "Gå til ‘Mine fordeler’", + "Go to My Benefits": "Gå til 'Mine fordeler'", "Guarantee booking with credit card": "Garantere booking med kredittkort", "Guest information": "Informasjon til gjester", "Guests & Rooms": "Gjester & rom", "Gym": "Treningsstudio", - "Hi": "Hei", + "Hi {firstName}!": "Hei {firstName}!", "High floor": "Høy nivå", - "Highest floor": "Høyeste nivå", + "Highest level": "Høyeste nivå", "Home": "Hjem", "Hospital": "Sykehus", "Hotel": "Hotel", @@ -186,7 +190,6 @@ "Hotel facilities": "Hotelfaciliteter", "Hotel reservation": "Hotellreservasjon", "Hotel surroundings": "Hotellomgivelser", - "Hotel(s)": "{amount} {amount, plural, one {hotell} other {hoteller}}", "Hotels": "Hoteller", "Hours": "Tider", "How do you want to sleep?": "Hvordan vil du sove?", @@ -195,7 +198,6 @@ "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", @@ -203,6 +205,7 @@ "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.", + "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.": "Det ser ut til at ingen hoteller samsvarer med filtrene dine. Prøv å justere søket for å finne det perfekte oppholdet.", "Jacuzzi": "Boblebad", "Join Scandic Friends": "Bli med i Scandic Friends", "Join at no cost": "Bli med uten kostnad", @@ -214,7 +217,6 @@ "Last name can't contain any special characters": "Etternavn kan ikke inneholde spesielle tegn", "Last name is required": "Etternavn kreves", "Latest searches": "Siste søk", - "Left": "igjen", "Level": "Nivå", "Level 1": "Nivå 1", "Level 2": "Nivå 2", @@ -224,6 +226,7 @@ "Level 6": "Nivå 6", "Level 7": "Nivå 7", "Level up to unlock": "Nivå opp for å låse opp", + "Level {level}": "Nivå {level}", "Location": "Beliggenhet", "Locations": "Steder", "Log in": "Logg Inn", @@ -231,27 +234,29 @@ "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", "Map": "Kart", - "Map of HOTEL_NAME": "Map of {hotelName}", + "Map of {hotelName}": "Map of {hotelName}", "Marketing city": "Markedsføringsby", + "Max {max, plural, one {{range} guest} other {{range} guests}}": "Maks {max, plural, one {{range} gjest} other {{range} gjester}}", "Meetings & Conferences": "Møter & Konferanser", "Member price": "Medlemspris", "Member price activated": "Medlemspris aktivert", "Member price from": "Medlemspris fra", - "Members": "Medlemmer", - "Membership ID": "Medlems-ID", + "Members {price}/night": "Medlemmer {price}/natt", "Membership ID copied to clipboard": "Medlems-ID kopiert til utklippstavlen", + "Membership ID {id}": "Medlems-ID {id}", + "Membership ID: {id}": "Medlems-ID: {id}", "Membership cards": "Medlemskort", "Membership terms and conditions": "Medlemsvilkår og -betingelser", "Menu": "Menu", "Menus": "Menyer", "Modify": "Endre", - "Mon-Fri": "Man-Fre", + "Mon-Fri Always open": "Man-Fre Alltid åpen", + "Mon-Fri {openingTime}-${closingTime}": "Man-Fre {openingTime}-${closingTime}", "Monday": "Mandag", "Month": "Måned", "Museum": "Museum", @@ -262,6 +267,7 @@ "My payment cards": "Mine betalingskort", "My wishes": "Mine ønsker", "Name": "Navn", + "Name: {cardMembershipType}": "Navn: {cardMembershipType}", "Near elevator": "Nær heisen", "Nearby": "I nærheten", "Nearby companies": "Nærliggende selskaper", @@ -272,6 +278,7 @@ "No availability": "Ingen tilgjengelighet", "No breakfast": "Ingen frokost", "No content published": "Ingen innhold publisert", + "No hotels match your filters": "Ingen rom samsvarte med filtrene dine", "No matching location found": "Fant ingen samsvarende plassering", "No preference": "Ingen preferanse", "No prices available": "Ingen priser tilgjengelig", @@ -282,18 +289,18 @@ "Non-refundable": "Ikke-refunderbart", "Nordic Swan Ecolabel": "Svanemerket", "Not found": "Ikke funnet", - "Nr night, nr adult": "{nights, number} natt, {adults, number} voksen", - "Number of charging points for electric cars": "Antall ladepunkter for elbiler: {number}", - "Number of parking spots": "Antall parkeringsplasser: {number}", + "Number of charging points for electric cars: {number}": "Antall ladepunkter for elbiler: {number}", + "Number of parking spots: {number}": "Antall parkeringsplasser: {number}", + "OK": "OK", "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER", "On your journey": "På reisen din", "Only pay {amount}": "Bare betal {amount}", "Open": "Åpen", - "Open gift(s)": "{amount, plural, one {Åpen gave} other {Åpnen gaver}}", "Open image gallery": "Åpne bildegalleri", "Open language menu": "Åpne språkmenyen", "Open menu": "Åpne menyen", "Open my pages menu": "Åpne mine sider menyen", + "Open {amount, plural, one {gift} other {gifts}}": "{amount, plural, one {Åpen gave} other {Åpnen gaver}}", "Opening hours": "Åpningstider", "Outdoor": "Utendørs", "OutdoorPool": "Utendørs basseng", @@ -327,6 +334,8 @@ "Previous victories": "Tidligere seire", "Price": "Pris", "Price details": "Prisdetaljer", + "Price excluding VAT": "Pris exkludert mva", + "Price including VAT": "Pris inkludert mva", "Price per 24 hours": "Pris per 24 timer", "Price per day": "Pris per dag", "Price per night": "Pris per natt", @@ -346,16 +355,15 @@ "Relax": "Slappe av", "Remove card from member profile": "Fjern kortet fra medlemsprofilen", "Request bedtype": "Be om sengetype", - "Restaurant": "{count, plural, one {Restaurant} other {Restauranter}}", "Restaurant & Bar": "Restaurant & Bar", "Restaurants & Bars": "Restaurants & Bars", "Retype new password": "Skriv inn nytt passord på nytt", "Room & Terms": "Rom & Vilkår", "Room facilities": "Romfasiliteter", - "Room types available": "{numberOfRooms, plural, one {# room type} other {# room types}} tilgjengelig", "Rooms": "Rom", "Rooms & Guests": "Rom og gjester", - "Sat-Sun": "Lør-Søn", + "Sat-Sun Always open": "Lør-Søn Alltid åpen", + "Sat-Sun {openingTime}-${closingTime}": "Lør-Søn {openingTime}-${closingTime}", "Saturday": "Lørdag", "Sauna": "Badstue", "Sauna and gym": "Sauna and gym", @@ -370,7 +378,7 @@ "See less FAQ": "Se mindre FAQ", "See map": "Vis kart", "See on map": "Se på kart", - "See results": "Se resultater ({ count })", + "See results ({ count })": "Se resultater ({ count })", "See room details": "Se detaljer om rommet", "See rooms": "Se rom", "Select a country": "Velg et land", @@ -382,6 +390,7 @@ "Select hotel": "Velg hotell", "Select language": "Velg språk", "Select payment method": "Velg betalingsmetode", + "Select room": "Velg rom", "Select your language": "Velg språk", "Shopping": "Shopping", "Shopping & Dining": "Shopping & Spisesteder", @@ -404,23 +413,27 @@ "Spice things up": "Krydre tingene", "Sports": "Sport", "Standard price": "Standardpris", - "Stay at HOTEL_NAME | Hotel in DESTINATION": "Bo på {hotelName} | Hotell i {destination}", + "Stay at {hotelName} | Hotel in {destination}": "Bo på {hotelName} | Hotell i {destination}", "Street": "Gate", + "Submit": "Submit", "Successfully updated profile!": "Vellykket oppdatert profil!", "Summary": "Sammendrag", "Sunday": "Søndag", "Surprise!": "Overraskelse!", + "Surprises": "Surprises", "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", + "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 contact us.": "Takk for at du booket hos oss! Vi ser frem til å ønske deg velkommen og håper du får et hyggelig opphold. Hvis du har spørsmål eller trenger å gjøre endringer i bestillingen din, vennligst kontakt oss.", "The new price is": "Den nye prisen er", "The price has increased": "Prisen er steget", "The price has increased since you selected your room.": "Prisen er steget, etter at du har valgt rommet.", "Theatre": "Teater", "There are no rooms available that match your request.": "Det er ingen rom tilgjengelige som matcher din forespørsel.", "There are no transactions to display": "Det er ingen transaksjoner å vise", - "Things nearby HOTEL_NAME": "Ting i nærheten av {hotelName}", + "Things nearby {hotelName}": "Ting i nærheten av {hotelName}", + "This room is equipped with": "Dette rommet er utstyrt med", "This room is not available": "Dette rommet er ikke tilgjengelig", "Thursday": "Torsdag", "Times": "Tider", @@ -435,22 +448,23 @@ "Transactions": "Transaksjoner", "Transportations": "Transport", "TripAdvisor rating": "TripAdvisor vurdering", - "Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)", "Tuesday": "Tirsdag", "Type of bed": "Sengtype", "Type of room": "Romtype", "Use bonus cheque": "Bruk bonussjekk", "Use code/voucher": "Bruk kode/voucher", "User information": "Brukerinformasjon", + "VAT {vat}%": "mva {vat}%", "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 had an issue processing your booking. Please try again. No charges have been made.": "Vi hadde et problem med å behandle din bestilling. Vær så snill å prøv igjen. Ingen gebyrer er blevet belastet.", "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!", + "We're sorry": "Vi beklager", "Wednesday": "Onsdag", "Weekday": "Ukedag", "Weekday prices": "Ukedagspriser", @@ -474,11 +488,13 @@ "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 can still book the room but you need to confirm that you accept the new price": "Du kan fortsatt booke rommet, men du må bekrefte at du aksepterer den nye prisen", "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 {amount} 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’", + "You have now cancelled your payment.": "Du har nå annullerer din betaling.", + "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 booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.": "Din bestilling er bekreftet, men vi kunne ikke verifisere medlemskapet ditt. Hvis du har booke ut med et medlemsrabatt, må du enten presentere eksisterende medlemsnummer ved check-in, bli medlem eller betale prisdifferansen ved hotellet. Registrering er foretrukket gjort online før oppholdet.", "Your card was successfully removed!": "Kortet ditt ble fjernet!", "Your card was successfully saved!": "Kortet ditt ble lagret!", "Your current level": "Ditt nåværende nivå", @@ -492,64 +508,62 @@ "Zoom in": "Zoom inn", "Zoom out": "Zoom ut", "as of today": "per i dag", - "booking.accommodatesUpTo": "Plass til {max, plural, one {{range} person} other {opptil {range} personer}}", - "booking.adults": "{totalAdults, plural, one {# voksen} other {# voksne}}", - "booking.adults.breakfasts": "{totalAdults, plural, one {# voksen} other {# voksne}}, {totalBreakfasts, plural, one {# frokost} other {# frokoster}}", - "booking.basedOnAvailability": "Basert på tilgjengelighet", - "booking.bedOptions": "Sengemuligheter", - "booking.children": "{totalChildren, plural, one {# barn} other {# barn}}", - "booking.children.breakfasts": "{totalChildren, plural, one {# barn} other {# barn}}, {totalBreakfasts, plural, one {# frokost} other {# frokoster}}", - "booking.confirmation.membershipInfo.heading": "Medlemskap ikke verifisert", - "booking.confirmation.membershipInfo.text": "Din bestilling er bekreftet, men vi kunne ikke verifisere medlemskapet ditt. Hvis du har booke ut med et medlemsrabatt, må du enten presentere eksisterende medlemsnummer ved check-in, bli medlem eller betale prisdifferansen ved hotellet. Registrering er foretrukket gjort online før oppholdet.", "booking.confirmation.text": "Takk for at du booket hos oss! Vi ser frem til å ønske deg velkommen og håper du får et hyggelig opphold. Hvis du har spørsmål eller trenger å gjøre endringer i bestillingen din, vennligst kontakt oss.", "booking.confirmation.title": "Bestillingsbekreftelse", "booking.guests": "Maks {max, plural, one {{range} gjest} other {{range} gjester}}", - "booking.nights": "{totalNights, plural, one {# natt} other {# netter}}", - "booking.rooms": "{totalRooms, plural, one {# rom} other {# rom}}", "booking.selectRoom": "Velg rom", - "booking.terms": "Ved å betale med en av de tilgjengelige betalingsmetodene godtar jeg vilkårene og betingelsene for denne bestillingen og de generelle vilkårene, og forstår at Scandic vil behandle mine personopplysninger i forbindelse med denne bestillingen i henhold til Scandics personvernpolicy. Jeg aksepterer at Scandic krever et gyldig kredittkort under mitt besøk i tilfelle noe blir refundert.", "booking.thisRoomIsEquippedWith": "Dette rommet er utstyrt med", - "booking.vat": "mva {vat}%", - "booking.vat.excl": "Pris exkludert mva", - "booking.vat.incl": "Pris inkludert mva", - "breakfast.price": "{amount}/natt per voksen", - "breakfast.price.free": "{amount} 0 {currency}/natt per voksen", - "by": "innen", - "characters": "tegn", - "filters.nohotel.heading": "Ingen rom samsvarte med filtrene dine", - "filters.nohotel.text": "Det ser ut til at ingen hoteller samsvarer med filtrene dine. Prøv å justere søket for å finne det perfekte oppholdet.", - "from": "fra", - "guaranteeing": "garantiert", - "guest": "gjest", - "guests": "gjester", - "hotelPages.rooms.roomCard.persons": "{size} ({max, plural, one {{range} person} other {{range} 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å:", + "friday": "fredag", + "monday": "mandag", "night": "natt", - "nights": "netter", - "number": "antall", - "or": "eller", - "paying": "betaler", - "payment.error.abandoned": "Vi hadde et problem med å behandle din bestilling. Vær så snill å prøv igjen. Ingen gebyrer er blevet belastet.", - "payment.error.cancelled": "Du har nå annullerer din betaling.", - "payment.error.failed": "Vi hadde et problem med å behandle din bestilling. Vær så snill å prøv igjen. Ingen gebyrer er blevet belastet.", "points": "poeng", - "room type": "romtype", - "room types": "romtyper", - "signup.terms": "Ved å registrere deg godtar du Scandic Friends vilkår og betingelser. Medlemskapet ditt er gyldig inntil videre, og du kan si opp medlemskapet ditt når som helst ved å sende en e-post til Scandics kundeservice", - "signupPage.terms": "Ved å akseptere vilkårene og betingelsene for Scandic Friends, er jeg inneforstått med at mine personopplysninger vil bli behandlet i samsvar med Scandics personvernpolicy.", - "special character": "spesiell karakter", - "spendable points expiring by": "{points} Brukbare poeng utløper innen {date}", - "to": "til", - "uppercase letter": "stor bokstav", + "saturday": "lørdag", + "sunday": "søndag", + "thursday": "torsdag", + "tuesday": "tirsdag", + "wednesday": "onsdag", + "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center": "{address}, {city} ∙ {distanceToCityCentreInKm} km til sentrum", + "{amount, number} left": "{amount, number} igjen", + "{amount, plural, one {Gift} other {Gifts}} added to your benefits": "{amount, plural, one {Gave} other {Gaver}} lagt til fordelene dine", "{amount} out of {total}": "{amount} av {total}", + "{amount} {amount, plural, one {hotel} other {hotels}}": "{amount} {amount, plural, one {hotell} other {hoteller}}", + "{amount}/night per adult": "{amount}/natt per voksen", "{card} ending with {cardno}": "{card} slutter med {cardno}", + "{checkInDate} from {checkInTime}": "{checkInDate} fra {checkInTime}", + "{checkOutDate} from {checkOutTime}": "{checkOutDate} fra {checkOutTime}", + "{count} lowercase letter": "{count} liten bokstav", + "{count} number": "{count} antall", + "{count} special character": "{count} spesiell karakter", + "{count} uppercase letter": "{count} stor bokstav", "{difference}{amount} {currency}": "{difference}{amount} {currency}", - "{number} persons": "{number} personer", - "{number} square meters": "{number} kvadratmeter", - "{number} to {number} persons": "{lowest} til {highest} personer", - "{number} to {number} square meters": "{smallest} til {largest} kvadratmeter" + "{distanceInKm} km": "{distanceInKm} km", + "{lowest} to {highest} persons": "{lowest} til {highest} personer", + "{min} to {max} characters": "{min} til {max} tegn", + "{numberOfRooms, plural, one {# room type} other {# room types}} available": "{numberOfRooms, plural, one {# room type} other {# room types}} tilgjengelig", + "{number} km to city centre": "{number} km til sentrum", + "{pointsAmount, number} points": "{pointsAmount, number} poeng", + "{points} spendable points expiring by {date}": "{points} Brukbare poeng utløper innen {date}", + "{price} {currency}": "{price} {currency}", + "{price}/night": "{price}/natt", + "{publicPrice}/{memberPrice} {currency}": "{publicPrice}/{memberPrice} {currency}", + "{rating} ({count} reviews on Tripadvisor)": "{rating} ({count} anmeldelser på Tripadvisor)", + "{roomSizeMin} - {roomSizeMax} m²": "{roomSizeMin} - {roomSizeMax} m²", + "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSizeMin} - {roomSizeMax} m². Plass til {max, plural, one {{range} person} other {opptil {range} personer}}", + "{roomSize} m²": "{roomSize} m²", + "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSize} m². Plass til {max, plural, one {{range} person} other {opptil {range} personer}}", + "{roomType} {rateDescription}": "{roomType} {rateDescription}", + "{selectedFromDate} - {selectedToDate}": "{selectedFromDate} - {selectedToDate}", + "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}": "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + "{size} ({max, plural, one {{range} person} other {{range} persons}})": "{size} ({max, plural, one {{range} person} other {{range} personer}})", + "{smallest} to {largest} square meters": "{smallest} til {largest} kvadratmeter", + "{title} - Image gallery": "{title} - Bildegalleri", + "{totalAdults, plural, one {# adult} other {# adults}}": "{totalAdults, plural, one {# voksen} other {# voksne}}", + "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}": "{totalBreakfasts, plural, one {# frokost} other {# frokoster}}", + "{totalChildren, plural, one {# child} other {# children}}": "{totalChildren, plural, one {# barn} other {# barn}}", + "{totalNights, plural, one {# night} other {# nights}}": "{totalNights, plural, one {# natt} other {# netter}}", + "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}": "{totalRestaurants, plural, one {Restaurant} other {Restauranter}}", + "{totalRooms, plural, one {# room} other {# rooms}}": "{totalRooms, plural, one {# rom} other {# rom}}", + "{value} persons": "{number} personer", + "{value} square meters": "{number} kvadratmeter", + "© {currentYear} Scandic AB All rights reserved": "© {currentYear} Scandic AB Alle rettigheter forbeholdt" } diff --git a/i18n/dictionaries/sv.json b/i18n/dictionaries/sv.json index ccdedebf6..c540c5167 100644 --- a/i18n/dictionaries/sv.json +++ b/i18n/dictionaries/sv.json @@ -1,6 +1,7 @@ { "Included (based on availability)": "Ingår (baserat på tillgänglighet)", "Total price (incl VAT)": "Totalpris (inkl moms)", + "{amount} 0 {currency}/night per adult": "{amount} 0 {currency}/natt per vuxen", "A destination or hotel name is needed to be able to search for a hotel room.": "Ett destinations- eller hotellnamn behövs för att kunna söka efter ett hotellrum.", "A photo of the room": "Ett foto av rummet", "ACCE": "Tillgänglighet", @@ -14,11 +15,13 @@ "Accessible Room": "Tillgänglighetsrum", "Active": "Aktiv", "Activities": "Aktiviteter", - "Add Room": "Lägg till rum", "Add code": "Lägg till kod", "Add new card": "Lägg till nytt kort", + "Add room": "Lägg till rum", "Add to calendar": "Lägg till i kalendern", + "Adding room is not available on the new website yet.": "Lägg till rum är inte tillgängligt än på den nya webbplatsen.", "Address": "Adress", + "Address: {address}": "Adress: {address}", "Adults": "Vuxna", "Age": "Ålder", "Airport": "Flygplats", @@ -34,10 +37,11 @@ "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.", + "Approx. {value}": "Ca. {value}", "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 our": "Som vår {level}", "As our Close Friend": "Som vår nära vän", + "As our {level}": "Som vår {level}", "At latest": "Senast", "At the hotel": "På hotellet", "Attractions": "Sevärdheter", @@ -47,12 +51,14 @@ "Bar": "Bar", "Based on availability": "Baserat på tillgänglighet", "Bed": "Sängtyp", + "Bed options": "Sängalternativ", "Bed type": "Sängtyp", "Birth date": "Födelsedatum", "Book": "Boka", "Book a table online": "Boka ett bord online", "Book parking": "Boka parkering", "Book reward night": "Boka frinatt", + "Booking confirmation": "Bokningsbekräftelse", "Booking number": "Bokningsnummer", "Breakfast": "Frukost", "Breakfast buffet": "Frukostbuffé", @@ -64,12 +70,15 @@ "Breakfast selection in next step.": "Frukostval i nästa steg.", "Bus terminal": "Bussterminal", "Business": "Business", + "By accepting the Terms and Conditions for Scandic Friends I understand that my personal data will be processed in accordance with Scandic's Privacy Policy.": "Genom att acceptera villkoren för Scandic Friends förstår jag att mina personuppgifter kommer att behandlas i enlighet med Scandics Integritetspolicy.", + "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.": "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.", + "By signing up you accept the Scandic Friends Terms and Conditions. Your membership is valid until further notice, and you can terminate your membership at any time by sending an email to Scandic's customer service": "Genom att registrera dig accepterar du Scandic Friends Användarvillkor. Ditt medlemskap gäller tills vidare och du kan när som helst säga upp ditt medlemskap genom att skicka ett mejl till Scandics kundtjänst", "Cancel": "Avbryt", "Change room": "Ändra rum", "Check in": "Checka in", - "Check in from": "Incheckning från", + "Check in from: {checkInTime}": "Incheckning från: {checkInTime}", "Check out": "Checka ut", - "Check out at latest": "Utcheckning senast", + "Check out at latest: {checkOutTime}": "Utcheckning senast: {checkOutTime}", "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.", "Check-in/Check-out": "Inchecking/Utcheckning", "Children": "Barn", @@ -88,6 +97,7 @@ "Close the map": "Stäng kartan", "Closed": "Stängt", "Code / Voucher": "Bokningskoder / kuponger", + "Codes, cheques and reward nights aren't available on the new website yet.": "Koder, bonuscheckar och belöningsnätter är inte tillgängliga på den nya webbplatsen än.", "Coming up": "Kommer härnäst", "Compare all levels": "Jämför alla nivåer", "Complete booking": "Slutför bokning", @@ -96,15 +106,13 @@ "Contact information": "Kontaktinformation", "Contact us": "Kontakta oss", "Continue": "Fortsätt", - "Copyright all rights reserved": "Scandic AB Alla rättigheter förbehålls", "Could not find requested resource": "Det gick inte att hitta den begärda resursen", "Country": "Land", "Country code": "Landskod", "Country is required": "Land är obligatoriskt", "Creative spaces for meetings": "Kreativa utrymmen för möten", "Credit card deleted successfully": "Kreditkort har tagits bort", - "Crib (child)": "Spjälsäng (barn)", - "Currency Code": "SEK", + "Crib (child) × {count}": "Spjälsäng (barn) × {count}", "Current password": "Nuvarande lösenord", "Customer service": "Kundservice", "Date of Birth": "Födelsedatum", @@ -113,15 +121,11 @@ "Destination": "Destination", "Destinations & hotels": "Destinationer & hotell", "Details": "Detaljer", - "Disabled adding room": "Lägg till rum är inte tillgängligt än på den nya webbplatsen.", - "Disabled booking options header": "Vi beklagar", - "Disabled booking options text": "Koder, bonuscheckar och belöningsnätter är inte tillgängliga på den nya webbplatsen än.", "Discard changes": "Ignorera ändringar", "Discard unsaved changes?": "Vill du ignorera ändringar som inte har sparats?", "Discover": "Upptäck", - "Distance in km to city centre": "{number} km till centrum", "Distance to city centre": "Avstånd till centrum", - "Distance to hotel": "Avstånd till hotell: {distance} m", + "Distance to hotel: {distanceInM} m": "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", @@ -138,14 +142,15 @@ "Enter destination or hotel": "Ange destination eller hotell", "Enter your details": "Ange dina uppgifter", "Events that make an impression": "Events that make an impression", - "Expires at the earliest": "Löper ut tidigast {date}", + "Expires at the earliest {expirationDate}": "Löper ut tidigast {expirationDate}", "Explore all levels and benefits": "Utforska alla nivåer och fördelar", "Explore nearby": "Utforska i närheten", - "Extra bed (child)": "Extra säng (barn)", + "Extra bed (child) × {count}": "Extra säng (barn) × {count}", "Extra bed will be provided additionally": "Extra säng kommer att tillhandahållas", "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.", + "Failed to verify membership": "Medlemskap inte verifierat", "Fair": "Mässa", "Filter": "Filter", "Filter and sort": "Filtrera och sortera", @@ -168,17 +173,16 @@ "Garage": "Garage", "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", - "Go to My Benefits": "Gå till ‘Mina förmåner’", + "Go to My Benefits": "Gå till 'Mina förmåner'", "Guarantee booking with credit card": "Garantera bokning med kreditkort", "Guest information": "Information till gästerna", "Guests & Rooms": "Gäster & rum", "Gym": "Gym", - "Hi": "Hej", + "Hi {firstName}!": "Hej {firstName}!", "High floor": "Högt upp", - "Highest floor": "Högsta nivå", + "Highest level": "Högsta nivå", "Home": "Hem", "Hospital": "Sjukhus", "Hotel": "Hotell", @@ -186,7 +190,6 @@ "Hotel facilities": "Hotellfaciliteter", "Hotel reservation": "Hotellbokning", "Hotel surroundings": "Hotellomgivning", - "Hotel(s)": "{amount} hotell", "Hotels": "Hotell", "Hours": "Tider", "How do you want to sleep?": "Hur vill du sova?", @@ -195,7 +198,6 @@ "I accept": "Jag accepterar", "I accept the terms and conditions": "Jag accepterar villkoren", "I would like to get my booking confirmation via sms": "Jag vill få min bokningsbekräftelse via sms", - "Image gallery": "{name} - Bildgalleri", "In adults bed": "I vuxens säng", "In crib": "I spjälsäng", "In extra bed": "Egen sängplats", @@ -203,6 +205,7 @@ "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.", + "It looks like no hotels match your filters. Try adjusting your search to find the perfect stay.": "Det verkar som att inga hotell matchar dina filter. Prova att justera din sökning för att hitta den perfekta vistelsen.", "Jacuzzi": "Jacuzzi", "Join Scandic Friends": "Gå med i Scandic Friends", "Join at no cost": "Gå med utan kostnad", @@ -214,7 +217,6 @@ "Last name can't contain any special characters": "Efternamn får inte innehålla några specialtecken", "Last name is required": "Efternamn är obligatoriskt", "Latest searches": "Senaste sökningarna", - "Left": "kvar", "Level": "Nivå", "Level 1": "Nivå 1", "Level 2": "Nivå 2", @@ -224,6 +226,7 @@ "Level 6": "Nivå 6", "Level 7": "Nivå 7", "Level up to unlock": "Levla upp för att låsa upp", + "Level {level}": "Nivå {level}", "Location": "Plats", "Locations": "Platser", "Log in": "Logga in", @@ -231,27 +234,29 @@ "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", "Map": "Karta", - "Map of HOTEL_NAME": "Map of {hotelName}", + "Map of {hotelName}": "Map of {hotelName}", "Marketing city": "Marknadsföringsstad", + "Max {max, plural, one {{range} guest} other {{range} guests}}": "Max {max, plural, one {{range} gäst} other {{range} gäster}}", "Meetings & Conferences": "Möten & Konferenser", "Member price": "Medlemspris", "Member price activated": "Medlemspris aktiverat", "Member price from": "Medlemspris från", - "Members": "Medlemmar", - "Membership ID": "Medlems-ID", + "Members {price}/night": "Medlemmar {price}/natt", "Membership ID copied to clipboard": "Medlems-ID kopierat till urklipp", + "Membership ID {id}": "Medlems-ID {id}", + "Membership ID: {id}": "Medlems-ID: {id}", "Membership cards": "Medlemskort", "Membership terms and conditions": "Medlemsvillkor", "Menu": "Meny", "Menus": "Menyer", "Modify": "Ändra", - "Mon-Fri": "Mån-Fre", + "Mon-Fri Always open": "Mån-Fre Alltid öppet", + "Mon-Fri {openingTime}-${closingTime}": "Mån-Fre {openingTime}-${closingTime}", "Monday": "Måndag", "Month": "Månad", "Museum": "Museum", @@ -262,6 +267,7 @@ "My payment cards": "Mina betalningskort", "My wishes": "Mina önskningar", "Name": "Namn", + "Name: {cardMembershipType}": "Namn: {cardMembershipType}", "Near elevator": "Nära hissen", "Nearby": "I närheten", "Nearby companies": "Närliggande företag", @@ -272,6 +278,7 @@ "No availability": "Ingen tillgänglighet", "No breakfast": "Ingen frukost", "No content published": "Inget innehåll publicerat", + "No hotels match your filters": "Inga rum matchade dina filter", "No matching location found": "Ingen matchande plats hittades", "No preference": "Ingen preferens", "No prices available": "Inga priser tillgängliga", @@ -282,18 +289,18 @@ "Non-refundable": "Ej återbetalningsbar", "Nordic Swan Ecolabel": "Svanenmärkt", "Not found": "Hittades inte", - "Nr night, nr adult": "{nights, number} natt, {adults, number} vuxen", - "Number of charging points for electric cars": "Antal laddplatser för elbilar: {number}", - "Number of parking spots": "Antal parkeringsplatser: {number}", + "Number of charging points for electric cars: {number}": "Antal laddplatser för elbilar: {number}", + "Number of parking spots: {number}": "Antal parkeringsplatser: {number}", + "OK": "OK", "OTHER PAYMENT METHODS": "ANDRE BETALINGSMETODER", "On your journey": "På din resa", "Only pay {amount}": "Betala endast {amount}", "Open": "Öppna", - "Open gift(s)": "Öppna {amount, plural, one {gåva} other {gåvor}}", "Open image gallery": "Öppna bildgalleri", "Open language menu": "Öppna språkmenyn", "Open menu": "Öppna menyn", "Open my pages menu": "Öppna mina sidor menyn", + "Open {amount, plural, one {gift} other {gifts}}": "Öppna {amount, plural, one {gåva} other {gåvor}}", "Opening hours": "Öppettider", "Outdoor": "Utomhus", "OutdoorPool": "Utomhuspool", @@ -327,6 +334,8 @@ "Previous victories": "Tidigare segrar", "Price": "Pris", "Price details": "Prisdetaljer", + "Price excluding VAT": "Pris exkl. VAT", + "Price including VAT": "Pris inkl. VAT", "Price per 24 hours": "Pris per 24 timmar", "Price per day": "Pris per dag", "Price per night": "Pris per natt", @@ -346,16 +355,15 @@ "Relax": "Koppla av", "Remove card from member profile": "Ta bort kortet från medlemsprofilen", "Request bedtype": "Request bedtype", - "Restaurant": "{count, plural, one {Restaurang} other {Restauranger}}", "Restaurant & Bar": "Restaurang & Bar", "Restaurants & Bars": "Restaurants & Bars", "Retype new password": "Upprepa nytt lösenord", "Room & Terms": "Rum & Villkor", "Room facilities": "Rumfaciliteter", - "Room types available": "{numberOfRooms, plural, one {# room type} other {# room types}} tillgängliga", "Rooms": "Rum", "Rooms & Guests": "Rum och gäster", - "Sat-Sun": "Lör-Sön", + "Sat-Sun Always open": "Lör-Sön Alltid öppet", + "Sat-Sun {openingTime}-${closingTime}": "Lör-Sön {openingTime}-${closingTime}", "Saturday": "Lördag", "Sauna": "Bastu", "Sauna and gym": "Sauna and gym", @@ -370,7 +378,7 @@ "See less FAQ": "See färre FAQ", "See map": "Visa karta", "See on map": "Se på karta", - "See results": "Se resultat ({ count })", + "See results ({ count })": "Se resultat ({ count })", "See room details": "Se rumsdetaljer", "See rooms": "Se rum", "Select a country": "Välj ett land", @@ -382,6 +390,7 @@ "Select hotel": "Välj hotell", "Select language": "Välj språk", "Select payment method": "Välj betalningsmetod", + "Select room": "Välj rum", "Select your language": "Välj ditt språk", "Shopping": "Shopping", "Shopping & Dining": "Shopping & Mat", @@ -404,23 +413,27 @@ "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}", + "Stay at {hotelName} | Hotel in {destination}": "Bo på {hotelName} | Hotell i {destination}", "Street": "Gata", + "Submit": "Submit", "Successfully updated profile!": "Profilen har uppdaterats framgångsrikt!", "Summary": "Sammanfattning", "Sunday": "Söndag", "Surprise!": "Överraskning!", + "Surprises": "Surprises", "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", + "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 contact us.": "Tack för att du bokar hos oss! Vi ser fram emot att välkomna dig och hoppas att du får en trevlig vistelse. Om du har några frågor eller behöver göra ändringar i din bokning, vänligen kontakta oss.", "The new price is": "Det nya priset är", "The price has increased": "Priset har ökat", "The price has increased since you selected your room.": "Priset har ökat sedan du valde ditt rum.", "Theatre": "Teater", "There are no rooms available that match your request.": "Det finns inga rum tillgängliga som matchar din begäran.", "There are no transactions to display": "Det finns inga transaktioner att visa", - "Things nearby HOTEL_NAME": "Saker i närheten av {hotelName}", + "Things nearby {hotelName}": "Saker i närheten av {hotelName}", + "This room is equipped with": "Detta rum är utrustat med", "This room is not available": "Detta rum är inte tillgängligt", "Thursday": "Torsdag", "Times": "Tider", @@ -435,22 +448,23 @@ "Transactions": "Transaktioner", "Transportations": "Transport", "TripAdvisor rating": "TripAdvisor-betyg", - "Tripadvisor reviews": "{rating} ({count} recensioner på Tripadvisor)", "Tuesday": "Tisdag", "Type of bed": "Sängtyp", "Type of room": "Rumstyp", "Use bonus cheque": "Använd bonuscheck", "Use code/voucher": "Använd kod/voucher", "User information": "Användarinformation", + "VAT {vat}%": "Moms {vat}%", "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 had an issue processing your booking. Please try again. No charges have been made.": "Vi hade ett problem med att bearbeta din bokning. Vänligen försök igen. Inga avgifter har debiterats.", "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!", + "We're sorry": "Vi beklagar", "Wednesday": "Onsdag", "Weekday": "Vardag", "Weekday prices": "Vardagspriser", @@ -474,11 +488,13 @@ "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 can still book the room but you need to confirm that you accept the new price": "Du kan fortsatt boka rummet men du måste bekräfta att du accepterar det nya priset", "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 {amount} 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’", + "You have now cancelled your payment.": "Du har nu avbrutit din betalning.", + "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 booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.": "Din bokning är bekräftad, men vi kunde inte verifiera ditt medlemskap. Om du har bokat med ett medlemsrabatt måste du antingen presentera ditt befintliga medlemsnummer vid check-in, bli medlem eller betala prisdifferensen vid hotell. Registrering är föredragen gjord online före vistelsen.", "Your card was successfully removed!": "Ditt kort har tagits bort!", "Your card was successfully saved!": "Ditt kort har sparats!", "Your current level": "Din nuvarande nivå", @@ -492,66 +508,64 @@ "Zoom in": "Zooma in", "Zoom out": "Zooma ut", "as of today": "från och med idag", - "booking.accommodatesUpTo": "Rymmer {max, plural, one {{range} person} other {upp till {range} personer}}", - "booking.adults": "{totalAdults, plural, one {# vuxen} other {# vuxna}}", - "booking.adults.breakfasts": "{totalAdults, plural, one {# vuxen} other {# vuxna}}, {totalBreakfasts, plural, one {# frukost} other {# frukostar}}", - "booking.basedOnAvailability": "Baserat på tillgänglighet", - "booking.bedOptions": "Sängalternativ", - "booking.children": "{totalChildren, plural, one {# barn} other {# barn}}", - "booking.children.breakfasts": "{totalChildren, plural, one {# barn} other {# barn}}, {totalBreakfasts, plural, one {# frukost} other {# frukostar}}", - "booking.confirmation.membershipInfo.heading": "Medlemskap inte verifierat", - "booking.confirmation.membershipInfo.text": "Din bokning är bekräftad, men vi kunde inte verifiera ditt medlemskap. Om du har bokat med ett medlemsrabatt måste du antingen presentera ditt befintliga medlemsnummer vid check-in, bli medlem eller betala prisdifferensen vid hotell. Registrering är föredragen gjord online före vistelsen.", "booking.confirmation.text": "Tack för att du bokar hos oss! Vi ser fram emot att välkomna dig och hoppas att du får en trevlig vistelse. Om du har några frågor eller behöver göra ändringar i din bokning, vänligen kontakta oss.", "booking.confirmation.title": "Bokningsbekräftelse", "booking.guests": "Max {max, plural, one {{range} gäst} other {{range} gäster}}", - "booking.nights": "{totalNights, plural, one {# natt} other {# nätter}}", - "booking.rooms": "{totalRooms, plural, one {# rum} other {# rum}}", "booking.selectRoom": "Välj 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", - "booking.vat": "Moms {vat}%", - "booking.vat.excl": "Pris exkl. VAT", - "booking.vat.incl": "Pris inkl. VAT", - "breakfast.price": "{amount}/natt per vuxen", - "breakfast.price.free": "{amount} 0 {currency}/natt per vuxen", - "by": "innan", - "characters": "tecken", - "filters.nohotel.heading": "Inga rum matchade dina filter", - "filters.nohotel.text": "Det verkar som att inga hotell matchar dina filter. Prova att justera din sökning för att hitta den perfekta vistelsen.", - "from": "från", - "guaranteeing": "garanterar", - "guest": "gäst", - "guests": "gäster", - "hotelPages.rooms.roomCard.persons": "{size} ({max, plural, one {{range} person} other {{range} 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å:", + "friday": "fredag", + "monday": "måndag", "night": "natt", - "nights": "nätter", - "number": "nummer", - "or": "eller", - "paying": "betalar", - "payment.error.abandoned": "Vi hade et problem med att bearbeta din bokning. Vänligen försök igen. Inga avgifter har debiterats.", - "payment.error.cancelled": "Du har nu avbrutit din betalning.", - "payment.error.failed": "Vi hade ett problem med att bearbeta din bokning. Vänligen försök igen. Inga avgifter har debiterats.", "points": "poäng", - "room type": "rumtyp", - "room types": "rumstyper", - "signup.terms": "Genom att registrera dig accepterar du Scandic Friends Användarvillkor. Ditt medlemskap gäller tills vidare och du kan när som helst säga upp ditt medlemskap genom att skicka ett mejl till Scandics kundtjänst", - "signupPage.terms": "Genom att acceptera villkoren för Scandic Friends förstår jag att mina personuppgifter kommer att behandlas i enlighet med Scandics Integritetspolicy.", - "special character": "speciell karaktär", - "spendable points expiring by": "{points} poäng förfaller {date}", - "to": "till", + "saturday": "lördag", + "sunday": "söndag", + "thursday": "torsdag", + "tuesday": "tisdag", "type": "typ", "types": "typer", - "uppercase letter": "stor bokstav", + "wednesday": "onsdag", + "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center": "{address}, {city} ∙ {distanceToCityCentreInKm} km till stadens centrum", + "{amount, number} left": "{amount, number} kvar", + "{amount, plural, one {Gift} other {Gifts}} added to your benefits": "{amount, plural, one {Gåva} other {Gåvor}} läggs till dina förmåner", "{amount} out of {total}": "{amount} av {total}", + "{amount} {amount, plural, one {hotel} other {hotels}}": "{amount} {amount, plural, one {hotell} other {hotell}}", + "{amount}/night per adult": "{amount}/natt per vuxen", "{card} ending with {cardno}": "{card} som slutar på {cardno}", + "{checkInDate} from {checkInTime}": "{checkInDate} från {checkInTime}", + "{checkOutDate} from {checkOutTime}": "{checkOutDate} från {checkOutTime}", + "{count} lowercase letter": "{count} liten bokstav", + "{count} number": "{count} nummer", + "{count} special character": "{count} speciell karaktär", + "{count} uppercase letter": "{count} stor bokstav", "{difference}{amount} {currency}": "{difference}{amount} {currency}", - "{number} persons": "{number} personer", - "{number} square meters": "{number} kvadratmeter", - "{number} to {number} persons": "{lowest} till {highest} personer", - "{number} to {number} square meters": "{smallest} till {largest} kvadratmeter" + "{distanceInKm} km": "{distanceInKm} km", + "{lowest} to {highest} persons": "{lowest} till {highest} personer", + "{min} to {max} characters": "{min} till {max} tecken", + "{numberOfRooms, plural, one {# room type} other {# room types}} available": "{numberOfRooms, plural, one {# room type} other {# room types}} tillgängliga", + "{number} km to city centre": "{number} km till centrum", + "{pointsAmount, number} points": "{pointsAmount, number} poäng", + "{points} spendable points expiring by {date}": "{points} poäng förfaller {date}", + "{price} {currency}": "{price} {currency}", + "{price}/night": "{price}/natt", + "{publicPrice}/{memberPrice} {currency}": "{publicPrice}/{memberPrice} {currency}", + "{rating} ({count} reviews on Tripadvisor)": "{rating} ({count} recensioner på Tripadvisor)", + "{roomSizeMin} - {roomSizeMax} m²": "{roomSizeMin} - {roomSizeMax} m²", + "{roomSizeMin} - {roomSizeMax} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSizeMin} - {roomSizeMax} m². Rymmer {max, plural, one {{range} person} other {upp till {range} personer}}", + "{roomSize} m²": "{roomSize} m²", + "{roomSize} m². Accommodates up to {max, plural, one {{range} person} other {{range} people}}": "{roomSize} m². Rymmer {max, plural, one {{range} person} other {upp till {range} personer}}", + "{roomType} {rateDescription}": "{roomType} {rateDescription}", + "{selectedFromDate} - {selectedToDate}": "{selectedFromDate} - {selectedToDate}", + "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}": "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + "{size} ({max, plural, one {{range} person} other {{range} persons}})": "{size} ({max, plural, one {{range} person} other {{range} personer}})", + "{smallest} to {largest} square meters": "{smallest} till {largest} kvadratmeter", + "{title} - Image gallery": "{title} - Bildgalleri", + "{totalAdults, plural, one {# adult} other {# adults}}": "{totalAdults, plural, one {# vuxen} other {# vuxna}}", + "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}": "{totalBreakfasts, plural, one {# frukost} other {# frukostar}}", + "{totalChildren, plural, one {# child} other {# children}}": "{totalChildren, plural, one {# barn} other {# barn}}", + "{totalNights, plural, one {# night} other {# nights}}": "{totalNights, plural, one {# natt} other {# nätter}}", + "{totalRestaurants, plural, one {Restaurant} other {Restaurants}}": "{totalRestaurants, plural, one {Restaurang} other {Restauranger}}", + "{totalRooms, plural, one {# room} other {# rooms}}": "{totalRooms, plural, one {# rum} other {# rum}}", + "{value} persons": "{number} personer", + "{value} square meters": "{number} kvadratmeter", + "© {currentYear} Scandic AB All rights reserved": "© {currentYear} Scandic AB Alla rättigheter förbehålls" } diff --git a/server/routers/contentstack/metadata/utils.ts b/server/routers/contentstack/metadata/utils.ts index 1cf9ce80c..55c8729c8 100644 --- a/server/routers/contentstack/metadata/utils.ts +++ b/server/routers/contentstack/metadata/utils.ts @@ -68,7 +68,7 @@ export async function getTitle(data: RawMetadataSchema) { } if (data.hotelData) { return intl.formatMessage( - { id: "Stay at HOTEL_NAME | Hotel in DESTINATION" }, + { id: "Stay at {hotelName} | Hotel in {destination}" }, { hotelName: data.hotelData.name, destination: data.hotelData.address.city, diff --git a/server/routers/hotels/schemas/restaurants.ts b/server/routers/hotels/schemas/restaurants.ts index f85b1fe37..221f0eac0 100644 --- a/server/routers/hotels/schemas/restaurants.ts +++ b/server/routers/hotels/schemas/restaurants.ts @@ -17,8 +17,6 @@ export const restaurantDaySchema = z.object({ export const restaurantOpeningHoursSchema = z.object({ isActive: z.boolean(), name: z.string().optional(), - openingTime: z.string().optional(), - closingTime: z.string().optional(), monday: restaurantDaySchema.optional(), tuesday: restaurantDaySchema.optional(), wednesday: restaurantDaySchema.optional(), diff --git a/server/routers/hotels/tempHotelData.json b/server/routers/hotels/tempHotelData.json index 2ec39da33..b2e954824 100644 --- a/server/routers/hotels/tempHotelData.json +++ b/server/routers/hotels/tempHotelData.json @@ -51,7 +51,7 @@ "hotelFacilityDetail": { "breakfast": { "heading": "Breakfast", - "description": "Breakfast buffet is always included. It’s a tasty mix with healthy and allergy friendly alternatives." + "description": "Breakfast buffet is always included. It's a tasty mix with healthy and allergy friendly alternatives." }, "checkout": { "heading": "Check out", @@ -59,7 +59,7 @@ }, "gym": { "heading": "Gym", - "description": "Our beds are comfy, but a workout will cheer you up as well. Have a run on the treadmill or work out in our well-equipped gym – it’s free when staying with us." + "description": "Our beds are comfy, but a workout will cheer you up as well. Have a run on the treadmill or work out in our well-equipped gym – it's free when staying with us." }, "internet": { "heading": "Internet", @@ -67,15 +67,15 @@ }, "laundry": { "heading": "Laundry", - "description": "Got laundry that needs taking care of? Just dial 9 for the reception, and we’ll take care of it." + "description": "Got laundry that needs taking care of? Just dial 9 for the reception, and we'll take care of it." }, "luggage": { "heading": "Luggage", - "description": "Do you need to store any luggage after check out? Speak to the reception and we’ll store it for you." + "description": "Do you need to store any luggage after check out? Speak to the reception and we'll store it for you." }, "shop": { "heading": "Shop", - "description": "When the craving sets in, there’s freshly brewed coffee and lighter meals in our shop to bring up to your room. You can also find necessities such as a toothbrush. \\r\\n \\r\\nOur shop is open around the clock, you will find it next to the reception." + "description": "When the craving sets in, there's freshly brewed coffee and lighter meals in our shop to bring up to your room. You can also find necessities such as a toothbrush. \\r\\n \\r\\nOur shop is open around the clock, you will find it next to the reception." }, "telephone": { "heading": "Telephone", @@ -94,7 +94,7 @@ }, "sustainability": { "heading": "Sustainability Information", - "description": "In 1993, Scandic decided to become a leader in sustainability and drive the development of sustainability in the hotel sector. It was at Scandic that the idea to “hang up your towel if you want to use it again” was formed – an idea that is now the standard in the hotel industry around the world. Sustainability is a part of our values – an integral element of all of the operations that Scandic’s team members manifest in daily work.", + "description": "In 1993, Scandic decided to become a leader in sustainability and drive the development of sustainability in the hotel sector. It was at Scandic that the idea to “hang up your towel if you want to use it again” was formed – an idea that is now the standard in the hotel industry around the world. Sustainability is a part of our values – an integral element of all of the operations that Scandic's team members manifest in daily work.", "link": "https://www.youtube.com/watch?v=0td9PfNfT1A" } }, diff --git a/types/components/hotelPage/sidepeek/restaurantBar.ts b/types/components/hotelPage/sidepeek/restaurantBar.ts index e774325a2..bbd0ba91a 100644 --- a/types/components/hotelPage/sidepeek/restaurantBar.ts +++ b/types/components/hotelPage/sidepeek/restaurantBar.ts @@ -1,15 +1,5 @@ import type { RestaurantData } from "@/types/hotel" -export enum DaysEnum { - Monday = "monday", - Tuesday = "tuesday", - Wednesday = "wednesday", - Thursday = "thursday", - Friday = "friday", - Saturday = "saturday", - Sunday = "sunday", -} - export interface RestaurantBarSidePeekProps { restaurants: RestaurantData[] } diff --git a/types/components/hotelReservation/bookingConfirmation/promos.ts b/types/components/hotelReservation/bookingConfirmation/promos.ts index 55f11c6a1..2d786d63c 100644 --- a/types/components/hotelReservation/bookingConfirmation/promos.ts +++ b/types/components/hotelReservation/bookingConfirmation/promos.ts @@ -1,4 +1,4 @@ -import { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation" +import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation" export interface PromosProps extends Pick< diff --git a/types/hotel.ts b/types/hotel.ts index 2435d8617..d22d04390 100644 --- a/types/hotel.ts +++ b/types/hotel.ts @@ -9,7 +9,6 @@ import type { } from "@/server/routers/hotels/output" import type { imageSchema } from "@/server/routers/hotels/schemas/image" import type { - restaurantDaySchema, restaurantOpeningHoursSchema, restaurantSchema, } from "@/server/routers/hotels/schemas/restaurants" @@ -34,7 +33,6 @@ export type RestaurantData = z.output export type RestaurantOpeningHours = z.output< typeof restaurantOpeningHoursSchema > -export type RestaurantOpeningHoursDay = z.output export type GalleryImage = z.infer export type CheckInData = z.infer
- {intl.formatMessage({ id: "Membership ID" })}: {membershipNumber} + {intl.formatMessage( + { id: "Membership ID: {id}" }, + { id: membershipNumber } + )} {intl.formatMessage( - { id: "Distance in km to city centre" }, + { id: "{number} km to city centre" }, { number: getSingleDecimal( hotel.location.distanceToCentre / 1000 diff --git a/components/BookingWidget/MobileToggleButton/index.tsx b/components/BookingWidget/MobileToggleButton/index.tsx index ce4513d58..f7229ae02 100644 --- a/components/BookingWidget/MobileToggleButton/index.tsx +++ b/components/BookingWidget/MobileToggleButton/index.tsx @@ -1,4 +1,5 @@ "use client" + import { useWatch } from "react-hook-form" import { useIntl } from "react-intl" @@ -34,13 +35,12 @@ export default function MobileToggleButton({ ? JSON.parse(decodeURIComponent(location)) : null - const nights = dt(d.toDate).diff(dt(d.fromDate), "days") - const selectedFromDate = dt(d.fromDate).locale(lang).format("D MMM") const selectedToDate = dt(d.toDate).locale(lang).format("D MMM") const locationAndDateIsSet = parsedLocation && d + const totalNights = dt(d.toDate).diff(dt(d.fromDate), "days") const totalRooms = rooms.length const totalAdults = rooms.reduce((acc, room) => { if (room.adults) { @@ -55,6 +55,32 @@ export default function MobileToggleButton({ return acc }, 0) + const totalNightsMsg = intl.formatMessage( + { id: "{totalNights, plural, one {# night} other {# nights}}" }, + { totalNights } + ) + + const totalAdultsMsg = intl.formatMessage( + { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, + { totalAdults } + ) + + const totalChildrenMsg = intl.formatMessage( + { id: "{totalChildren, plural, one {# child} other {# children}}" }, + { totalChildren } + ) + + const totalRoomsMsg = intl.formatMessage( + { id: "{totalRooms, plural, one {# room} other {# rooms}}" }, + { totalRooms } + ) + + const totalDetails = [totalAdultsMsg] + if (totalChildren > 0) { + totalDetails.push(totalChildrenMsg) + } + totalDetails.push(totalRoomsMsg) + return (
- {intl.formatMessage( - { id: "booking.nights" }, - { totalNights: nights } - )} + {totalNightsMsg} {parsedLocation?.name} - {`${selectedFromDate} - ${selectedToDate} (${intl.formatMessage( - { id: "booking.nights" }, - { totalNights: nights } - )}) ${intl.formatMessage({ id: "booking.adults" }, { totalAdults })}, ${ - totalChildren > 0 - ? intl.formatMessage( - { id: "booking.children" }, - { totalChildren } - ) + ", " - : "" - }${intl.formatMessage({ id: "booking.rooms" }, { totalRooms })}`} + {intl.formatMessage( + { + id: "{selectedFromDate} - {selectedToDate} ({totalNights}) {details}", + }, + { + selectedFromDate, + selectedToDate, + totalNights: totalNightsMsg, + details: totalDetails.join(", "), + } + )} - {intl.formatMessage({ id: "booking.nights" }, { totalNights: 0 })} + {intl.formatMessage( + { id: "{totalNights, plural, one {# night} other {# nights}}" }, + { totalNights: 0 } + )} {poi.distance} km + {intl.formatMessage( + { id: "{distanceInKm} km" }, + { distanceInKm: poi.distance } + )} + {nights > 0 ? intl.formatMessage( - { id: "booking.nights" }, + { + id: "{totalNights, plural, one {# night} other {# nights}}", + }, { totalNights: nights } ) : intl.formatMessage({ @@ -102,7 +104,10 @@ export function BookingWidgetFormContentSkeleton() {
- {intl.formatMessage({ id: "booking.nights" }, { totalNights: 0 })} + {intl.formatMessage( + { id: "{totalNights, plural, one {# night} other {# nights}}" }, + { totalNights: 0 } + )} {membershipLevel.name} - {membershipPoints} {intl.formatMessage({ id: "points" })} + {intl.formatMessage( + { id: "{pointsAmount, number} points" }, + { pointsAmount: membershipPoints } + )} - {hotel.address.streetAddress}, {hotel.address.city} - {addressStr} {intl.formatMessage( - { id: "Distance in km to city centre" }, + { id: "{number} km to city centre" }, { number: getSingleDecimal( hotel.location.distanceToCentre / 1000 @@ -45,7 +46,7 @@ export default async function HotelHeader({ hotelData }: HotelHeaderProps) { } )} {intl.formatMessage( { - id: "booking.terms", + id: "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.", }, { - paymentVerb, - termsLink: (str) => ( + termsAndConditionsLink: (str) => ( ), - privacyLink: (str) => ( + privacyPolicyLink: (str) => ( {formatPrice(intl, oldPrice, currency)} - {" "} + {formatPrice(intl, newPrice, currency)} diff --git a/components/HotelReservation/EnterDetails/SelectedRoom/ToggleSidePeek.tsx b/components/HotelReservation/EnterDetails/SelectedRoom/ToggleSidePeek.tsx index 7f22430d0..909c2ee48 100644 --- a/components/HotelReservation/EnterDetails/SelectedRoom/ToggleSidePeek.tsx +++ b/components/HotelReservation/EnterDetails/SelectedRoom/ToggleSidePeek.tsx @@ -28,7 +28,7 @@ export default function ToggleSidePeek({ intent="text" wrapping > - {intl.formatMessage({ id: "See room details" })}{" "} + {intl.formatMessage({ id: "See room details" })} ) diff --git a/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx b/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx index 7e222b789..3db090c20 100644 --- a/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx +++ b/components/HotelReservation/EnterDetails/SelectedRoom/index.tsx @@ -47,8 +47,16 @@ export default function SelectedRoom({ className={styles.description} color="uiTextHighContrast" > - {room.roomType}{" "} - {rateDescription} + {intl.formatMessage( + { id: "{roomType} {rateDescription}" }, + { + roomType: room.roomType, + rateDescription, + rate: (str) => { + return {str} + }, + } + )} - {intl.formatMessage({ id: "Total price" })}:{intl.formatMessage({ id: "Total price" })}
- {intl.formatMessage({ id: "booking.vat.incl" })} + {intl.formatMessage({ id: "Price including VAT" })} diff --git a/components/HotelReservation/EnterDetails/Summary/UI/index.tsx b/components/HotelReservation/EnterDetails/Summary/UI/index.tsx index 9c30c2775..b2fb6f0f4 100644 --- a/components/HotelReservation/EnterDetails/Summary/UI/index.tsx +++ b/components/HotelReservation/EnterDetails/Summary/UI/index.tsx @@ -107,7 +107,7 @@ export default function SummaryUI({ const diff = dt(booking.toDate).diff(booking.fromDate, "days") const nights = intl.formatMessage( - { id: "booking.nights" }, + { id: "{totalNights, plural, one {# night} other {# nights}}" }, { totalNights: diff } ) @@ -123,6 +123,22 @@ export default function SummaryUI({ } } + const adultsMsg = intl.formatMessage( + { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, + { totalAdults: adults } + ) + + const guestsParts = [adultsMsg] + if (children?.length) { + const childrenMsg = intl.formatMessage( + { + id: "{totalChildren, plural, one {# child} other {# children}}", + }, + { totalChildren: children.length } + ) + guestsParts.push(childrenMsg) + } + return (
@@ -157,17 +173,7 @@ export default function SummaryUI({
- {`${intl.formatMessage( - { id: "booking.adults" }, - { totalAdults: adults } - )}${ - children?.length - ? `, ${intl.formatMessage( - { id: "booking.children" }, - { totalChildren: children.length } - )}` - : "" - }`} + {guestsParts.join(", ")} {cancellationText} {intl.formatMessage({ id: "Based on availability" })} @@ -246,7 +255,12 @@ export default function SummaryUI({
- {`${intl.formatMessage({ id: "Extra bed (child)" })} × ${childBedExtraBed}`} + {intl.formatMessage( + { id: "Extra bed (child) × {count}" }, + { + count: childBedExtraBed, + } + )}
@@ -278,7 +292,9 @@ export default function SummaryUI({
{intl.formatMessage( - { id: "booking.adults" }, + { + id: "{totalAdults, plural, one {# adult} other {# adults}}", + }, { totalAdults: adults } )} {intl.formatMessage( - { id: "booking.children" }, + { + id: "{totalChildren, plural, one {# child} other {# children}}", + }, { totalChildren: children.length } )} - {intl.formatMessage({ id: "Approx." })}{" "} - {formatPrice( - intl, - totalPrice.requested.price, - totalPrice.requested.currency + {intl.formatMessage( + { id: "Approx. {value}" }, + { + value: formatPrice( + intl, + totalPrice.requested.price, + totalPrice.requested.currency + ), + } )} - {hotelData.address.streetAddress}, {hotelData.address.city} - {addressStr} @@ -112,7 +113,7 @@ function HotelCard({ color="burgundy" size="small" > - {hotelData.address.streetAddress}, {hotelData.address.city} + {addressStr} {intl.formatMessage( - { id: "Distance in km to city centre" }, + { id: "{number} km to city centre" }, { number: getSingleDecimal( hotelData.location.distanceToCentre / 1000 diff --git a/components/HotelReservation/HotelCardDialog/ListingHotelCardDialog/index.tsx b/components/HotelReservation/HotelCardDialog/ListingHotelCardDialog/index.tsx index 8860bafb9..2f8000baa 100644 --- a/components/HotelReservation/HotelCardDialog/ListingHotelCardDialog/index.tsx +++ b/components/HotelReservation/HotelCardDialog/ListingHotelCardDialog/index.tsx @@ -93,7 +93,13 @@ export default function ListingHotelCardDialog({ {publicPrice && memberPrice && / - {`${hotelAttributes.address.streetAddress}, ${hotelAttributes.address.city} ∙ ${getSingleDecimal(hotelAttributes.location.distanceToCentre / 1000)} ${intl.formatMessage({ id: "km to city center" })}`} + {intl.formatMessage( + { + id: "{address}, {city} ∙ {distanceToCityCentreInKm} km to city center", + }, + { + address: hotelAttributes.address.streetAddress, + city: hotelAttributes.address.city, + distanceToCityCentreInKm: getSingleDecimal( + hotelAttributes.location.distanceToCentre / 1000 + ), + } + )} {intl.formatMessage( - { id: "Room types available" }, - { numberOfRooms } + { + id: "{numberOfRooms, plural, one {# room type} other {# room types}} available", + }, + { + numberOfRooms, + } )} - {totalPublicRequestedPricePerNight}/ - {totalMemberRequestedPricePerNight}{" "} - {publicRequestedPrice.currency} + {intl.formatMessage( + { id: "{publicPrice}/{memberPrice} {currency}" }, + { + publicPrice: totalPublicRequestedPricePerNight, + memberPrice: totalMemberRequestedPricePerNight, + currency: publicRequestedPrice.currency, + } + )} {intl.formatMessage( { - id: "booking.guests", + id: "Max {max, plural, one {{range} guest} other {{range} guests}}", }, { max: totalOccupancy.max, range: totalOccupancy.range } )} @@ -159,9 +161,21 @@ export default function RoomCard({ {roomSize && ( {roomSize.min === roomSize.max - ? roomSize.min - : `${roomSize.min}-${roomSize.max}`} - m² + ? intl.formatMessage( + { id: "{roomSize} m²" }, + { + roomSize: roomSize.min, + } + ) + : intl.formatMessage( + { + id: "{roomSizeMin} - {roomSizeMax} m²", + }, + { + roomSizeMin: roomSize.min, + roomSizeMax: roomSize.max, + } + )} - {formatPrice(intl, price, currency)}/ - {intl.formatMessage({ id: "night" })} + {intl.formatMessage( + { id: "{price}/night" }, + { + price: formatPrice(intl, price, currency), + } + )} - {intl.formatMessage({ id: "Members" })}{" "} - {formatPrice(intl, membersPrice, currency)}/ - {intl.formatMessage({ id: "night" })} + {intl.formatMessage( + { id: "Members {price}/night" }, + { price: formatPrice(intl, membersPrice, currency) } + )} - {poi.distance} km + + {intl.formatMessage( + { id: "{distanceInKm} km" }, + { + distanceInKm: poi.distance, + } + )} + {intl.formatMessage( - { id: "Expires at the earliest" }, + { id: "Expires at the earliest {expirationDate}" }, { - date: dt(earliestExpirationDate) + expirationDate: dt(earliestExpirationDate) .locale(lang) .format("D MMM YYYY"), } )} - {intl.formatMessage({ - id: "Membership ID", - })}{" "} - {membershipNumber} + {intl.formatMessage( + { + id: "Membership ID {id}", + }, + { + id: membershipNumber, + } + )}