+
setTab("description")}>
- توضیحات
+ {t.comments.description}
setTab("technical")}>
- مشخصات فنی
+ {t.comments.technical}
setTab("comments")}>
- نظرات
+ {t.comments.commentsTab}
@@ -44,7 +46,7 @@ export default function ProductTabs({
) : descriptionText ? (
{descriptionText}
) : (
-
توضیحاتی ثبت نشده است.
+
{t.comments.noDescription}
)
) : null}
@@ -61,7 +63,7 @@ export default function ProductTabs({
) : (
-
مشخصات فنی برای این محصول ثبت نشده است.
+
{t.comments.noSpecs}
)
) : null}
diff --git a/src/components/Providers.tsx b/src/components/Providers.tsx
index 4735e7c..8722137 100644
--- a/src/components/Providers.tsx
+++ b/src/components/Providers.tsx
@@ -1,14 +1,22 @@
"use client";
+import { LocaleProvider } from "@/i18n/locale-context";
+import type { Locale } from "@/i18n/config";
import { SessionProvider } from "@/lib/session";
import type { ReactNode } from "react";
export default function Providers({
businessId,
+ locale,
children,
}: {
businessId: string;
+ locale: Locale;
children: ReactNode;
}) {
- return
{children} ;
+ return (
+
+ {children}
+
+ );
}
diff --git a/src/i18n/ar.ts b/src/i18n/ar.ts
new file mode 100644
index 0000000..e0c9ba4
--- /dev/null
+++ b/src/i18n/ar.ts
@@ -0,0 +1,260 @@
+import type { Messages } from "@/i18n/fa";
+
+export const ar: Messages = {
+ brand: {
+ name: "صناعات أسلاك وكابلات كمان",
+ shortName: "كابلات كمان",
+ nameEn: "Kaman Cable & Wire Industries",
+ nameEnShort: "Kaman Cable",
+ tagline: "إنتاج كابلات الجهد المنخفض والاتصالات والتحكم والأجهزة الدقيقة",
+ description:
+ "تنتج شركة كابلات كمان منذ عام ۱۳۷۰ في المدينة الصناعية بزنجان أنواع كابلات الكهرباء والاتصالات للجهد المنخفض وكابلات التحكم والأجهزة الدقيقة وفقاً للمواصفات الوطنية والدولية.",
+ },
+ nav: {
+ home: "الرئيسية",
+ products: "المنتجات",
+ blog: "المدونة",
+ about: "من نحن",
+ contact: "اتصل بنا",
+ menu: "القائمة",
+ search: "بحث",
+ language: "اللغة",
+ languageSelect: "اختر اللغة",
+ },
+ account: {
+ login: "دخول",
+ dear: "{name} العزيز",
+ profile: "ملفي",
+ logout: "خروج",
+ manage: "إدارة الموقع",
+ transferring: "جارٍ التحويل…",
+ },
+ footer: {
+ quickLinks: "روابط سريعة",
+ contact: "اتصل بنا",
+ },
+ contactInfo: {
+ address: "طهران، شارع كريم خان زند، شارع سنائي، أعلى ميدان سنائي، رقم 82، الطابق الثالث، الوحدة 6",
+ factory: "المدينة الصناعية رقم 1، محافظة زنجان",
+ phoneLabel: "الهاتف",
+ addressLabel: "العنوان",
+ factoryLabel: "المصنع",
+ addressEn: "Address",
+ factoryEn: "Factory",
+ phoneEn: "Phone",
+ },
+ social: {
+ instagram: "إنستغرام",
+ telegram: "تيليغرام",
+ linkedin: "لينكدإن",
+ email: "البريد الإلكتروني",
+ },
+ home: {
+ appTitle: "التطبيق الخاص",
+ appCta: "تحميل التطبيق",
+ aboutKicker: "About",
+ aboutTitle: "صناعات كابلات كمان",
+ contactCta: "اتصل بنا",
+ productsKicker: "Products",
+ productsTitle: "منتجات الكابلات والأسلاك",
+ productsText:
+ "مجموعة كاملة من كابلات الجهد المنخفض والاتصالات والشبكات والأجهزة الدقيقة، مصنّعة وفق المواصفات الوطنية والدولية.",
+ blogKicker: "Blog",
+ blogTitle: "آخر الأخبار والمقالات",
+ blogText: "تابع أحدث المعارف الفنية وأخبار صناعات أسلاك وكابلات كمان.",
+ partnersKicker: "Partners",
+ partnersTitle: "الشركاء والعملاء",
+ partnersText: "علامات تجارية ومؤسسات اختارت جودة إنتاج كابلات كمان لمشاريعها.",
+ aboutImageAlt: "مصنع صناعات كابلات كمان",
+ productImageAlt: "منتج كابلات كمان",
+ partnerImageAlt: "شريك كابلات كمان",
+ sliderAlt: "شريط صور كابلات كمان",
+ sliderLabel: "الشريط",
+ },
+ hero: {
+ slides: [
+ {
+ kicker: "KAMAN CABLE & WIRE INDUSTRIES",
+ title: "أسلاك وكابلات كمان",
+ },
+ {
+ kicker: "ENDORSED BY THE MINISTRY OF ENERGY AND OIL COMPANY",
+ title: "معتمد من وزارة الطاقة وشركات النفط",
+ },
+ {
+ kicker: "HIGH QUALITY AND UP-TO-DATE PRODUCTS",
+ title: "روّاد في تقديم منتجات عالية الجودة ومواكبة للعصر",
+ },
+ ],
+ highlights: [
+ { n: "١", title: "تنوع المنتجات", kicker: "Variety of products" },
+ { n: "٢", title: "خط إنتاج قوي", kicker: "Powerful Production Line" },
+ { n: "٣", title: "منتج نموذجي", kicker: "Top Producer" },
+ ],
+ },
+ aboutTabs: {
+ resume: "النبذة",
+ goalsTab: "الأهداف",
+ resumeText:
+ "بدأت شركة كابلات كمان نشاطها عام ۱۳۷۰ على أرض مساحتها ۴۰۰۰۰ متر مربع في المدينة الصناعية رقم 1 بمحافظة زنجان. وبعد تركيب الآلات وتوفير البنية التحتية والاستعانة بالمتخصصين ذوي الخبرة، حصلت في مطلع عام ۱۳۷۳ على رخصة التشغيل بطاقة ۱۵۰۰۰ طن وعلامة المواصفة الوطنية (ISIRI). ولأن الجودة ورضا العميل أساس كل نشاط، حصلت الشركة في سنواتها الأولى على شهادتي ISO 9001:2015 وCE، وتواصل توريد منتجاتها بجودة عالية للأسواق المحلية ودول الجوار بما يتوافق مع أهداف العملاء.",
+ goalsParagraphs: [
+ "الصدق أفضل طريقة.",
+ "بصفتها أحد منتجي الأسلاك والكابلات، جعلت كابلات كمان رضا العملاء عبر رفع الجودة والالتزام بجميع المتطلبات هدفها الأسمى. وتعلن الإدارة العليا التزامها بتنفيذ نظام إدارة الجودة وفق ISO 9001:2015 والحفاظ عليه وتحسين فاعليته باستمرار.",
+ ],
+ qualityIntro: "سياسة الجودة هي:",
+ qualityPolicy: [
+ "زيادة تنوع وحجم المنتجات",
+ "رفع مستوى رضا العملاء",
+ "تطوير المواصفات الوطنية والدولية في المؤسسة",
+ ],
+ },
+ aboutPage: {
+ title: "من نحن",
+ kicker: "About Us",
+ metaDescription:
+ "تعرّف على شركة كابلات كمان؛ منتج أسلاك وكابلات الجهد المنخفض والاتصالات والأجهزة الدقيقة منذ عام ۱۳۷۰ في زنجان.",
+ heroAlt: "عن صناعات كابلات كمان",
+ companyTitle: "شركة كابلات كمان",
+ intro:
+ "كابلات كمان شركة راسخة في إنتاج الكابلات والكهرباء. تستخدم أفضل الآلات الأوروبية لإنتاج أسلاك وكابلات الجهد المنخفض للاتصالات وكابلات التحكم والأجهزة الدقيقة. منتجاتها مطابقة للمواصفات الوطنية والدولية وتُورَّد بأعلى جودة للأسواق المحلية ودول الجوار بما يتوافق مع أهداف العملاء.",
+ goalsTitle: "الأهداف",
+ goalsKicker: "Quality Policy",
+ honesty: "الصدق أفضل طريقة.",
+ goalsBody:
+ "بصفتها أحد منتجي الأسلاك والكابلات، جعلت كابلات كمان رضا العملاء عبر رفع الجودة والالتزام بجميع المتطلبات هدفها الأسمى.",
+ labTitle: "مختبر صناعات كابلات كمان",
+ labKicker: "Laboratory",
+ labText:
+ "حصل مختبر الشركة عام ۱۳۹۱ على شهادة مختبر متعاون من مؤسسة المواصفات في محافظة زنجان، ويحمل اليوم شهادة اعتماد المختبر من المركز الوطني للاعتماد في إيران (ISIRI-ISO/IEC 17025). كما يملك اعتمادات من توانير وشركات توزيع الكهرباء وشركات النفط. وبأجهزة متقدمة ومتخصصين ذوي خبرة، جاهز لإجراء الاختبارات وفق حاجة قطاع الكهرباء والعملاء.",
+ machineryTitle: "التجهيزات والآلات",
+ machineryKicker: "Equipment & Machinery",
+ machineryText:
+ "المصنع مجهّز بآلات من شركات أوروبية مرموقة لإنتاج أسلاك وكابلات الجهد المنخفض للاتصالات وكابلات التحكم والأجهزة الدقيقة وفق المواصفات الوطنية (ISIRI 607, 3569-1, 1926, …) والدولية (IEC, BS, VDE, …).",
+ guaranteeTitle: "ضمان الشركة",
+ guaranteeKicker: "Guarantee",
+ galleryTitle: "المعرض",
+ galleryKicker: "Gallery",
+ galleryItems: [
+ "مصنع كابلات كمان",
+ "ملفات الكابلات",
+ "تفاصيل الكابل",
+ "ملفات النحاس",
+ "خط الإنتاج",
+ "آلات الإنتاج",
+ ],
+ stats: [
+ { value: "۱۳۷۰", label: "سنة التأسيس", kicker: "Founded" },
+ { value: "۴۰٬۰۰۰", label: "متر مربع للمصنع", kicker: "Factory Area" },
+ { value: "۱۵٬۰۰۰", label: "طن طاقة سنوية", kicker: "Annual Capacity" },
+ { value: "ISO", label: "۹۰۰۱:۲۰۱۵ و ۱۷۰۲۵", kicker: "Certified" },
+ ],
+ },
+ contactPage: {
+ title: "اتصل بنا",
+ heading: "تواصل معنا",
+ kicker: "Contact Us",
+ metaDescription: "التواصل مع صناعات كابلات كمان. مكتب طهران ومصنع زنجان.",
+ heroAlt: "الاتصال بصناعات كابلات كمان",
+ infoTitle: "بيانات الاتصال",
+ mapTitle: "موقع مكتب صناعات كابلات كمان",
+ },
+ contactBar: {
+ label: "اتصل بنا",
+ subscribe: "اترك رقمك وسنتصل بك.",
+ },
+ callback: {
+ name: "الاسم",
+ phone: "رقم الهاتف",
+ submit: "إرسال الرقم",
+ sending: "جارٍ الإرسال…",
+ title: "طلب اتصال",
+ body: "طلب اتصال من الصفحة الرئيسية. الرقم: {phone}",
+ error: "تعذّر حفظ الرقم. يرجى المحاولة مرة أخرى.",
+ ok: "تم حفظ رقمك. سنتصل بك قريباً.",
+ network: "تعذّر الاتصال بالخادم.",
+ },
+ contactForm: {
+ heading: "أرسل رسالتك",
+ kicker: "Send a message",
+ name: "الاسم",
+ subject: "الموضوع",
+ email: "البريد الإلكتروني",
+ phone: "رقم الهاتف",
+ message: "نص الرسالة",
+ submit: "إرسال الرسالة",
+ sending: "جارٍ الإرسال…",
+ error: "تعذّر إرسال الرسالة. يرجى المحاولة مرة أخرى.",
+ ok: "تم إرسال رسالتك. سنتواصل معك قريباً.",
+ network: "تعذّر الاتصال بالخادم.",
+ },
+ categories: [
+ {
+ id: "power",
+ title: "كابل القدرة",
+ kicker: "Power Cable",
+ text: "تنقل أسلاك الكهرباء التيار عبر الموصلات الداخلية المكوِّنة للكابل.",
+ },
+ {
+ id: "flat",
+ title: "الكابلات المسطحة",
+ kicker: "Flat Cables",
+ text: "تناسب هذه الكابلات المصاعد والوصلات المتحركة.",
+ },
+ {
+ id: "phone",
+ title: "كابلات الاتصالات",
+ kicker: "Phone Cables",
+ text: "يُملأ داخل كابلات الاتصالات بهلام بلاستيكي لزج لمنع الرطوبة من إحداث قصر أو أكسدة بين الأسلاك.",
+ },
+ {
+ id: "network",
+ title: "كابلات الشبكة",
+ kicker: "Network Cable",
+ text: "يلزم كابل شبكة لربط الحواسيب والخوادم والموجّهات وغيرها على الشبكة.",
+ },
+ {
+ id: "instrument",
+ title: "الأجهزة الدقيقة والتحكم",
+ kicker: "Instrumentation & Control",
+ text: "تشكّل الأجهزة الدقيقة بنية نظام التحكم والأتمتة، وتشمل الحساسات والمتحكمات وغيرها.",
+ },
+ {
+ id: "coaxial",
+ title: "محوري",
+ kicker: "Coaxial",
+ text: "الكابل المحوري نوع شائع من كابلات نقل البيانات المحمية، ويتكون من موصلين.",
+ },
+ {
+ id: "fire",
+ title: "إنذار الحريق",
+ kicker: "Fire Alarm",
+ text: "تتولى أنظمة إنذار الحريق الإبلاغ عند اندلاع حريق، ويمكن تصنيفها إلى مجموعتين.",
+ },
+ {
+ id: "smart",
+ title: "المنزل الذكي",
+ kicker: "Smart House",
+ text: "في المنزل الذكي تتصل جميع الأجهزة وتُدار من جهاز مركزي.",
+ },
+ ],
+ partners: ["شريك ١", "شريك ٢", "شريك ٣", "شريك ٤", "شريك ٥"],
+ comments: {
+ empty: "لا توجد تعليقات بعد.",
+ submit: "نشر التعليق",
+ sending: "جارٍ الإرسال…",
+ ok: "تم إرسال تعليقك وسيظهر بعد الموافقة.",
+ loginPrompt: "سجّل الدخول لنشر تعليق.",
+ loginBody: "سجّل الدخول إلى حسابك لنشر تعليق.",
+ user: "مستخدم",
+ yourComment: "تعليقك",
+ placeholder: "اكتب تعليقك…",
+ sendError: "تعذّر إرسال التعليق. يرجى المحاولة مرة أخرى.",
+ unavailable: "التعليق غير متاح لهذا المحتوى.",
+ noDescription: "لا يوجد وصف مسجّل.",
+ noSpecs: "لا توجد مواصفات فنية لهذا المنتج.",
+ tabsLabel: "تفاصيل المنتج",
+ description: "الوصف",
+ technical: "المواصفات الفنية",
+ commentsTab: "التعليقات",
+ },
+};
diff --git a/src/i18n/config.ts b/src/i18n/config.ts
new file mode 100644
index 0000000..c87871e
--- /dev/null
+++ b/src/i18n/config.ts
@@ -0,0 +1,44 @@
+export const locales = ["fa", "en", "ar"] as const;
+
+export type Locale = (typeof locales)[number];
+
+export const defaultLocale: Locale = "fa";
+
+export const localeCookie = "kaman-locale";
+
+export const localeDir: Record
= {
+ fa: "rtl",
+ ar: "rtl",
+ en: "ltr",
+};
+
+export const localeHtml: Record = {
+ fa: "fa",
+ ar: "ar",
+ en: "en",
+};
+
+export const localeOg: Record = {
+ fa: "fa_IR",
+ ar: "ar_SA",
+ en: "en_US",
+};
+
+export const localeOptions: { id: Locale; label: string }[] = [
+ { id: "fa", label: "FA" },
+ { id: "en", label: "EN" },
+ { id: "ar", label: "AR" },
+];
+
+/** Meshkee catalog and blog are FA-only until those modules are translated. */
+export function showsCatalog(locale: Locale) {
+ return locale === "fa";
+}
+
+export function isLocale(value: string | null | undefined): value is Locale {
+ return value === "fa" || value === "en" || value === "ar";
+}
+
+export function isCatalogPath(pathname: string) {
+ return pathname === "/products" || pathname.startsWith("/products/") || pathname === "/blog" || pathname.startsWith("/blog/");
+}
diff --git a/src/i18n/en.ts b/src/i18n/en.ts
new file mode 100644
index 0000000..b867912
--- /dev/null
+++ b/src/i18n/en.ts
@@ -0,0 +1,260 @@
+import type { Messages } from "@/i18n/fa";
+
+export const en: Messages = {
+ brand: {
+ name: "Kaman Cable & Wire Industries",
+ shortName: "Kaman Cable",
+ nameEn: "Kaman Cable & Wire Industries",
+ nameEnShort: "Kaman Cable",
+ tagline: "Low-voltage, telecom, control, and instrumentation cables",
+ description:
+ "Since 1991, Kaman Cable has manufactured low-voltage power and telecom cables, control and instrumentation cables in Zanjan Industrial Town, in line with national and international standards.",
+ },
+ nav: {
+ home: "Home",
+ products: "Products",
+ blog: "Blog",
+ about: "About",
+ contact: "Contact",
+ menu: "Menu",
+ search: "Search",
+ language: "Language",
+ languageSelect: "Select language",
+ },
+ account: {
+ login: "Login",
+ dear: "Hi, {name}",
+ profile: "My profile",
+ logout: "Log out",
+ manage: "Website admin",
+ transferring: "Redirecting…",
+ },
+ footer: {
+ quickLinks: "Quick links",
+ contact: "Contact us",
+ },
+ contactInfo: {
+ address: "Tehran, Karim Khan Zand St., Sanaee St., above Sanaee Sq., No. 82, 3rd floor, Unit 6",
+ factory: "Industrial Town No. 1, Zanjan Province",
+ phoneLabel: "Phone",
+ addressLabel: "Address",
+ factoryLabel: "Factory",
+ addressEn: "Address",
+ factoryEn: "Factory",
+ phoneEn: "Phone",
+ },
+ social: {
+ instagram: "Instagram",
+ telegram: "Telegram",
+ linkedin: "LinkedIn",
+ email: "Email",
+ },
+ home: {
+ appTitle: "Dedicated app",
+ appCta: "Download the app",
+ aboutKicker: "About",
+ aboutTitle: "Kaman Cable",
+ contactCta: "Contact us",
+ productsKicker: "Products",
+ productsTitle: "Cables and wires",
+ productsText:
+ "A full range of low-voltage, telecom, network, and instrumentation cables, manufactured to national and international standards.",
+ blogKicker: "Blog",
+ blogTitle: "News and articles",
+ blogText: "Follow the latest technical notes and news from Kaman Cable.",
+ partnersKicker: "Partners",
+ partnersTitle: "Partners and clients",
+ partnersText: "Brands and organizations that specify Kaman Cable for their projects.",
+ aboutImageAlt: "Kaman Cable factory",
+ productImageAlt: "Kaman Cable product",
+ partnerImageAlt: "Kaman Cable partner",
+ sliderAlt: "Kaman Cable homepage slider",
+ sliderLabel: "Slider",
+ },
+ hero: {
+ slides: [
+ {
+ kicker: "KAMAN CABLE & WIRE INDUSTRIES",
+ title: "Kaman cable & wire",
+ },
+ {
+ kicker: "ENDORSED BY THE MINISTRY OF ENERGY AND OIL COMPANY",
+ title: "Approved by the Ministry of Energy and oil companies",
+ },
+ {
+ kicker: "HIGH QUALITY AND UP-TO-DATE PRODUCTS",
+ title: "Leading in quality, up-to-date products",
+ },
+ ],
+ highlights: [
+ { n: "1", title: "Product range", kicker: "Variety of products" },
+ { n: "2", title: "Production line", kicker: "Powerful Production Line" },
+ { n: "3", title: "Trusted maker", kicker: "Top Producer" },
+ ],
+ },
+ aboutTabs: {
+ resume: "Profile",
+ goalsTab: "Goals",
+ resumeText:
+ "Kaman Cable started operations in 1991 on a 40,000 m² site in Industrial Town No. 1, Zanjan Province. After installing machinery and infrastructure, and with experienced specialists, the plant obtained its operating license in 1994 for 15,000 tonnes of annual capacity and the national ISIRI standard mark. Quality and customer satisfaction sit at the centre of every activity. By focusing on customer needs, the company earned ISO 9001:2015 and CE in its early years, and continues to supply domestic and neighbouring markets with products that match customer goals.",
+ goalsParagraphs: [
+ "Honesty is the best policy.",
+ "As a wire and cable manufacturer, Kaman Cable has made customer satisfaction — through quality and full compliance — its highest goal. Senior management is committed to implementing, maintaining, and continually improving the effectiveness of the quality management system to ISO 9001:2015.",
+ ],
+ qualityIntro: "Our quality policy is:",
+ qualityPolicy: [
+ "Increase the range and volume of products",
+ "Raise customer satisfaction",
+ "Develop national and international standards in the organisation",
+ ],
+ },
+ aboutPage: {
+ title: "About us",
+ kicker: "About Us",
+ metaDescription:
+ "Kaman Cable manufactures low-voltage, telecom, and instrumentation cables. Founded in 1991 in Zanjan, Iran.",
+ heroAlt: "About Kaman Cable",
+ companyTitle: "Kaman Cable",
+ intro:
+ "Kaman Cable is an established manufacturer of electrical cables. The company uses European machinery to produce low-voltage power and telecom cables, control and instrumentation cables. Products follow national and international standards and are supplied at high quality to domestic and neighbouring markets, aligned with customer goals.",
+ goalsTitle: "Goals",
+ goalsKicker: "Quality Policy",
+ honesty: "Honesty is the best policy.",
+ goalsBody:
+ "As a wire and cable manufacturer, Kaman Cable has made customer satisfaction — through quality and full compliance — its highest goal.",
+ labTitle: "Kaman Cable laboratory",
+ labKicker: "Laboratory",
+ labText:
+ "In 2012 the Kaman Cable laboratory received a partner-lab certificate from the Zanjan Standards Institute, and it now holds ISIRI-ISO/IEC 17025 accreditation from the National Accreditation Center of Iran. It also holds approvals from Tavanir, regional electricity distribution companies, and oil companies. With advanced equipment and experienced specialists, the lab is ready to run the tests required by the power industry and our customers.",
+ machineryTitle: "Equipment and machinery",
+ machineryKicker: "Equipment & Machinery",
+ machineryText:
+ "The plant is equipped with European machinery for low-voltage power and telecom cables, control and instrumentation cables, to national standards (ISIRI 607, 3569-1, 1926, …) and international standards (IEC, BS, VDE, …).",
+ guaranteeTitle: "Company guarantee",
+ guaranteeKicker: "Guarantee",
+ galleryTitle: "Gallery",
+ galleryKicker: "Gallery",
+ galleryItems: [
+ "Kaman Cable factory",
+ "Cable coils",
+ "Cable detail",
+ "Copper coils",
+ "Production line",
+ "Production machinery",
+ ],
+ stats: [
+ { value: "1991", label: "Founded", kicker: "Founded" },
+ { value: "40,000", label: "m² factory", kicker: "Factory Area" },
+ { value: "15,000", label: "tonnes per year", kicker: "Annual Capacity" },
+ { value: "ISO", label: "9001:2015 & 17025", kicker: "Certified" },
+ ],
+ },
+ contactPage: {
+ title: "Contact us",
+ heading: "Get in touch",
+ kicker: "Contact Us",
+ metaDescription: "Contact Kaman Cable. Tehran office and Zanjan factory.",
+ heroAlt: "Contact Kaman Cable",
+ infoTitle: "Contact details",
+ mapTitle: "Kaman Cable office location",
+ },
+ contactBar: {
+ label: "Contact us",
+ subscribe: "Leave your number and we will call you back.",
+ },
+ callback: {
+ name: "Name",
+ phone: "Phone number",
+ submit: "Send number",
+ sending: "Sending…",
+ title: "Callback request",
+ body: "Callback request from the homepage. Number: {phone}",
+ error: "Could not save your number. Please try again.",
+ ok: "Your number was saved. We will call you soon.",
+ network: "Could not reach the server.",
+ },
+ contactForm: {
+ heading: "Send a message",
+ kicker: "Send a message",
+ name: "Name",
+ subject: "Subject",
+ email: "Email",
+ phone: "Phone number",
+ message: "Message",
+ submit: "Send message",
+ sending: "Sending…",
+ error: "Could not send the message. Please try again.",
+ ok: "Your message was sent. We will contact you soon.",
+ network: "Could not reach the server.",
+ },
+ categories: [
+ {
+ id: "power",
+ title: "Power cable",
+ kicker: "Power Cable",
+ text: "Power cables carry electrical current through their internal conductors.",
+ },
+ {
+ id: "flat",
+ title: "Flat cables",
+ kicker: "Flat Cables",
+ text: "These cables are suited to lifts and other moving connections.",
+ },
+ {
+ id: "phone",
+ title: "Telecom cables",
+ kicker: "Phone Cables",
+ text: "A jelly filling inside telecom cables helps keep moisture from causing shorts or oxidation between conductors.",
+ },
+ {
+ id: "network",
+ title: "Network cables",
+ kicker: "Network Cable",
+ text: "A LAN cable connects computers, servers, routers, and other devices on a network.",
+ },
+ {
+ id: "instrument",
+ title: "Instrumentation & control",
+ kicker: "Instrumentation & Control",
+ text: "Instrumentation forms the backbone of a control and automation system, including sensors, controllers, and more.",
+ },
+ {
+ id: "coaxial",
+ title: "Coaxial",
+ kicker: "Coaxial",
+ text: "Coaxial cable is a common shielded data cable built from two conductors.",
+ },
+ {
+ id: "fire",
+ title: "Fire alarm",
+ kicker: "Fire Alarm",
+ text: "Fire-alarm systems notify occupants in a fire and are grouped into two main types.",
+ },
+ {
+ id: "smart",
+ title: "Smart home",
+ kicker: "Smart House",
+ text: "In a smart home, appliances are connected and managed from a central controller.",
+ },
+ ],
+ partners: ["Partner 1", "Partner 2", "Partner 3", "Partner 4", "Partner 5"],
+ comments: {
+ empty: "No comments yet.",
+ submit: "Post comment",
+ sending: "Sending…",
+ ok: "Your comment was submitted and will appear after approval.",
+ loginPrompt: "Sign in to post a comment.",
+ loginBody: "Sign in to your account to post a comment.",
+ user: "User",
+ yourComment: "Your comment",
+ placeholder: "Write your comment…",
+ sendError: "Could not send the comment. Please try again.",
+ unavailable: "Comments are not available for this item.",
+ noDescription: "No description has been added.",
+ noSpecs: "No technical specifications are recorded for this product.",
+ tabsLabel: "Product details",
+ description: "Description",
+ technical: "Technical specs",
+ commentsTab: "Comments",
+ },
+};
diff --git a/src/i18n/fa.ts b/src/i18n/fa.ts
new file mode 100644
index 0000000..af235b8
--- /dev/null
+++ b/src/i18n/fa.ts
@@ -0,0 +1,260 @@
+export const fa = {
+ brand: {
+ name: "صنایع سیم و کابل کمان",
+ shortName: "کابل کمان",
+ nameEn: "Kaman Cable & Wire Industries",
+ nameEnShort: "Kaman Cable",
+ tagline: "تولید سیم و کابل فشار ضعیف، مخابراتی، کنترل و ابزار دقیق",
+ description:
+ "شرکت صنایع کابل کمان از سال ۱۳۷۰ در شهر صنعتی زنجان به تولید انواع سیم و کابل فشار ضعیف برق و مخابراتی، کابلهای کنترل و ابزار دقیق مطابق با استانداردهای ملی و بینالمللی میپردازد.",
+ },
+ nav: {
+ home: "صفحه اصلی",
+ products: "محصولات",
+ blog: "وبلاگ",
+ about: "درباره ما",
+ contact: "ارتباط با ما",
+ menu: "منو",
+ search: "جستجو",
+ language: "زبان",
+ languageSelect: "انتخاب زبان",
+ },
+ account: {
+ login: "ورود",
+ dear: "{name} عزیز",
+ profile: "پروفایل من",
+ logout: "خروج",
+ manage: "مدیریت وبسایت",
+ transferring: "در حال انتقال…",
+ },
+ footer: {
+ quickLinks: "دسترسی سریع",
+ contact: "تماس با ما",
+ },
+ contactInfo: {
+ address: "تهران، خیابان کریمخان زند، خیابان سنایی، بالاتر از میدان سنایی، پلاک ۸۲، طبقه سوم، واحد ۶",
+ factory: "شهر صنعتی شماره یک، استان زنجان",
+ phoneLabel: "تلفن",
+ addressLabel: "آدرس",
+ factoryLabel: "کارخانه",
+ addressEn: "Address",
+ factoryEn: "Factory",
+ phoneEn: "Phone",
+ },
+ social: {
+ instagram: "اینستاگرام",
+ telegram: "تلگرام",
+ linkedin: "لینکدین",
+ email: "ایمیل",
+ },
+ home: {
+ appTitle: "اپلیکیشن اختصاصی",
+ appCta: "دانلود اپلیکیشن",
+ aboutKicker: "About",
+ aboutTitle: "صنایع کابل کمان",
+ contactCta: "تماس با ما",
+ productsKicker: "Products",
+ productsTitle: "محصولات کابل و سیم",
+ productsText:
+ "تنوع کامل سیم و کابل فشار ضعیف، مخابراتی، شبکه و ابزار دقیق، تولیدشده مطابق با استانداردهای ملی و بینالمللی.",
+ blogKicker: "Blog",
+ blogTitle: "آخرین اخبار و مقالات",
+ blogText: "تازهترین دانستنیهای فنی و اخبار صنایع سیم و کابل کمان را در این بخش دنبال کنید.",
+ partnersKicker: "Partners",
+ partnersTitle: "همکاران و مشتریان",
+ partnersText: "برندها و مجموعههایی که کیفیت تولید کابل کمان را برای پروژههای خود انتخاب کردهاند.",
+ aboutImageAlt: "کارخانه صنایع کابل کمان",
+ productImageAlt: "محصول کابل کمان",
+ partnerImageAlt: "همکار کابل کمان",
+ sliderAlt: "اسلایدر صنایع کابل کمان",
+ sliderLabel: "اسلایدر",
+ },
+ hero: {
+ slides: [
+ {
+ kicker: "KAMAN CABLE & WIRE INDUSTRIES",
+ title: "kaman cable & wire",
+ },
+ {
+ kicker: "ENDORSED BY THE MINISTRY OF ENERGY AND OIL COMPANY",
+ title: "دارای تاییدیه از وزارت نیرو و شرکت نفت",
+ },
+ {
+ kicker: "HIGH QUALITY AND UP-TO-DATE PRODUCTS",
+ title: "پیشرو در ارائه محصولات با کیفیت و بروز",
+ },
+ ],
+ highlights: [
+ { n: "۱", title: "تنوع محصولات", kicker: "Variety of products" },
+ { n: "۲", title: "خط تولید قدرتمند", kicker: "Powerful Production Line" },
+ { n: "۳", title: "تولید کننده نمونه", kicker: "Top Producer" },
+ ],
+ },
+ aboutTabs: {
+ resume: "رزومه",
+ goalsTab: "اهداف",
+ resumeText:
+ "شرکت صنایع کابل کمان در سال ۱۳۷۰ در زمینی به وسعت ۴۰۰۰۰ متر مربع در شهر صنعتی شماره یک واقع در استان زنجان شروع به فعالیت نمود. این واحد تولیدی پس از گذراندن مراحل نصب ماشین آلات و تامین زیر ساختهای مناسب و با بهرهمندی از متخصصین و کارشناسان با تجربه در این رشته، در ابتدای سال ۱۳۷۳ موفق به اخذ پروانه بهرهبرداری با ظرفیت ۱۵۰۰۰ تن و دریافت گواهینامه استاندارد ملی (ISIRI) گردید. از آنجایی که کیفیت و رضایتمندی مشتری سرلوحه کلیه فعالیتها است، لذا این واحد تولیدی با تکیه بر اصل مشتریمداری و با تلاش متخصصین خود توانست در سالهای نخست گواهینامه ISO 9001:2015 و CE را اخذ نموده و در راستای نیاز روزافزون بازارهای داخلی و کشورهای همسایه به صورت گسترده محصولات خود را با کیفیت مرغوب و سازگار با اهداف مشتری عرضه نماید.",
+ goalsParagraphs: [
+ "صداقت بهترین روش است.",
+ "شرکت صنایع کابل کمان بهعنوان یکی از تولیدکنندگان سیم و کابل، رضایت مشتریان را از طریق ارتقاء کیفیت و رعایت کلیه قوانین و الزامات حاکم بر محصول خود، بهعنوان برترین هدف برگزیده است. در این راستا مدیریت ارشد، اعتقاد و تعهد خود را به اجرا، حفظ و بهبود مستمر اثربخشی سیستم مدیریت کیفیت بر اساس استاندارد ISO 9001:2015 اعلام میدارد.",
+ ],
+ qualityIntro: "خط مشی کیفیت عبارت است از:",
+ qualityPolicy: [
+ "افزایش تنوع و حجم محصولات تولیدی",
+ "افزایش سطح رضایتمندی مشتریان",
+ "توسعه استانداردهای ملی و بینالمللی در سازمان",
+ ],
+ },
+ aboutPage: {
+ title: "درباره ما",
+ kicker: "About Us",
+ metaDescription:
+ "آشنایی با شرکت صنایع کابل کمان؛ تولیدکننده سیم و کابل فشار ضعیف، مخابراتی و ابزار دقیق از سال ۱۳۷۰ در زنجان.",
+ heroAlt: "درباره صنایع کابل کمان",
+ companyTitle: "شرکت کابل کمان",
+ intro:
+ "شرکت کابل کمان یک شرکت موفق در زمینه تولید کابل و برق است که سابقه زیادی در این زمینه دارد. شرکت کابل کمان در حال حاضر از بهترین ماشینآلات شرکتهای سازنده معتبر اروپایی استفاده میکند و به تولید انواع سیم و کابل فشار ضعیف برق و مخابراتی، کابلهای کنترل و ابزار دقیق مشغول است. محصولات شرکت کابل کمان مطابق با استانداردهای ملی و بینالمللی است و محصولاتی با بهترین کیفیت را ارائه میدهد و به صورت گسترده نیاز بازارهای داخلی و کشورهای همسایه را با بالاترین کیفیت و سازگار با اهداف مشتری عرضه میکند.",
+ goalsTitle: "اهداف",
+ goalsKicker: "Quality Policy",
+ honesty: "صداقت بهترین روش است.",
+ goalsBody:
+ "شرکت صنایع کابل کمان بهعنوان یکی از تولیدکنندگان سیم و کابل، رضایت مشتریان را از طریق ارتقاء کیفیت و رعایت کلیه قوانین و الزامات حاکم بر محصول خود، بهعنوان برترین هدف برگزیده است.",
+ labTitle: "آزمایشگاه صنایع کابل کمان",
+ labKicker: "Laboratory",
+ labText:
+ "طبق تاریخچه آزمایشگاه شرکت صنایع کابل کمان در سال ۱۳۹۱ موفق به دریافت گواهینامه آزمایشگاه همکار از موسسه استاندارد استان زنجان شد و بهعنوان همکار آن موسسه محترم اقدام به فعالیت نمود و هماکنون دارای گواهینامه تایید صلاحیت آزمایشگاه از طرف مرکز ملی تایید صلاحیت ایران (ISIRI-ISO/IEC 17025) میباشد. علاوه بر گواهینامههای فوق، تاییدیه از شرکت توانیر، شرکتهای توزیع نیروی برق استانهای مختلف و شرکتهای نفت را نیز دارا میباشد. آزمایشگاه شرکت با داشتن تجهیزات پیشرفته و متخصصین با تجربه و توانمند جهت انجام انواع تست، آمادگی خدمترسانی مطابق با نیاز واحدهای مختلف صنعت برق و مشتریان گرامی را دارد.",
+ machineryTitle: "تجهیزات و ماشینآلات",
+ machineryKicker: "Equipment & Machinery",
+ machineryText:
+ "این شرکت هماکنون مجهز به انواع ماشینآلات از شرکتهای سازنده معتبر اروپایی، در زمینه تولید انواع سیم و کابل فشار ضعیف برق و مخابراتی، کابلهای کنترل و ابزار دقیق مطابق با انواع استانداردهای ملی (ISIRI 607, 3569-1, 1926, …) و بینالمللی (IEC, BS, VDE, …) قادر به ارائه محصولات با کیفیت است.",
+ guaranteeTitle: "ضمانتنامه شرکت",
+ guaranteeKicker: "Guarantee",
+ galleryTitle: "گالری",
+ galleryKicker: "Gallery",
+ galleryItems: [
+ "کارخانه کابل کمان",
+ "کلافهای کابل",
+ "جزئیات کابل",
+ "کلاف مس",
+ "خط تولید",
+ "ماشینآلات تولید",
+ ],
+ stats: [
+ { value: "۱۳۷۰", label: "سال تاسیس", kicker: "Founded" },
+ { value: "۴۰٬۰۰۰", label: "متر مربع کارخانه", kicker: "Factory Area" },
+ { value: "۱۵٬۰۰۰", label: "تن ظرفیت سالانه", kicker: "Annual Capacity" },
+ { value: "ISO", label: "۹۰۰۱:۲۰۱۵ و ۱۷۰۲۵", kicker: "Certified" },
+ ],
+ },
+ contactPage: {
+ title: "تماس با ما",
+ heading: "با ما در ارتباط باشید",
+ kicker: "Contact Us",
+ metaDescription: "ارتباط با صنایع کابل کمان. دفتر تهران و کارخانه زنجان.",
+ heroAlt: "تماس با صنایع کابل کمان",
+ infoTitle: "اطلاعات تماس",
+ mapTitle: "موقعیت دفتر صنایع کابل کمان",
+ },
+ contactBar: {
+ label: "تماس با ما",
+ subscribe: "شماره تماس خود را بگذارید، ما با شما تماس میگیریم.",
+ },
+ callback: {
+ name: "نام",
+ phone: "شماره تماس",
+ submit: "ثبت شماره",
+ sending: "در حال ارسال…",
+ title: "درخواست تماس",
+ body: "درخواست تماس از صفحه اصلی. شماره: {phone}",
+ error: "ثبت شماره انجام نشد. لطفاً دوباره تلاش کنید.",
+ ok: "شماره شما ثبت شد. بهزودی تماس میگیریم.",
+ network: "ارتباط با سرور برقرار نشد.",
+ },
+ contactForm: {
+ heading: "پیام خود را ارسال کنید",
+ kicker: "Send a message",
+ name: "نام",
+ subject: "موضوع",
+ email: "ایمیل",
+ phone: "شماره تماس",
+ message: "متن پیام",
+ submit: "ارسال پیام",
+ sending: "در حال ارسال…",
+ error: "ارسال پیام انجام نشد. لطفاً دوباره تلاش کنید.",
+ ok: "پیام شما ثبت شد. بهزودی با شما تماس میگیریم.",
+ network: "ارتباط با سرور برقرار نشد.",
+ },
+ categories: [
+ {
+ id: "power",
+ title: "کابل قدرت",
+ kicker: "Power Cable",
+ text: "سیمهای برق وظیفه انتقال جریان الکتریسیته را دارند و این انتقال توسط بخشهای داخلی تشکیلدهنده انجام میگیرد.",
+ },
+ {
+ id: "flat",
+ title: "کابلهای تخت",
+ kicker: "Flat Cables",
+ text: "این نوع کابلها جهت استفاده در بالابرها و نیز در اتصالات متحرک مناسب میباشند.",
+ },
+ {
+ id: "phone",
+ title: "کابلهای مخابراتی",
+ kicker: "Phone Cables",
+ text: "برای اینکه رطوبت حالت اتصال و اکسیدگی بین سیمها ایجاد نشود درون کابلهای مخابراتی را از نوعی ژله پلاستیکی چسبناک پر میکنند.",
+ },
+ {
+ id: "network",
+ title: "کابلهای شبکه",
+ kicker: "Network Cable",
+ text: "برای برقراری ارتباط در هر شبکه نیازمند کابل شبکه هستیم. کابل LAN ارتباط بین دو یا چند کامپیوتر، سرور، روتر و … را فراهم میکند.",
+ },
+ {
+ id: "instrument",
+ title: "ابزار دقیق و کنترل",
+ kicker: "Instrumentation & Control",
+ text: "ابزار دقیق در حقیقت زیرساخت یک سیستم کنترل و اتوماسیون را تشکیل میدهند و شامل انواع سنسور، انواع کنترلر و … میباشند.",
+ },
+ {
+ id: "coaxial",
+ title: "کواکسیال",
+ kicker: "Coaxial",
+ text: "کابل کواکسیال نوع خیلی رایج از کابل انتقال دادههای محافظتشده میباشد که از دو رسانا ساخته شده است.",
+ },
+ {
+ id: "fire",
+ title: "اعلام حریق",
+ kicker: "Fire Alarm",
+ text: "سیستمهای اعلام حریق وظیفه اطلاعرسانی در هنگام آتشسوزی را بر عهده دارند و میتوان آنها را به دو گروه تقسیم کرد.",
+ },
+ {
+ id: "smart",
+ title: "خانه هوشمند",
+ kicker: "Smart House",
+ text: "تفاوت خانه هوشمند با خانه معمولی این است که همه وسایل خانه هوشمند به یکدیگر متصل هستند و با دستگاه مرکزی کنترل میشوند.",
+ },
+ ],
+ partners: ["همکار ۱", "همکار ۲", "همکار ۳", "همکار ۴", "همکار ۵"],
+ comments: {
+ empty: "هنوز نظری ثبت نشده است.",
+ submit: "ثبت نظر",
+ sending: "در حال ارسال…",
+ ok: "نظر شما ثبت شد و پس از تأیید نمایش داده میشود.",
+ loginPrompt: "برای ثبت نظر وارد شوید.",
+ loginBody: "برای ثبت نظر وارد حساب کاربری شوید.",
+ user: "کاربر",
+ yourComment: "نظر شما",
+ placeholder: "نظر خود را بنویسید…",
+ sendError: "ارسال نظر انجام نشد. لطفاً دوباره تلاش کنید.",
+ unavailable: "ثبت نظر برای این مطلب در دسترس نیست.",
+ noDescription: "توضیحاتی ثبت نشده است.",
+ noSpecs: "مشخصات فنی برای این محصول ثبت نشده است.",
+ tabsLabel: "جزئیات محصول",
+ description: "توضیحات",
+ technical: "مشخصات فنی",
+ commentsTab: "نظرات",
+ },
+};
+
+export type Messages = typeof fa;
diff --git a/src/i18n/get-locale.ts b/src/i18n/get-locale.ts
new file mode 100644
index 0000000..a8030d6
--- /dev/null
+++ b/src/i18n/get-locale.ts
@@ -0,0 +1,14 @@
+import { cookies } from "next/headers";
+
+import { defaultLocale, isLocale, localeCookie, type Locale } from "@/i18n/config";
+import { getMessages } from "@/i18n/index";
+
+export async function getLocale(): Promise {
+ const value = (await cookies()).get(localeCookie)?.value;
+ return isLocale(value) ? value : defaultLocale;
+}
+
+export async function getDictionary() {
+ const locale = await getLocale();
+ return { locale, t: getMessages(locale) };
+}
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
new file mode 100644
index 0000000..a8af4b6
--- /dev/null
+++ b/src/i18n/index.ts
@@ -0,0 +1,14 @@
+import { ar } from "@/i18n/ar";
+import { defaultLocale, isLocale, type Locale } from "@/i18n/config";
+import { en } from "@/i18n/en";
+import { fa, type Messages } from "@/i18n/fa";
+
+export const dictionaries: Record = { fa, en, ar };
+
+export function getMessages(locale: Locale | string | null | undefined): Messages {
+ return dictionaries[isLocale(locale) ? locale : defaultLocale];
+}
+
+export function interpolate(template: string, vars: Record) {
+ return Object.entries(vars).reduce((text, [key, value]) => text.split(`{${key}}`).join(value), template);
+}
diff --git a/src/i18n/locale-context.tsx b/src/i18n/locale-context.tsx
new file mode 100644
index 0000000..662ae8e
--- /dev/null
+++ b/src/i18n/locale-context.tsx
@@ -0,0 +1,58 @@
+"use client";
+
+import { createContext, useCallback, useContext, useEffect, type ReactNode } from "react";
+import { usePathname, useRouter } from "next/navigation";
+
+import { isCatalogPath, isLocale, localeCookie, localeDir, localeHtml, type Locale } from "@/i18n/config";
+import { getMessages } from "@/i18n/index";
+
+const LocaleContext = createContext("fa");
+
+export function LocaleProvider({ locale, children }: { locale: Locale; children: ReactNode }) {
+ const router = useRouter();
+
+ useEffect(() => {
+ const saved = window.localStorage.getItem(localeCookie);
+ const hasCookie = document.cookie.split("; ").some((part) => part.startsWith(`${localeCookie}=`));
+ if (!hasCookie && isLocale(saved) && saved !== locale) {
+ persistLocale(saved);
+ router.refresh();
+ }
+ }, [locale, router]);
+
+ return {children} ;
+}
+
+export function useLocale() {
+ return useContext(LocaleContext);
+}
+
+export function useMessages() {
+ return getMessages(useLocale());
+}
+
+export function persistLocale(locale: Locale) {
+ document.cookie = `${localeCookie}=${locale}; Path=/; Max-Age=31536000; SameSite=Lax`;
+ window.localStorage.setItem(localeCookie, locale);
+ document.documentElement.lang = localeHtml[locale];
+ document.documentElement.dir = localeDir[locale];
+}
+
+export function useSetLocale() {
+ const router = useRouter();
+ const pathname = usePathname();
+
+ return useCallback(
+ (next: string) => {
+ if (!isLocale(next)) return;
+ persistLocale(next);
+ if (isCatalogPath(pathname) && next !== "fa") {
+ router.push("/");
+ router.refresh();
+ return;
+ }
+ router.refresh();
+ },
+ [pathname, router],
+ );
+}
diff --git a/src/lib/seo.ts b/src/lib/seo.ts
index d10d322..49c85f6 100644
--- a/src/lib/seo.ts
+++ b/src/lib/seo.ts
@@ -1,6 +1,7 @@
import type { Metadata } from "next";
-import { site } from "@/data/site";
+import { defaultLocale, localeOg, type Locale } from "@/i18n/config";
+import { getMessages } from "@/i18n/index";
import { websiteDomain } from "@/lib/config";
export const siteUrl = `https://${websiteDomain}`;
@@ -11,15 +12,18 @@ export function pageMetadata({
path = "/",
image,
absolute = false,
+ locale = defaultLocale,
}: {
title: string;
description: string;
path?: string;
image?: string | null;
absolute?: boolean;
+ locale?: Locale;
}): Metadata {
const url = `${siteUrl}${path.startsWith("/") ? path : `/${path}`}`;
const ogImage = image || `${siteUrl}/images/slider/bg1.jpg`;
+ const t = getMessages(locale);
return {
title: absolute ? { absolute: title } : title,
@@ -27,9 +31,9 @@ export function pageMetadata({
alternates: { canonical: url },
openGraph: {
type: path === "/" ? "website" : "article",
- locale: "fa_IR",
+ locale: localeOg[locale],
url,
- siteName: site.shortName,
+ siteName: t.brand.shortName,
title,
description,
images: [{ url: ogImage, alt: title }],
diff --git a/src/lib/static-images.ts b/src/lib/static-images.ts
index a2a6301..0d4a9fe 100644
--- a/src/lib/static-images.ts
+++ b/src/lib/static-images.ts
@@ -1,4 +1,5 @@
import { meshkeeApiBase, websiteDomain } from "@/lib/config";
+import type { CSSProperties } from "react";
export type SlotKind = "single" | "list";
@@ -158,9 +159,9 @@ export function parseAspectRatio(ratio?: string | null) {
}
/** CSS custom property consumed by `.about-photo`, `.product-card .thumb`, `.client`. */
-export function slotRatioStyle(ratio?: string | null): { "--slot-ratio": string } | undefined {
+export function slotRatioStyle(ratio?: string | null): CSSProperties | undefined {
const parsed = parseAspectRatio(ratio);
- return parsed ? { "--slot-ratio": parsed } : undefined;
+ return parsed ? ({ ["--slot-ratio"]: parsed } as CSSProperties) : undefined;
}
export function pickSlot(slots: StaticImageSlot[], key: string) {
diff --git a/src/middleware.ts b/src/middleware.ts
new file mode 100644
index 0000000..0c083bb
--- /dev/null
+++ b/src/middleware.ts
@@ -0,0 +1,17 @@
+import { NextResponse } from "next/server";
+import type { NextRequest } from "next/server";
+
+import { isCatalogPath, isLocale, localeCookie, showsCatalog } from "@/i18n/config";
+
+export function middleware(request: NextRequest) {
+ const raw = request.cookies.get(localeCookie)?.value;
+ const locale = isLocale(raw) ? raw : "fa";
+ if (!showsCatalog(locale) && isCatalogPath(request.nextUrl.pathname)) {
+ return NextResponse.redirect(new URL("/", request.url));
+ }
+ return NextResponse.next();
+}
+
+export const config = {
+ matcher: ["/products", "/products/:path*", "/blog", "/blog/:path*"],
+};