diff --git a/src/components/layout/burger.tsx b/src/components/layout/burger.tsx index 3508692..1f2f4ec 100644 --- a/src/components/layout/burger.tsx +++ b/src/components/layout/burger.tsx @@ -8,7 +8,9 @@ import { } from "../ui/sheet"; import { Link } from "react-router-dom"; import { Button } from "../ui/button"; -import { navData, navData2 } from "./header"; +import { navData } from "@/data/header.data"; +import { useTranslate } from "@/hooks/use-translate"; +import { useLangStore } from "@/store/lang"; interface Props { className?: string; @@ -16,6 +18,7 @@ interface Props { export const Burger: FC = () => { const [open, setOpen] = useState(false); + const lang = useLangStore((state) => state.lang); return ( setOpen(!open)} open={open}> @@ -50,7 +53,7 @@ export const Burger: FC = () => {
- {navData.concat(navData2).map((item) => ( + {navData[useTranslate(lang)].data.map((item) => ( setOpen(false)} className="h-10 text-on_surface" diff --git a/src/components/layout/footer.tsx b/src/components/layout/footer.tsx index 57cc635..62d1bde 100644 --- a/src/components/layout/footer.tsx +++ b/src/components/layout/footer.tsx @@ -1,8 +1,10 @@ import { FC } from "react"; import { Container } from "./"; import { Logo } from "../shared"; +import { Language, useLangStore } from "@/store/lang"; export const Footer: FC = () => { + const lang = useLangStore((state) => state.lang); return (
@@ -19,7 +21,9 @@ export const Footer: FC = () => {
- ©2025 Все права защищены + {lang === Language.RU + ? "©2025 Все права защищены" + : "All rights reserved"}
diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx index 488d4a8..f55edef 100644 --- a/src/components/layout/header.tsx +++ b/src/components/layout/header.tsx @@ -4,34 +4,13 @@ import { MapPin, Smartphone } from "lucide-react"; import { Link } from "react-router-dom"; import { Button } from "../ui/button"; import { Logo } from "../shared"; - -export const navData = [ - { - title: "Медиа", - link: "", - }, - { - title: "Контакты", - link: "/contacts", - }, -]; - -export const navData2 = [ - { - title: "О выставке", - link: "/about", - }, - { - title: "Посетителям", - link: "", - }, - { - title: "Экспонентам", - link: "", - }, -]; +import { useLangStore } from "@/store/lang"; +import { navData } from "@/data/header.data"; +import { useTranslate } from "@/hooks/use-translate"; export const Header: FC = () => { + const lang = useLangStore((state) => state.lang); + return (
@@ -39,15 +18,21 @@ export const Header: FC = () => {
-

Ашхабад, Туркменистан

+

+ {lang === "ru" + ? "Ашхабад, Туркменистан" + : "Ashgabat, Turkmenistan"} +

@@ -70,11 +55,17 @@ export const Header: FC = () => {
@@ -93,7 +84,7 @@ export const Header: FC = () => { size={"sm"} className="bg-white text-primary hover:bg-white/90" > - Официальная поддержка + {lang === "ru" ? "Официальная поддержка" : "Official Support"} @@ -103,7 +94,7 @@ export const Header: FC = () => { size={"sm"} className="bg-teritary text-white hover:bg-teritary/90" > - Стать спонсором{" "} + {lang === "ru" ? "Стать спонсором" : "Become a sponsor"}
diff --git a/src/components/shared/about/about-time.tsx b/src/components/shared/about/about-time.tsx index 87ebfef..cd30edd 100644 --- a/src/components/shared/about/about-time.tsx +++ b/src/components/shared/about/about-time.tsx @@ -1,22 +1,25 @@ import { cn } from "@/lib/utils"; import { FC } from "react"; -import { times } from "../home/home-time"; import { Container } from "@/components/layout"; import { TimeCard } from "../"; +import { useTranslate } from "@/hooks/use-translate"; +import { useLangStore } from "@/store/lang"; +import { times } from "@/data/home-time.data"; interface Props { className?: string; } export const AboutTime: FC = ({ className }) => { + const lang = useLangStore((state) => state.lang); return (
-

Время выставки

+

{times[useTranslate(lang)].title}

- {times.map((item) => ( + {times[useTranslate(lang)].data.map((item) => ( { const [ebmblaRef] = useEmblaCarousel(); + const lang = useLangStore((state) => state.lang); return (

- Выставка-ярмарка «TurkmenTextile Expo 2025» в Ашхабаде{" "} + Выставка-ярмарка «TurkmenTextile Expo 2025» в Ашхабаде

Глобальная выставка и ярмарка текстиля и моды, которая объединит @@ -46,7 +50,7 @@ export const HomeAbout: FC = () => {

- {data.map((item) => ( + {aboutData[useTranslate(lang)].data.map((item) => ( {
- +
diff --git a/src/components/shared/home/home-hero.tsx b/src/components/shared/home/home-hero.tsx index 7729e13..25dd874 100644 --- a/src/components/shared/home/home-hero.tsx +++ b/src/components/shared/home/home-hero.tsx @@ -4,29 +4,13 @@ import { Link } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { Container } from "@/components/layout"; import { useMediaQuery } from "usehooks-ts"; - -export const btns = [ - { - title: "План выставки", - link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/Floor%20plan/floor%20plan.pdf", - blank: true, - }, - { - title: "Забронировать стенд", - link: "/stend-form", - }, - { - title: "Список участников ", - link: "", - }, - { - title: "B2B | B2G встречи", - link: "/B2B-B2G", - }, -]; +import { btns } from "@/data/home-hero.data"; +import { useTranslate } from "@/hooks/use-translate"; +import { useLangStore } from "@/store/lang"; export const HomeHero: FC = () => { const [embalRef] = useEmblaCarousel(); + const lang = useLangStore((state) => state.lang); const lg = useMediaQuery("(min-width: 1024px)"); const md = useMediaQuery("(min-width: 768px)"); @@ -52,7 +36,7 @@ export const HomeHero: FC = () => {
- {btns.map(({ title, link, blank }) => ( + {btns[useTranslate(lang)].data.map(({ title, link, blank }) => ( { const [emblaRef, emblaApi] = useEmblaCarousel({ align: "start" }); const [activeIndex, setActiveIndex] = useState(0); + const lang = useLangStore((state) => state.lang); const scrollTo = useCallback( (index: number) => { @@ -34,22 +38,9 @@ export const HomeOffers: FC = () => {
- - + {offersData[useTranslate(lang)].data.map((item) => ( + + ))}
{ + const lang = useLangStore((state) => state.lang); return (

- Тематические направления выставки + {homeTheme[useTranslate(lang)].title}

- {themes.map((item) => ( + {homeTheme[useTranslate(lang)].data.map((item) => ( = ({ className }) => { + const lang = useLangStore((state) => state.lang); + return (
-

Время выставки

+

{times[useTranslate(lang)].title}

- {times.map((item) => ( + {times[useTranslate(lang)].data.map((item) => ( ))}
- {contacts.map((item) => ( + {contacts[useTranslate(lang)].data.map((item) => ( ))}
- +
diff --git a/src/data/contacts.data.ts b/src/data/contacts.data.ts new file mode 100644 index 0000000..14e642e --- /dev/null +++ b/src/data/contacts.data.ts @@ -0,0 +1,41 @@ +export const contacts = [ + { + data: [ + { + title: "contact@turkmenexpo.com", + subtitle: "Адрес электронной почты", + img: "/contacts/home/mail.svg", + }, + { + title: "здание ТПП Туркменистана", + subtitle: "Адрес выставки", + img: "/contacts/home/location.svg", + }, + { + title: "+99371871812; 99363719588", + subtitle: "Контактный номер", + img: "/contacts/home/mobile.svg", + }, + ], + }, + + { + data: [ + { + title: "contact@turkmenexpo.com", + subtitle: "E-mail Address", + img: "/contacts/home/mail.svg", + }, + { + title: "здание ТПП Туркменистана", + subtitle: "Exhibition address", + img: "/contacts/home/location.svg", + }, + { + title: "+99371871812; 99363719588", + subtitle: "Contact Number", + img: "/contacts/home/mobile.svg", + }, + ], + }, +]; diff --git a/src/data/header.data.ts b/src/data/header.data.ts new file mode 100644 index 0000000..2cefd0f --- /dev/null +++ b/src/data/header.data.ts @@ -0,0 +1,55 @@ +import { Language } from "@/store/lang"; + +export const navData = [ + { + lang: Language.RU, + data: [ + { + title: "Медиа", + link: "", + }, + { + title: "Контакты", + link: "/contacts", + }, + { + title: "О выставке", + link: "/about", + }, + { + title: "Посетителям", + link: "", + }, + { + title: "Экспонентам", + link: "", + }, + ], + }, + + { + lang: Language.EN, + data: [ + { + title: "Media", + link: "", + }, + { + title: "Contacts", + link: "/contacts", + }, + { + title: "About exhibition", + link: "/about", + }, + { + title: "To the Visitors", + link: "", + }, + { + title: "To the Exhibitors", + link: "", + }, + ], + }, +]; diff --git a/src/data/home-about.data.ts b/src/data/home-about.data.ts new file mode 100644 index 0000000..ec0c043 --- /dev/null +++ b/src/data/home-about.data.ts @@ -0,0 +1,43 @@ +export const aboutData = [ + { + data: [ + { + nums: "8,400 m²", + text: "выставочной площади", + }, + { + nums: "10000+", + text: "Посетители посетят выставку", + }, + { + nums: "100+", + text: "Экспоненты из более чем 30 стран", + }, + { + nums: "80%", + text: "Участники принимают участие в принятии решений о закупках", + }, + ], + }, + + { + data: [ + { + nums: "8,400 m²", + text: "Of the exhibition area", + }, + { + nums: "10000+", + text: "Visitors and specialists attend the exhibition", + }, + { + nums: "100+", + text: "More than 100 exhibitors from 30 countries ", + }, + { + nums: "80%", + text: "Visitors are involved in procurement decisions", + }, + ], + }, +]; diff --git a/src/data/home-hero.data.ts b/src/data/home-hero.data.ts new file mode 100644 index 0000000..1b9bb82 --- /dev/null +++ b/src/data/home-hero.data.ts @@ -0,0 +1,49 @@ +import { Language } from "@/store/lang"; + +export const btns = [ + { + lang: Language.RU, + data: [ + { + title: "План выставки", + link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/Floor%20plan/floor%20plan.pdf", + blank: true, + }, + { + title: "Забронировать стенд", + link: "/stend-form", + }, + { + title: "Список участников", + link: "", + }, + { + title: "B2B | B2G встречи", + link: "/B2B-B2G", + }, + ], + }, + + { + lang: Language.EN, + data: [ + { + title: "Floor Plan", + link: "https://itse.turkmenexpo.com/app/storage/app/media/Floor%20plan/Floor%20plan.pdf", + blank: true, + }, + { + title: "Book a stand", + link: "/stend-form", + }, + { + title: "Participants list", + link: "/", + }, + { + title: "B2B | B2G meetings", + link: "/B2B-B2G", + }, + ], + }, +]; diff --git a/src/data/home-offers.data.ts b/src/data/home-offers.data.ts new file mode 100644 index 0000000..5d2ea5d --- /dev/null +++ b/src/data/home-offers.data.ts @@ -0,0 +1,41 @@ +export const offersData = [ + { + data: [ + { + img: "/offer-1.png", + title: "Гостиницы, трансфер, визы", + btnText: "Скачать путеводитель", + text: "По вопросам размещения в гостиницах, визовой поддержки, транспортного и экскурсионного обслуживания Вы можете ознакомиться с путеводителем", + link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/travel_guide/Travel_guide_ru.pdf", + }, + { + img: "/offer-2.png", + title: "Ознакомьтесь с планом выставки TurkmenTextile Expo 2025", + btnText: "Скачать план выставки", + text: `Как выбрать лучшее место на выставке? Вы всегда должны помнить, что удачное расположение выставочной экспозиции повышает Ваши шансы привлечь внимание Ваших потенциальных клиентов`, + link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/Floor%20plan/floor%20plan.pdf", + }, + ], + }, + + { + data: [ + { + img: "/offer-2.png", + title: "Hotels, transfers, visa", + btnText: "Download the Travel guide", + text: `Regarding hotel accommodation, visa support, + transportation and excursion services you can check out the Travel guide`, + link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/travel_guide/Travel_guide_ru.pdf", + }, + { + img: "/offer-2.png", + title: "Check out the Turkmen Textile 2025 Exhibition plan ", + btnText: "Download the Floor plan", + text: `How to choose the best place in the exhibition? + You should always remember that the good location of the exhibition increases your chance to attract the attention of your potential customers…`, + link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/Floor%20plan/floor%20plan.pdf", + }, + ], + }, +]; diff --git a/src/data/home-theme.data.ts b/src/data/home-theme.data.ts new file mode 100644 index 0000000..0767915 --- /dev/null +++ b/src/data/home-theme.data.ts @@ -0,0 +1,79 @@ +export const homeTheme = [ + { + h1: "Тематические направления выставки", + + data: [ + { + title: "Пищевая продукция и сельское хозяйство", + img: "/theme/1.svg", + }, + { + title: "Товары и услуги", + img: "/theme/2.svg", + }, + { + title: "E-commerce", + img: "/theme/3.svg", + }, + { + title: "Волокна, текстиль и одежда", + img: "/theme/4.svg", + }, + { + title: "Продукция промышленного производства", + img: "/theme/5.svg", + }, + { + title: "Профессиональные услуги", + img: "/theme/6.svg", + }, + { + title: "Ремесленные производства", + img: "/theme/7.svg", + }, + { + title: "Креативные индустрии", + img: "/theme/8.svg", + }, + ], + }, + + { + title: "Thematic areas of the exhibition", + + data: [ + { + title: "Пищевая продукция и сельское хозяйство", + img: "/theme/1.svg", + }, + { + title: "Товары и услуги", + img: "/theme/2.svg", + }, + { + title: "E-commerce", + img: "/theme/3.svg", + }, + { + title: "Волокна, текстиль и одежда", + img: "/theme/4.svg", + }, + { + title: "Продукция промышленного производства", + img: "/theme/5.svg", + }, + { + title: "Профессиональные услуги", + img: "/theme/6.svg", + }, + { + title: "Ремесленные производства", + img: "/theme/7.svg", + }, + { + title: "Креативные индустрии", + img: "/theme/8.svg", + }, + ], + }, +]; diff --git a/src/data/home-time.data.ts b/src/data/home-time.data.ts new file mode 100644 index 0000000..9729348 --- /dev/null +++ b/src/data/home-time.data.ts @@ -0,0 +1,37 @@ +export const times = [ + { + title: "Время выставки", + data: [ + { + name: "Монтаж выставки", + date: "12 мая – 10 июня 2025 года", + }, + { + name: "Работа", + date: "11–13 июня 2025 года", + }, + { + name: "Демонтаж", + date: "13–14 июня 2025 года", + }, + ], + }, + + { + title: "Exhibition time", + data: [ + { + name: "Exhibition assembly", + date: "1 — 27 april 2025", + }, + { + name: "Exhibition days", + date: "29 — 1 may 2025", + }, + { + name: "Exhibition dismantling", + date: "1 — 2 may 2025", + }, + ], + }, +]; diff --git a/src/hooks/use-translate.ts b/src/hooks/use-translate.ts new file mode 100644 index 0000000..92c4569 --- /dev/null +++ b/src/hooks/use-translate.ts @@ -0,0 +1,5 @@ +import { Language } from "@/store/lang"; + +export const useTranslate = (lang: Language): number => { + return lang === Language.RU ? 0 : 1; +}; diff --git a/src/pages/about.tsx b/src/pages/about.tsx index b7781a2..d86f9ab 100644 --- a/src/pages/about.tsx +++ b/src/pages/about.tsx @@ -8,13 +8,15 @@ import { } from "@/components/shared"; import { useScrollTop } from "@/hooks/use-scroll-top"; import { cn } from "@/lib/utils"; +import { Language, useLangStore } from "@/store/lang"; export default function About() { useScrollTop(); + const lang = useLangStore((state) => state.lang); return (
- + diff --git a/src/store/lang.ts b/src/store/lang.ts new file mode 100644 index 0000000..96e4265 --- /dev/null +++ b/src/store/lang.ts @@ -0,0 +1,16 @@ +import { create } from "zustand"; + +export enum Language { + EN = "en", + RU = "ru", +} + +export interface LangState { + lang: Language; + setLang: (lang: Language) => void; +} + +export const useLangStore = create()((set) => ({ + lang: Language.EN, + setLang: (lang) => set({ lang }), +}));