diff --git a/components/landingComponents/StressTest.jsx b/components/landingComponents/StressTest.jsx
index 20577dc..14e6cbd 100644
--- a/components/landingComponents/StressTest.jsx
+++ b/components/landingComponents/StressTest.jsx
@@ -3,13 +3,14 @@ import { Tilt } from "react-tilt";
import { motion } from "framer-motion";
import { fadeIn, textVariant } from "src/utils/motion";
-import { services } from "src/constans";
import { styles } from "src/style";
import { SectionWrapper } from "src/hoc";
import Image from "next/image";
import vector1 from "@img/Vector1.png";
import validateIranPhone from "plugins/IranPhoneRegex";
import { toast } from "react-toastify";
+import { useLocale, useTranslations } from "next-intl";
+import { useRouter } from "next/navigation";
const ServiceCard = ({ index, title, icon }) => (
);
+const services = () => {
+ const t = useTranslations("services");
+ return [
+ { title: t("streamlinedOperations") },
+ { title: t("empoweredDecision") },
+ { title: t("unwaveringSupport") },
+ { title: t("seamlessIntegration") },
+ ];
+};
+
const StressTest = () => {
const [subscribe, setSubscribe] = useState(false);
const [subscribeNumber, setSubscribeNumber] = useState("");
@@ -68,31 +79,46 @@ const StressTest = () => {
}
};
+ const t = useTranslations("services");
+
+ const locale = useLocale();
+ const router = useRouter();
+
+ const isRTL = locale === "fa";
+
return (
-
+
)}
- {services.map((service, index) => (
+ {services().map((service, index) => (
))}
diff --git a/datacalender.js b/datacalender.js
index 19c351f..dde4a0c 100644
--- a/datacalender.js
+++ b/datacalender.js
@@ -424,3 +424,27 @@ export const activityFake = {
userId: "27b63e2b-8b36-41a0-b0e1-270a51184f15",
userLastName: "masoomi pour",
};
+
+export const activityFakeFa = {
+ amount: "0",
+ amountType: " 0",
+ description: "شستن همه ی پنجره ها ",
+ doneAt: "0001-01-01T00:00:00",
+ hasDisposed: false,
+ id: "8c3b04cb-a4dc-471b-baa3-a0ce773301fa",
+ isDisposable: false,
+ isDone: false,
+ performanceDescription: "",
+ scheduleType: 0,
+ setFor: "2024-09-04T06:00:00",
+ shiftPlanId: "dfb74c6e-5c27-4c4b-866f-ae66f7320331",
+ shiftTitle: "شیفت صبح",
+ status: 0,
+ title: "تمیز کردن همه ی دیوار های اتاق کنفرانس ",
+ type: 0,
+ unDoneReason: "",
+ userFirstName: "حسین",
+ userFullName: "حسین معصومی پور",
+ userId: "27b63e2b-8b36-41a0-b0e1-270a51184f15",
+ userLastName: "معصومی پور",
+};
diff --git a/messages/en.json b/messages/en.json
new file mode 100644
index 0000000..8669708
--- /dev/null
+++ b/messages/en.json
@@ -0,0 +1,100 @@
+{
+ "page": {
+ "title": "SIMPLE AND SMOOTH OPERATION",
+ "desc": "A task and shift management solution for coffee shops that provides clear, trackable task management and monitoring of store operations. ",
+ "button": "Get started",
+ "brand": "Brands that trust us and use BRIZ for their managing."
+ },
+ "home": {
+ "title": "Hello, Next.js i18n",
+ "desc": "This is a demo of Next.js i18n"
+ },
+ "navLinks": {
+ "ourSolution": "Our Solution",
+ "product": "Product",
+ "pricing": "Pricing",
+ "aboutUs": "About Us",
+ "button": "Get started"
+ },
+ "services": {
+ "title": "Be Part of Our Stress Test",
+ "desc": "Be Part of Our Stress Test and try us as an early adapter",
+ "inputValue": "Enter your number",
+ "button": "subscribe",
+ "successInput": "Thank you for your trust, we will contact you",
+ "streamlinedOperations": "Streamlined Operations",
+ "empoweredDecision": "Empowered Decision",
+ "unwaveringSupport": "Unwavering Support",
+ "seamlessIntegration": "Seamless Integration"
+ },
+ "experiences": {
+ "title": "Base logics",
+ "taskText": " Number of tasks completed in Briz",
+ "LiveNumberTask": "Activities performed with Briz",
+ "insertTasks": {
+ "title": "Insert tasks and assign",
+ "points": "Insert tasks and assign them to positions in the store"
+ },
+ "createShiftPlan": {
+ "title": "Create a clear shift plan",
+ "points": "Create a clear shift plan for each week and assign a supervisor to each shift."
+ },
+ "specificPerson": {
+ "title": "Activity assigned to a specific person",
+ "points": "After shift planning, each task becomes an activity assigned to a specific person."
+ },
+ "realTime": {
+ "title": "Real time",
+ "points": "Track the operation routine in the system in real time."
+ },
+ "confirmsCompletion": {
+ "title": "Confirms completion",
+ "points": "After closing the shift, your supervisor checks all the tasks, confirms completion, and rates the staff."
+ }
+ },
+ "phiData": {
+ "title": "phi",
+ "desc": "Coffee taste always matters the most. With PHI, it will always be perfect. Phi means the golden ratio. If you brew your coffee with the golden ratio, it will always taste good. In the Phi section, there are three boxes that the barista on shift should fill. These are the main elements for adjusting the daily coffee recipe:",
+ "endDesc": "Your barista enters the daily recipe, which will be recorded in your database. You can view your adjustment chart see what’s happening in your bar, and check the quality of your coffee serving in your store.",
+ "bcg": {
+ "desc": "This refers to the precise amount of ground coffee used for each brew...",
+ "title": "Basic Coffee Gram (BCG)"
+ },
+ "oeg": {
+ "desc": "This measures the final weight of the extracted coffee after brewing...",
+ "title": "Output Extract Grammage (OEG)"
+ },
+ "et": {
+ "desc": "This is the total time taken to brew the coffee from start to finish...",
+ "title": "Extraction Time (ET)"
+ }
+ },
+ "stepProducts": {
+ "endDesc": "Now just set up your shifts for the upcoming week. Assign staff to each position within each shift and designate a supervisor.",
+
+ "setupRoutine": {
+ "desc": "You can fully customize and define your operation system...",
+ "title": "Setup your routine"
+ },
+ "setupSections": {
+ "desc": "Define your sections to gain better insights into your operations...",
+ "title": "Setup your sections"
+ },
+ "setupPositions": {
+ "desc": "Positions play a crucial role in our platform...",
+ "title": "Setup your positions"
+ },
+ "setupStaffInfo": {
+ "desc": "You need to set up your staff information...",
+ "title": "Setup staff information"
+ },
+ "setupShiftsLogic": {
+ "desc": "You need to establish your shift logic...",
+ "title": "Setup your shifts logic"
+ },
+ "insertTasks": {
+ "desc": "Set up all your tasks at this stage...",
+ "title": "Insert all of your tasks"
+ }
+ }
+}
diff --git a/messages/fa.json b/messages/fa.json
new file mode 100644
index 0000000..1c05660
--- /dev/null
+++ b/messages/fa.json
@@ -0,0 +1,102 @@
+{
+ "page": {
+ "title": "عملیات ساده و روان",
+ "desc": "ک راه حل مدیریت کار و شیفت برای کافی شاپ ها که مدیریت وظایف واضح و قابل ردیابی و نظارت بر عملیات فروشگاه را ارائه می دهد. ",
+ "button": "شروع کنید",
+ "brand": "برندهایی که به ما اعتماد دارند و از BRIZ برای مدیریت خود استفاده می کنند."
+ },
+ "home": {
+ "title": "Hello, Next.js i18n",
+ "desc": "This is a demo of Next.js i18n"
+ },
+ "navLinks": {
+ "ourSolution": "راه حل ما",
+ "product": "محصول",
+ "pricing": "قیمت",
+ "aboutUs": "درباره ما",
+ "button": "شروع کنید"
+ },
+ "services": {
+ "title": "بخشی از تست استرس ما باشید",
+ "desc": "خشی از تست استرس ما باشید و ما را به عنوان یک آداپتور اولیه امتحان کنید",
+ "inputValue": "شماره خود را وارد کنید",
+ "button": "عضو شوید",
+ "successInput": "با تشکر از اعتماد شما، ما با شما تماس خواهیم گرفت",
+ "streamlinedOperations": "عملیات ساده",
+ "empoweredDecision": "تصمیم قدرتمند",
+ "unwaveringSupport": "پشتیبانی بی دریغ",
+ "seamlessIntegration": "یکپارچه سازی "
+ },
+ "experiences": {
+ "title": "منطق پایه",
+ "taskText": "تعداد کارهای انجام شده در بریز",
+ "LiveNumberTask": "فعالیت های انجام شده با بریز",
+ "insertTasks": {
+ "title": "وظایف را وارد کنید و تعیین کنید",
+ "points": "وظایف را وارد کنید و آنها را به موقعیت هایی در فروشگاه اختصاص دهید"
+ },
+ "createShiftPlan": {
+ "title": "یک برنامه شفاف ایجاد کنید",
+ "points": "برای هر هفته یک برنامه شیفت روشن ایجاد کنید و برای هر شیفت یک سرپرست تعیین کنید."
+ },
+ "specificPerson": {
+ "title": "فعالیتی که به شخص خاصی اختصاص داده شده است",
+ "points": "پس از برنامه ریزی نوبت، هر وظیفه به فعالیتی تبدیل می شود که به یک فرد خاص واگذار می شود."
+ },
+ "realTime": {
+ "title": "به لحظه",
+ "points": "ردیابی روال عملیات در سیستم در زمان واقعی.."
+ },
+ "confirmsCompletion": {
+ "title": "تکمیل را تایید می کند",
+ "points": "پس از بستن شیفت، سرپرست شما تمام وظایف را بررسی می کند، تکمیل را تایید می کند و به کارکنان امتیاز می دهد."
+ }
+ },
+
+ "phiData": {
+ "title": "phi",
+ "desc": "طعم قهوه همیشه بیشترین اهمیت را دارد. با PHI، همیشه عالی خواهد بود. فی به معنای نسبت طلایی است. اگر قهوه خود را با نسبت طلایی دم کنید، همیشه طعم خوبی خواهد داشت. در قسمت Phi، سه کادر وجود دارد که باریستای شیفت باید آنها را پر کند. اینها عناصر اصلی برای تنظیم دستور پخت قهوه روزانه هستند:",
+ "endDesc": "باریستای شما دستور پخت روزانه را وارد می کند که در پایگاه داده شما ثبت می شود. می توانید نمودار تنظیم خود را مشاهده کنید و ببینید در نوار شما چه اتفاقی می افتد و کیفیت سرو قهوه خود را در فروشگاه خود بررسی کنید.",
+
+ "bcg": {
+ "desc": "منظور مقدار دقیق قهوه آسیاب شده برای هر دم کردن است...",
+ "title": "گرم قهوه پایه (BCG)"
+ },
+ "oeg": {
+ "desc": " وزن نهایی قهوه استخراج شده را پس از دم کردن اندازه گیری می کند.",
+ "title": "خروجی استخراج گراماژ(OEG)"
+ },
+ "et": {
+ "desc": " کل زمان دم کردن قهوه از ابتدا تا انتها است...",
+ "title": "زمان استخراج (ET)"
+ }
+ },
+ "stepProducts": {
+ "endDesc": "اکنون فقط شیفت های خود را برای هفته آینده تنظیم کنید. در هر شیفت، کارکنان را به هر موقعیتی اختصاص دهید و یک سرپرست تعیین کنید.",
+
+ "setupRoutine": {
+ "desc": "شما می توانید به طور کامل سیستم عامل خود را سفارشی و تعریف کنید...",
+ "title": "روال خود را تنظیم کنید"
+ },
+ "setupSections": {
+ "desc": "بخش های خود را برای به دست آوردن بینش بهتر در مورد عملیات خود تعریف کنید...",
+ "title": "بخش های خود را تنظیم کنید"
+ },
+ "setupPositions": {
+ "desc": "موقعیت ها نقش مهمی در پلتفرم ما دارند...",
+ "title": "موقعیت های خود را تنظیم کنید"
+ },
+ "setupStaffInfo": {
+ "desc": "شما باید اطلاعات کارکنان خود را تنظیم کنید ...",
+ "title": "تنظیم اطلاعات کارکنان"
+ },
+ "setupShiftsLogic": {
+ "desc": "شما باید منطق شیفت خود را ایجاد کنید...",
+ "title": "منطق شیفت خود را تنظیم کنید"
+ },
+ "insertTasks": {
+ "desc": "تمام وظایف خود را در این مرحله تنظیم کنید...",
+ "title": "همه وظایف خود را وارد کنید"
+ }
+ }
+}
diff --git a/messages/zh.json b/messages/zh.json
new file mode 100644
index 0000000..f53551e
--- /dev/null
+++ b/messages/zh.json
@@ -0,0 +1,100 @@
+{
+ "page": {
+ "title": "简单流畅的操作",
+ "desc": "一款咖啡店的任务和班次管理解决方案,提供清晰、可追踪的任务管理和店铺运营监控。",
+ "button": "开始使用",
+ "brand": "信任我们并使用 BRIZ 进行管理的品牌。"
+ },
+ "home": {
+ "title": "你好,Next.js i18n",
+ "desc": "这是 Next.js i18n 的演示"
+ },
+ "navLinks": {
+ "ourSolution": "我们的解决方案",
+ "product": "产品",
+ "pricing": "定价",
+ "aboutUs": "关于我们",
+ "button": "开始使用"
+ },
+ "services": {
+ "title": "参与我们的压力测试",
+ "desc": "成为我们的压力测试的一部分,作为早期适配者尝试我们",
+ "inputValue": "输入您的号码",
+ "button": "订阅",
+ "successInput": "感谢您的信任,我们将与您联系",
+ "streamlinedOperations": "精简的操作",
+ "empoweredDecision": "赋权决策",
+ "unwaveringSupport": "坚定支持",
+ "seamlessIntegration": "无缝集成"
+ },
+ "experiences": {
+ "title": "基本逻辑",
+ "taskText": "在 Briz 完成的任务数量",
+ "LiveNumberTask": "使用 Briz 执行的活动",
+ "insertTasks": {
+ "title": "插入任务并分配",
+ "points": "插入任务并将其分配到店铺中的职位"
+ },
+ "createShiftPlan": {
+ "title": "创建明确的班次计划",
+ "points": "为每周创建明确的班次计划,并为每个班次分配监督员。"
+ },
+ "specificPerson": {
+ "title": "任务分配给特定人员",
+ "points": "班次计划后,每项任务将成为分配给特定人员的活动。"
+ },
+ "realTime": {
+ "title": "实时",
+ "points": "实时在系统中跟踪运营常规。"
+ },
+ "confirmsCompletion": {
+ "title": "确认完成",
+ "points": "班次结束后,您的监督员检查所有任务,确认完成并评估员工表现。"
+ }
+ },
+ "phiData": {
+ "title": "PHI",
+ "desc": "咖啡的味道永远是最重要的。有了 PHI,它将永远完美。Phi 代表黄金比例。如果按照黄金比例冲泡咖啡,它将永远味道醇美。在 PHI 部分,有三个框需要当班咖啡师填写。这些是调整每日咖啡配方的主要元素:",
+ "endDesc": "您的咖啡师输入每日配方,这将被记录在您的数据库中。您可以查看您的调整图表,了解您的咖啡店情况,并检查店内的咖啡质量。",
+ "bcg": {
+ "desc": "这指的是每次冲泡所使用的精确咖啡粉量...",
+ "title": "基础咖啡克数 (BCG)"
+ },
+ "oeg": {
+ "desc": "这是冲泡后提取的咖啡的最终重量...",
+ "title": "输出提取克重 (OEG)"
+ },
+ "et": {
+ "desc": "这是从开始到结束冲泡咖啡所花费的总时间...",
+ "title": "萃取时间 (ET)"
+ }
+ },
+ "stepProducts": {
+ "endDesc": "现在为接下来的一周设置您的班次。为每个班次中的每个职位分配员工并指定监督员。",
+
+ "setupRoutine": {
+ "desc": "您可以完全自定义并定义您的运营系统...",
+ "title": "设置您的常规操作"
+ },
+ "setupSections": {
+ "desc": "定义您的区域以更好地了解您的运营...",
+ "title": "设置您的区域"
+ },
+ "setupPositions": {
+ "desc": "职位在我们的平台中扮演着重要角色...",
+ "title": "设置您的职位"
+ },
+ "setupStaffInfo": {
+ "desc": "您需要设置您的员工信息...",
+ "title": "设置员工信息"
+ },
+ "setupShiftsLogic": {
+ "desc": "您需要确定您的班次逻辑...",
+ "title": "设置您的班次逻辑"
+ },
+ "insertTasks": {
+ "desc": "在此阶段设置您所有的任务...",
+ "title": "插入所有任务"
+ }
+ }
+}
diff --git a/next.config.js b/next.config.js
index 976f51b..f951233 100644
--- a/next.config.js
+++ b/next.config.js
@@ -7,18 +7,20 @@ const withPWA = require("@ducanh2912/next-pwa").default({
swcMinify: true,
dest: "public",
fallbacks: {
- //image: "/static/images/fallback.png",
- document: "/offline", // if you want to fallback to a custom page rather than /_offline
- // font: '/static/font/fallback.woff2',
- // audio: ...,
- // video: ...,
+ document: "/offline", // fallback to custom page
},
workboxOptions: {
disableDevLogs: true,
},
- // ... other options you like
});
+const createNextIntlPlugin = require("next-intl/plugin");
+
+// Initialize the next-intl plugin
+const withNextIntl = createNextIntlPlugin();
+
+// Merge the configurations
const nextConfig = {};
-module.exports = withPWA(nextConfig);
+// Export the combined configuration
+module.exports = withNextIntl(withPWA(nextConfig));
diff --git a/package-lock.json b/package-lock.json
index 0bd0a87..152db92 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,7 @@
"lodash": "^4.17.21",
"maath": "^0.10.4",
"next": "13.4.19",
+ "next-intl": "^3.20.0",
"postcss": "8.4.28",
"rc-slider": "^10.5.0",
"react": "18.2.0",
@@ -1797,6 +1798,50 @@
"integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
"optional": true
},
+ "node_modules/@formatjs/ecma402-abstract": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz",
+ "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==",
+ "dependencies": {
+ "@formatjs/intl-localematcher": "0.5.4",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@formatjs/fast-memoize": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz",
+ "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@formatjs/icu-messageformat-parser": {
+ "version": "2.7.8",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz",
+ "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.0.0",
+ "@formatjs/icu-skeleton-parser": "1.8.2",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@formatjs/icu-skeleton-parser": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz",
+ "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.0.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@formatjs/intl-localematcher": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz",
+ "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@hassanmojab/react-modern-calendar-datepicker": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/@hassanmojab/react-modern-calendar-datepicker/-/react-modern-calendar-datepicker-3.1.7.tgz",
@@ -4493,6 +4538,17 @@
"node": ">= 0.4"
}
},
+ "node_modules/intl-messageformat": {
+ "version": "10.5.14",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz",
+ "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.0.0",
+ "@formatjs/fast-memoize": "2.2.0",
+ "@formatjs/icu-messageformat-parser": "2.7.8",
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/is-array-buffer": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
@@ -5229,6 +5285,14 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -5281,6 +5345,26 @@
}
}
},
+ "node_modules/next-intl": {
+ "version": "3.20.0",
+ "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-3.20.0.tgz",
+ "integrity": "sha512-0bCZcc38HfAZk/T+PNNcnJZknC+caS5rBK+WYRd1HsOL5O6puEu2H3kya8oT9s8piHjrTf7P0UHeahOFleOnrw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/amannn"
+ }
+ ],
+ "dependencies": {
+ "@formatjs/intl-localematcher": "^0.5.4",
+ "negotiator": "^0.6.3",
+ "use-intl": "^3.20.0"
+ },
+ "peerDependencies": {
+ "next": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/next/node_modules/postcss": {
"version": "8.4.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
@@ -7326,6 +7410,18 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/use-intl": {
+ "version": "3.20.0",
+ "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-3.20.0.tgz",
+ "integrity": "sha512-5WQs6yZVWI9K7vw3134P0bhKNp4mi8NbmqKOCuhD9nQUMTKdmpBXwjk62+axwvEbj4XrZxj4X93mQMLXU5ZsCg==",
+ "dependencies": {
+ "@formatjs/fast-memoize": "^2.2.0",
+ "intl-messageformat": "^10.5.14"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/use-isomorphic-layout-effect": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
diff --git a/package.json b/package.json
index f354f46..d7645c4 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
"lodash": "^4.17.21",
"maath": "^0.10.4",
"next": "13.4.19",
+ "next-intl": "^3.20.0",
"postcss": "8.4.28",
"rc-slider": "^10.5.0",
"react": "18.2.0",
diff --git a/public/sw.js.map b/public/sw.js.map
index 896d6e7..dc9ad80 100644
--- a/public/sw.js.map
+++ b/public/sw.js.map
@@ -1 +1 @@
-{"version":3,"file":"sw.js","sources":["C:/Users/jp/AppData/Local/Temp/882037db3d753c208cf8336a88514e46/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'Y:/projects/brizco/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from 'Y:/projects/brizco/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from 'Y:/projects/brizco/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'Y:/projects/brizco/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from 'Y:/projects/brizco/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from 'Y:/projects/brizco/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \"/fallback-development.js\"\n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/offline\",\n \"revision\": \"development\"\n }\n], {\n \"ignoreURLParametersMatching\": [/^utm_/, /^fbclid$/, /ts/]\n});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ response: e })=>e && \"opaqueredirect\" === e.type ? new Response(e.body, { status: 200, statusText: \"OK\", headers: e.headers }) : e }, { handlerDidError: async ({ request: e })=>\"undefined\" != typeof self ? self.fallback(e) : Response.error() }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [{ handlerDidError: async ({ request: e })=>\"undefined\" != typeof self ? self.fallback(e) : Response.error() }] }), 'GET');\n\n\n\n\nself.__WB_DISABLE_DEV_LOGS = true;"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","response","e","type","Response","body","status","statusText","headers","handlerDidError","request","fallback","error","workbox_strategies_NetworkOnly","__WB_DISABLE_DEV_LOGS"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"sw.js","sources":["C:/Users/jp/AppData/Local/Temp/2f69dd474e183f4b0de2abbbbbbb6f93/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'Y:/projects/brizco/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from 'Y:/projects/brizco/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from 'Y:/projects/brizco/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'Y:/projects/brizco/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from 'Y:/projects/brizco/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from 'Y:/projects/brizco/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \"/fallback-development.js\"\n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/offline\",\n \"revision\": \"development\"\n }\n], {\n \"ignoreURLParametersMatching\": [/^utm_/, /^fbclid$/, /ts/]\n});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ response: e })=>e && \"opaqueredirect\" === e.type ? new Response(e.body, { status: 200, statusText: \"OK\", headers: e.headers }) : e }, { handlerDidError: async ({ request: e })=>\"undefined\" != typeof self ? self.fallback(e) : Response.error() }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [{ handlerDidError: async ({ request: e })=>\"undefined\" != typeof self ? self.fallback(e) : Response.error() }] }), 'GET');\n\n\n\n\nself.__WB_DISABLE_DEV_LOGS = true;"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","response","e","type","Response","body","status","statusText","headers","handlerDidError","request","fallback","error","workbox_strategies_NetworkOnly","__WB_DISABLE_DEV_LOGS"],"mappings":"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"}
\ No newline at end of file
diff --git a/src/app/about-us/page.jsx b/src/app/[locale]/about-us/page.jsx
similarity index 100%
rename from src/app/about-us/page.jsx
rename to src/app/[locale]/about-us/page.jsx
diff --git a/src/app/add-buy/page.jsx b/src/app/[locale]/add-buy/page.jsx
similarity index 100%
rename from src/app/add-buy/page.jsx
rename to src/app/[locale]/add-buy/page.jsx
diff --git a/src/app/app/acount/page.jsx b/src/app/[locale]/app/acount/page.jsx
similarity index 100%
rename from src/app/app/acount/page.jsx
rename to src/app/[locale]/app/acount/page.jsx
diff --git a/src/app/app/coffee-brew/page.jsx b/src/app/[locale]/app/coffee-brew/page.jsx
similarity index 100%
rename from src/app/app/coffee-brew/page.jsx
rename to src/app/[locale]/app/coffee-brew/page.jsx
diff --git a/src/app/app/employees/page.jsx b/src/app/[locale]/app/employees/page.jsx
similarity index 100%
rename from src/app/app/employees/page.jsx
rename to src/app/[locale]/app/employees/page.jsx
diff --git a/src/app/app/home/page.jsx b/src/app/[locale]/app/home/page.jsx
similarity index 100%
rename from src/app/app/home/page.jsx
rename to src/app/[locale]/app/home/page.jsx
diff --git a/src/app/app/login/page.jsx b/src/app/[locale]/app/login/page.jsx
similarity index 100%
rename from src/app/app/login/page.jsx
rename to src/app/[locale]/app/login/page.jsx
diff --git a/src/app/app/news/page.jsx b/src/app/[locale]/app/news/page.jsx
similarity index 100%
rename from src/app/app/news/page.jsx
rename to src/app/[locale]/app/news/page.jsx
diff --git a/src/app/app/shifts/complete-shift/page.jsx b/src/app/[locale]/app/shifts/complete-shift/page.jsx
similarity index 100%
rename from src/app/app/shifts/complete-shift/page.jsx
rename to src/app/[locale]/app/shifts/complete-shift/page.jsx
diff --git a/src/app/app/shifts/manage-shift/page.jsx b/src/app/[locale]/app/shifts/manage-shift/page.jsx
similarity index 100%
rename from src/app/app/shifts/manage-shift/page.jsx
rename to src/app/[locale]/app/shifts/manage-shift/page.jsx
diff --git a/src/app/app/shifts/page.jsx b/src/app/[locale]/app/shifts/page.jsx
similarity index 100%
rename from src/app/app/shifts/page.jsx
rename to src/app/[locale]/app/shifts/page.jsx
diff --git a/src/app/app/tasks/add-task/page.jsx b/src/app/[locale]/app/tasks/add-task/page.jsx
similarity index 100%
rename from src/app/app/tasks/add-task/page.jsx
rename to src/app/[locale]/app/tasks/add-task/page.jsx
diff --git a/src/app/app/tasks/page.jsx b/src/app/[locale]/app/tasks/page.jsx
similarity index 100%
rename from src/app/app/tasks/page.jsx
rename to src/app/[locale]/app/tasks/page.jsx
diff --git a/src/app/favicon.ico b/src/app/[locale]/favicon.ico
similarity index 100%
rename from src/app/favicon.ico
rename to src/app/[locale]/favicon.ico
diff --git a/src/app/[locale]/layout.jsx b/src/app/[locale]/layout.jsx
new file mode 100644
index 0000000..dcd26ce
--- /dev/null
+++ b/src/app/[locale]/layout.jsx
@@ -0,0 +1,25 @@
+import { Inter } from "next/font/google";
+import { NextIntlClientProvider } from "next-intl";
+import RootData from "@comp/RootData/page";
+import { getMessages } from "next-intl/server";
+
+const inter = Inter({ subsets: ["latin"] });
+
+// export const metadata = {
+// title: "Create Next App",
+// description: "Generated by create next app",
+// };
+
+export default async function RootLayout({ children, locale }) {
+ const messages = await getMessages();
+
+ return (
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/src/app/page.jsx b/src/app/[locale]/page.jsx
similarity index 88%
rename from src/app/page.jsx
rename to src/app/[locale]/page.jsx
index a11d9fd..c194cbf 100644
--- a/src/app/page.jsx
+++ b/src/app/[locale]/page.jsx
@@ -11,9 +11,10 @@ import Footer from "@comp/landingComponents/Footer/page";
import Phi from "@comp/landingComponents/Phi";
import StepProduct from "@comp/landingComponents/StepProduct";
import StressTest from "@comp/landingComponents/StressTest";
+import { useTranslations } from "next-intl";
import { useEffect, useState } from "react";
-export default function Home() {
+export default function Home(locale) {
const [state, setstate] = useState(false);
useEffect(() => {
@@ -32,7 +33,7 @@ export default function Home() {
{/*
*/}
-
+
diff --git a/src/app/pricing/page.jsx b/src/app/[locale]/pricing/page.jsx
similarity index 100%
rename from src/app/pricing/page.jsx
rename to src/app/[locale]/pricing/page.jsx
diff --git a/src/i18n/request.ts b/src/i18n/request.ts
new file mode 100644
index 0000000..6666a0e
--- /dev/null
+++ b/src/i18n/request.ts
@@ -0,0 +1,12 @@
+import { notFound } from "next/navigation";
+import { getRequestConfig } from "next-intl/server";
+import { routing } from "./routing";
+
+export default getRequestConfig(async ({ locale }) => {
+ // Validate that the incoming `locale` parameter is valid
+ if (!routing.locales.includes(locale as any)) notFound();
+
+ return {
+ messages: (await import(`../../messages/${locale}.json`)).default,
+ };
+});
diff --git a/src/i18n/routing.ts b/src/i18n/routing.ts
new file mode 100644
index 0000000..137e987
--- /dev/null
+++ b/src/i18n/routing.ts
@@ -0,0 +1,15 @@
+import { defineRouting } from "next-intl/routing";
+import { createSharedPathnamesNavigation } from "next-intl/navigation";
+
+export const routing = defineRouting({
+ // A list of all locales that are supported
+ locales: ["en", "fa", "zh"],
+
+ // Used when no locale matches
+ defaultLocale: "en",
+});
+
+// Lightweight wrappers around Next.js' navigation APIs
+// that will consider the routing configuration
+export const { Link, redirect, usePathname, useRouter } =
+ createSharedPathnamesNavigation(routing);
diff --git a/src/middleware.ts b/src/middleware.ts
new file mode 100644
index 0000000..a2fed51
--- /dev/null
+++ b/src/middleware.ts
@@ -0,0 +1,9 @@
+import createMiddleware from "next-intl/middleware";
+import { routing } from "./i18n/routing";
+
+export default createMiddleware(routing);
+
+export const config = {
+ // Match only internationalized pathnames
+ matcher: ["/", "/(fa|en|zh)/:path*"],
+};