mirror of
https://git.meshkee.com/Meshkee/dashboards.git
synced 2026-08-11 22:30:58 +04:30
Add FA/EN locale, home activity charts, and theme-aware polish.
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>
This commit is contained in:
co-authored by
Cursor
parent
f5b2193ba1
commit
66004a0fba
@@ -0,0 +1,621 @@
|
||||
import type { DashboardLocale, RouteTitleRule } from '@meshkee/dashboard-core'
|
||||
|
||||
const en = {
|
||||
'app.dashboardName': 'Business Dashboard',
|
||||
'app.storeFallback': 'Business',
|
||||
'app.poweredBy': 'powered by Meshkee.app',
|
||||
'app.userFallback': 'User',
|
||||
|
||||
'role.superAdmin': 'Super Admin',
|
||||
'role.owner': 'Business Owner',
|
||||
'role.staff': 'Staff',
|
||||
|
||||
'nav.home': 'Home',
|
||||
'nav.businessProfile': 'Business Profile',
|
||||
'nav.products': 'Products',
|
||||
'nav.products.overview': 'Overview',
|
||||
'nav.products.list': 'My Products',
|
||||
'nav.products.new': 'Add New Product',
|
||||
'nav.products.categories': 'Categories',
|
||||
'nav.products.brands': 'Brands',
|
||||
'nav.products.settings': 'Settings',
|
||||
'nav.store': 'Store',
|
||||
'nav.store.overview': 'Overview',
|
||||
'nav.store.items': 'My Store Items',
|
||||
'nav.store.orders': 'My Orders',
|
||||
'nav.store.shipping': 'Shipping Fees',
|
||||
'nav.store.cards': 'Shopping Cards',
|
||||
'nav.store.settings': 'Settings',
|
||||
'nav.customers': 'Customers',
|
||||
'nav.settings': 'Settings',
|
||||
'nav.blog': 'Blog',
|
||||
'nav.blog.overview': 'Overview',
|
||||
'nav.blog.list': 'My Blogs',
|
||||
'nav.blog.new': 'Add New Blog',
|
||||
'nav.blog.categories': 'Categories',
|
||||
'nav.blog.settings': 'Settings',
|
||||
'nav.portfolios': 'Portfolios',
|
||||
'nav.portfolios.overview': 'Overview',
|
||||
'nav.portfolios.list': 'My Portfolios',
|
||||
'nav.portfolios.new': 'Add New Portfolio',
|
||||
'nav.portfolios.categories': 'Categories',
|
||||
'nav.portfolios.settings': 'Settings',
|
||||
'nav.website': 'Website',
|
||||
'nav.website.overview': 'Overview',
|
||||
'nav.website.sliders': 'Sliders',
|
||||
'nav.website.specialCategories': 'Special Categories',
|
||||
'nav.website.specialBrands': 'Special Brands',
|
||||
'nav.website.specialItems': 'Special Items',
|
||||
'nav.website.contact': 'Contact Us Form',
|
||||
'nav.website.subscriptions': 'Subscriptions',
|
||||
'nav.website.faq': 'FAQ',
|
||||
'nav.website.badges': 'Badges',
|
||||
'nav.website.ePayment': 'E-Payment',
|
||||
'nav.help': 'Help Center',
|
||||
'nav.logout': 'Logout',
|
||||
|
||||
'header.toggleMenu': 'Toggle menu',
|
||||
'header.title': 'Admin Dashboard',
|
||||
'header.messages': 'Messages',
|
||||
'header.notifications': 'Notifications',
|
||||
'header.profile': 'Profile',
|
||||
'header.setting': 'Setting',
|
||||
'header.changePassword': 'Change password',
|
||||
|
||||
'bc.dashboard': 'Dashboard',
|
||||
'bc.editProduct': 'Edit Product',
|
||||
'bc.productDetails': 'Product Details',
|
||||
'bc.editBlog': 'Edit Blog',
|
||||
'bc.blogDetails': 'Blog Details',
|
||||
'bc.editPortfolio': 'Edit Portfolio',
|
||||
'bc.portfolioDetails': 'Portfolio Details',
|
||||
|
||||
'home.welcome': 'Welcome back, {name}!',
|
||||
'home.welcomeFallback': 'there',
|
||||
'home.subtitle': "Here's what's happening with your store today.",
|
||||
'home.card.products.title': 'Products',
|
||||
'home.card.products.desc': 'Manage your products, inventory and categories.',
|
||||
'home.card.products.link': 'View products',
|
||||
'home.card.products.count': 'products',
|
||||
'home.card.store.title': 'Store',
|
||||
'home.card.store.desc': 'Manage your store settings, pages and themes.',
|
||||
'home.card.store.link': 'View store',
|
||||
'home.card.store.count': 'on sale',
|
||||
'home.card.customers.title': 'Customers',
|
||||
'home.card.customers.desc': 'View and manage your customers and their activity.',
|
||||
'home.card.customers.link': 'View customers',
|
||||
'home.card.customers.count': 'people',
|
||||
'home.card.settings.title': 'Settings',
|
||||
'home.card.settings.desc': 'Configure your store preferences and system settings.',
|
||||
'home.card.settings.link': 'View settings',
|
||||
'home.card.blog.title': 'Blog',
|
||||
'home.card.blog.desc': 'Create and manage blog posts and categories.',
|
||||
'home.card.blog.link': 'View blog',
|
||||
'home.card.blog.count': 'posts',
|
||||
'home.card.portfolios.title': 'Portfolios',
|
||||
'home.card.portfolios.desc': 'Manage your portfolio items and showcase projects.',
|
||||
'home.card.portfolios.link': 'View portfolios',
|
||||
'home.card.portfolios.count': 'portfolios',
|
||||
'home.card.website.title': 'Website',
|
||||
'home.card.website.desc': 'Manage contact forms, FAQ, badges, subscriptions, and e-payment.',
|
||||
'home.card.website.link': 'View website',
|
||||
|
||||
'home.chart.orders.title': 'Orders',
|
||||
'home.chart.orders.subtitle': 'Orders and cart adds in the last 30 days',
|
||||
'home.chart.orders.legend': 'Orders ({count})',
|
||||
'home.chart.orders.cartLegend': 'Added to basket ({count})',
|
||||
'home.chart.orders.loading': 'Loading chart...',
|
||||
'home.chart.orders.error': 'Unable to load order activity.',
|
||||
'home.chart.orders.bar': '{day}: {count} orders',
|
||||
'home.chart.orders.cartBar': '{day}: {count} added to basket',
|
||||
'home.chart.customers.title': 'Customers',
|
||||
'home.chart.customers.subtitle': 'Registrations and active users in the last 30 days',
|
||||
'home.chart.customers.legend': 'Registered ({count})',
|
||||
'home.chart.customers.activeLegend': 'Active ({count})',
|
||||
'home.chart.customers.loading': 'Loading chart...',
|
||||
'home.chart.customers.error': 'Unable to load customer activity.',
|
||||
'home.chart.customers.bar': '{day}: {count} registered',
|
||||
'home.chart.customers.activeBar': '{day}: {count} active',
|
||||
|
||||
'products.overview.subtitle': 'Manage your products, inventory and categories.',
|
||||
'products.card.list.desc': 'View, edit and manage all your existing products.',
|
||||
'products.card.new.title': 'Add a New Product',
|
||||
'products.card.new.desc': 'Create and publish a new product to your store.',
|
||||
'products.form.edit.subtitle': 'Update product details and save changes.',
|
||||
'products.card.categories.desc': 'Organize your products into categories and subcategories.',
|
||||
'products.card.brands.desc': 'Manage product brands and assign them when creating products.',
|
||||
'products.card.settings.desc': 'Configure product defaults, variants and display options.',
|
||||
'products.activity.title': 'Product activity',
|
||||
'products.activity.subtitle': 'Products added or updated in the last 12 months',
|
||||
'products.activity.added': 'Added ({count})',
|
||||
'products.activity.updated': 'Updated ({count})',
|
||||
'products.activity.loading': 'Loading chart...',
|
||||
'products.activity.error': 'Unable to load product activity.',
|
||||
'products.activity.chartAria': 'Bar chart of products added and updated per month',
|
||||
'products.activity.barAdded': '{month}: {count} added',
|
||||
'products.activity.barUpdated': '{month}: {count} updated',
|
||||
|
||||
'title.signIn': 'Sign in',
|
||||
'title.home': 'Home',
|
||||
'title.businessProfile': 'Business Profile',
|
||||
'title.products': 'Products',
|
||||
'title.myProducts': 'My Products',
|
||||
'title.addProduct': 'Add New Product',
|
||||
'title.editProduct': 'Edit Product',
|
||||
'title.productDetails': 'Product Details',
|
||||
'title.categories': 'Categories',
|
||||
'title.brands': 'Brands',
|
||||
'title.settings': 'Settings',
|
||||
'title.store': 'Store',
|
||||
'title.storeItems': 'My Store Items',
|
||||
'title.orders': 'My Orders',
|
||||
'title.shoppingCards': 'Shopping Cards',
|
||||
'title.customers': 'Customers',
|
||||
'title.blog': 'Blog',
|
||||
'title.myBlogs': 'My Blogs',
|
||||
'title.addBlog': 'Add New Blog',
|
||||
'title.editBlog': 'Edit Blog',
|
||||
'title.blogDetails': 'Blog Details',
|
||||
'title.portfolios': 'Portfolios',
|
||||
'title.myPortfolios': 'My Portfolios',
|
||||
'title.addPortfolio': 'Add New Portfolio',
|
||||
'title.editPortfolio': 'Edit Portfolio',
|
||||
'title.portfolioDetails': 'Portfolio Details',
|
||||
'title.website': 'Website',
|
||||
'title.sliders': 'Sliders',
|
||||
'title.specialCategories': 'Special Categories',
|
||||
'title.specialBrands': 'Special Brands',
|
||||
'title.specialItems': 'Special Items',
|
||||
'title.contactForm': 'Contact Us Form',
|
||||
'title.subscriptions': 'Subscriptions',
|
||||
'title.faq': 'FAQ',
|
||||
'title.badges': 'Badges',
|
||||
'title.ePayment': 'E-Payment',
|
||||
|
||||
'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.access': 'You do not have access to this business dashboard.',
|
||||
|
||||
'signup.title': 'Create account',
|
||||
'signup.subtitle': 'Register for {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}',
|
||||
'common.breadcrumb': 'Breadcrumb',
|
||||
'common.overview': 'Overview',
|
||||
} as const
|
||||
|
||||
type MessageKey = keyof typeof en
|
||||
|
||||
const fa: Record<MessageKey, string> = {
|
||||
'app.dashboardName': 'پنل کسبوکار',
|
||||
'app.storeFallback': 'کسبوکار',
|
||||
'app.poweredBy': 'قدرتگرفته از Meshkee.app',
|
||||
'app.userFallback': 'کاربر',
|
||||
|
||||
'role.superAdmin': 'سوپرادمین',
|
||||
'role.owner': 'صاحب کسبوکار',
|
||||
'role.staff': 'کارمند',
|
||||
|
||||
'nav.home': 'خانه',
|
||||
'nav.businessProfile': 'پروفایل کسبوکار',
|
||||
'nav.products': 'محصولات',
|
||||
'nav.products.overview': 'نمای کلی',
|
||||
'nav.products.list': 'محصولات من',
|
||||
'nav.products.new': 'افزودن محصول',
|
||||
'nav.products.categories': 'دستهبندیها',
|
||||
'nav.products.brands': 'برندها',
|
||||
'nav.products.settings': 'تنظیمات',
|
||||
'nav.store': 'فروشگاه',
|
||||
'nav.store.overview': 'نمای کلی',
|
||||
'nav.store.items': 'اقلام فروشگاه',
|
||||
'nav.store.orders': 'سفارشهای من',
|
||||
'nav.store.shipping': 'هزینه ارسال',
|
||||
'nav.store.cards': 'کارتهای خرید',
|
||||
'nav.store.settings': 'تنظیمات',
|
||||
'nav.customers': 'مشتریان',
|
||||
'nav.settings': 'تنظیمات',
|
||||
'nav.blog': 'بلاگ',
|
||||
'nav.blog.overview': 'نمای کلی',
|
||||
'nav.blog.list': 'بلاگهای من',
|
||||
'nav.blog.new': 'افزودن بلاگ',
|
||||
'nav.blog.categories': 'دستهبندیها',
|
||||
'nav.blog.settings': 'تنظیمات',
|
||||
'nav.portfolios': 'نمونه کارها',
|
||||
'nav.portfolios.overview': 'نمای کلی',
|
||||
'nav.portfolios.list': 'نمونه کارهای من',
|
||||
'nav.portfolios.new': 'افزودن نمونه کار',
|
||||
'nav.portfolios.categories': 'دستهبندیها',
|
||||
'nav.portfolios.settings': 'تنظیمات',
|
||||
'nav.website': 'وبسایت',
|
||||
'nav.website.overview': 'نمای کلی',
|
||||
'nav.website.sliders': 'اسلایدرها',
|
||||
'nav.website.specialCategories': 'دستههای ویژه',
|
||||
'nav.website.specialBrands': 'برندهای ویژه',
|
||||
'nav.website.specialItems': 'اقلام ویژه',
|
||||
'nav.website.contact': 'فرم تماس با ما',
|
||||
'nav.website.subscriptions': 'عضویتها',
|
||||
'nav.website.faq': 'سوالات متداول',
|
||||
'nav.website.badges': 'نشانها',
|
||||
'nav.website.ePayment': 'پرداخت الکترونیک',
|
||||
'nav.help': 'مرکز راهنما',
|
||||
'nav.logout': 'خروج',
|
||||
|
||||
'header.toggleMenu': 'باز و بسته کردن منو',
|
||||
'header.title': 'پنل مدیریت',
|
||||
'header.messages': 'پیامها',
|
||||
'header.notifications': 'اعلانها',
|
||||
'header.profile': 'پروفایل',
|
||||
'header.setting': 'تنظیمات',
|
||||
'header.changePassword': 'تغییر رمز عبور',
|
||||
|
||||
'bc.dashboard': 'داشبورد',
|
||||
'bc.editProduct': 'ویرایش محصول',
|
||||
'bc.productDetails': 'جزئیات محصول',
|
||||
'bc.editBlog': 'ویرایش بلاگ',
|
||||
'bc.blogDetails': 'جزئیات بلاگ',
|
||||
'bc.editPortfolio': 'ویرایش نمونه کار',
|
||||
'bc.portfolioDetails': 'جزئیات نمونه کار',
|
||||
|
||||
'home.welcome': '{name} عزیز، خوش آمدی.',
|
||||
'home.welcomeFallback': 'کاربر',
|
||||
'home.subtitle': 'وضعیت فروشگاهتان را از اینجا دنبال کنید.',
|
||||
'home.card.products.title': 'محصولات',
|
||||
'home.card.products.desc': 'محصولات، موجودی و دستهبندیها را مدیریت کنید.',
|
||||
'home.card.products.link': 'مشاهده محصولات',
|
||||
'home.card.products.count': 'محصول',
|
||||
'home.card.store.title': 'فروشگاه',
|
||||
'home.card.store.desc': 'تنظیمات، صفحات و ظاهر فروشگاه را مدیریت کنید.',
|
||||
'home.card.store.link': 'مشاهده فروشگاه',
|
||||
'home.card.store.count': 'محصول فروش',
|
||||
'home.card.customers.title': 'مشتریان',
|
||||
'home.card.customers.desc': 'مشتریان و فعالیت آنها را ببینید و مدیریت کنید.',
|
||||
'home.card.customers.link': 'مشاهده مشتریان',
|
||||
'home.card.customers.count': 'نفر',
|
||||
'home.card.settings.title': 'تنظیمات',
|
||||
'home.card.settings.desc': 'ترجیحات فروشگاه و تنظیمات سیستم را پیکربندی کنید.',
|
||||
'home.card.settings.link': 'مشاهده تنظیمات',
|
||||
'home.card.blog.title': 'بلاگ',
|
||||
'home.card.blog.desc': 'مطالب و دستهبندیهای بلاگ را ایجاد و مدیریت کنید.',
|
||||
'home.card.blog.link': 'مشاهده بلاگ',
|
||||
'home.card.blog.count': 'مطلب',
|
||||
'home.card.portfolios.title': 'نمونه کارها',
|
||||
'home.card.portfolios.desc': 'نمونه کارها و پروژههای نمایشی را مدیریت کنید.',
|
||||
'home.card.portfolios.link': 'مشاهده نمونه کارها',
|
||||
'home.card.portfolios.count': 'نمونه کار',
|
||||
'home.card.website.title': 'وبسایت',
|
||||
'home.card.website.desc': 'فرم تماس، سوالات متداول، نشانها، عضویتها و پرداخت الکترونیک.',
|
||||
'home.card.website.link': 'مشاهده وبسایت',
|
||||
|
||||
'home.chart.orders.title': 'سفارشها',
|
||||
'home.chart.orders.subtitle': 'سفارشها و افزودن به سبد در ۳۰ روز گذشته',
|
||||
'home.chart.orders.legend': 'سفارش ({count})',
|
||||
'home.chart.orders.cartLegend': 'افزودن به سبد ({count})',
|
||||
'home.chart.orders.loading': 'در حال بارگذاری نمودار...',
|
||||
'home.chart.orders.error': 'بارگذاری فعالیت سفارشها ممکن نشد.',
|
||||
'home.chart.orders.bar': '{day}: {count} سفارش',
|
||||
'home.chart.orders.cartBar': '{day}: {count} افزودن به سبد',
|
||||
'home.chart.customers.title': 'مشتریان',
|
||||
'home.chart.customers.subtitle': 'ثبتنام و کاربران فعال در ۳۰ روز گذشته',
|
||||
'home.chart.customers.legend': 'ثبتنام ({count})',
|
||||
'home.chart.customers.activeLegend': 'فعال ({count})',
|
||||
'home.chart.customers.loading': 'در حال بارگذاری نمودار...',
|
||||
'home.chart.customers.error': 'بارگذاری فعالیت مشتریان ممکن نشد.',
|
||||
'home.chart.customers.bar': '{day}: {count} ثبتنام',
|
||||
'home.chart.customers.activeBar': '{day}: {count} فعال',
|
||||
|
||||
'products.overview.subtitle': 'محصولات، موجودی و دستهبندیها را مدیریت کنید.',
|
||||
'products.card.list.desc': 'همه محصولات موجود را ببینید، ویرایش و مدیریت کنید.',
|
||||
'products.card.new.title': 'افزودن محصول جدید',
|
||||
'products.card.new.desc': 'یک محصول جدید بسازید و در فروشگاه منتشر کنید.',
|
||||
'products.form.edit.subtitle': 'جزئیات محصول را بهروز کنید و ذخیره کنید.',
|
||||
'products.card.categories.desc': 'محصولات را در دستهبندیها و زیردستهها سازماندهی کنید.',
|
||||
'products.card.brands.desc': 'برندهای محصول را مدیریت کنید و هنگام ساخت محصول به آنها اختصاص دهید.',
|
||||
'products.card.settings.desc': 'پیشفرضها، تنوعها و گزینههای نمایش محصول را پیکربندی کنید.',
|
||||
'products.activity.title': 'فعالیت محصولات',
|
||||
'products.activity.subtitle': 'محصولات افزودهشده یا بهروزرسانیشده در ۱۲ ماه گذشته',
|
||||
'products.activity.added': 'افزودهشده ({count})',
|
||||
'products.activity.updated': 'بهروزرسانیشده ({count})',
|
||||
'products.activity.loading': 'در حال بارگذاری نمودار...',
|
||||
'products.activity.error': 'بارگذاری فعالیت محصولات ممکن نشد.',
|
||||
'products.activity.chartAria': 'نمودار میلهای محصولات افزودهشده و بهروزرسانیشده در هر ماه',
|
||||
'products.activity.barAdded': '{month}: {count} افزودهشده',
|
||||
'products.activity.barUpdated': '{month}: {count} بهروزرسانیشده',
|
||||
|
||||
'title.signIn': 'ورود',
|
||||
'title.home': 'خانه',
|
||||
'title.businessProfile': 'پروفایل کسبوکار',
|
||||
'title.products': 'محصولات',
|
||||
'title.myProducts': 'محصولات من',
|
||||
'title.addProduct': 'افزودن محصول',
|
||||
'title.editProduct': 'ویرایش محصول',
|
||||
'title.productDetails': 'جزئیات محصول',
|
||||
'title.categories': 'دستهبندیها',
|
||||
'title.brands': 'برندها',
|
||||
'title.settings': 'تنظیمات',
|
||||
'title.store': 'فروشگاه',
|
||||
'title.storeItems': 'اقلام فروشگاه',
|
||||
'title.orders': 'سفارشهای من',
|
||||
'title.shoppingCards': 'کارتهای خرید',
|
||||
'title.customers': 'مشتریان',
|
||||
'title.blog': 'بلاگ',
|
||||
'title.myBlogs': 'بلاگهای من',
|
||||
'title.addBlog': 'افزودن بلاگ',
|
||||
'title.editBlog': 'ویرایش بلاگ',
|
||||
'title.blogDetails': 'جزئیات بلاگ',
|
||||
'title.portfolios': 'نمونه کارها',
|
||||
'title.myPortfolios': 'نمونه کارهای من',
|
||||
'title.addPortfolio': 'افزودن نمونه کار',
|
||||
'title.editPortfolio': 'ویرایش نمونه کار',
|
||||
'title.portfolioDetails': 'جزئیات نمونه کار',
|
||||
'title.website': 'وبسایت',
|
||||
'title.sliders': 'اسلایدرها',
|
||||
'title.specialCategories': 'دستههای ویژه',
|
||||
'title.specialBrands': 'برندهای ویژه',
|
||||
'title.specialItems': 'اقلام ویژه',
|
||||
'title.contactForm': 'فرم تماس با ما',
|
||||
'title.subscriptions': 'عضویتها',
|
||||
'title.faq': 'سوالات متداول',
|
||||
'title.badges': 'نشانها',
|
||||
'title.ePayment': 'پرداخت الکترونیک',
|
||||
|
||||
'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.access': 'به این پنل کسبوکار دسترسی ندارید.',
|
||||
|
||||
'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} ارسال شد',
|
||||
'common.breadcrumb': 'مسیر صفحه',
|
||||
'common.overview': 'نمای کلی',
|
||||
}
|
||||
|
||||
const dictionaries: Record<DashboardLocale, Record<MessageKey, string>> = {
|
||||
en: en as Record<MessageKey, string>,
|
||||
fa,
|
||||
}
|
||||
|
||||
export type BusinessMessageKey = MessageKey
|
||||
|
||||
/** Maps hardcoded English breadcrumb labels used across pages → message keys. */
|
||||
const BREADCRUMB_LABEL_KEYS: Record<string, MessageKey> = {
|
||||
Home: 'nav.home',
|
||||
Dashboard: 'bc.dashboard',
|
||||
'Business Profile': 'nav.businessProfile',
|
||||
Products: 'nav.products',
|
||||
Overview: 'common.overview',
|
||||
'My Products': 'nav.products.list',
|
||||
'Add New Product': 'nav.products.new',
|
||||
'Add a New Product': 'nav.products.new',
|
||||
'Edit Product': 'bc.editProduct',
|
||||
'Product Details': 'bc.productDetails',
|
||||
Categories: 'title.categories',
|
||||
Brands: 'title.brands',
|
||||
Settings: 'title.settings',
|
||||
Store: 'nav.store',
|
||||
'My Store Items': 'nav.store.items',
|
||||
'My Orders': 'nav.store.orders',
|
||||
'Shipping Fees': 'nav.store.shipping',
|
||||
'Shopping Cards': 'nav.store.cards',
|
||||
Customers: 'nav.customers',
|
||||
Blog: 'nav.blog',
|
||||
'My Blogs': 'nav.blog.list',
|
||||
'Add New Blog': 'nav.blog.new',
|
||||
'Edit Blog': 'bc.editBlog',
|
||||
'Blog Details': 'bc.blogDetails',
|
||||
Portfolios: 'nav.portfolios',
|
||||
'My Portfolios': 'nav.portfolios.list',
|
||||
'Add New Portfolio': 'nav.portfolios.new',
|
||||
'Edit Portfolio': 'bc.editPortfolio',
|
||||
'Portfolio Details': 'bc.portfolioDetails',
|
||||
Website: 'nav.website',
|
||||
Sliders: 'nav.website.sliders',
|
||||
'Special Categories': 'nav.website.specialCategories',
|
||||
'Special Brands': 'nav.website.specialBrands',
|
||||
'Special Items': 'nav.website.specialItems',
|
||||
'Contact Us Form': 'nav.website.contact',
|
||||
Subscriptions: 'nav.website.subscriptions',
|
||||
FAQ: 'nav.website.faq',
|
||||
Badges: 'nav.website.badges',
|
||||
'E-Payment': 'nav.website.ePayment',
|
||||
Orders: 'nav.store.orders',
|
||||
Profile: 'header.profile',
|
||||
'Sign in': 'title.signIn',
|
||||
}
|
||||
|
||||
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 translateBreadcrumbLabel(locale: DashboardLocale, label: string): string {
|
||||
const key = BREADCRUMB_LABEL_KEYS[label]
|
||||
return key ? translate(locale, key) : label
|
||||
}
|
||||
|
||||
export function getBusinessRouteTitleRules(locale: DashboardLocale): RouteTitleRule[] {
|
||||
const t = (key: MessageKey) => translate(locale, key)
|
||||
return [
|
||||
{ match: '/login', labels: [t('title.signIn')] },
|
||||
{ match: '/business-profile', labels: [t('title.businessProfile')] },
|
||||
{ match: '/products/categories', labels: [t('title.products'), t('title.categories')] },
|
||||
{ match: '/products/brands', labels: [t('title.products'), t('title.brands')] },
|
||||
{ match: '/products/new', labels: [t('title.products'), t('title.addProduct')] },
|
||||
{ match: /^\/products\/edit\/[^/]+$/, labels: [t('title.products'), t('title.editProduct')] },
|
||||
{ match: '/products/list', labels: [t('title.products'), t('title.myProducts')] },
|
||||
{
|
||||
match: /^\/products\/detail\/[^/]+$/,
|
||||
labels: [t('title.products'), t('title.productDetails')],
|
||||
},
|
||||
{ match: '/products/settings', labels: [t('title.products'), t('title.settings')] },
|
||||
{ match: '/products', labels: [t('title.products')] },
|
||||
{ match: '/store/items', labels: [t('title.store'), t('title.storeItems')] },
|
||||
{ match: '/store/orders', labels: [t('title.store'), t('title.orders')] },
|
||||
{ match: '/store/cards', labels: [t('title.store'), t('title.shoppingCards')] },
|
||||
{ match: '/store/settings', labels: [t('title.store'), t('title.settings')] },
|
||||
{ match: '/store', labels: [t('title.store')] },
|
||||
{ match: '/customers', labels: [t('title.customers')] },
|
||||
{ match: '/blog/list', labels: [t('title.blog'), t('title.myBlogs')] },
|
||||
{ match: /^\/blog\/detail\/[^/]+$/, labels: [t('title.blog'), t('title.blogDetails')] },
|
||||
{ match: '/blog/new', labels: [t('title.blog'), t('title.addBlog')] },
|
||||
{ match: /^\/blog\/edit\/[^/]+$/, labels: [t('title.blog'), t('title.editBlog')] },
|
||||
{ match: '/blog/categories', labels: [t('title.blog'), t('title.categories')] },
|
||||
{ match: '/blog/settings', labels: [t('title.blog'), t('title.settings')] },
|
||||
{ match: '/blog', labels: [t('title.blog')] },
|
||||
{ match: '/portfolios/list', labels: [t('title.portfolios'), t('title.myPortfolios')] },
|
||||
{
|
||||
match: /^\/portfolios\/detail\/[^/]+$/,
|
||||
labels: [t('title.portfolios'), t('title.portfolioDetails')],
|
||||
},
|
||||
{ match: '/portfolios/new', labels: [t('title.portfolios'), t('title.addPortfolio')] },
|
||||
{
|
||||
match: /^\/portfolios\/edit\/[^/]+$/,
|
||||
labels: [t('title.portfolios'), t('title.editPortfolio')],
|
||||
},
|
||||
{ match: '/portfolios/categories', labels: [t('title.portfolios'), t('title.categories')] },
|
||||
{ match: '/portfolios/settings', labels: [t('title.portfolios'), t('title.settings')] },
|
||||
{ match: '/portfolios', labels: [t('title.portfolios')] },
|
||||
{ match: '/website/sliders', labels: [t('title.website'), t('title.sliders')] },
|
||||
{
|
||||
match: '/website/special-categories',
|
||||
labels: [t('title.website'), t('title.specialCategories')],
|
||||
},
|
||||
{ match: '/website/special-brands', labels: [t('title.website'), t('title.specialBrands')] },
|
||||
{ match: '/website/special-items', labels: [t('title.website'), t('title.specialItems')] },
|
||||
{ match: '/website/contact', labels: [t('title.website'), t('title.contactForm')] },
|
||||
{ match: '/website/subscriptions', labels: [t('title.website'), t('title.subscriptions')] },
|
||||
{ match: '/website/faq', labels: [t('title.website'), t('title.faq')] },
|
||||
{ match: '/website/badges', labels: [t('title.website'), t('title.badges')] },
|
||||
{ match: '/website/e-payment', labels: [t('title.website'), t('title.ePayment')] },
|
||||
{ match: '/website', labels: [t('title.website')] },
|
||||
{ match: '/', labels: [t('title.home')] },
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user