From 577eb45633a903b43cdd36cb7b56cbed49e26178 Mon Sep 17 00:00:00 2001 From: zojgame Date: Wed, 29 May 2024 16:13:16 +0500 Subject: [PATCH] translate 50% --- package.json | 2 + src/components/HintThreeDTour.tsx | 4 +- src/components/HouseItem.tsx | 47 ++- src/components/ImagesButton.tsx | 4 +- src/components/Layout.tsx | 15 +- src/components/LayoutButton.tsx | 4 +- src/components/LayoutToggle.tsx | 9 +- src/components/LoaderModal.tsx | 6 +- src/components/UnitList.tsx | 4 +- src/components/ViewToggle.tsx | 8 +- .../desktop/Appartment/ButtonPanel.tsx | 24 +- .../ControlHelpModal/ControlHelpModal.tsx | 6 +- .../ControlHelpModal/LookAroundButton.tsx | 5 +- .../StartThreeDTourHelpModal.tsx | 15 +- .../ControlHelpModal/ThreeDTourHelpModal.tsx | 17 +- .../ControlHelpModal/TouchScreenHelpModal.tsx | 10 +- .../Appartment/ParameterDescription.tsx | 16 +- .../mobile/Appartment/ButtonPanel.tsx | 2 +- src/components/mobile/Main/HouseListModal.tsx | 4 +- src/components/mobile/Main/KnowMoreButton.tsx | 14 +- .../mobile/Main/ViewOnMapButton.tsx | 12 +- src/consts/loading.ts | 14 +- src/languages/arabian/translation.json | 43 +++ src/languages/english/translation.json | 42 +++ src/languages/i18n.ts | 20 ++ src/main.tsx | 15 +- src/pages/Desktop/DesktopMainPage.tsx | 8 +- yarn.lock | 276 ++++++++++++++---- 28 files changed, 505 insertions(+), 141 deletions(-) create mode 100644 src/languages/arabian/translation.json create mode 100644 src/languages/english/translation.json create mode 100644 src/languages/i18n.ts diff --git a/package.json b/package.json index 169883c..b44ed1f 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "@heroicons/react": "^2.1.1", "@react-spring/web": "^9.7.3", "@use-gesture/react": "^10.3.0", + "i18next": "^23.11.5", "react": "^18.2.0", "react-device-detect": "^2.2.3", "react-dom": "^18.2.0", "react-full-screen": "^1.1.1", + "react-i18next": "^14.1.2", "react-router-dom": "^6.21.3", "react-swipeable": "^7.0.1", "react-unity-webgl": "^9.5.0", diff --git a/src/components/HintThreeDTour.tsx b/src/components/HintThreeDTour.tsx index 0ff10d4..1070f1a 100644 --- a/src/components/HintThreeDTour.tsx +++ b/src/components/HintThreeDTour.tsx @@ -1,5 +1,6 @@ import PedestrianIcon from "../icons/Pedestrianicon"; import CrossIcon from "../icons/CrossIcon"; +import { useTranslation } from "react-i18next"; type HintThreeDTourProps = { isMobile?: boolean; @@ -12,6 +13,7 @@ const HintThreeDTour = ({ className, onClose, }: HintThreeDTourProps) => { + const [t] = useTranslation(); return (
-

Choose a room to start the 3D tour

+

{t("Choose a room to start the 3D tour")}

{onClose && (
diff --git a/src/components/HouseItem.tsx b/src/components/HouseItem.tsx index 5437d7a..6e78cb6 100644 --- a/src/components/HouseItem.tsx +++ b/src/components/HouseItem.tsx @@ -1,9 +1,9 @@ +import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import useStore from "../store/store"; import { Villa } from "../types/appartment"; import KnowMoreButton from "./mobile/Main/KnowMoreButton"; import ViewOnMapButton from "./mobile/Main/ViewOnMapButton"; - type HouseItemProps = { villa: Villa; }; @@ -11,6 +11,7 @@ type HouseItemProps = { const HouseItem = ({ villa }: HouseItemProps) => { const { setSelectedOnMapVilla, setModal, selectedOnMapVilla } = useStore(); const navigate = useNavigate(); + const [t, i18n] = useTranslation(); const handleOnViewOnMapClick = () => { setSelectedOnMapVilla(villa); @@ -18,12 +19,16 @@ const HouseItem = ({ villa }: HouseItemProps) => { const handleOnKnowMoreButton = () => { setModal(null); - navigate(`../en/villa/${villa.type}`); + navigate(`${villa.type}`); }; return (
-
+
{villa?.perspectiveWorkings[0]?.image && ( @@ -36,24 +41,40 @@ const HouseItem = ({ villa }: HouseItemProps) => { )}
-
-
-

Type

-

Plot area, m2

-

Unit area, m2

-

Bedrooms

-

Villa Theme

+
+
+

{t("Type")}

+

{t("PlotArea")}

+

{t("UnitArea")}

+

{t("Bedrooms")}

+

{t("VillaTheme")}

-
+
{villa.type}
{villa.plotArea}
{villa.totalBuildUpArea}
{villa.totalCountBedroms}
-
{villa.villaTheme}
+
{t(`${villa.villaTheme}`)}
-
+
{ + const [t] = useTranslation(); return ( ); }; diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 29019b5..fbfa6bb 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,11 +1,24 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { FullScreen, useFullScreenHandle } from "react-full-screen"; import { useEffect } from "react"; -import { Outlet } from "react-router-dom"; +import { Outlet, useParams } from "react-router-dom"; import useStore from "../store/store"; +import { useTranslation } from "react-i18next"; + +const languages = ["ar", "en"]; const Layout = () => { const { loader, setOnFullscreen, modal, hintModal } = useStore(); const onFullscreenHandle = useFullScreenHandle(); + const { lang } = useParams(); + const [, i18n] = useTranslation(); + + useEffect(() => { + console.log("lang", lang); + if (lang && languages.includes(lang)) { + i18n.changeLanguage(lang); + } + }, [i18n, lang]); useEffect(() => { setOnFullscreen(onFullscreenHandle); diff --git a/src/components/LayoutButton.tsx b/src/components/LayoutButton.tsx index e5adb1d..5113d88 100644 --- a/src/components/LayoutButton.tsx +++ b/src/components/LayoutButton.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import LayoutIcon from "../icons/LayoutIcon"; type LayoutButtonProps = { @@ -5,13 +6,14 @@ type LayoutButtonProps = { }; const LayoutButton = ({ onClick }: LayoutButtonProps) => { + const [t] = useTranslation(); return ( ); }; diff --git a/src/components/LayoutToggle.tsx b/src/components/LayoutToggle.tsx index 1c86426..39228d0 100644 --- a/src/components/LayoutToggle.tsx +++ b/src/components/LayoutToggle.tsx @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; + type LayoutToggleProps = { currentView: number; setCurrentView: React.Dispatch>; @@ -9,6 +11,7 @@ const LayoutToggle = ({ setCurrentView, className, }: LayoutToggleProps) => { + const [t] = useTranslation(); return (
setCurrentView(1)} > {" "} - Ground Floor + {t("GroundFloor")}
setCurrentView(2)} > {" "} - First Floor + {t("FirstFloor")}
setCurrentView(3)} > {" "} - Parking + {t("Parking")}
diff --git a/src/components/LoaderModal.tsx b/src/components/LoaderModal.tsx index a24d709..544fa77 100644 --- a/src/components/LoaderModal.tsx +++ b/src/components/LoaderModal.tsx @@ -4,6 +4,7 @@ import { loadingMessages } from "../consts/loading"; import { isDesktop } from "react-device-detect"; import { useParams } from "react-router-dom"; import useStore from "../store/store"; +import { useTranslation } from "react-i18next"; type LoaderModalProps = { isSimleLoader?: boolean; @@ -12,6 +13,7 @@ type LoaderModalProps = { const LoaderModal = ({ isSimleLoader = false }: LoaderModalProps) => { const { villaTitle } = useParams(); const { villaLoadStatus } = useStore(); + const isMapDesktopModal = !villaTitle && isDesktop; return ( @@ -32,6 +34,8 @@ const LoaderModal = ({ isSimleLoader = false }: LoaderModalProps) => { const LoaderModalWithMessage = () => { const [offset, setOffset] = useState(0); + const [t] = useTranslation(); + useEffect(() => { const interval = setInterval(() => { setOffset((prev) => { @@ -52,7 +56,7 @@ const LoaderModalWithMessage = () => { > {loadingMessages.map((message) => (
- {message.value} + {t(`${message.value}`)}
))}
diff --git a/src/components/UnitList.tsx b/src/components/UnitList.tsx index 3c8b9c0..9d85046 100644 --- a/src/components/UnitList.tsx +++ b/src/components/UnitList.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { Units } from "../types/appartment"; type UnitListProps = { @@ -6,6 +7,7 @@ type UnitListProps = { }; const UnitList = ({ units, startIndex = 0 }: UnitListProps) => { + const [t] = useTranslation(); return (
@@ -25,7 +27,7 @@ const UnitList = ({ units, startIndex = 0 }: UnitListProps) => { >
{startIndex + index + 1}
-
{unit.title}
+
{t(`${unit.title}`)}
{unit.value}
diff --git a/src/components/ViewToggle.tsx b/src/components/ViewToggle.tsx index 42dd217..5a189a5 100644 --- a/src/components/ViewToggle.tsx +++ b/src/components/ViewToggle.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import useStore from "../store/store"; type ViewSwitcherProps = { @@ -7,6 +8,7 @@ type ViewSwitcherProps = { const ViewToggle = ({ offset, isDesktop }: ViewSwitcherProps) => { const { sendMessageToUnity, setCurrentView, currentView } = useStore(); + const [t] = useTranslation(); const handleOnFirstClick = () => { setCurrentView(1); @@ -62,7 +64,7 @@ const ViewToggle = ({ offset, isDesktop }: ViewSwitcherProps) => { } py-2 px-3 text-[14px] w-full sm:w-fit rounded-[32px]`} > {" "} - Outdoor + {t("Outdoor")}
{ } py-2 px-3 w-full sm:w-fit rounded-[32px] `} > {" "} - Ground Floor + {t("GroundFloor")}
{ } py-2 px-3 w-full sm:w-fit rounded-[32px] `} > {" "} - First Floor + {t("FirstFloor")}
diff --git a/src/components/desktop/Appartment/ButtonPanel.tsx b/src/components/desktop/Appartment/ButtonPanel.tsx index 9584aef..a960419 100644 --- a/src/components/desktop/Appartment/ButtonPanel.tsx +++ b/src/components/desktop/Appartment/ButtonPanel.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import { useNavigate, useLocation } from "react-router-dom"; import { FullScreenHandle } from "react-full-screen"; import { useState } from "react"; @@ -12,6 +13,7 @@ import LayoutModal from "./LayoutModal"; import ImagesModal from "./ImagesModal"; import HintThreeDTour from "../../HintThreeDTour"; import ModalAnimationContainer from "./ModalAnimationContainer"; +import { useTranslation } from "react-i18next"; type ButtonPanelProps = { handleFullscreen: FullScreenHandle | null; @@ -19,6 +21,7 @@ type ButtonPanelProps = { const ButtonPanel = ({ handleFullscreen }: ButtonPanelProps) => { const { setModal, is3DTour, currentView, setModalAnimation } = useStore(); + const [_, i18n] = useTranslation(); const [isFullMode, setIsFullMode] = useState(false); @@ -56,14 +59,24 @@ const ButtonPanel = ({ handleFullscreen }: ButtonPanelProps) => { }; return ( -
-
+
+
{currentView !== 1 && !is3DTour && }
-
+
{ const location = useLocation(); const isHistoryEmpty = location.key === "default"; const navigate = useNavigate(); + const { t } = useTranslation(); const handleOnMapClick = () => { - navigate("../en"); + navigate(-1); }; const handleOnBackClick = () => { @@ -110,7 +124,7 @@ const GoBackButton = () => { ) : ( )} diff --git a/src/components/desktop/Appartment/ControlHelpModal/ControlHelpModal.tsx b/src/components/desktop/Appartment/ControlHelpModal/ControlHelpModal.tsx index d34e463..0fbf68a 100644 --- a/src/components/desktop/Appartment/ControlHelpModal/ControlHelpModal.tsx +++ b/src/components/desktop/Appartment/ControlHelpModal/ControlHelpModal.tsx @@ -5,12 +5,14 @@ import useStore from "../../../../store/store"; import StartThreeDTourHelpModal from "./StartThreeDTourHelpModal"; import ThreeDTourHelpModal from "./ThreeDTourHelpModal"; import TouchScreenHelpModal from "./TouchScreenHelpModal"; +import { useTranslation } from "react-i18next"; -const views = ["Outdoor", "Ground Floor", "First Floor"]; +const views = ["Outdoor", "GroundFloor", "FirstFloor"]; const ControlHelpModal = () => { const { currentView, setModal, is3DTour } = useStore(); - const currentViewTitle = views[currentView - 1]; + const [t] = useTranslation(); + const currentViewTitle = t(`${views[currentView - 1]}`); const handleOnCloseClick = () => { setModal(null); }; diff --git a/src/components/desktop/Appartment/ControlHelpModal/LookAroundButton.tsx b/src/components/desktop/Appartment/ControlHelpModal/LookAroundButton.tsx index a6c642b..b1c3578 100644 --- a/src/components/desktop/Appartment/ControlHelpModal/LookAroundButton.tsx +++ b/src/components/desktop/Appartment/ControlHelpModal/LookAroundButton.tsx @@ -1,14 +1,17 @@ +import { useTranslation } from "react-i18next"; + type LookAroundButtonProps = { onClick: () => void; }; const LookAroundButton = ({ onClick }: LookAroundButtonProps) => { + const [t] = useTranslation(); return ( ); }; diff --git a/src/components/desktop/Appartment/ControlHelpModal/StartThreeDTourHelpModal.tsx b/src/components/desktop/Appartment/ControlHelpModal/StartThreeDTourHelpModal.tsx index cedfec1..8844b46 100644 --- a/src/components/desktop/Appartment/ControlHelpModal/StartThreeDTourHelpModal.tsx +++ b/src/components/desktop/Appartment/ControlHelpModal/StartThreeDTourHelpModal.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import MouseIcon from "../../../../icons/MouseIcon"; import PedestrianIcon from "../../../../icons/Pedestrianicon"; import CrossButton from "../../../CrossButton"; @@ -12,6 +13,7 @@ const StartThreeDTourHelpModal = ({ onClick, currentViewTitle, }: StartThreeDTourHelpModalProps) => { + const [t] = useTranslation(); return (
@@ -22,23 +24,20 @@ const StartThreeDTourHelpModal = ({
-

Control Help

+

+ {t("ControlHelp")} +

{" "}
-
- Click and hold the left mouse -
button to look around -
+
{t("ClickAndHoldTheLeftMouseButtonToLookAround")}
{" "}
-
- Select an available point
to start the 3D tour -
+
{t("SelectAnAvailablePointToStartThe3DTour")}
diff --git a/src/components/desktop/Appartment/ControlHelpModal/ThreeDTourHelpModal.tsx b/src/components/desktop/Appartment/ControlHelpModal/ThreeDTourHelpModal.tsx index 69791d1..0cf6fe7 100644 --- a/src/components/desktop/Appartment/ControlHelpModal/ThreeDTourHelpModal.tsx +++ b/src/components/desktop/Appartment/ControlHelpModal/ThreeDTourHelpModal.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import CursorIcon from "../../../../icons/CursorIcon"; import MouseIcon from "../../../../icons/MouseIcon"; import CrossButton from "../../../CrossButton"; @@ -12,6 +13,7 @@ const ThreeDTourHelpModal = ({ onClick, currentViewTitle, }: ThreeDTourHelpModalProps) => { + const [t] = useTranslation(); return (
@@ -22,24 +24,23 @@ const ThreeDTourHelpModal = ({
-

Control Help

+

+ {t("ControlHelp")} +

{" "}
-
- Click and hold the left mouse -
button to look around -
+
{t("ClickAndHoldTheLeftMouseButtonToLookAround")}
- {/* {" "} */} {" "}
- Place the cursor on a section of the floor and click the left - mouse button to move around the 3D scene + {t( + "PlaceTheCursorOnASectionOfTheFloorAndClickTheLeftMouseButtonToMoveAroundThe3DScene" + )}
diff --git a/src/components/desktop/Appartment/ControlHelpModal/TouchScreenHelpModal.tsx b/src/components/desktop/Appartment/ControlHelpModal/TouchScreenHelpModal.tsx index ce2450e..3053483 100644 --- a/src/components/desktop/Appartment/ControlHelpModal/TouchScreenHelpModal.tsx +++ b/src/components/desktop/Appartment/ControlHelpModal/TouchScreenHelpModal.tsx @@ -2,6 +2,7 @@ import TouchIcon from "../../../../icons/TouchIcon"; import RotateIcon from "../../../../icons/RotateIcon"; import CrossButton from "../../../CrossButton"; import LookAroundButton from "./LookAroundButton"; +import { useTranslation } from "react-i18next"; type TouchScreenHelpModalProps = { onClick: () => void; @@ -12,6 +13,7 @@ const TouchScreenHelpModal = ({ onClick, currentViewTitle, }: TouchScreenHelpModalProps) => { + const [t] = useTranslation(); return (
@@ -22,18 +24,20 @@ const TouchScreenHelpModal = ({
-

Control Help

+

+ {t("ControlHelp")} +

{" "}
-
Press the floor to move in 3D space
+
{t("PressTheFloorToMoveIn3DSpace")}
{" "}
-
Rotate the camera by swiping the screen
+
{t("RotateTheCameraBySwipingTheScreen")}
diff --git a/src/components/desktop/Appartment/ParameterDescription.tsx b/src/components/desktop/Appartment/ParameterDescription.tsx index efa0993..5421ebc 100644 --- a/src/components/desktop/Appartment/ParameterDescription.tsx +++ b/src/components/desktop/Appartment/ParameterDescription.tsx @@ -1,7 +1,9 @@ +import { useTranslation } from "react-i18next"; import useStore from "../../../store/store"; const ParameterDescription = () => { const { currentVilla } = useStore(); + const [t] = useTranslation(); return (
@@ -11,26 +13,22 @@ const ParameterDescription = () => {
-
Villa Theme
-
{currentVilla && currentVilla.villaTheme}
+
{t("VillaTheme")}
+
{t(`${currentVilla && currentVilla.villaTheme}`)}
-
Total no. of Bedrooms
+
{t("Total no. of Bedrooms")}
{currentVilla && currentVilla.totalCountBedroms}
-
- Plot area, m2 -
+
{t("PlotArea")}
{currentVilla && currentVilla.plotArea}
-
- Total Build up Area, m2 -
+
{t("Total Build up Area, m 2")}
{currentVilla && currentVilla.totalBuildUpArea}
diff --git a/src/components/mobile/Appartment/ButtonPanel.tsx b/src/components/mobile/Appartment/ButtonPanel.tsx index 3a85ae5..92edc28 100644 --- a/src/components/mobile/Appartment/ButtonPanel.tsx +++ b/src/components/mobile/Appartment/ButtonPanel.tsx @@ -52,7 +52,7 @@ const GoBackButton = () => { const navigate = useNavigate(); const handleOnMapClick = () => { - navigate("../en"); + navigate(-1); }; const handleOnBackClick = () => { diff --git a/src/components/mobile/Main/HouseListModal.tsx b/src/components/mobile/Main/HouseListModal.tsx index f52dc18..30d58cd 100644 --- a/src/components/mobile/Main/HouseListModal.tsx +++ b/src/components/mobile/Main/HouseListModal.tsx @@ -1,10 +1,12 @@ import MainPagePanel from "./MainPagePanel"; import HouseList from "./HouseList"; +import { useTranslation } from "react-i18next"; const HouseListModal = () => { + const [t] = useTranslation(); return (
- +
); diff --git a/src/components/mobile/Main/KnowMoreButton.tsx b/src/components/mobile/Main/KnowMoreButton.tsx index 59b089c..4295bdd 100644 --- a/src/components/mobile/Main/KnowMoreButton.tsx +++ b/src/components/mobile/Main/KnowMoreButton.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import ArrowIcon from "../../../icons/ArrowIcon"; type KnowMoreButtonProps = { @@ -5,13 +6,20 @@ type KnowMoreButtonProps = { }; const KnowMoreButton = ({ onClick }: KnowMoreButtonProps) => { + const [t, i18n] = useTranslation(); return ( ); }; diff --git a/src/components/mobile/Main/ViewOnMapButton.tsx b/src/components/mobile/Main/ViewOnMapButton.tsx index 2deb3de..6603845 100644 --- a/src/components/mobile/Main/ViewOnMapButton.tsx +++ b/src/components/mobile/Main/ViewOnMapButton.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import ViewOnMapIcon from "../../../icons/ViewOnMapIcon"; type ViewOnMapProps = { @@ -6,14 +7,17 @@ type ViewOnMapProps = { }; const ViewOnMapButton = ({ onClick, isVillaSelected }: ViewOnMapProps) => { + const [t, i18n] = useTranslation(); return ( ); diff --git a/src/consts/loading.ts b/src/consts/loading.ts index 7c30fa0..6dbd8ee 100644 --- a/src/consts/loading.ts +++ b/src/consts/loading.ts @@ -1,9 +1,9 @@ const loadingMessages = [ - { id: 1, value: "looking for a villa" }, - { id: 2, value: "building the walls" }, - { id: 3, value: "installing the roof" }, - { id: 4, value: "arranging the furniture" }, - { id: 5, value: "preparing the villa for showing" }, - ]; + { id: 1, value: "LookingForAVilla" }, + { id: 2, value: "BuildingTheWalls" }, + { id: 3, value: "InstallingTheRoof" }, + { id: 4, value: "ArrangingTheFurniture" }, + { id: 5, value: "PreparingTheVillaForShowing" }, +]; - export {loadingMessages} \ No newline at end of file +export { loadingMessages }; diff --git a/src/languages/arabian/translation.json b/src/languages/arabian/translation.json new file mode 100644 index 0000000..11c6ea0 --- /dev/null +++ b/src/languages/arabian/translation.json @@ -0,0 +1,43 @@ +{ + "ViewOnMap": "العرض على الخريطة", + "KnowMore": "تعرف أكثر", + "Type": "النوع", + "PlotArea": "مساحة الأرض (متر مربع)", + "UnitArea": "مساحة الفيلا (متر مربع)", + "Bedrooms": "غرف النوم", + "VillaTheme": "تصميم واجهة الفيلا", + "Traditional": "تقليدي", + "Modern": "حديث", + "SelectAHouse": "اختر فيلا", + "LookingForAVilla": "جاري تحميل نموذج الفيلا ..", + "BuildingTheWalls": "جاري بناء الجدران ..", + "InstallingTheRoof": "جاري تركيب السقف..", + "ArrangingTheFurniture": "جاري ترتيب الأثاث..", + "PreparingTheVillaForShowing": "جاري تجهيز الفيلا للعرض..", + "Images": "الصور", + "Layout": "المخطط", + "Outdoor": "خارج الفيلا", + "ControlHelp": "تعليمات التحكم", + "ClickAndHoldTheLeftMouseButtonToLookAround": "استمر بالضغط على زر الماوس الأيسر لتحريك المشهد", + "SelectAnAvailablePointToStartThe3DTour": "قم باختيار نقطة متاحة لبدء الجولة ثلاثية الأبعاد", + "LookAround": "انظر حولك", + "Map": "الخريطة", + "GroundFloor": "الطابق الأرضي", + "FirstFloor": "الطابق الأول", + "PressTheFloorToMoveIn3DSpace": "أنقر على الأرض للتنقل من مكان لأخر", + "RotateTheCameraBySwipingTheScreen": "حرك الشاشة بأصبعك نحو اليمين أو اليسار لتحريك المشهد", + "PlaceTheCursorOnASectionOfTheFloorAndClickTheLeftMouseButtonToMoveAroundThe3DScene": "ضع المؤشر على جزء من الأرضية وانقر زر الماوس الأيسر للتنقل داخل المشهد ثلاثي الأبعاد", + "Parking": "موقف السيارات", + "Choose a room to start the 3D tour": "اختر غرفة لبدء الجولة ثلاثية الأبعاد", + "Total no. of Bedrooms": "عدد غرف النوم", + "Total Build up Area, m 2": "Total Build up Area, m 2", + "Unit": "Unit", + "Area (m)": "Area (m)", + "Entrance": "المدخل", + "Living Room": "غرفة المعيشة", + "Dining Room": "غرفة الطعام", + "Terrace 1": "شرفة 1", + "Terrace 2": "شرفة 2", + "Store 1": "متجر 1", + "Mens Majilas": "مجلس الرجال" +} diff --git a/src/languages/english/translation.json b/src/languages/english/translation.json new file mode 100644 index 0000000..725fcee --- /dev/null +++ b/src/languages/english/translation.json @@ -0,0 +1,42 @@ +{ + "ViewOnMap": "View on Map", + "KnowMore": "Know more", + "Type": "Type", + "PlotArea": "Plot area, m2", + "UnitArea": "Unit area, m2", + "Bedrooms": "Bedrooms", + "VillaTheme": "Villa Theme", + "Traditional": "Traditional", + "Modern": "Modern", + "SelectAHouse": "Select A House", + "LookingForAVilla": "looking for a villa", + "BuildingTheWalls": "building the walls", + "InstallingTheRoof": "installing the roof", + "ArrangingTheFurniture": "arranging the furniture", + "PreparingTheVillaForShowing": "preparing the villa for showing", + "Images": "Images", + "Layout": "Layout", + "Outdoor": "Outdoor", + "ControlHelp": "Control Help", + "ClickAndHoldTheLeftMouseButtonToLookAround": "Click and hold the left mouse button to look around", + "SelectAnAvailablePointToStartThe3DTour": "Select an available point to start the 3D tour", + "LookAround": "Look around", + "Map": "Map", + "GroundFloor": "Ground Floor", + "FirstFloor": "First Floor", + "PressTheFloorToMoveIn3DSpace": "Press the floor to move in 3D space", + "RotateTheCameraBySwipingTheScreen": "Rotate the camera by swiping the screen", + "PlaceTheCursorOnASectionOfTheFloorAndClickTheLeftMouseButtonToMoveAroundThe3DScene": "Place the cursor on a section of the floor and click the left mouse button to move around the 3D scene", + "Parking": "Parking", + "Choose a room to start the 3D tour": "Choose a room to start the 3D tour", + "Total no. of Bedrooms": "Total no. of Bedrooms", + "Total Build up Area, m 2": "Total Build up Area, m 2", + "Unit": "Unit", + "Area (m)": "Area (m)", + "Entrance": "Entrance", + "Living Room": "Living Room", + "Dining Room": "Dinning Room", + "Terrace 1": "Terrace 1", + "Store 1": "Store 1", + "Mens Majilas": "Mens Majilas" +} diff --git a/src/languages/i18n.ts b/src/languages/i18n.ts new file mode 100644 index 0000000..d91754e --- /dev/null +++ b/src/languages/i18n.ts @@ -0,0 +1,20 @@ +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import translationEn from "../languages/english/translation.json"; +import translationAr from "../languages/arabian/translation.json"; + +const resources = { + en: { translation: translationEn }, + ar: { translation: translationAr }, +}; + +i18n.use(initReactI18next).init({ + resources, + lng: "en", + + interpolation: { + escapeValue: false, + }, +}); + +export default i18n; diff --git a/src/main.tsx b/src/main.tsx index e8bbcb5..e3def80 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,32 +4,25 @@ import MainPage from "./pages/MainPage"; import ApartmentPage from "./pages/ApartmentPage"; import "./index.css"; import Layout from "./components/Layout"; +import "./languages/i18n"; const router = createBrowserRouter([ { - path: "/", + path: "/:lang/", element: , children: [ { - path: "en/:villaTitle", + path: ":villaTitle", element: , }, { - path: "en/", + index: true, element: , }, ], }, ]); -//arabian -//villa/:villaTitle -// - -//english -//en/villa/:villaTitle -//en - ReactDOM.createRoot(document.getElementById("root")!).render( ); diff --git a/src/pages/Desktop/DesktopMainPage.tsx b/src/pages/Desktop/DesktopMainPage.tsx index 02f6bbe..d415cb5 100644 --- a/src/pages/Desktop/DesktopMainPage.tsx +++ b/src/pages/Desktop/DesktopMainPage.tsx @@ -1,11 +1,17 @@ +import { useTranslation } from "react-i18next"; import MapComponent from "../../components/Map/Map"; import HouseList from "../../components/desktop/Main/HouseList"; const DesktopMainPage = () => { + const [, i18n] = useTranslation(); return ( <> -
+
diff --git a/yarn.lock b/yarn.lock index 0e12799..84b75a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,6 +26,118 @@ luxon "~3.4.3" sortablejs "~1.15.0" +"@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" + integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== + dependencies: + regenerator-runtime "^0.14.0" + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz" @@ -192,7 +304,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -264,6 +376,51 @@ resolved "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz" integrity sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng== +"@swc/core-darwin-arm64@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.105.tgz#2960f8a87aed01b3850d5c37f05b51d9d3747141" + integrity sha512-buWeweLVDXXmcnfIemH4PGnpjwsDTUGitnPchdftb0u1FU8zSSP/lw/pUCBDG/XvWAp7c/aFxgN4CyG0j7eayA== + +"@swc/core-darwin-x64@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.105.tgz#aaa502f902dec1e4735a0a37a4fcc3a2c0369882" + integrity sha512-hFmXPApqjA/8sy/9NpljHVaKi1OvL9QkJ2MbbTCCbJERuHMpMUeMBUWipHRfepGHFhU+9B9zkEup/qJaJR4XIg== + +"@swc/core-linux-arm-gnueabihf@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.105.tgz#5a8629c75db4fe298ca3fdb18ecbc7888cd34759" + integrity sha512-mwXyMC41oMKkKrPpL8uJpOxw7fyfQoVtIw3Y5p0Blabk+espNYqix0E8VymHdRKuLmM//z5wVmMsuHdGBHvZeg== + +"@swc/core-linux-arm64-gnu@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.105.tgz#9cae768a92944774511a569dffca45f1beab7cdd" + integrity sha512-H7yEIVydnUtqBSUxwmO6vpIQn7j+Rr0DF6ZOORPyd/SFzQJK9cJRtmJQ3ZMzlJ1Bb+1gr3MvjgLEnmyCYEm2Hg== + +"@swc/core-linux-arm64-musl@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.105.tgz#9244aabe4a7884d3d81df707d3e3c3478953a454" + integrity sha512-Jg7RTFT3pGFdGt5elPV6oDkinRy7q9cXpenjXnJnM2uvx3jOwnsAhexPyCDHom8SHL0j+9kaLLC66T3Gz1E4UA== + +"@swc/core-linux-x64-gnu@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.105.tgz#7fde7b8a2ab7f5152e2dc37abf95f9add2c46937" + integrity sha512-DJghplpyusAmp1X5pW/y93MmS/u83Sx5GrpJxI6KLPa82+NItTgMcl8KBQmW5GYAJpVKZyaIvBanS5TdR8aN2w== + +"@swc/core-linux-x64-musl@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.105.tgz#a8d96fc532427f353696283c70ae13e7fcc18358" + integrity sha512-wD5jL2dZH/5nPNssBo6jhOvkI0lmWnVR4vnOXWjuXgjq1S0AJpO5jdre/6pYLmf26hft3M42bteDnjR4AAZ38w== + +"@swc/core-win32-arm64-msvc@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.105.tgz#35edc1d898d7e9994fd6986b4c0085b3f1d59ec5" + integrity sha512-UqJtwILUHRw2+3UTPnRkZrzM/bGdQtbR4UFdp79mZQYfryeOUVNg7aJj/bWUTkKtLiZ3o+FBNrM/x2X1mJX5bA== + +"@swc/core-win32-ia32-msvc@1.3.105": + version "1.3.105" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.105.tgz#5e538fd63b648d8c5bf9c22371c5e273c208f961" + integrity sha512-Z95C6vZgBEJ1snidYyjVKnVWiy/ZpPiIFIXGWkDr4ZyBgL3eZX12M6LzZ+NApHKffrbO4enbFyFomueBQgS2oA== + "@swc/core-win32-x64-msvc@1.3.105": version "1.3.105" resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.105.tgz" @@ -322,7 +479,7 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@^20.11.20", "@types/node@>= 14": +"@types/node@^20.11.20": version "20.11.20" resolved "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz" integrity sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg== @@ -341,7 +498,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.15", "@types/react@>=16.8": +"@types/react@*", "@types/react@^18.2.15": version "18.2.48" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz" integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== @@ -377,7 +534,7 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^6.0.0", "@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha": +"@typescript-eslint/parser@^6.0.0": version "6.19.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz" integrity sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow== @@ -480,7 +637,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: +acorn@^8.9.0: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -589,7 +746,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.22.2, "browserslist@>= 4.21.0": +browserslist@^4.22.2: version "4.22.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz" integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== @@ -831,7 +988,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.45.0, eslint@>=7: +eslint@^8.45.0: version "8.56.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== @@ -977,7 +1134,7 @@ flatted@^3.2.9: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -focus-trap@~7.5.3, focus-trap@7.5.4: +focus-trap@7.5.4, focus-trap@~7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz" integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w== @@ -1007,6 +1164,11 @@ fscreen@^1.0.2: resolved "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz" integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -1085,6 +1247,20 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + +i18next@^23.11.5: + version "23.11.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" + integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== + dependencies: + "@babel/runtime" "^7.23.2" + ignore@^5.2.0, ignore@^5.2.4: version "5.3.0" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz" @@ -1292,6 +1468,13 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -1299,20 +1482,6 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.0.4" resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" @@ -1504,7 +1673,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31, postcss@>=8.0.9: +postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31: version "8.4.33" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== @@ -1535,7 +1704,7 @@ react-device-detect@^2.2.3: dependencies: ua-parser-js "^1.0.33" -"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18.2.0, "react-dom@>= 0.14.0", react-dom@>=16.8: +react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -1550,6 +1719,14 @@ react-full-screen@^1.1.1: dependencies: fscreen "^1.0.2" +react-i18next@^14.1.2: + version "14.1.2" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.2.tgz#cd57a755f25a32a5fcc3dbe546cf3cc62b4f3ebd" + integrity sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg== + dependencies: + "@babel/runtime" "^7.23.9" + html-parse-stringify "^3.0.1" + react-router-dom@^6.21.3: version "6.21.3" resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz" @@ -1575,7 +1752,7 @@ react-unity-webgl@^9.5.0: resolved "https://registry.npmjs.org/react-unity-webgl/-/react-unity-webgl-9.5.0.tgz" integrity sha512-zmTffL2S7QL1g2DQem0/HzxhJaEQ3L4aEV4VUlQOkZc4JzMjScrqGVvHc4AnyMz94vVQqlbHwNfq4YhJEEGzQg== -"react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.3 || ^17 || ^18", react@^18.2.0, "react@>= 0.14.0", "react@>= 16", "react@>= 16.8.0", react@>=16.8, react@>=16.8.0: +react@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -1596,6 +1773,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -1679,31 +1861,22 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -sortablejs@~1.15.0: - version "1.15.2" - resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz" - integrity sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA== - sortablejs@1.15.0: version "1.15.0" resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz" integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w== +sortablejs@~1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz" + integrity sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA== + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -1721,14 +1894,7 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -1805,9 +1971,10 @@ tailwindcss@^3.3.5: resolve "^1.22.2" sucrase "^3.32.0" -"test-kit-12@file:../kit": +test-kit-12@^1.0.0: version "1.0.0" - resolved "file:../kit" + resolved "https://registry.yarnpkg.com/test-kit-12/-/test-kit-12-1.0.0.tgz#33b4b4f4d278e2efc2e3d48fa0913380ab1cfa49" + integrity sha512-Ixz8IQ3aGEi7jkTi+oGaaxKAKfLqDAOqfpwjhgTdwSKUYb0IJ+jYle+d9L549VbcH5a8mtuUosRNmOf5CWvD5Q== text-table@^0.2.0: version "0.2.0" @@ -1862,7 +2029,7 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^5.0.2, typescript@>=4.2.0: +typescript@^5.0.2: version "5.3.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== @@ -1902,7 +2069,7 @@ util-deprecate@^1.0.2: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -"vite@^4 || ^5", vite@^4.4.5: +vite@^4.4.5: version "4.5.2" resolved "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz" integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== @@ -1913,6 +2080,11 @@ util-deprecate@^1.0.2: optionalDependencies: fsevents "~2.3.2" +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"