diff --git a/.gitignore b/.gitignore index 5a86d2a..eb66c62 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ coverage/ *.log .env* !.env.example +/fonts/ +/backend/uploads/ diff --git a/backend/prisma/seed-products-data.json b/backend/prisma/seed-products-data.json index 4da166d..964214c 100644 --- a/backend/prisma/seed-products-data.json +++ b/backend/prisma/seed-products-data.json @@ -1,6 +1,7 @@ [ { "name": "Canina Ballaststoff Mix", + "category_slug": "immune", "description": "فیبر میکس کانینا حاوی منابع فیبر گیاهی است که به طور روزانه رژیم غذایی خام پت را تقویت می کند. این فیبرها به عنوان پری بیوتیک برای فلور پایدار روده مهم هستند. حرکت طبیعی روده را تحریک کرده، مدفوع را حجیم می کند و تاثیر مثبتی بر تخلیه غدد مقعدی دارد. سیستم ایمنی روده را تقویت کرده و انرژی باکتری های روده بزرگ را تامین می کند. بدون غلات و پروتئین حیوانی بوده و برای آلرژی غذایی مناسب است.", "ingredients": "تفاله سیب، پودر یونجه سبز، فیبر نخود فرنگی، تفاله هویج، کیک بذر کتان، کمپلکس الیگوساکارید و بتاگلوکان، مخمر آبجو، کنگر فرنگی، خاک دیاتومه، روغن کلزا، کربنات کلسیم. مواد تشکیل دهنده: پروتئین خام 11.9%، چربی خام 6.3%، فیبر خام 27.3%.", "usage_and_dosage": "مناسب برای توله سگ ها، بچه گربه ها و حیوانات مسن، باردار و شیرده. پودر را با کمی آب گرم مخلوط کنید. مقدار مصرف: 1 گرم به ازای هر کیلوگرم وزن بدن، حداکثر 15 گرم در روز.", @@ -10,6 +11,7 @@ }, { "name": "Canina CANHYDROX GAG", + "category_slug": "joints", "description": "ویژه سگ های بزرگ و سنگین وزن برای درمان بافت همبند، مفاصل، استخوان ها، تاندون ها و غضروف. ایده آل برای سگ های در مرحله رشد، مسن و سگ های با عملکرد بالا. از تشکیل کالوس و استحکام استخوان پشتیبانی کرده و ظرفیت بافر مفاصل را بهبود می بخشد.", "ingredients": "30% تری کلسیم فسفات، هیدروکسی آپاتیت، مخمر آبجو، 10% پودر صدف سبز، جلبک دریایی. ویتامین سی، ویتامین ایی، سلنیوم و متیونین.", "usage_and_dosage": "سگ های جوان از 8 هفتگی: برای پیشگیری 2 قرص و برای اندام های بدشکل 4 قرص به ازای هر 10 کیلوگرم تا 15 ماهگی. سگ های مسن و عملکردی: 4 قرص به ازای هر 10 کیلوگرم. پس از شکستگی: 4 قرص برای دوره نقاهت.", @@ -19,6 +21,7 @@ }, { "name": "Canina Eierschalenpulver", + "category_slug": "energy", "description": "پودر پوسته تخم مرغ برای تامین کلسیم، سلامت دندان ها و فعالیت عضلات. جایگزین پودر استخوان برای سگ های دارای آلرژی به پروتئین گوشت. مناسب برای تکمیل وعده های غذایی گوشتی خام (B.A.R.F).", "ingredients": "100% پوسته تخم مرغ آسیاب شده. خاکستر خام 96%، کلسیم 36%، فسفر 0.1%.", "usage_and_dosage": "0.2 گرم به ازای هر کیلوگرم وزن بدن، حداکثر 16 گرم برای هر حیوان در روز.", @@ -28,6 +31,7 @@ }, { "name": "Canina FLEXAN", + "category_slug": "joints", "description": "پشتیبانی از سیستم اسکلتی عضلانی، مفاصل متحرک و تناسب اندام. پپتیدهای کلاژن غضروف را بازسازی کرده و پودر صدف لب سبز بافت همبند را تقویت می کند.", "ingredients": "90% کلاژن، 10% پودر گوشت صدف لب سبز. پروتئین خام 94.2%.", "usage_and_dosage": "تغذیه روزانه برای توله سگ ها تا مسن. 2 گرم به ازای هر 10 کیلوگرم وزن بدن، حداکثر 15 گرم در روز.", @@ -37,6 +41,7 @@ }, { "name": "Canina HERZ VITAL", + "category_slug": "energy", "description": "برای سگ ها و گربه های مسن دارای نارسایی قلبی. ال کارنیتین بر تامین انرژی قلب و عضلات تاثیر گذاشته و نشاط و رفاه حیوان را افزایش می دهد.", "ingredients": "دکستروز، مخمر غیر فعال، زالزالک. حاوی ال کارنیتین.", "usage_and_dosage": "نصف قاشق چایخوری به ازای هر 10 کیلوگرم وزن بدن، حداکثر 3 قاشق چایخوری. به مدت 6 ماه همراه غذا تجویز شود.", @@ -46,6 +51,7 @@ }, { "name": "Canina IMMUN-BOOSTER Paste", + "category_slug": "immune", "description": "بازیابی و نقاهت تغذیه ای با چگالی انرژی بالا. ایمونوگلوبولین های آغوز سیستم دفاعی را تقویت کرده و برای نقاهت پس از زایمان، تمرین و استرس عالی است. انتروکوک فاسیوم فلور روده را سالم نگه می دارد.", "ingredients": "روغن های گیاهی، 20% پودر آغوز، شکر انگور. ویتامین آ، د3، ایی و تثبیت کننده فلور روده.", "usage_and_dosage": "توله ها 0.25 میلی لیتر، سگ های متوسط 0.5-1 میلی لیتر، سگ های بزرگ 1-4 میلی لیتر در روز تا زمان بهبودی کامل.", @@ -55,6 +61,7 @@ }, { "name": "Canina Katzenmilch", + "category_slug": "nutrition", "description": "غذای کامل جایگزین شیر مادر با ویتامین ها و مواد معدنی. مناسب بچه گربه های بی مادر از 1 روزگی، گربه های مسن، بیمار و شیرده.", "ingredients": "لاکتوز، پودر آب پنیر، چربی نارگیل، روغن ماهی، پروتئین 30%. غنی از ویتامین ها و 100 میلی گرم تورین.", "usage_and_dosage": "1 قسمت شیر با 3 قسمت آب ولرم مخلوط شود. به بچه گربه های 1 تا 14 روزه هر 2 ساعت تغذیه شود.", @@ -64,6 +71,7 @@ }, { "name": "Canina Lachsöl", + "category_slug": "special-care", "description": "روغن ماهی سالمون 100% خالص سرشار از اسیدهای چرب امگا 3 (EPA و DHA). متابولیسم را تنظیم کرده و از بازسازی پوست و رشد مو پشتیبانی می کند.", "ingredients": "100% روغن ماهی سالمون. اسیدهای چرب چند غیراشباع 56%، امگا 3 (14%) و امگا 6 (11%).", "usage_and_dosage": "2 میلی لیتر به ازای هر 10 کیلوگرم وزن بدن، حداکثر 10 میلی لیتر در روز مخلوط با خوراک.", @@ -73,6 +81,7 @@ }, { "name": "Canina Marine-Ölmischung PREMIUM", + "category_slug": "special-care", "description": "ترکیبی هماهنگ از روغن های خوراکی که متابولیسم ارگانیسم را ارتقا می دهد. از کمبود مواد مغذی در رژیم های خام جلوگیری می کند. روغن آرگان و گل رز به عنوان آنتی اکسیدان و بازسازی کننده عمل می کنند.", "ingredients": "روغن ماهی، روغن گردو، روغن آرگان، روغن دانه گل رز. چربی خام 100%.", "usage_and_dosage": "قابل افزودن به تمام وعده های غذایی برای بهینه سازی ویتامین ها و اسیدهای چرب امگا.", @@ -82,6 +91,7 @@ }, { "name": "Canina Moortränke", + "category_slug": "immune", "description": "عصاره پیت حاوی مواد هومیک برای محافظت از غشاهای مخاطی و سیستم ایمنی روده. ایده آل برای نفخ، اسهال، پس از درمان آنتی بیوتیک، تحریک اشتها و خون سازی.", "ingredients": "100% پیت، پیت مایع (بدون افزودنی و نگهدارنده).", "usage_and_dosage": "قبل از استفاده تکان دهید. سگ های کوچک 2.5 تا 5 میلی لیتر، سگ های متوسط 10 میلی لیتر، سگ های بزرگتر 15 تا 20 میلی لیتر. از 20 میلی لیتر تجاوز نکند.", @@ -91,6 +101,7 @@ }, { "name": "Canina PETVITAL Arthro-Tabletten", + "category_slug": "joints", "description": "متابولیسم استخوان را بهبود بخشیده و مفاصل ضعیف را تقویت می کند. عصاره بید و زنجبیل به عنوان آنتی اکسیدان عمل کرده و خاصیت ارتجاعی استخوان را افزایش می دهند.", "ingredients": "گیاهان خشک (بید و زنجبیل)، ویتامین ایی، ویتامین ب1، آهن، مس، روی.", "usage_and_dosage": "توله سگ ها: 2 قرص به ازای 10 کیلوگرم برای 1 ماه. سگ های بالغ: 5 قرص به ازای 10 کیلوگرم برای 3 ماه (سالی یکبار تکرار شود).", @@ -100,6 +111,7 @@ }, { "name": "Canina PETVITAL Bio-Aktivator", + "category_slug": "energy", "description": "حاوی سرم خون گاو برای تحریک اشتها و تسریع بهبودی در دوره نقاهت. رفاه و هماهنگی متابولیسم را بهبود می بخشد.", "ingredients": "سرم خون گاو، اتانول 164.4 گرم (به عنوان طعم دهنده).", "usage_and_dosage": "1 قطره به ازای هر کیلوگرم وزن بدن، حداکثر 20 قطره در روز. قطره ها به مدت 4 هفته داده شوند، سپس 2 هفته استراحت.", @@ -109,6 +121,7 @@ }, { "name": "Canina PETVITAL Biotin-Tabs", + "category_slug": "special-care", "description": "دوز بالای بیوتین (ویتامین H) برای جلوگیری از ریزش مو، ایجاد پوشش براق، رنگدانه های قوی و پنجه های محکم.", "ingredients": "دکستروز، آب پنیر، نشاسته، سلولز. بیوتین 1000000 میکروگرم، ویتامین ب2، اسید نیکوتینیک.", "usage_and_dosage": "یک قرص به ازای هر 10 کیلوگرم وزن بدن، حداکثر 5 قرص در روز.", @@ -118,6 +131,7 @@ }, { "name": "Canina PETVITAL ENERGY-GEL", + "category_slug": "energy", "description": "کنسانتره انرژی برای اصلاح سریع کمبودهای مواد مغذی. ایده آل برای دوره نقاهت جهت تحریک اشتها، دوره های رشد، بارداری و شیردهی.", "ingredients": "روغن ها، چربی ها، ویتامین ایی، ویتامین ب1، ب2، ب6، ب12.", "usage_and_dosage": "1 قاشق چایخوری (3 میلی لیتر) به ازای 10 کیلوگرم وزن بدن، حداکثر 4 قاشق چایخوری در روز.", @@ -127,6 +141,7 @@ }, { "name": "Canina PETVITAL MINERAL-Tabs", + "category_slug": "energy", "description": "انواع مختلف کلسیم برای برطرف کردن کمبود و تشکیل بافت استخوانی. عالی برای دوره رشد، بارداری و شیردهی جهت تامین نیاز کلسیم.", "ingredients": "کربنات کلسیم، مخمر آبجو، ویتامین د3 100000 (برای ذخیره کلسیم در استخوان).", "usage_and_dosage": "سگ های بالغ: 2 قرص به ازای 10 کیلوگرم. باردار و شیرده: 3 قرص به ازای 10 کیلوگرم. مصرف ویتامین D2 همزمان مجاز نیست.", @@ -136,6 +151,7 @@ }, { "name": "Canina PETVITAL GAG", + "category_slug": "joints", "description": "تامین گلیکوزآمینوگلیکان ها، تاندون ها، رباط ها و غضروف مفاصل را تثبیت می کند. شامل پودر صدف لب سبز و اسیدهای آمینه برای عملکرد بهینه سیستم حرکتی.", "ingredients": "پودر ماهی، پودر جلبک دریایی، پودر گوشت صدف لب سبز. دی ال متیونین، ویتامین ایی، سلنیوم.", "usage_and_dosage": "پودر: 1 قاشق چایخوری به ازای 10 کیلوگرم (حداکثر 4 قاشق). قرص: 1 قرص به ازای 10 کیلوگرم (حداکثر 5 قرص).", @@ -147,6 +163,7 @@ }, { "name": "Canina PETVITAL VITAMIN-Tabs", + "category_slug": "energy", "description": "اصلاح کمبود ویتامین، جلوگیری از خستگی، عدم تناسب و اختلالات رشد. ایده آل برای مادران باردار و شرایط استرس زا.", "ingredients": "مخمر آبجو، سلولز، ویتامین های آ، ب1 تا ب12، د3، ایی، کا3.", "usage_and_dosage": "1 قرص به ازای هر 10 کیلوگرم وزن بدن در روز.", @@ -156,6 +173,7 @@ }, { "name": "Canina Rinderblut Pulver", + "category_slug": "energy", "description": "پودر خون گاو، منبع ارزشمند آهن و هموگلوبین برای انتقال اکسیژن. مکمل عالی برای رژیم گوشت خام (B.A.R.F) جهت تامین خون از دست رفته و رشد عضلات. مناسب دوره نقاهت و سگ های ورزشی.", "ingredients": "خون کامل گاو خشک شده. پروتئین خام 92%، آهن.", "usage_and_dosage": "0.3 گرم به ازای هر کیلوگرم وزن بدن (حداکثر 12 گرم در روز) مخلوط با خوراک خام برای 6 ماه.", @@ -166,6 +184,7 @@ }, { "name": "Canina Rinderfett Pulver", + "category_slug": "energy", "description": "منبع انرژی طبیعی از چربی گوشت گاو آب پز بدون شکر. عالی برای حیوانات لاغر، سگ های بسیار فعال، و جبران کمبود چربی در وعده های خام.", "ingredients": "72% چربی گوشت گاو، 27% آب گوشت گاو خشک شده. انرژی: 740 کیلوکالری.", "usage_and_dosage": "نصف قاشق چایخوری به ازای هر 10 کیلوگرم وزن بدن، حداکثر 3 قاشق چایخوری در روز همراه غذای مرطوب.", @@ -175,6 +194,7 @@ }, { "name": "Canina Schwarz Kümmel Samen", + "category_slug": "general", "description": "دانه های زیره سیاه سرشار از اسیدهای چرب غیر اشباع که هضم و متابولیسم را تنظیم می کنند. سیستم دفاعی و عملکرد سگ را تقویت می کند.", "ingredients": "100% دانه های زیره سیاه مصری.", "usage_and_dosage": "1 قاشق چایخوری به ازای 10 کیلوگرم وزن بدن، حداکثر 4 قاشق چایخوری مخلوط با آب ولرم. در بارداری استفاده نشود.", @@ -184,6 +204,7 @@ }, { "name": "Canina Seealgen / Bio-Seealgenmehl", + "category_slug": "special-care", "description": "جلبک دریایی ارگانیک سرشار از مواد معدنی و اسیدهای آمینه که با ید و روی، رنگدانه های پوست، بینی و پوشش را پشتیبانی می کند. هضم و سیستم ایمنی را بهبود می بخشد.", "ingredients": "جلبک دریایی حاوی لیزین، سلولز و ویتامین سی.", "usage_and_dosage": "قرص: 2 عدد به ازای 10 کیلوگرم. پودر: نصف قاشق چایخوری به ازای 10 کیلوگرم وزن بدن. جهت تامین نیاز ید.", @@ -195,6 +216,7 @@ }, { "name": "Canina TAURIN Für Katzen", + "category_slug": "special-care", "description": "اسید آمینه ضروری برای گربه ها که سیستم ایمنی، بینایی و قلب را پشتیبانی می کند. کمبود آن باعث نابینایی و اختلالات عصبی می شود.", "ingredients": "مخمر آبجو، تورین 700 گرم.", "usage_and_dosage": "گربه تا 6 کیلو: نصف قاشق چایخوری. بالای 6 کیلو و باردار/شیرده: 1 قاشق چایخوری در روز.", @@ -204,6 +226,7 @@ }, { "name": "Canina Velox Gelenkenergie", + "category_slug": "joints", "description": "کنسانتره صدف لب سبز نیوزیلندی برای بازسازی مفاصل، رباط ها و غضروف. افزایش استقامت مفاصل توله ها در حال رشد و سگ های پیر.", "ingredients": "100% پودر گوشت صدف لب سبز.", "usage_and_dosage": "1 قاشق چایخوری به ازای 10 کیلوگرم وزن بدن (حداکثر 2 قاشق) در روز به مدت 4 هفته یا مداوم.", @@ -213,6 +236,7 @@ }, { "name": "Canina Welpenbrei", + "category_slug": "nutrition", "description": "فرنی با پروتئین و ویتامین بالا که پرورش سالم توله سگ را از هفته 3 تضمین می کند.", "ingredients": "غلات، گوشت، فرآورده های لبنی، ماهی، پروتئین 27%.", "usage_and_dosage": "1 قسمت فرنی را با 3 قسمت آب گرم (50 درجه سانتیگراد) مخلوط کنید. مصرف ویتامین D2 همزمان مجاز نیست.", @@ -222,6 +246,7 @@ }, { "name": "Canina Welpenmilch", + "category_slug": "nutrition", "description": "شیر کامل جایگزین شیر مادر با انرژی و ویتامین بالا برای توله سگ های بی مادر از روز 1.", "ingredients": "لاکتوز، پودر آب پنیر، روغن ماهی، پروتئین 30%، تورین، ویتامین ها.", "usage_and_dosage": "1 قسمت شیر با 4 قسمت آب 50 درجه مخلوط شود. تغذیه هر 2 ساعت در ابتدا و سپس هر 4 ساعت.", @@ -231,6 +256,7 @@ }, { "name": "Canina PETVITAL Bio-Insect Shocker", + "category_slug": "special-care", "description": "اسپری دفع کننده محیطی کک، شپش و کنه. تخم ها و انگل های خارجی را به طور موثر از بین می برد.", "ingredients": "15 گرم در لیتر دودکانوئیک اسید، 5 گرم در لیتر عصاره مارگوسا.", "usage_and_dosage": "هر 4 تا 6 هفته به صورت اسپری از فاصله 30 سانتی متری روی محل زندگی و خواب حیوان استفاده شود.", @@ -241,6 +267,7 @@ }, { "name": "Canina Mikrosilber Zahngel", + "category_slug": "special-care", "description": "ژل دندانی با میکروسیلور که پلاک، جرم و التهاب لثه را هدف قرار می دهد. بیوفلاونوئیدها از باکتری های پلاک جلوگیری می کنند.", "ingredients": "آب، نقره، گلیسیرین، عصاره دانه گریپ فروت.", "usage_and_dosage": "روزانه عصرها 1 ساعت پس از غذا روی دندان های آسیاب مالیده شود. سگ تا 10 کیلو: 1 سانتی متر ژل.", @@ -250,6 +277,7 @@ }, { "name": "Canina NovaGard Green Augenpflege", + "category_slug": "special-care", "description": "قطره چشم برای تمیز کردن و مراقبت از چشم های گریان و گرفتگی چشم. نقره کلوئیدی از التهاب جلوگیری می کند.", "ingredients": "آب بدون مواد معدنی، هیالورونات سدیم، نقره کلوئیدی.", "usage_and_dosage": "چند قطره روی کیسه ملتحمه ریخته و اطراف چشم پاک شود.", @@ -259,6 +287,7 @@ }, { "name": "Canina NovaGard Green Pfotenpflege", + "category_slug": "special-care", "description": "کرم مراقبت از پنجه 100% طبیعی برای تسکین پوست خارش دار، التیام زخم ها و خراشیدگی پوست سگ ها در زمستان و تابستان.", "ingredients": "وازلین، روغن پالپ سنجد دریایی، روغن کالاندولا، پانتنول.", "usage_and_dosage": "چندین بار در روز روی نواحی آسیب دیده بمالید و ماساژ دهید.", diff --git a/backend/prisma/seed-ui-texts.ts b/backend/prisma/seed-ui-texts.ts new file mode 100644 index 0000000..1cf8e67 --- /dev/null +++ b/backend/prisma/seed-ui-texts.ts @@ -0,0 +1,150 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +const UI_TEXTS: Record = { + // === Header / Navigation === + "shipping_notice": "ارسال رایگان برای سفارش‌های بالای ۱۵۰ هزار تومان", + "brand_name_fa": "ایران", + "brand_subtitle": "نماینده رسمی Canina Pharma GmbH آلمان", + "nav_solutions": "راهکارهای درمانی", + "nav_products": "محصولات تخصصی", + "nav_wiki": "دانشنامه علمی", + "nav_blog": "مجله سلامت پت", + "nav_pet_profiles": "شناسنامه پتها", + "nav_search_placeholder": "جستجوی محصولات، مقالات سلامت و...", + "nav_search_button": "جستجو", + "nav_pet_switcher_title": "تغییر پت یا مدیریت حساب", + "nav_register_pet": "ثبت همدم (Pet) جدید", + "nav_wallet_orders": "کیف پول و سفارشات", + "nav_logout": "خروج از حساب کانینا", + "nav_login": "ورود / ثبت‌نام", + "nav_cart": "سبد خرید", + + // === Hero Section === + "hero_badge": "تخصص دارویی از آلمان", + "hero_title": "تخصص آلمانی در خدمت\nسلامت پت‌های خانگی", + "hero_desc": "بیش از ۴۰ سال تجربه نوآورانه در تولید مکمل‌های درمانی با بالاترین استاندارد کیفی «گرید دارویی اختصاصی». راهکار هوشمند برای هر نیاز بالینی.", + "hero_btn_advisor": "دستیار سلامت پت", + "hero_btn_products": "مشاهده محصولات", + "hero_image_badge": "سرآمد علمی در پزشکی پت‌ها", + "hero_image_title": "مکمل‌های تایید شده دامپزشکی", + "hero_quality_standard": "استاندارد کیفی آلمان", + "hero_stat_founded": "سال تأسیس ۱۹۸۴", + "hero_stat_agencies": "نمایندگی فعال", + "hero_stat_german_formula": "فرمول آلمانی", + + // === Smart Advisor === + "advisor_badge": "تکنولوژی پایش هوشمند", + "advisor_title": "دستیار سلامت کانینا", + "advisor_subtitle": "فقط چند قدم تا صدور شناسنامه هوشمند و دریافت پیشنهادات تخصصی", + "advisor_step1_title": "گام اول: هویت بصری", + "advisor_step1_desc": "همدم شما رو با چه اسمی صدا می‌زنید؟", + "advisor_pet_name_label": "نام پت", + "advisor_pet_name_placeholder": "لوسی، تدی...", + "advisor_pet_breed_label": "نژاد", + "advisor_pet_breed_placeholder": "ژرمن، پرشین...", + "advisor_submit_btn": "ثبت هویت و ادامه", + "advisor_validation_warning": "⚠️ لطفاً ابتدا نام و نژاد پت را در بالا وارد کنید.", + "advisor_step2_title": "گام دوم: پایش فیزیکی", + "advisor_step2_desc": "اطلاعات فیزیکی دقیق به دوزبندی صحیح مکمل‌ها کمک می‌کند", + "advisor_age_label": "سن حیوان (سال)", + "advisor_weight_label": "وزن حیوان (کیلوگرم)", + "advisor_activity_label": "سطح فعالیت روزانه", + "advisor_back": "قبلی", + "advisor_next_final": "گام نهایی سلامت", + "advisor_step3_title": "گام آخر: سوابق و حساسیت‌ها", + "advisor_step3_desc": "در صورت وجود هر یک از موارد زیر، آن را تیک بزنید", + "advisor_complete": "تکمیل و صدور شناسنامه", + + // === Featured Products === + "featured_badge": "بیشترین انتخاب توسط دامپزشکان", + "featured_title_line1": "محصولات برگزیده و راهکارهای", + "featured_title_line2": "درمان تخصصی", + "featured_desc": "محصولات دارویی کانینا با استفاده از دانش پیشرفته بیوتکنولوژی و مواد اولیه ارگانیک نایاب فرآوری شده‌اند.", + "featured_view_all": "مشاهده تمامی محصولات", + "product_view_details": "مشاهده جزییات", + "featured_no_products_title": "هیچ محصولی یافت نشد", + "featured_no_products_desc": "در حال حاضر هیچ محصول برجسته‌ای برای نمایش وجود ندارد. لطفاً در پنل ادمین محصولات برگزیده را تنظیم کنید.", + + // === Vet Gallery / Videos === + "videos_badge": "Vet Insights", + "videos_title": "مشاوره ویدئویی", + "videos_title_highlight": "دوست دامپزشک پت شما", + "videos_desc": "متخصصین آلمانی کانینا مستقیماً با شما صحبت می‌کنند. نحوه مصرف، مزایای رقابتی و دانش تخصصی پشت هر محصول.", + "videos_view_all": "مشاهده همه ویدئوها", + + // === Navigation Cards (Home Page) === + "nav_card_shop_title": "فروشگاه تخصصی", + "nav_card_shop_desc": "دسترسی به تمامی محصولات بر اساس علائم بالینی و نیازهای پت شما.", + "nav_card_shop_cta": "کاتالوگ کامل محصولات", + "nav_card_wiki_title": "دانشنامه علمی", + "nav_card_wiki_desc": "آشنایی با ترکیبات نایاب و استانداردهای دارویی محصولات آلمانی کانینا.", + "nav_card_wiki_cta": "مطالعه مقالات تخصصی", + + // === About Section === + "about_label": "میراث ما از آلمان", + "about_title": "چرا برند آلمانی Canina مرجع دامپزشکان است؟", + "about_item1_title": "مواد اولیه نایاب", + "about_item1_desc": "استفاده از پودر صدف لب‌سبز اصل نیوزیلند و مواد ارگانیک با گرید دارویی.", + "about_item2_title": "فاقد مواد نگهدارنده", + "about_item2_desc": "تمامی محصولات ۱۰۰٪ طبیعی و فاقد رنگ‌های مصنوعی و طعم‌دهنده‌های شیمیایی هستند.", + "about_item3_title": "تاییدیه اروپا", + "about_item3_desc": "مطابق با سخت‌گیرانه‌ترین استانداردهای ایمنی مواد غذایی و دارویی در اتحادیه اروپا.", + + // === CTA Section === + "cta_title": "می‌خواهید بدانید کدام محصول برای پت شما مناسب‌تر است؟", + "cta_desc": "تیم متخصص دامپزشکی کانینا ایران آماده پاسخگویی به سوالات شماست.", + "cta_btn_primary": "دریافت رژیم مکمل رایگان", + "cta_btn_secondary": "پروانه دامپزشکی و اصالت کالا", + + // === Footer === + "footer_brand_title": "کانینا ایران", + "footer_brand_subtitle": "نماینده رسمی در ایران", + "footer_brand_desc": "تدارک هوشمندانه سلامت برای همراهان وفادار شما. واردکننده انحصاری مکمل‌های درمانی با گرید دارویی اختصاصی از آلمان با سابقه ۴۰ سال نوآوری.", + "footer_links_title": "دسترسی سریع", + "footer_link_products": "محصولات تخصصی ۲۰۲۴", + "footer_link_blog": "مجله سلامت پت (وبلاگ)", + "footer_link_profiles": "شناسنامه پتها", + "footer_link_wiki": "دانشنامه ترکیبات", + "footer_link_b2b": "پنل سفارش عمده (B2B)", + "footer_contact_title": "اطلاعات تماس نمایندگی", + "footer_phone_label": "خط ویژه فروش", + "footer_phone": "۰۲۱-۸۸۸۸ ۴۴۴۴", + "footer_email_label": "مکاتبات رسمی", + "footer_email": "info@canino-iran.com", + "footer_address_label": "دفتر مرکزی", + "footer_address": "تهران، جردن، خیابان سعیدی، ساختمان کانینا، طبقه ۵، واحد ۱۹", + "footer_auth_title": "اصالت کالا تضمین می‌شود", + "footer_auth_desc": "تمامی محصولات دارای لیبل اصالت وزارت بهداشت و QR Code اختصاصی هستند.", + "footer_auth_badge": "اصالت آلمانی کانینا", + "footer_copyright": "© ۲۰۲۶ کانینا ایران. تمامی حقوق محفوظ است.", + "footer_about": "درباره ما", + "footer_contact": "تماس با ما", + "footer_privacy": "حریم خصوصی", +}; + +async function main() { + console.log('Seeding UI texts...'); + + const entries = Object.entries(UI_TEXTS); + + for (const [key, value] of entries) { + await prisma.uiText.upsert({ + where: { key }, + update: { value }, + create: { key, value }, + }); + } + + console.log(`Seeded ${entries.length} UI texts.`); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/frontend/admin-panel/src/App.tsx b/frontend/admin-panel/src/App.tsx index 296e4c6..f417230 100644 --- a/frontend/admin-panel/src/App.tsx +++ b/frontend/admin-panel/src/App.tsx @@ -14,6 +14,7 @@ import Categories from './pages/Categories'; import Blogs from './pages/Blogs'; import Wiki from './pages/Wiki'; import Pets from './pages/Pets'; +import UITexts from './pages/UITexts'; function App() { return ( @@ -33,7 +34,8 @@ function App() { } /> } /> } /> - } /> + } /> + } /> diff --git a/frontend/admin-panel/src/components/Sidebar.tsx b/frontend/admin-panel/src/components/Sidebar.tsx index 69ac63a..e2f2e51 100644 --- a/frontend/admin-panel/src/components/Sidebar.tsx +++ b/frontend/admin-panel/src/components/Sidebar.tsx @@ -1,5 +1,5 @@ import { Link, useLocation, useNavigate } from 'react-router-dom'; -import { Home, Users, ShoppingBag, ShoppingCart, Tag, Settings, LogOut, TrendingUp, FolderTree, FileText, BookOpen, Heart, Package, LayoutDashboard } from 'lucide-react'; +import { Home, Users, ShoppingBag, ShoppingCart, Tag, Settings, LogOut, TrendingUp, FolderTree, FileText, BookOpen, Heart, Package, LayoutDashboard, Languages } from 'lucide-react'; const menuGroups = [ { @@ -36,6 +36,7 @@ const menuGroups = [ title: 'سیستم', items: [ { icon: Settings, label: 'تنظیمات', path: '/settings' }, + { icon: Languages, label: 'متون رابط کاربری', path: '/ui-texts' }, ] } ]; diff --git a/frontend/admin-panel/src/pages/UITexts.tsx b/frontend/admin-panel/src/pages/UITexts.tsx new file mode 100644 index 0000000..097ff3f --- /dev/null +++ b/frontend/admin-panel/src/pages/UITexts.tsx @@ -0,0 +1,220 @@ +import { useState, useEffect } from 'react'; +import { Languages, Save, Search, CheckCircle, Loader2 } from 'lucide-react'; +import api from '../services/api'; +import Spinner from '../components/ui/Spinner'; + +const GROUPS: Record = { + "هدر و ناوبری": [ + "shipping_notice", "brand_name_fa", "brand_subtitle", + "nav_solutions", "nav_products", "nav_wiki", "nav_blog", "nav_pet_profiles", + "nav_search_placeholder", "nav_search_button", "nav_pet_switcher_title", + "nav_register_pet", "nav_wallet_orders", "nav_logout", "nav_login", "nav_cart", + ], + "بنر اصلی (Hero)": [ + "hero_badge", "hero_title", "hero_desc", + "hero_btn_advisor", "hero_btn_products", + "hero_image_badge", "hero_image_title", "hero_quality_standard", + "hero_stat_founded", "hero_stat_agencies", "hero_stat_german_formula", + ], + "دستیار سلامت": [ + "advisor_badge", "advisor_title", "advisor_subtitle", + "advisor_step1_title", "advisor_step1_desc", + "advisor_pet_name_label", "advisor_pet_name_placeholder", + "advisor_pet_breed_label", "advisor_pet_breed_placeholder", + "advisor_submit_btn", "advisor_validation_warning", + "advisor_step2_title", "advisor_step2_desc", + "advisor_age_label", "advisor_weight_label", "advisor_activity_label", + "advisor_back", "advisor_next_final", + "advisor_step3_title", "advisor_step3_desc", "advisor_complete", + ], + "محصولات برگزیده": [ + "featured_badge", "featured_title_line1", "featured_title_line2", + "featured_desc", "featured_view_all", "product_view_details", + "featured_no_products_title", "featured_no_products_desc", + ], + "ویدئوها": [ + "videos_badge", "videos_title", "videos_title_highlight", + "videos_desc", "videos_view_all", + ], + "کارت‌های ناوبری": [ + "nav_card_shop_title", "nav_card_shop_desc", "nav_card_shop_cta", + "nav_card_wiki_title", "nav_card_wiki_desc", "nav_card_wiki_cta", + ], + "درباره ما": [ + "about_label", "about_title", + "about_item1_title", "about_item1_desc", + "about_item2_title", "about_item2_desc", + "about_item3_title", "about_item3_desc", + ], + "CTA": [ + "cta_title", "cta_desc", "cta_btn_primary", "cta_btn_secondary", + ], + "فوتر": [ + "footer_brand_title", "footer_brand_subtitle", "footer_brand_desc", + "footer_links_title", "footer_link_products", "footer_link_blog", + "footer_link_profiles", "footer_link_wiki", "footer_link_b2b", + "footer_contact_title", "footer_phone_label", "footer_phone", + "footer_email_label", "footer_email", "footer_address_label", "footer_address", + "footer_auth_title", "footer_auth_desc", "footer_auth_badge", + "footer_copyright", "footer_about", "footer_contact", "footer_privacy", + ], +}; + +export default function UITexts() { + const [texts, setTexts] = useState>({}); + const [edits, setEdits] = useState>({}); + const [search, setSearch] = useState(""); + const [saving, setSaving] = useState(null); + const [savedKey, setSavedKey] = useState(null); + const [loading, setLoading] = useState(true); + const [expandedGroups, setExpandedGroups] = useState>(() => new Set(Object.keys(GROUPS))); + + useEffect(() => { + api.get('/settings/ui-texts').then(res => { + const obj: Record = {}; + if (Array.isArray(res.data)) { + res.data.forEach((item: { key: string; value: string }) => { + obj[item.key] = item.value; + }); + } + setTexts(obj); + setLoading(false); + }).catch(() => setLoading(false)); + }, []); + + const handleChange = (key: string, value: string) => { + setEdits(prev => ({ ...prev, [key]: value })); + }; + + const handleSave = async (key: string) => { + const value = edits[key] ?? texts[key]; + setSaving(key); + try { + await api.patch(`/settings/ui-texts/${key}`, { value }); + setTexts(prev => ({ ...prev, [key]: value })); + setEdits(prev => { const n = { ...prev }; delete n[key]; return n; }); + setSavedKey(key); + setTimeout(() => setSavedKey(null), 2000); + } catch (err) { + console.error('Failed to save:', err); + } finally { + setSaving(null); + } + }; + + const toggleGroup = (group: string) => { + setExpandedGroups(prev => { + const next = new Set(prev); + if (next.has(group)) next.delete(group); + else next.add(group); + return next; + }); + }; + + const filteredGroups = Object.entries(GROUPS) + .map(([group, keys]) => ({ + group, + keys: keys.filter(k => + !search || k.toLowerCase().includes(search.toLowerCase()) || + (texts[k] || "").toLowerCase().includes(search.toLowerCase()) || + (edits[k] || "").toLowerCase().includes(search.toLowerCase()) + ), + })) + .filter(g => g.keys.length > 0); + + const unsavedCount = Object.keys(edits).length; + + return ( +
+
+
+

+ + متون رابط کاربری +

+

ویرایش تمامی متون سایت از هدر تا فوتر

+
+ {unsavedCount > 0 && ( + + {unsavedCount} تغییر ذخیره نشده + + )} +
+ +
+ + setSearch(e.target.value)} + className="w-full bg-white border border-gray-200 rounded-xl py-3 pr-11 pl-4 text-sm focus:outline-none focus:ring-2 focus:ring-purple-500/20" + /> +
+ + {loading ? ( +
+ ) : ( +
+ {filteredGroups.map(({ group, keys }) => { + const isExpanded = expandedGroups.has(group); + return ( +
+ + {isExpanded && ( +
+ {keys.map(key => { + const current = edits[key] !== undefined ? edits[key] : texts[key] || ""; + const isDirty = edits[key] !== undefined; + const isSaved = savedKey === key; + const isSavingThis = saving === key; + + return ( +
+
+ + {key} + +
+
+