translation done , services page added backend service detail page added
This commit is contained in:
@@ -63,8 +63,8 @@ export function Footer() {
|
|||||||
if (email) {
|
if (email) {
|
||||||
// Telefon raqamni tozalash (faqat raqamlar)
|
// Telefon raqamni tozalash (faqat raqamlar)
|
||||||
const cleanPhone = email.replace(/\D/g, "");
|
const cleanPhone = email.replace(/\D/g, "");
|
||||||
console.log("without 998: ",cleanPhone.slice(3))
|
console.log("without 998: ", cleanPhone.slice(3));
|
||||||
formRequest.mutate({ number: Number(cleanPhone.slice(3))});
|
formRequest.mutate({ number: Number(cleanPhone.slice(3)) });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ export function Footer() {
|
|||||||
"linear-gradient(to top right, #452811 0%, #000000 20%, #000000 40%, #000000 60%, #000000 80%, #000000 100%)",
|
"linear-gradient(to top right, #452811 0%, #000000 20%, #000000 40%, #000000 60%, #000000 80%, #000000 100%)",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Newsletter Section for gitea */}
|
{/* Newsletter Section */}
|
||||||
<div className=" absolute w-full -top-40 px-4 py-12 md:py-16">
|
<div className=" absolute w-full -top-40 px-4 py-12 md:py-16">
|
||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto max-w-6xl">
|
||||||
<div className="rounded-2xl bg-red-600 px-6 py-8 md:flex lg:flex-row flex-col max-lg:gap-5 md:items-center lg:justify-between justify-center md:px-10 md:py-12">
|
<div className="rounded-2xl bg-red-600 px-6 py-8 md:flex lg:flex-row flex-col max-lg:gap-5 md:items-center lg:justify-between justify-center md:px-10 md:py-12">
|
||||||
@@ -241,18 +241,28 @@ export function Footer() {
|
|||||||
{/* Copyright Section */}
|
{/* Copyright Section */}
|
||||||
<div className="border-t border-gray-800 px-4 py-8">
|
<div className="border-t border-gray-800 px-4 py-8">
|
||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto max-w-6xl">
|
||||||
<div className="font-almarai flex flex-col justify-center gap-4 text-lg text-gray-400 md:flex-row md:items-center">
|
<div className="font-almarai flex flex-col justify-between gap-4 text-lg text-gray-400 md:flex-row md:items-center">
|
||||||
<a href="http://felix-its.uz/" className="hover:text-red-600">
|
{locale === "uz" ? (
|
||||||
{t("footer.create", { name: "Felix-its.uz" })}
|
<div className="flex gap-2 ">
|
||||||
</a>
|
<a
|
||||||
{/* <div className="flex gap-6">
|
href="http://felix-its.uz/"
|
||||||
<a href="#terms" className="hover:text-white">
|
className="hover:text-red-600 hover:cursor-pointer text-blue-300 underline"
|
||||||
Terms & Conditions
|
>
|
||||||
</a>
|
Felix-its.uz
|
||||||
<a href="#privacy" className="hover:text-white">
|
</a>
|
||||||
Privacy Policy
|
<p>- Jamoasi tomonidan ishlab chiqilgan</p>
|
||||||
</a>
|
</div>
|
||||||
</div> */}
|
) : (
|
||||||
|
<div className="flex gap-2">
|
||||||
|
{locale === "ru" ? <p>Разработано -</p> : <p>Created by - </p>}
|
||||||
|
<a
|
||||||
|
href="http://felix-its.uz/"
|
||||||
|
className="hover:text-red-600 hover:cursor-pointer text-blue-300 underline"
|
||||||
|
>
|
||||||
|
Felix-its.uz
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export function Contact() {
|
|||||||
className="absolute inset-0"
|
className="absolute inset-0"
|
||||||
style={{
|
style={{
|
||||||
background:
|
background:
|
||||||
"radial-gradient(at center bottom, rgb(144 74 20) 0%, rgba(30, 29, 28, 0.914) 70%, rgba(30, 29, 28, 0.914) 70%)",
|
"radial-gradient(at center bottom, rgb(144 74 20) 0%, rgba(30, 29, 28, 0.914) 50%, rgba(30, 29, 28, 0.914) 70%)",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import CatalogCardSkeleton from "@/components/loadingSkleton";
|
|||||||
import EmptyData from "@/components/EmptyData";
|
import EmptyData from "@/components/EmptyData";
|
||||||
import { getRouteLang } from "@/request/getLang";
|
import { getRouteLang } from "@/request/getLang";
|
||||||
import { CategoryType } from "@/lib/types";
|
import { CategoryType } from "@/lib/types";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
|
|
||||||
export default function Catalog() {
|
export default function Catalog() {
|
||||||
const language = getRouteLang();
|
const language = getRouteLang();
|
||||||
@@ -15,6 +16,7 @@ export default function Catalog() {
|
|||||||
queryFn: () => httpClient(endPoints.category.all),
|
queryFn: () => httpClient(endPoints.category.all),
|
||||||
select: (data): CategoryType[] => data?.data?.results,
|
select: (data): CategoryType[] => data?.data?.results,
|
||||||
});
|
});
|
||||||
|
const t = useTranslations();
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
@@ -30,8 +32,8 @@ export default function Catalog() {
|
|||||||
if (!data || data.length === 0) {
|
if (!data || data.length === 0) {
|
||||||
return (
|
return (
|
||||||
<EmptyData
|
<EmptyData
|
||||||
title="Katalog topilmadi"
|
title={t("products.noData.title")}
|
||||||
description="Hozircha kategoriyalar mavjud emas. Keyinroq qaytib keling."
|
description={t("products.noData.description")}
|
||||||
icon="shopping"
|
icon="shopping"
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ export default function CatalogCard({
|
|||||||
<Link
|
<Link
|
||||||
href={navigateLink}
|
href={navigateLink}
|
||||||
onClick={updateZustands}
|
onClick={updateZustands}
|
||||||
className="group relative h-112.5 w-full overflow-hidden rounded-2xl bg-[#171616] from-[#2a2a2a] to-black border hover:border-red-700 border-white/10 transition-all duration-500 hover:-translate-y-1"
|
className="group relative h-112.5 w-full overflow-hidden rounded-2xl bg-[#171616] bg-linear-to-br from-[#2a2a2a] to-black border hover:border-red-700 border-white/10 transition-all duration-500 hover:-translate-y-1"
|
||||||
>
|
>
|
||||||
{/* Background glow effect */}
|
{/* Background glow effect */}
|
||||||
<div className="absolute inset-0 bg-linear-to-t from-red-600/20 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
|
<div className="absolute inset-0 bg-linear-to-t from-red-600/20 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export function EmptyServices() {
|
|||||||
transition={{ duration: 0.5 }}
|
transition={{ duration: 0.5 }}
|
||||||
className="max-w-250 w-full mx-auto py-20"
|
className="max-w-250 w-full mx-auto py-20"
|
||||||
>
|
>
|
||||||
<div className="bg-linear-to-br from-gray-900 to-gray-800 rounded-2xl p-10 md:p-16 text-center border border-gray-700/50">
|
<div className="bg-[#171616] bg-linear-to-br from-[#2a2a2a] to-black rounded-2xl p-10 md:p-16 text-center border border-gray-500">
|
||||||
<motion.div
|
<motion.div
|
||||||
initial={{ scale: 0 }}
|
initial={{ scale: 0 }}
|
||||||
animate={{ scale: 1 }}
|
animate={{ scale: 1 }}
|
||||||
@@ -42,7 +42,7 @@ export function EmptyServices() {
|
|||||||
transition={{ delay: 0.3 }}
|
transition={{ delay: 0.3 }}
|
||||||
className="text-2xl md:text-3xl font-bold text-white font-unbounded mb-4"
|
className="text-2xl md:text-3xl font-bold text-white font-unbounded mb-4"
|
||||||
>
|
>
|
||||||
{t("home.services.noData.title") || "Xizmatlar topilmadi"}
|
{t("operationalSystems.noData.title") || "Xizmatlar topilmadi"}
|
||||||
</motion.h3>
|
</motion.h3>
|
||||||
|
|
||||||
<motion.p
|
<motion.p
|
||||||
@@ -51,7 +51,7 @@ export function EmptyServices() {
|
|||||||
transition={{ delay: 0.4 }}
|
transition={{ delay: 0.4 }}
|
||||||
className="text-gray-400 font-almarai text-base md:text-lg mb-8 max-w-md mx-auto"
|
className="text-gray-400 font-almarai text-base md:text-lg mb-8 max-w-md mx-auto"
|
||||||
>
|
>
|
||||||
{t("home.services.noData.description") || "Hozircha hech qanday xizmat mavjud emas. Tez orada yangi xizmatlar qo'shiladi."}
|
{t("operationalSystems.noData.description") || "Hozircha hech qanday xizmat mavjud emas. Tez orada yangi xizmatlar qo'shiladi."}
|
||||||
</motion.p>
|
</motion.p>
|
||||||
|
|
||||||
<motion.div
|
<motion.div
|
||||||
@@ -63,7 +63,7 @@ export function EmptyServices() {
|
|||||||
onClick={() => window.location.reload()}
|
onClick={() => window.location.reload()}
|
||||||
className="font-almarai bg-red-600 hover:bg-red-700 text-white font-semibold py-3 px-8 rounded-full transition-all duration-300 transform hover:scale-105 shadow-lg hover:shadow-red-500/50"
|
className="font-almarai bg-red-600 hover:bg-red-700 text-white font-semibold py-3 px-8 rounded-full transition-all duration-300 transform hover:scale-105 shadow-lg hover:shadow-red-500/50"
|
||||||
>
|
>
|
||||||
{t("home.services.noData.reload") || "Qayta yuklash"}
|
{t("operationalSystems.noData.empty") || "Qayta yuklash"}
|
||||||
</button>
|
</button>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
|
|
||||||
|
|
||||||
// Loading Skeleton Component
|
// Loading Skeleton Component
|
||||||
function ServiceCardSkeleton() {
|
function ServiceCardSkeleton() {
|
||||||
return (
|
return (
|
||||||
<div className="animate-pulse space-y-4 py-6 px-8 rounded-xl bg-linear-to-br from-gray-800 to-gray-900">
|
<div className="animate-pulse space-y-4 py-6 px-8 rounded-xl bg-[#171616] bg-linear-to-br from-[#2a2a2a] to-black">
|
||||||
<div className="h-6 bg-gray-700 rounded w-3/4"></div>
|
<div className="h-6 bg-[#171616] rounded w-3/4"></div>
|
||||||
<div className="h-4 bg-gray-700 rounded w-full"></div>
|
<div className="h-4 bg-[#171616] rounded w-full"></div>
|
||||||
<div className="h-4 bg-gray-700 rounded w-5/6"></div>
|
<div className="h-4 bg-[#171616] rounded w-5/6"></div>
|
||||||
<div className="h-8 bg-gray-700 rounded w-32"></div>
|
<div className="h-8 bg-[#171616] rounded w-32"></div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -38,9 +37,9 @@ export function ServicesLoading() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="sm:w-[60%] w-full space-y-5">
|
<div className="sm:w-[60%] w-full space-y-5">
|
||||||
<ServiceCardSkeleton />
|
<ServiceCardSkeleton />
|
||||||
<div className="h-24 bg-gray-800 rounded-xl animate-pulse"></div>
|
<div className="h-24 bg-[#171616] rounded-xl animate-pulse"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,8 +131,8 @@ export function OurService() {
|
|||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="max-w-250 flex sm:flex-row flex-col items-start justify-between gap-5 mt-5 w-full mx-auto">
|
<div className="max-w-250 flex sm:flex-row flex-col items-start justify-between gap-5 mt- w-full mx-auto">
|
||||||
<motion.div variants={cardVariants} className="sm:w-[40%] w-full">
|
<motion.div variants={cardVariants} className="sm:w-[40%] w-full -mt-5">
|
||||||
<Link
|
<Link
|
||||||
href={`/${locale}/services/detail`}
|
href={`/${locale}/services/detail`}
|
||||||
className="block hover:cursor-pointer relative rounded-xl w-full bg-[linear-gradient(to_bottom_right,#000000,#190b00,#542604,#8f4308)] hover:shadow-2xl hover:shadow-red-500/20 transition-all duration-300"
|
className="block hover:cursor-pointer relative rounded-xl w-full bg-[linear-gradient(to_bottom_right,#000000,#190b00,#542604,#8f4308)] hover:shadow-2xl hover:shadow-red-500/20 transition-all duration-300"
|
||||||
@@ -184,7 +184,7 @@ export function OurService() {
|
|||||||
|
|
||||||
<motion.div
|
<motion.div
|
||||||
variants={cardVariants}
|
variants={cardVariants}
|
||||||
className="py-8 px-8 rounded-xl mt-5 w-full p-5 bg-[linear-gradient(to_top_right,#000000,#190b00,#542604,#8f4308)] flex sm:flex-row flex-col gap-5 items-center justify-between hover:shadow-2xl hover:shadow-red-500/20 transition-all duration-300"
|
className="py-6 px-8 rounded-xl mt-5 w-full p-5 bg-[linear-gradient(to_top_right,#000000,#190b00,#542604,#8f4308)] flex sm:flex-row flex-col gap-5 items-center justify-between hover:shadow-2xl hover:shadow-red-500/20 transition-all duration-300"
|
||||||
>
|
>
|
||||||
<h2 className="font-unbounded sm:text-3xl text-xl font-semibold font-armanai text-white">
|
<h2 className="font-unbounded sm:text-3xl text-xl font-semibold font-armanai text-white">
|
||||||
{t("home.services.viewMoreServices")}
|
{t("home.services.viewMoreServices")}
|
||||||
|
|||||||
@@ -146,6 +146,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"products": {
|
"products": {
|
||||||
|
"noData": {
|
||||||
|
"title": "Catalog Not Found",
|
||||||
|
"description": "There are currently no categories available. Please check back later."
|
||||||
|
},
|
||||||
"catalog": {
|
"catalog": {
|
||||||
"blockdescription": "Polypropylene pipes and fittings for automatic fire suppression systems and internal fire water supply",
|
"blockdescription": "Polypropylene pipes and fittings for automatic fire suppression systems and internal fire water supply",
|
||||||
"cadescription": "Equipment for automatic fire suppression",
|
"cadescription": "Equipment for automatic fire suppression",
|
||||||
@@ -223,14 +227,20 @@
|
|||||||
"help": "Help"
|
"help": "Help"
|
||||||
},
|
},
|
||||||
"address": "Tashkent city, Yunusabad district, 3rd dead-end of Niyozbek Yoli street, house 39",
|
"address": "Tashkent city, Yunusabad district, 3rd dead-end of Niyozbek Yoli street, house 39",
|
||||||
"create": "Created by {name}"
|
"create": "Created by {name}",
|
||||||
|
"terms": "Terms & Conditions",
|
||||||
|
"privacy": "Privacy Policy"
|
||||||
},
|
},
|
||||||
"operationalSystems": {
|
"operationalSystems": {
|
||||||
"title": "Operating Systems",
|
"title": "Operating Systems",
|
||||||
"subtitle": "Automatic fire detection and extinguishing systems. Latest technological achievements.",
|
"subtitle": "Automatic fire detection and extinguishing systems. Latest technological achievements.",
|
||||||
"loading": "Loading...",
|
"loading": "Loading...",
|
||||||
"error": "An error occurred. Please try again.",
|
"error": "An error occurred. Please try again.",
|
||||||
"noData": "No data found",
|
"noData": {
|
||||||
|
"empty": "No data found",
|
||||||
|
"title": "No Services Found",
|
||||||
|
"description": "There are currently no services available. New services will be added soon."
|
||||||
|
},
|
||||||
"retry": "Retry",
|
"retry": "Retry",
|
||||||
"features": "Features",
|
"features": "Features",
|
||||||
"systems": {
|
"systems": {
|
||||||
|
|||||||
@@ -146,6 +146,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"products": {
|
"products": {
|
||||||
|
"noData": {
|
||||||
|
"title": "Каталог не найден",
|
||||||
|
"description": "В настоящее время категории отсутствуют. Пожалуйста, зайдите позже."
|
||||||
|
},
|
||||||
"catalog": {
|
"catalog": {
|
||||||
"blockdescription": "Полипропиленовые трубы и фитинги для систем автоматического пожаротушения и внутреннего противопожарного водопровода",
|
"blockdescription": "Полипропиленовые трубы и фитинги для систем автоматического пожаротушения и внутреннего противопожарного водопровода",
|
||||||
"cadescription": "Оборудование для автоматического пожаротушения",
|
"cadescription": "Оборудование для автоматического пожаротушения",
|
||||||
@@ -223,20 +227,26 @@
|
|||||||
"help": "Помощь"
|
"help": "Помощь"
|
||||||
},
|
},
|
||||||
"address": "г. Ташкент, Юнусабадский район, 3-й тупик улицы Ниязбек йўли, дом 39",
|
"address": "г. Ташкент, Юнусабадский район, 3-й тупик улицы Ниязбек йўли, дом 39",
|
||||||
"create": "Разработано {name}"
|
"create": "Разработано",
|
||||||
|
"terms": "Условия использования",
|
||||||
|
"privacy": "Политика конфиденциальности"
|
||||||
},
|
},
|
||||||
"operationalSystems": {
|
"operationalSystems": {
|
||||||
"title": "Операционные системы",
|
"title": "Операционные системы",
|
||||||
"subtitle": "Системы автоматического обнаружения и тушения пожаров. Последние достижения технологий.",
|
"subtitle": "Системы автоматического обнаружения и тушения пожаров. Последние достижения технологий.",
|
||||||
"loading": "Загрузка...",
|
"loading": "Загрузка...",
|
||||||
"error": "Произошла ошибка. Пожалуйста, попробуйте снова.",
|
"error": "Произошла ошибка. Пожалуйста, попробуйте снова.",
|
||||||
"noData": "Данные не найдены",
|
"noData": {
|
||||||
|
"empty": "Данные не найдены",
|
||||||
|
"title": "Услуги не найдены",
|
||||||
|
"description": "В настоящее время нет доступных услуг. Новые услуги будут добавлены в ближайшее время."
|
||||||
|
},
|
||||||
"retry": "Повторить",
|
"retry": "Повторить",
|
||||||
"features": "Характеристики",
|
"features": "Характеристики",
|
||||||
"systems": {
|
"systems": {
|
||||||
"sprinkler": {
|
"sprinkler": {
|
||||||
"title": "Спринклерная система пожаротушения",
|
"title": "Спринклерная система пожаротушения",
|
||||||
"short-desc":"Системы автоматического обнаружения и тушения пожаров. Новейшие достижения технологий.",
|
"short-desc": "Системы автоматического обнаружения и тушения пожаров. Новейшие достижения технологий.",
|
||||||
"description": "Спринклерная система пожаротушения контролирует и тушит пожар на начальной стадии путем автоматического распыления воды. Система автоматически активируется при повышении температуры и работает только в зоне обнаружения пожара.",
|
"description": "Спринклерная система пожаротушения контролирует и тушит пожар на начальной стадии путем автоматического распыления воды. Система автоматически активируется при повышении температуры и работает только в зоне обнаружения пожара.",
|
||||||
"features": [
|
"features": [
|
||||||
"Автоматический механизм активации",
|
"Автоматический механизм активации",
|
||||||
|
|||||||
@@ -146,6 +146,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"products": {
|
"products": {
|
||||||
|
"noData":{
|
||||||
|
"title":"Katalog topilmadi",
|
||||||
|
"description":"Hozircha kategoriyalar mavjud emas. Keyinroq urinib ko'ring"
|
||||||
|
},
|
||||||
"catalog": {
|
"catalog": {
|
||||||
"blockdescription": "Avtomatik yong‘in o‘chirish tizimlari va ichki yong‘inga qarshi suv ta’minoti uchun polipropilen quvurlar va fitinglar",
|
"blockdescription": "Avtomatik yong‘in o‘chirish tizimlari va ichki yong‘inga qarshi suv ta’minoti uchun polipropilen quvurlar va fitinglar",
|
||||||
"cadescription": "Avtomatik yong‘in o‘chirish uchun uskunalar",
|
"cadescription": "Avtomatik yong‘in o‘chirish uchun uskunalar",
|
||||||
@@ -223,20 +227,26 @@
|
|||||||
"help": "Yordam"
|
"help": "Yordam"
|
||||||
},
|
},
|
||||||
"address": "Toshkent shahri , Yunusabod tumani , Niyozbek yo'li 3 tor ko'chasi , 39 uy",
|
"address": "Toshkent shahri , Yunusabod tumani , Niyozbek yo'li 3 tor ko'chasi , 39 uy",
|
||||||
"create": "{name} - Jamoasi tomonidan ishlab chiqilgan"
|
"create": "{name} - Jamoasi tomonidan ishlab chiqilgan",
|
||||||
|
"terms":"Foydalanish shartlari",
|
||||||
|
"privacy":"Maxfiylik siyosati"
|
||||||
},
|
},
|
||||||
"operationalSystems": {
|
"operationalSystems": {
|
||||||
"title": "Operatsion tizimlar",
|
"title": "Operatsion tizimlar",
|
||||||
"subtitle": "Yong'inni avtomatik aniqlash va o'chirish tizimlari. Texnologiyaning eng so'nggi yutuqlari.",
|
"subtitle": "Yong'inni avtomatik aniqlash va o'chirish tizimlari. Texnologiyaning eng so'nggi yutuqlari.",
|
||||||
"loading": "Yuklanmoqda...",
|
"loading": "Yuklanmoqda...",
|
||||||
"error": "Xatolik yuz berdi. Iltimos, qaytadan urinib ko'ring.",
|
"error": "Xatolik yuz berdi. Iltimos, qaytadan urinib ko'ring.",
|
||||||
"noData": "Ma'lumotlar topilmadi",
|
"noData": {
|
||||||
|
"empty": "Ma'lumotlar topilmadi",
|
||||||
|
"title": "Xizmatlar topilmadi",
|
||||||
|
"description": "Hozircha hech qanday xizmat mavjud emas. Tez orada yangi xizmatlar qo'shiladi."
|
||||||
|
},
|
||||||
"retry": "Qayta urinish",
|
"retry": "Qayta urinish",
|
||||||
"features": "Hususiyatlari",
|
"features": "Hususiyatlari",
|
||||||
"systems": {
|
"systems": {
|
||||||
"sprinkler": {
|
"sprinkler": {
|
||||||
"title": "Sprinklerli yong'in o'chirish tizimi",
|
"title": "Sprinklerli yong'in o'chirish tizimi",
|
||||||
"short-desc":"Yong'inni avtomatik aniqlash va o'chirish tizimlari. Texnologiyaning eng so'nggi yutuqlari.",
|
"short-desc": "Yong'inni avtomatik aniqlash va o'chirish tizimlari. Texnologiyaning eng so'nggi yutuqlari.",
|
||||||
"description": "Sprinklerli yong'in o'chirish tizimi avtomatik suv purkash orqali yong'inni dastlabki bosqichida nazorat qiladi va o'chiradi. Tizim harorat oshganda avtomatik ishga tushadi va faqat yong'in aniqlangan hududda faoliyat ko'rsatadi.",
|
"description": "Sprinklerli yong'in o'chirish tizimi avtomatik suv purkash orqali yong'inni dastlabki bosqichida nazorat qiladi va o'chiradi. Tizim harorat oshganda avtomatik ishga tushadi va faqat yong'in aniqlangan hududda faoliyat ko'rsatadi.",
|
||||||
"features": [
|
"features": [
|
||||||
"Avtomatik ishga tushish mexanizmi",
|
"Avtomatik ishga tushish mexanizmi",
|
||||||
|
|||||||
Reference in New Issue
Block a user