Files
dashboards/apps/customer/src/i18n/messages.ts
T
Alireza HassaniandCursor 722933dda9 Tighten Users filters and admin-only header badges.
Match sticky headers to sidebar glass, drop the Users role column, and show compact owner/admin badges only where needed.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-11 00:23:39 +03:30

821 lines
43 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { DashboardLocale } from '@meshkee/dashboard-core'
const en = {
'app.dashboardName': 'Customer Dashboard',
'app.role.customer': 'Website user',
'app.role.superAdmin': 'Super Admin',
'app.role.admin': 'Admin',
'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.myProducts': 'My Products',
'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',
'header.openBusinessDashboard': 'Open business dashboard',
'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.addresses.count': '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.orders.count': 'orders',
'home.card.favorites.title': 'My Favorites',
'home.card.favorites.desc': 'Browse and manage your saved favorite products.',
'home.card.favorites.link': 'View favorites',
'home.card.favorites.count': 'favorites',
'home.card.myProducts.title': 'My Products',
'home.card.myProducts.desc': 'List and manage products you have submitted.',
'home.card.myProducts.link': 'View my products',
'home.card.myProducts.count': 'products',
'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',
'myProducts.title': 'My Products',
'myProducts.subtitle':
'The products below are yours and will be sold on our website after supervisor approval.',
'myProducts.empty': 'You have not added any products yet.',
'myProducts.add': 'Add product',
'myProducts.addTitle': 'Add product',
'myProducts.addSubtitle': 'Submit a new product for review.',
'myProducts.addComingSoon': 'The add form will be designed next.',
'myProducts.backToList': 'Back to my products',
'myProducts.editTitle': 'Edit product',
'myProducts.editSubtitle': 'Update your listing details, then save.',
'myProducts.detailsTitle': 'Product details',
'myProducts.detailsSubtitle': 'Review your submitted listing.',
'myProducts.edit': 'Edit product',
'myProducts.yes': 'Yes',
'myProducts.editSoon': 'Edit product will be available soon.',
'myProducts.remove': 'Remove product',
'myProducts.removeConfirm': 'Remove this product from your stock?',
'myProducts.removeSuccess': 'Product removed.',
'myProducts.promote': 'Promote product',
'myProducts.promoted': 'Promoted',
'myProducts.promoteSuccess': 'Product promoted.',
'myProducts.priceUnavailable': 'Price on request',
'myProducts.status.pending': 'Pending',
'myProducts.status.published': 'Approved',
'myProducts.status.rejected': 'Rejected',
'myProducts.status.archived': 'Archived',
'myProducts.stepperLabel': 'Add product steps',
'myProducts.step.basics': 'Basics',
'myProducts.step.basicsHint': 'Category, names, description, price, and location.',
'myProducts.step.basicsPlaceholder': 'Basic fields will go here.',
'myProducts.step.images': 'Images',
'myProducts.step.imagesHint': 'Add a cropped thumbnail and gallery photos.',
'myProducts.step.details': 'Details',
'myProducts.step.detailsHint': 'Description and technical information for the selected category.',
'myProducts.step.detailsPlaceholder': 'Details and technical fields will go here.',
'myProducts.step.technical': 'Technical data',
'myProducts.step.technicalHint':
'Choose condition, add optional notes, then fill the category technical form.',
'myProducts.optional': '(optional)',
'myProducts.loading': 'Loading products…',
'myProducts.fields.category': 'Category',
'myProducts.fields.selectCategory': 'Select category',
'myProducts.fields.searchCategory': 'Search category…',
'myProducts.fields.clearCategory': 'Clear category',
'myProducts.fields.noCategories': 'No categories found',
'myProducts.fields.titleFa': 'Name (FA)',
'myProducts.fields.titleFaPlaceholder': 'Product name in Farsi',
'myProducts.fields.titleEn': 'Name (EN)',
'myProducts.fields.titleEnPlaceholder': 'Product name in English',
'myProducts.fields.description': 'Description',
'myProducts.fields.descriptionPlaceholder': 'Short description of your product',
'myProducts.fields.price': 'Desired price',
'myProducts.fields.priceSuggested': 'Your suggested price',
'myProducts.fields.priceByExpert': 'I want an expert to set the price',
'myProducts.fields.pricePlaceholder': 'e.g. 1,500,000',
'myProducts.fields.priceUnit': 'Unit',
'myProducts.fields.priceUnit.IRT': 'IRT',
'myProducts.fields.priceUnit.USD': 'Dollar',
'myProducts.fields.priceUnit.EUR': 'EURO',
'myProducts.fields.priceUnit.AED': 'AED',
'myProducts.fields.location': 'Location',
'myProducts.fields.country': 'Country',
'myProducts.fields.selectCountry': 'Select country',
'myProducts.fields.province': 'Province',
'myProducts.fields.selectProvince': 'Select province',
'myProducts.fields.city': 'City',
'myProducts.fields.selectCity': 'Select city',
'myProducts.fields.searchCity': 'Search city…',
'myProducts.fields.clearCity': 'Clear city',
'myProducts.fields.noCities': 'No cities found',
'myProducts.fields.deliveryNote': 'Pickup / delivery note',
'myProducts.fields.deliveryNotePlaceholder': 'e.g. pickup only, evening delivery…',
'myProducts.fields.district': 'District',
'myProducts.fields.selectDistrict': 'Select district',
'myProducts.fields.condition': 'Condition',
'myProducts.fields.technicalNotes': 'Technical notes',
'myProducts.fields.technicalNotesPlaceholder': 'Optional extra technical details…',
'myProducts.condition.new': 'New',
'myProducts.condition.stock': 'Stock',
'myProducts.condition.needs_repair': 'Needs repair',
'myProducts.condition.scrap': 'Scrap',
'myProducts.images.thumbnail': 'Thumbnail',
'myProducts.images.thumbnailUpload': 'Upload thumbnail',
'myProducts.images.thumbnailHint': '3:2 landscape works best',
'myProducts.images.thumbnailChange': 'Change thumbnail',
'myProducts.images.thumbnailRemove': 'Remove thumbnail',
'myProducts.images.zoom': 'Zoom',
'myProducts.images.applyCrop': 'Apply crop',
'myProducts.images.gallery': 'Gallery',
'myProducts.images.galleryAdd': 'Add photos',
'myProducts.images.galleryHint': 'You can select multiple images.',
'myProducts.images.galleryRemove': 'Remove image {index}',
'myProducts.technical.select': 'Select…',
'myProducts.technical.needCategory': 'Choose a category in step 1 to load technical fields.',
'myProducts.technical.empty': 'This category has no technical fields yet.',
'myProducts.technical.categoryForm': 'Category technical form',
'myProducts.technical.loading': 'Loading technical fields…',
'myProducts.cancel': 'Cancel',
'myProducts.next': 'Next',
'myProducts.back': 'Back',
'myProducts.submit': 'Submit',
'myProducts.save': 'Save changes',
'myProducts.submitting': 'Submitting…',
'myProducts.submitSuccess': 'Product submitted for review.',
'myProducts.updateSuccess': 'Product updated.',
'myProducts.error.load': 'Unable to load your products.',
'myProducts.error.loadDetail': 'Unable to load this product.',
'myProducts.error.loadLocations': 'Unable to load locations.',
'myProducts.error.loadCategories': 'Unable to load categories.',
'myProducts.error.loadTechnicalForm': 'Unable to load the category technical form.',
'myProducts.error.categoryRequired': 'Please select a category.',
'myProducts.error.titleFaRequired': 'Please enter the Farsi name.',
'myProducts.error.locationRequired': 'Please select country and city.',
'myProducts.error.priceInvalid': 'Please enter a valid price.',
'myProducts.error.conditionRequired': 'Please select a condition.',
'myProducts.error.technicalRequired': 'Please fill required technical fields.',
'myProducts.error.submit': 'Unable to submit the product.',
'myProducts.error.update': 'Unable to update the product.',
'myProducts.error.remove': 'Unable to remove the product.',
'myProducts.error.promote': 'Unable to promote the product.',
'storeItems.price.contact': 'Contact for price',
'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.',
'login.error.cellEnglishDigits': 'Please use English digits for the mobile number.',
'login.error.smsProvider': 'SMS service is temporarily unavailable. Please try again later.',
'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.',
'signup.error.cellExists':
'This mobile number already has an account in Meshkee Unified Management System (__MESHKEE_APP__) on {sites}. Your password and data will stay the same. Continue to verify by SMS and join this website too.',
'signup.error.cellExistsGeneric':
'This mobile number already has an account in Meshkee Unified Management System (__MESHKEE_APP__) on another website. Your password and data will stay the same. Continue to verify by SMS and join this website too.',
'signup.info.verify': 'Account created. Enter the SMS code to verify your number and sign in.',
'signup.info.verifyExisting':
'Enter the SMS code to join this website. Your Meshkee password and profile stay the same.',
'signup.cellExists.title': 'Existing Meshkee account',
'signup.cellExists.admit': 'I understand, continue',
'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.confirm': 'Confirm password',
'forgot.confirmPlaceholder': 'Repeat new password',
'forgot.reset': 'Reset password',
'forgot.verifying': 'Verifying...',
'forgot.error.length': 'Password must be at least 8 characters.',
'forgot.error.strength': 'Please choose a stronger password.',
'forgot.error.match': 'Passwords do not match.',
'forgot.error.verify': 'Unable to reset password. Check the code and try again.',
'forgot.info.success': 'Password updated. You can sign in with your new password.',
'password.strength': 'Password strength',
'password.strength.empty': 'Enter a password',
'password.strength.weak': 'Weak',
'password.strength.fair': 'Fair',
'password.strength.good': 'Good',
'password.strength.strong': 'Strong',
'password.rule.length': 'At least 8 characters',
'password.rule.upper': 'One uppercase letter',
'password.rule.number': 'One number',
'password.rule.special': 'One special character',
'otp.back': 'Back to sign in',
'otp.title': 'One-time login',
'otp.subtitlePhone': 'We will send a one-time SMS code to your mobile number',
'otp.subtitleCode': 'Enter the SMS code to sign in',
'otp.sendCode': 'Send SMS code',
'otp.sending': 'Sending...',
'otp.code': 'SMS verification code',
'otp.signIn': 'Sign in',
'otp.signingIn': 'Signing in...',
'otp.error.signIn': 'Unable to sign in with SMS code.',
'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.role.superAdmin': 'سوپرادمین',
'app.role.admin': 'ادمین',
'app.storeFallback': 'فروشگاه',
'app.poweredBy': 'قدرت‌گرفته از Meshkee.app',
'nav.home': 'خانه',
'nav.cart': 'سبد خرید',
'nav.profile': 'پروفایل من',
'nav.addresses': 'آدرس‌های من',
'nav.orders': 'سفارش‌های من',
'nav.favorites': 'علاقه‌مندی‌ها',
'nav.myProducts': 'محصولات من',
'nav.help': 'مرکز راهنما',
'nav.logout': 'خروج',
'header.toggleMenu': 'باز و بسته کردن منو',
'header.messages': 'پیام‌ها',
'header.notifications': 'اعلان‌ها',
'header.changePassword': 'تغییر رمز عبور',
'header.myProfile': 'پروفایل من',
'header.openBusinessDashboard': 'رفتن به داشبورد کسب‌وکار',
'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.addresses.count': 'آدرس',
'home.card.orders.title': 'سفارش‌های من',
'home.card.orders.desc': 'سفارش‌ها را پیگیری کنید و تاریخچه و جزئیات را ببینید.',
'home.card.orders.link': 'مشاهده سفارش‌ها',
'home.card.orders.count': 'سفارش',
'home.card.favorites.title': 'علاقه‌مندی‌ها',
'home.card.favorites.desc': 'محصولات ذخیره‌شده مورد علاقه‌تان را ببینید و مدیریت کنید.',
'home.card.favorites.link': 'مشاهده علاقه‌مندی‌ها',
'home.card.favorites.count': 'علاقه‌مندی',
'home.card.myProducts.title': 'محصولات من',
'home.card.myProducts.desc': 'محصولاتی که ثبت کرده‌اید را ببینید و مدیریت کنید.',
'home.card.myProducts.link': 'مشاهده محصولات من',
'home.card.myProducts.count': 'محصول',
'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} تنوع',
'myProducts.title': 'محصولات من',
'myProducts.subtitle':
'محصولات زیر، محصولات شما هستند که توسط وبسایت ما بعد از تایید ناظر به فروش خواهد رسید.',
'myProducts.empty': 'هنوز محصولی ثبت نکرده‌اید.',
'myProducts.add': 'افزودن محصول',
'myProducts.addTitle': 'افزودن محصول',
'myProducts.addSubtitle': 'محصول جدید را برای بررسی ارسال کنید.',
'myProducts.addComingSoon': 'فرم افزودن در مرحله بعد طراحی می‌شود.',
'myProducts.backToList': 'بازگشت به محصولات من',
'myProducts.editTitle': 'ویرایش محصول',
'myProducts.editSubtitle': 'جزئیات آگهی را به‌روز کنید و ذخیره کنید.',
'myProducts.detailsTitle': 'جزئیات محصول',
'myProducts.detailsSubtitle': 'جزئیات آگهی ثبت‌شده را ببینید.',
'myProducts.edit': 'ویرایش محصول',
'myProducts.yes': 'بله',
'myProducts.editSoon': 'ویرایش محصول به‌زودی در دسترس خواهد بود.',
'myProducts.remove': 'حذف محصول',
'myProducts.removeConfirm': 'این محصول از موجودی شما حذف شود؟',
'myProducts.removeSuccess': 'محصول حذف شد.',
'myProducts.promote': 'پروموت محصول',
'myProducts.promoted': 'پروموت شده',
'myProducts.promoteSuccess': 'محصول پروموت شد.',
'myProducts.priceUnavailable': 'قیمت اعلام نشده',
'myProducts.status.pending': 'در انتظار تأیید',
'myProducts.status.published': 'تأیید شده',
'myProducts.status.rejected': 'رد شده',
'myProducts.status.archived': 'بایگانی',
'myProducts.stepperLabel': 'مراحل افزودن محصول',
'myProducts.step.basics': 'اطلاعات پایه',
'myProducts.step.basicsHint': 'دسته‌بندی، نام، توضیحات، قیمت و موقعیت.',
'myProducts.step.basicsPlaceholder': 'فیلدهای پایه اینجا قرار می‌گیرند.',
'myProducts.step.images': 'تصاویر',
'myProducts.step.imagesHint': 'تصویر شاخص با برش و گالری تصاویر را اضافه کنید.',
'myProducts.step.details': 'جزئیات',
'myProducts.step.detailsHint': 'توضیحات و اطلاعات فنی بر اساس دسته‌بندی انتخاب‌شده.',
'myProducts.step.detailsPlaceholder': 'جزئیات و فیلدهای فنی اینجا قرار می‌گیرند.',
'myProducts.step.technical': 'اطلاعات فنی',
'myProducts.step.technicalHint':
'وضعیت را انتخاب کنید، یادداشت اختیاری بنویسید و فرم فنی دسته‌بندی را تکمیل کنید.',
'myProducts.optional': '(اختیاری)',
'myProducts.loading': 'در حال بارگذاری محصولات…',
'myProducts.fields.category': 'دسته‌بندی',
'myProducts.fields.selectCategory': 'انتخاب دسته‌بندی',
'myProducts.fields.searchCategory': 'جستجوی دسته‌بندی…',
'myProducts.fields.clearCategory': 'پاک کردن دسته‌بندی',
'myProducts.fields.noCategories': 'دسته‌بندی‌ای پیدا نشد',
'myProducts.fields.titleFa': 'نام (فارسی)',
'myProducts.fields.titleFaPlaceholder': 'نام محصول به فارسی',
'myProducts.fields.titleEn': 'نام (انگلیسی)',
'myProducts.fields.titleEnPlaceholder': 'نام محصول به انگلیسی',
'myProducts.fields.description': 'توضیحات',
'myProducts.fields.descriptionPlaceholder': 'توضیح کوتاه درباره محصول',
'myProducts.fields.price': 'قیمت پیشنهادی',
'myProducts.fields.priceSuggested': 'قیمت پیشنهادی شما',
'myProducts.fields.priceByExpert': 'می‌خواهم قیمت توسط کارشناس مشخص شود',
'myProducts.fields.pricePlaceholder': 'مثلاً ۱٬۵۰۰٬۰۰۰',
'myProducts.fields.priceUnit': 'واحد',
'myProducts.fields.priceUnit.IRT': 'IRT',
'myProducts.fields.priceUnit.USD': 'Dollar',
'myProducts.fields.priceUnit.EUR': 'EURO',
'myProducts.fields.priceUnit.AED': 'AED',
'myProducts.fields.location': 'موقعیت',
'myProducts.fields.country': 'کشور',
'myProducts.fields.selectCountry': 'انتخاب کشور',
'myProducts.fields.province': 'استان',
'myProducts.fields.selectProvince': 'انتخاب استان',
'myProducts.fields.city': 'شهر',
'myProducts.fields.selectCity': 'انتخاب شهر',
'myProducts.fields.searchCity': 'جستجوی شهر…',
'myProducts.fields.clearCity': 'پاک کردن شهر',
'myProducts.fields.noCities': 'شهری پیدا نشد',
'myProducts.fields.deliveryNote': 'یادداشت تحویل / دریافت',
'myProducts.fields.deliveryNotePlaceholder': 'مثلاً فقط حضوری، تحویل عصر…',
'myProducts.fields.district': 'منطقه',
'myProducts.fields.selectDistrict': 'انتخاب منطقه',
'myProducts.fields.condition': 'وضعیت',
'myProducts.fields.technicalNotes': 'توضیحات فنی',
'myProducts.fields.technicalNotesPlaceholder': 'جزئیات فنی اختیاری…',
'myProducts.condition.new': 'نو',
'myProducts.condition.stock': 'استوک',
'myProducts.condition.needs_repair': 'نیاز به تعمیر',
'myProducts.condition.scrap': 'اوراق',
'myProducts.images.thumbnail': 'تصویر شاخص',
'myProducts.images.thumbnailUpload': 'آپلود تصویر شاخص',
'myProducts.images.thumbnailHint': 'نسبت ۳:۲ افقی بهتر است',
'myProducts.images.thumbnailChange': 'تغییر تصویر شاخص',
'myProducts.images.thumbnailRemove': 'حذف تصویر شاخص',
'myProducts.images.zoom': 'بزرگنمایی',
'myProducts.images.applyCrop': 'اعمال برش',
'myProducts.images.gallery': 'گالری',
'myProducts.images.galleryAdd': 'افزودن عکس',
'myProducts.images.galleryHint': 'می‌توانید چند تصویر انتخاب کنید.',
'myProducts.images.galleryRemove': 'حذف تصویر {index}',
'myProducts.technical.select': 'انتخاب کنید…',
'myProducts.technical.needCategory': 'برای نمایش فیلدهای فنی، در مرحله ۱ دسته‌بندی را انتخاب کنید.',
'myProducts.technical.empty': 'برای این دسته‌بندی هنوز فیلد فنی تعریف نشده است.',
'myProducts.technical.categoryForm': 'فرم فنی دسته‌بندی',
'myProducts.technical.loading': 'در حال بارگذاری فیلدهای فنی…',
'myProducts.cancel': 'انصراف',
'myProducts.next': 'بعدی',
'myProducts.back': 'قبلی',
'myProducts.submit': 'ارسال',
'myProducts.save': 'ذخیره تغییرات',
'myProducts.submitting': 'در حال ارسال…',
'myProducts.submitSuccess': 'محصول برای بررسی ارسال شد.',
'myProducts.updateSuccess': 'محصول به‌روز شد.',
'myProducts.error.load': 'بارگذاری محصولات ممکن نشد.',
'myProducts.error.loadDetail': 'بارگذاری این محصول ممکن نشد.',
'myProducts.error.loadLocations': 'بارگذاری موقعیت‌ها ممکن نشد.',
'myProducts.error.loadCategories': 'بارگذاری دسته‌بندی‌ها ممکن نشد.',
'myProducts.error.loadTechnicalForm': 'بارگذاری فرم فنی دسته‌بندی ممکن نشد.',
'myProducts.error.categoryRequired': 'لطفاً دسته‌بندی را انتخاب کنید.',
'myProducts.error.titleFaRequired': 'لطفاً نام فارسی را وارد کنید.',
'myProducts.error.locationRequired': 'لطفاً کشور و شهر را انتخاب کنید.',
'myProducts.error.priceInvalid': 'لطفاً قیمت معتبر وارد کنید.',
'myProducts.error.conditionRequired': 'لطفاً وضعیت را انتخاب کنید.',
'myProducts.error.technicalRequired': 'لطفاً فیلدهای فنی الزامی را تکمیل کنید.',
'myProducts.error.submit': 'ارسال محصول ممکن نشد.',
'myProducts.error.update': 'به‌روزرسانی محصول ممکن نشد.',
'myProducts.error.remove': 'حذف محصول ممکن نشد.',
'myProducts.error.promote': 'پروموت محصول ممکن نشد.',
'storeItems.price.contact': 'برای قیمت، تماس بگیرید',
'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': 'ارسال کد تأیید ممکن نشد.',
'login.error.cellEnglishDigits': 'خواهشمندیم از زبان انگلیسی برای شماره همراه استفاده کنید',
'login.error.smsProvider': 'سرویس پیامک موقتاً در دسترس نیست. لطفاً بعداً دوباره تلاش کنید.',
'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': 'ایجاد حساب ممکن نشد.',
'signup.error.cellExists':
'این شماره موبایل قبلاً در سیستم مدیریت یکپارچه ی مشکی (__MESHKEE_APP__) حساب دارد ({sites}). رمز عبور و اطلاعات شما همان خواهد بود. با ادامه، تأیید پیامکی را انجام دهید تا وارد این وب‌سایت هم شوید.',
'signup.error.cellExistsGeneric':
'این شماره موبایل قبلاً در سیستم مدیریت یکپارچه ی مشکی (__MESHKEE_APP__) (وب‌سایت دیگری) حساب دارد. رمز عبور و اطلاعات شما همان خواهد بود. با ادامه، تأیید پیامکی را انجام دهید تا وارد این وب‌سایت هم شوید.',
'signup.info.verify': 'حساب ایجاد شد. کد پیامکی را وارد کنید تا شماره تأیید شود و وارد شوید.',
'signup.info.verifyExisting':
'کد پیامکی را وارد کنید تا به این وب‌سایت بپیوندید. رمز عبور و اطلاعات مشکی شما همان می‌ماند.',
'signup.cellExists.title': 'حساب موجود در مشکی',
'signup.cellExists.admit': 'متوجه شدم، ادامه',
'forgot.back': 'بازگشت به ورود',
'forgot.title': 'فراموشی رمز عبور',
'forgot.subtitlePhone': 'کد تأیید را از طریق پیامک ارسال می‌کنیم',
'forgot.subtitleCode': 'کد و رمز عبور جدید را وارد کنید',
'forgot.sendCode': 'ارسال کد پیامکی',
'forgot.sending': 'در حال ارسال...',
'forgot.code': 'کد تأیید پیامکی',
'forgot.newPassword': 'رمز عبور جدید',
'forgot.newPasswordPlaceholder': 'رمز عبور جدید را وارد کنید',
'forgot.confirm': 'تأیید رمز عبور',
'forgot.confirmPlaceholder': 'رمز عبور جدید را تکرار کنید',
'forgot.reset': 'بازیابی رمز عبور',
'forgot.verifying': 'در حال تأیید...',
'forgot.error.length': 'رمز عبور باید حداقل ۸ کاراکتر باشد.',
'forgot.error.strength': 'لطفاً رمز عبور قوی‌تری انتخاب کنید.',
'forgot.error.match': 'رمزهای عبور یکسان نیستند.',
'forgot.error.verify': 'بازنشانی رمز ممکن نشد. کد را بررسی کنید و دوباره تلاش کنید.',
'forgot.info.success': 'رمز عبور به‌روز شد. می‌توانید با رمز جدید وارد شوید.',
'password.strength': 'قدرت رمز عبور',
'password.strength.empty': 'رمز عبور را وارد کنید',
'password.strength.weak': 'ضعیف',
'password.strength.fair': 'متوسط',
'password.strength.good': 'خوب',
'password.strength.strong': 'قوی',
'password.rule.length': 'حداقل ۸ کاراکتر',
'password.rule.upper': 'یک حرف بزرگ انگلیسی',
'password.rule.number': 'یک عدد',
'password.rule.special': 'یک کاراکتر ویژه',
'otp.back': 'بازگشت به ورود',
'otp.title': 'ورود یک‌بارمصرف',
'otp.subtitlePhone': 'کد یک‌بارمصرف را با پیامک به شماره موبایل ارسال می‌کنیم',
'otp.subtitleCode': 'کد پیامکی را وارد کنید تا وارد شوید',
'otp.sendCode': 'ارسال کد پیامکی',
'otp.sending': 'در حال ارسال...',
'otp.code': 'کد تأیید پیامکی',
'otp.signIn': 'ورود',
'otp.signingIn': 'در حال ورود...',
'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: '/my-products/new', labels: [t('nav.myProducts'), t('myProducts.addTitle')] },
{ match: /^\/my-products\/[^/]+\/edit$/, labels: [t('nav.myProducts'), t('myProducts.editTitle')] },
{ match: /^\/my-products\/[^/]+$/, labels: [t('nav.myProducts'), t('myProducts.detailsTitle')] },
{ match: '/my-products', labels: [t('nav.myProducts')] },
{ match: '/', labels: [t('nav.home')] },
]
}