mirror of
https://git.meshkee.com/Meshkee/dashboards.git
synced 2026-08-11 22:30:58 +04:30
Ship shared LocaleProvider, business/customer i18n, branding defaultLocale, curated home tiles with dual 30-day charts, and chart/page aura tokens; refresh PROJECT_CONTEXT. Co-authored-by: Cursor <cursoragent@cursor.com>
507 lines
24 KiB
TypeScript
507 lines
24 KiB
TypeScript
import type { DashboardLocale } from '@meshkee/dashboard-core'
|
||
|
||
const en = {
|
||
'app.dashboardName': 'Customer Dashboard',
|
||
'app.role.customer': 'Customer',
|
||
'app.storeFallback': 'Store',
|
||
'app.poweredBy': 'powered by Meshkee.app',
|
||
|
||
'nav.home': 'Home',
|
||
'nav.cart': 'Shopping Cart',
|
||
'nav.profile': 'My Profile',
|
||
'nav.addresses': 'My Addresses',
|
||
'nav.orders': 'My Orders',
|
||
'nav.favorites': 'My Favorites',
|
||
'nav.help': 'Help Center',
|
||
'nav.logout': 'Logout',
|
||
|
||
'header.toggleMenu': 'Toggle menu',
|
||
'header.messages': 'Messages',
|
||
'header.notifications': 'Notifications',
|
||
'header.changePassword': 'Change password',
|
||
'header.myProfile': 'My Profile',
|
||
|
||
'home.welcome': 'Welcome, dear {name}.',
|
||
'home.welcomeFallback': 'there',
|
||
'home.subtitle': 'Manage your profile, addresses, orders, and favorites in one place.',
|
||
'home.card.profile.title': 'My Profile',
|
||
'home.card.profile.desc': 'View and update your personal information and contact details.',
|
||
'home.card.profile.link': 'View profile',
|
||
'home.card.addresses.title': 'My Addresses',
|
||
'home.card.addresses.desc': 'Manage your shipping addresses for checkout and deliveries.',
|
||
'home.card.addresses.link': 'View addresses',
|
||
'home.card.orders.title': 'My Orders',
|
||
'home.card.orders.desc': 'Track your orders, view order history and order details.',
|
||
'home.card.orders.link': 'View orders',
|
||
'home.card.favorites.title': 'My Favorites',
|
||
'home.card.favorites.desc': 'Browse and manage your saved favorite products.',
|
||
'home.card.favorites.link': 'View favorites',
|
||
|
||
'profile.title': 'My Profile',
|
||
'profile.subtitle': 'Update your personal information and contact details.',
|
||
'profile.section.account': 'Account',
|
||
'profile.section.about': 'About',
|
||
'profile.section.social': 'Social',
|
||
'profile.mobile': 'Mobile number',
|
||
'profile.email': 'Email',
|
||
'profile.firstName': 'First name (FA)',
|
||
'profile.lastName': 'Last name (FA)',
|
||
'profile.firstNameEn': 'First name (EN)',
|
||
'profile.lastNameEn': 'Last name (EN)',
|
||
'profile.landline': 'Landline',
|
||
'profile.backupPhone': 'Backup phone number',
|
||
'profile.about': 'About',
|
||
'profile.instagram': 'Instagram',
|
||
'profile.telegram': 'Telegram',
|
||
'profile.linkedin': 'LinkedIn',
|
||
'profile.emailPlaceholder': 'you@example.com',
|
||
'profile.save': 'Save changes',
|
||
'profile.saving': 'Saving...',
|
||
'profile.toast.success': 'Profile updated successfully.',
|
||
'profile.error.update': 'Unable to update profile. Please try again.',
|
||
|
||
'addresses.title': 'My Addresses',
|
||
'addresses.subtitle': 'Manage your shipping addresses for orders at this store.',
|
||
'addresses.save': 'Save addresses',
|
||
'addresses.saveOne': 'Save address',
|
||
'addresses.saving': 'Saving...',
|
||
'addresses.cancel': 'Cancel',
|
||
'addresses.editorTitle': 'Saved addresses',
|
||
'addresses.add': 'Add address',
|
||
'addresses.edit': 'Edit address',
|
||
'addresses.empty': 'No addresses yet.',
|
||
'addresses.loading': 'Loading addresses...',
|
||
'addresses.label': 'Address name',
|
||
'addresses.labelPlaceholder': 'e.g. Home, Office',
|
||
'addresses.optional': '(optional)',
|
||
'addresses.province': 'Province',
|
||
'addresses.city': 'City',
|
||
'addresses.address': 'Address',
|
||
'addresses.postalCode': 'Postal code',
|
||
'addresses.landline': 'Landline',
|
||
'addresses.selectProvince': 'Select province',
|
||
'addresses.selectCity': 'Select city',
|
||
'addresses.streetPlaceholder': 'Street, plaque, unit',
|
||
'addresses.postalPlaceholder': 'Postal code',
|
||
'addresses.landlinePlaceholder': 'Landline',
|
||
'addresses.remove': 'Remove address',
|
||
'addresses.modal.addTitle': 'Add address',
|
||
'addresses.modal.editTitle': 'Edit address',
|
||
'addresses.modal.subtitle': 'Enter the shipping address details.',
|
||
'addresses.toast.removed': 'Address removed.',
|
||
'addresses.toast.saved': 'Addresses saved.',
|
||
'addresses.toast.created': 'Address saved.',
|
||
'addresses.toast.updated': 'Address updated.',
|
||
'addresses.error.load': 'Unable to load addresses.',
|
||
'addresses.error.remove': 'Unable to remove address.',
|
||
'addresses.error.incomplete': 'Add at least one complete address.',
|
||
'addresses.error.incompleteForm': 'Please fill in all required fields.',
|
||
'addresses.error.save': 'Unable to save address. Please try again.',
|
||
'addresses.error.loadLocations': 'Unable to load provinces.',
|
||
'addresses.error.loadCities': 'Unable to load cities.',
|
||
|
||
'orders.title': 'My Orders',
|
||
'orders.subtitle': 'View your order history and details.',
|
||
'orders.listTitle': 'Order list',
|
||
'orders.showing': 'Showing {from} - {to} of {total}',
|
||
'orders.none': 'No orders',
|
||
'orders.empty': 'You have no orders yet.',
|
||
'orders.loading': 'Loading orders...',
|
||
'orders.error.load': 'Unable to load orders.',
|
||
'orders.col.orderId': 'Order ID',
|
||
'orders.col.items': 'Items',
|
||
'orders.col.total': 'Total cost',
|
||
'orders.col.date': 'Date & time',
|
||
'orders.col.step': 'Step',
|
||
'orders.col.source': 'Registered by',
|
||
'orders.col.actions': 'Actions',
|
||
'orders.pageMeta': 'Page {page} / {totalPages} · {pageSize} per page · {total} total',
|
||
'orders.viewItems': 'View items',
|
||
'orders.source.operator': 'Operator',
|
||
'orders.source.app': 'Application',
|
||
'orders.source.website': 'Website',
|
||
'orders.step.processing': 'Under processing',
|
||
'orders.step.ready': 'Ready for shipping',
|
||
'orders.step.shipped': 'Shipped',
|
||
'orders.step.delivered': 'Delivered',
|
||
|
||
'orderItems.title': 'Order items',
|
||
'orderItems.customer': 'Customer',
|
||
'orderItems.phone': 'Phone',
|
||
'orderItems.items': 'Items',
|
||
'orderItems.empty': 'No items in this order.',
|
||
'orderItems.product': 'Product',
|
||
'orderItems.qty': 'Qty',
|
||
'orderItems.unitPrice': 'Unit price',
|
||
'orderItems.lineTotal': 'Line total',
|
||
'orderItems.sku': 'SKU: {sku}',
|
||
'orderItems.summary': 'Order total · {count} {itemsLabel}',
|
||
'orderItems.item': 'item',
|
||
'orderItems.itemsPlural': 'items',
|
||
'orderItems.close': 'Close',
|
||
|
||
'favorites.title': 'My Favorites',
|
||
'favorites.subtitle': 'Products you have saved for later.',
|
||
'favorites.loading': 'Loading favorites...',
|
||
'favorites.empty': 'No favorites yet.',
|
||
'favorites.error.load': 'Unable to load favorites.',
|
||
'favorites.toast.removed': 'Removed from favorites.',
|
||
'favorites.error.remove': 'Unable to remove favorite.',
|
||
'favorites.cartSoon': 'Shopping cart is coming soon.',
|
||
'favorites.remove': 'Remove from favorites',
|
||
'favorites.addToCart': 'Add to shopping cart',
|
||
'favorites.festival': 'Festival',
|
||
'favorites.inStock': '{count} in stock',
|
||
'favorites.variantOne': '1 variant',
|
||
'favorites.variantMany': '{count} variants',
|
||
|
||
'title.signIn': 'Sign in',
|
||
'title.checkout': 'Checkout',
|
||
'title.cart': 'Shopping Cart',
|
||
'title.delivery': 'Delivery',
|
||
'title.payment': 'Payment',
|
||
'title.success': 'Success',
|
||
'title.failed': 'Failed',
|
||
|
||
'login.welcome': 'Welcome back',
|
||
'login.subtitle': 'Sign in with your mobile number',
|
||
'login.mobile': 'Mobile number',
|
||
'login.password': 'Password',
|
||
'login.passwordPlaceholder': 'Enter your password',
|
||
'login.hidePassword': 'Hide password',
|
||
'login.showPassword': 'Show password',
|
||
'login.forgot': 'Forgot password?',
|
||
'login.signIn': 'Sign in',
|
||
'login.signingIn': 'Signing in...',
|
||
'login.or': 'or',
|
||
'login.otp': 'One-time login with SMS',
|
||
'login.noAccount': "Don't have an account?",
|
||
'login.signUp': 'Sign up',
|
||
'login.error.signIn': 'Unable to sign in. Check your connection and try again.',
|
||
'login.error.sendCode': 'Unable to send verification code.',
|
||
|
||
'signup.title': 'Create account',
|
||
'signup.subtitle': 'Register as a customer of {domain}',
|
||
'signup.firstName': 'First name',
|
||
'signup.lastName': 'Last name',
|
||
'signup.passwordPlaceholder': 'Choose a password',
|
||
'signup.confirm': 'Confirm password',
|
||
'signup.confirmPlaceholder': 'Repeat your password',
|
||
'signup.create': 'Create account',
|
||
'signup.creating': 'Creating account...',
|
||
'signup.hasAccount': 'Already have an account?',
|
||
'signup.signIn': 'Sign in',
|
||
'signup.error.match': 'Passwords do not match.',
|
||
'signup.error.length': 'Password must be at least 8 characters.',
|
||
'signup.error.create': 'Unable to create account.',
|
||
|
||
'forgot.back': 'Back to sign in',
|
||
'forgot.title': 'Forgot password',
|
||
'forgot.subtitlePhone': 'We will send a verification code via SMS',
|
||
'forgot.subtitleCode': 'Enter the code and your new password',
|
||
'forgot.sendCode': 'Send SMS code',
|
||
'forgot.sending': 'Sending...',
|
||
'forgot.code': 'SMS verification code',
|
||
'forgot.newPassword': 'New password',
|
||
'forgot.newPasswordPlaceholder': 'Enter new password',
|
||
'forgot.reset': 'Reset password',
|
||
'forgot.verifying': 'Verifying...',
|
||
'forgot.error.length': 'Password must be at least 8 characters.',
|
||
'forgot.error.verify': 'Unable to verify code.',
|
||
'forgot.info.partial':
|
||
'Phone number verified. Full password reset via SMS is not available yet — please contact support or sign in if you remember your password.',
|
||
|
||
'otp.back': 'Back to sign in',
|
||
'otp.title': 'One-time login',
|
||
'otp.subtitlePhone': 'Verify your mobile number with a one-time SMS code',
|
||
'otp.subtitleCode': 'Enter the SMS code and your password',
|
||
'otp.sendCode': 'Send SMS code',
|
||
'otp.sending': 'Sending...',
|
||
'otp.code': 'SMS verification code',
|
||
'otp.password': 'Password',
|
||
'otp.passwordPlaceholder': 'Your account password',
|
||
'otp.signIn': 'Sign in',
|
||
'otp.signingIn': 'Signing in...',
|
||
'otp.error.password': 'Enter your account password to complete sign-in after SMS verification.',
|
||
'otp.error.signIn': 'Unable to sign in with SMS verification.',
|
||
|
||
'common.close': 'Close',
|
||
'common.resendIn': 'Resend code in {seconds}s',
|
||
'common.resend': 'Resend SMS code',
|
||
'common.codeSent': 'Verification code sent to {phone}',
|
||
} as const
|
||
|
||
type MessageKey = keyof typeof en
|
||
|
||
const fa: Record<MessageKey, string> = {
|
||
'app.dashboardName': 'پنل مشتری',
|
||
'app.role.customer': 'مشتری',
|
||
'app.storeFallback': 'فروشگاه',
|
||
'app.poweredBy': 'قدرتگرفته از Meshkee.app',
|
||
|
||
'nav.home': 'خانه',
|
||
'nav.cart': 'سبد خرید',
|
||
'nav.profile': 'پروفایل من',
|
||
'nav.addresses': 'آدرسهای من',
|
||
'nav.orders': 'سفارشهای من',
|
||
'nav.favorites': 'علاقهمندیها',
|
||
'nav.help': 'مرکز راهنما',
|
||
'nav.logout': 'خروج',
|
||
|
||
'header.toggleMenu': 'باز و بسته کردن منو',
|
||
'header.messages': 'پیامها',
|
||
'header.notifications': 'اعلانها',
|
||
'header.changePassword': 'تغییر رمز عبور',
|
||
'header.myProfile': 'پروفایل من',
|
||
|
||
'home.welcome': '{name} عزیز، خوش آمدی.',
|
||
'home.welcomeFallback': 'کاربر',
|
||
'home.subtitle': 'پروفایل، آدرسها، سفارشها و علاقهمندیها را از یکجا مدیریت کنید.',
|
||
'home.card.profile.title': 'پروفایل من',
|
||
'home.card.profile.desc': 'اطلاعات شخصی و راههای ارتباطی خود را مشاهده و بهروزرسانی کنید.',
|
||
'home.card.profile.link': 'مشاهده پروفایل',
|
||
'home.card.addresses.title': 'آدرسهای من',
|
||
'home.card.addresses.desc': 'آدرسهای ارسال برای تسویهحساب و تحویل را مدیریت کنید.',
|
||
'home.card.addresses.link': 'مشاهده آدرسها',
|
||
'home.card.orders.title': 'سفارشهای من',
|
||
'home.card.orders.desc': 'سفارشها را پیگیری کنید و تاریخچه و جزئیات را ببینید.',
|
||
'home.card.orders.link': 'مشاهده سفارشها',
|
||
'home.card.favorites.title': 'علاقهمندیها',
|
||
'home.card.favorites.desc': 'محصولات ذخیرهشده مورد علاقهتان را ببینید و مدیریت کنید.',
|
||
'home.card.favorites.link': 'مشاهده علاقهمندیها',
|
||
|
||
'profile.title': 'پروفایل من',
|
||
'profile.subtitle': 'اطلاعات شخصی و راههای ارتباطی خود را بهروزرسانی کنید.',
|
||
'profile.section.account': 'حساب کاربری',
|
||
'profile.section.about': 'درباره من',
|
||
'profile.section.social': 'شبکههای اجتماعی',
|
||
'profile.mobile': 'شماره موبایل',
|
||
'profile.email': 'ایمیل',
|
||
'profile.firstName': 'نام (فارسی)',
|
||
'profile.lastName': 'نام خانوادگی (فارسی)',
|
||
'profile.firstNameEn': 'نام (انگلیسی)',
|
||
'profile.lastNameEn': 'نام خانوادگی (انگلیسی)',
|
||
'profile.landline': 'تلفن ثابت',
|
||
'profile.backupPhone': 'شماره تماس پشتیبان',
|
||
'profile.about': 'درباره من',
|
||
'profile.instagram': 'اینستاگرام',
|
||
'profile.telegram': 'تلگرام',
|
||
'profile.linkedin': 'لینکدین',
|
||
'profile.emailPlaceholder': 'you@example.com',
|
||
'profile.save': 'ذخیره تغییرات',
|
||
'profile.saving': 'در حال ذخیره...',
|
||
'profile.toast.success': 'پروفایل با موفقیت بهروزرسانی شد.',
|
||
'profile.error.update': 'بهروزرسانی پروفایل ممکن نشد. دوباره تلاش کنید.',
|
||
|
||
'addresses.title': 'آدرسهای من',
|
||
'addresses.subtitle': 'آدرسهای ارسال سفارش در این فروشگاه را مدیریت کنید.',
|
||
'addresses.save': 'ذخیره آدرسها',
|
||
'addresses.saveOne': 'ذخیره آدرس',
|
||
'addresses.saving': 'در حال ذخیره...',
|
||
'addresses.cancel': 'انصراف',
|
||
'addresses.editorTitle': 'آدرسهای ذخیرهشده',
|
||
'addresses.add': 'افزودن آدرس',
|
||
'addresses.edit': 'ویرایش آدرس',
|
||
'addresses.empty': 'هنوز آدرسی ثبت نشده است.',
|
||
'addresses.loading': 'در حال بارگذاری آدرسها...',
|
||
'addresses.label': 'عنوان آدرس',
|
||
'addresses.labelPlaceholder': 'مثلاً خانه، محل کار',
|
||
'addresses.optional': '(اختیاری)',
|
||
'addresses.province': 'استان',
|
||
'addresses.city': 'شهر',
|
||
'addresses.address': 'آدرس',
|
||
'addresses.postalCode': 'کد پستی',
|
||
'addresses.landline': 'تلفن ثابت',
|
||
'addresses.selectProvince': 'انتخاب استان',
|
||
'addresses.selectCity': 'انتخاب شهر',
|
||
'addresses.streetPlaceholder': 'خیابان، پلاک، واحد',
|
||
'addresses.postalPlaceholder': 'کد پستی',
|
||
'addresses.landlinePlaceholder': 'تلفن ثابت',
|
||
'addresses.remove': 'حذف آدرس',
|
||
'addresses.modal.addTitle': 'افزودن آدرس',
|
||
'addresses.modal.editTitle': 'ویرایش آدرس',
|
||
'addresses.modal.subtitle': 'جزئیات آدرس ارسال را وارد کنید.',
|
||
'addresses.toast.removed': 'آدرس حذف شد.',
|
||
'addresses.toast.saved': 'آدرسها ذخیره شدند.',
|
||
'addresses.toast.created': 'آدرس ذخیره شد.',
|
||
'addresses.toast.updated': 'آدرس بهروزرسانی شد.',
|
||
'addresses.error.load': 'بارگذاری آدرسها ممکن نشد.',
|
||
'addresses.error.remove': 'حذف آدرس ممکن نشد.',
|
||
'addresses.error.incomplete': 'حداقل یک آدرس کامل اضافه کنید.',
|
||
'addresses.error.incompleteForm': 'لطفاً همه فیلدهای الزامی را تکمیل کنید.',
|
||
'addresses.error.save': 'ذخیره آدرس ممکن نشد. دوباره تلاش کنید.',
|
||
'addresses.error.loadLocations': 'بارگذاری استانها ممکن نشد.',
|
||
'addresses.error.loadCities': 'بارگذاری شهرها ممکن نشد.',
|
||
|
||
'orders.title': 'سفارشهای من',
|
||
'orders.subtitle': 'تاریخچه و جزئیات سفارشهای خود را ببینید.',
|
||
'orders.listTitle': 'فهرست سفارشها',
|
||
'orders.showing': 'نمایش {from} تا {to} از {total}',
|
||
'orders.none': 'بدون سفارش',
|
||
'orders.empty': 'هنوز سفارشی ندارید.',
|
||
'orders.loading': 'در حال بارگذاری سفارشها...',
|
||
'orders.error.load': 'بارگذاری سفارشها ممکن نشد.',
|
||
'orders.col.orderId': 'شماره سفارش',
|
||
'orders.col.items': 'اقلام',
|
||
'orders.col.total': 'مبلغ کل',
|
||
'orders.col.date': 'تاریخ و ساعت',
|
||
'orders.col.step': 'وضعیت',
|
||
'orders.col.source': 'ثبتشده توسط',
|
||
'orders.col.actions': 'عملیات',
|
||
'orders.pageMeta': 'صفحه {page} / {totalPages} · {pageSize} در هر صفحه · {total} کل',
|
||
'orders.viewItems': 'مشاهده اقلام',
|
||
'orders.source.operator': 'اپراتور',
|
||
'orders.source.app': 'اپلیکیشن',
|
||
'orders.source.website': 'وبسایت',
|
||
'orders.step.processing': 'در حال پردازش',
|
||
'orders.step.ready': 'آماده ارسال',
|
||
'orders.step.shipped': 'ارسالشده',
|
||
'orders.step.delivered': 'تحویلشده',
|
||
|
||
'orderItems.title': 'اقلام سفارش',
|
||
'orderItems.customer': 'مشتری',
|
||
'orderItems.phone': 'تلفن',
|
||
'orderItems.items': 'اقلام',
|
||
'orderItems.empty': 'اقلامی در این سفارش نیست.',
|
||
'orderItems.product': 'محصول',
|
||
'orderItems.qty': 'تعداد',
|
||
'orderItems.unitPrice': 'قیمت واحد',
|
||
'orderItems.lineTotal': 'جمع ردیف',
|
||
'orderItems.sku': 'کد کالا: {sku}',
|
||
'orderItems.summary': 'جمع سفارش · {count} {itemsLabel}',
|
||
'orderItems.item': 'قلم',
|
||
'orderItems.itemsPlural': 'قلم',
|
||
'orderItems.close': 'بستن',
|
||
|
||
'favorites.title': 'علاقهمندیها',
|
||
'favorites.subtitle': 'محصولاتی که برای بعد ذخیره کردهاید.',
|
||
'favorites.loading': 'در حال بارگذاری علاقهمندیها...',
|
||
'favorites.empty': 'هنوز علاقهمندی ندارید.',
|
||
'favorites.error.load': 'بارگذاری علاقهمندیها ممکن نشد.',
|
||
'favorites.toast.removed': 'از علاقهمندیها حذف شد.',
|
||
'favorites.error.remove': 'حذف از علاقهمندیها ممکن نشد.',
|
||
'favorites.cartSoon': 'سبد خرید بهزودی فعال میشود.',
|
||
'favorites.remove': 'حذف از علاقهمندیها',
|
||
'favorites.addToCart': 'افزودن به سبد خرید',
|
||
'favorites.festival': 'جشنواره',
|
||
'favorites.inStock': '{count} موجود',
|
||
'favorites.variantOne': '۱ تنوع',
|
||
'favorites.variantMany': '{count} تنوع',
|
||
|
||
'title.signIn': 'ورود',
|
||
'title.checkout': 'تسویهحساب',
|
||
'title.cart': 'سبد خرید',
|
||
'title.delivery': 'ارسال',
|
||
'title.payment': 'پرداخت',
|
||
'title.success': 'موفق',
|
||
'title.failed': 'ناموفق',
|
||
|
||
'login.welcome': 'خوش آمدید',
|
||
'login.subtitle': 'با شماره موبایل وارد شوید',
|
||
'login.mobile': 'شماره موبایل',
|
||
'login.password': 'رمز عبور',
|
||
'login.passwordPlaceholder': 'رمز عبور خود را وارد کنید',
|
||
'login.hidePassword': 'مخفی کردن رمز',
|
||
'login.showPassword': 'نمایش رمز',
|
||
'login.forgot': 'رمز عبور را فراموش کردهاید؟',
|
||
'login.signIn': 'ورود',
|
||
'login.signingIn': 'در حال ورود...',
|
||
'login.or': 'یا',
|
||
'login.otp': 'ورود یکبارمصرف با پیامک',
|
||
'login.noAccount': 'حساب کاربری ندارید؟',
|
||
'login.signUp': 'ثبتنام',
|
||
'login.error.signIn': 'ورود ممکن نشد. اتصال خود را بررسی کنید و دوباره تلاش کنید.',
|
||
'login.error.sendCode': 'ارسال کد تأیید ممکن نشد.',
|
||
|
||
'signup.title': 'ایجاد حساب',
|
||
'signup.subtitle': 'بهعنوان مشتری {domain} ثبتنام کنید',
|
||
'signup.firstName': 'نام',
|
||
'signup.lastName': 'نام خانوادگی',
|
||
'signup.passwordPlaceholder': 'یک رمز عبور انتخاب کنید',
|
||
'signup.confirm': 'تأیید رمز عبور',
|
||
'signup.confirmPlaceholder': 'رمز عبور را تکرار کنید',
|
||
'signup.create': 'ایجاد حساب',
|
||
'signup.creating': 'در حال ایجاد حساب...',
|
||
'signup.hasAccount': 'قبلاً حساب دارید؟',
|
||
'signup.signIn': 'ورود',
|
||
'signup.error.match': 'رمزهای عبور یکسان نیستند.',
|
||
'signup.error.length': 'رمز عبور باید حداقل ۸ کاراکتر باشد.',
|
||
'signup.error.create': 'ایجاد حساب ممکن نشد.',
|
||
|
||
'forgot.back': 'بازگشت به ورود',
|
||
'forgot.title': 'فراموشی رمز عبور',
|
||
'forgot.subtitlePhone': 'کد تأیید را از طریق پیامک ارسال میکنیم',
|
||
'forgot.subtitleCode': 'کد و رمز عبور جدید را وارد کنید',
|
||
'forgot.sendCode': 'ارسال کد پیامکی',
|
||
'forgot.sending': 'در حال ارسال...',
|
||
'forgot.code': 'کد تأیید پیامکی',
|
||
'forgot.newPassword': 'رمز عبور جدید',
|
||
'forgot.newPasswordPlaceholder': 'رمز عبور جدید را وارد کنید',
|
||
'forgot.reset': 'بازیابی رمز عبور',
|
||
'forgot.verifying': 'در حال تأیید...',
|
||
'forgot.error.length': 'رمز عبور باید حداقل ۸ کاراکتر باشد.',
|
||
'forgot.error.verify': 'تأیید کد ممکن نشد.',
|
||
'forgot.info.partial':
|
||
'شماره موبایل تأیید شد. بازیابی کامل رمز با پیامک هنوز در دسترس نیست — با پشتیبانی تماس بگیرید یا اگر رمز را بهخاطر دارید وارد شوید.',
|
||
|
||
'otp.back': 'بازگشت به ورود',
|
||
'otp.title': 'ورود یکبارمصرف',
|
||
'otp.subtitlePhone': 'شماره موبایل خود را با کد یکبارمصرف پیامکی تأیید کنید',
|
||
'otp.subtitleCode': 'کد پیامکی و رمز عبور خود را وارد کنید',
|
||
'otp.sendCode': 'ارسال کد پیامکی',
|
||
'otp.sending': 'در حال ارسال...',
|
||
'otp.code': 'کد تأیید پیامکی',
|
||
'otp.password': 'رمز عبور',
|
||
'otp.passwordPlaceholder': 'رمز عبور حساب شما',
|
||
'otp.signIn': 'ورود',
|
||
'otp.signingIn': 'در حال ورود...',
|
||
'otp.error.password': 'برای تکمیل ورود پس از تأیید پیامکی، رمز حساب خود را وارد کنید.',
|
||
'otp.error.signIn': 'ورود با تأیید پیامکی ممکن نشد.',
|
||
|
||
'common.close': 'بستن',
|
||
'common.resendIn': 'ارسال مجدد کد تا {seconds} ثانیه',
|
||
'common.resend': 'ارسال مجدد کد پیامکی',
|
||
'common.codeSent': 'کد تأیید به {phone} ارسال شد',
|
||
}
|
||
|
||
const dictionaries: Record<DashboardLocale, Record<MessageKey, string>> = {
|
||
en: en as Record<MessageKey, string>,
|
||
fa,
|
||
}
|
||
|
||
export type CustomerMessageKey = MessageKey
|
||
|
||
export function translate(
|
||
locale: DashboardLocale,
|
||
key: MessageKey,
|
||
vars?: Record<string, string | number>,
|
||
): string {
|
||
const dict = dictionaries[locale] ?? dictionaries.en
|
||
let text = dict[key] ?? dictionaries.en[key] ?? key
|
||
if (vars) {
|
||
for (const [name, value] of Object.entries(vars)) {
|
||
text = text.replaceAll(`{${name}}`, String(value))
|
||
}
|
||
}
|
||
return text
|
||
}
|
||
|
||
export function getCustomerRouteTitleRules(locale: DashboardLocale) {
|
||
const t = (key: MessageKey) => translate(locale, key)
|
||
return [
|
||
{ match: '/login', labels: [t('title.signIn')] },
|
||
{ match: '/checkout/login', labels: [t('title.checkout'), t('title.signIn')] },
|
||
{ match: '/checkout/cart', labels: [t('title.checkout'), t('title.cart')] },
|
||
{ match: '/checkout/delivery', labels: [t('title.checkout'), t('title.delivery')] },
|
||
{ match: '/checkout/payment', labels: [t('title.checkout'), t('title.payment')] },
|
||
{ match: '/checkout/success', labels: [t('title.checkout'), t('title.success')] },
|
||
{ match: '/checkout/failed', labels: [t('title.checkout'), t('title.failed')] },
|
||
{ match: '/checkout', labels: [t('title.checkout')] },
|
||
{ match: '/profile', labels: [t('nav.profile')] },
|
||
{ match: '/addresses', labels: [t('nav.addresses')] },
|
||
{ match: '/orders', labels: [t('nav.orders')] },
|
||
{ match: '/favorites', labels: [t('nav.favorites')] },
|
||
{ match: '/', labels: [t('nav.home')] },
|
||
]
|
||
}
|