Files
meezi/web/dashboard/messages/en.json
T
soroush.asadi 24da1e0522
CI/CD / CI · API (dotnet build + test) (push) Successful in 57s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 57s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m6s
CI/CD / CI · Admin Web (tsc) (push) Successful in 35s
CI/CD / CI · Website (tsc) (push) Successful in 44s
CI/CD / CI · Koja (tsc) (push) Successful in 49s
CI/CD / Deploy · all services (push) Successful in 2m43s
feat(orders): per-item kitchen/bar notes (POS + QR app + KDS)
Lets the POS agent and the QR/app customer attach a free-text note to each
order line (e.g. "no tomato", "extra hot") that reaches the kitchen/bar.

- Backend already supported it (OrderItem.Notes persists; CreateOrderItemRequest
  and OrderItemDto carry Notes; LiveOrderDto items include it) — this wires the UI.
- cart.store: add setNotes(menuItemId, notes); notes already travel in
  getPendingLines and round-trip via hydrateFromOrder.
- POS pos-screen: a note input under each cart line.
- QR guest menu: a note input under each cart line (QrCartLine.note).
- KDS: render the note prominently under each item so kitchen/bar sees it.
- i18n: pos.itemNotePlaceholder + qrMenu.itemNote (fa/ar/en).

Note: notes are captured on items being added; editing a note on an
already-submitted line is out of scope (no pending delta to re-send).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 09:37:59 +03:30

1698 lines
58 KiB
JSON
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.
{
"common": {
"save": "Save",
"cancel": "Cancel",
"confirm": "Confirm",
"delete": "Delete",
"search": "Search",
"loading": "Loading...",
"logout": "Log out",
"language": "Language",
"comingSoon": "Coming soon",
"edit": "Edit"
},
"confirm": {
"title": "Confirm action",
"confirm": "Confirm",
"cancel": "Cancel"
},
"notify": {
"saved": "Saved",
"errorGeneric": "Something went wrong. Please try again."
},
"errors": {
"generic": "Something went wrong. Please try again.",
"REQUEST_FAILED": "Request failed. Please try again.",
"VALIDATION_ERROR": "The information entered is invalid.",
"FORBIDDEN": "You don't have permission to do this.",
"OWNER_REQUIRED": "Only the café owner can do this.",
"MANAGER_REQUIRED": "This action requires manager access.",
"PLAN_LIMIT_REACHED": "You've reached your plan limit. Upgrade to continue.",
"PLAN_FEATURE_DISABLED": "This feature isn't available on your current plan.",
"NOT_FOUND": "Not found.",
"ORDER_NOT_FOUND": "Order not found.",
"ITEM_NOT_FOUND": "Item not found.",
"ITEM_ALREADY_VOIDED": "This item is already voided.",
"ORDER_ALREADY_CLOSED": "This order is already closed.",
"TABLE_OCCUPIED": "This table is currently occupied.",
"TABLE_CLEANING": "This table is being cleaned.",
"TABLE_NOT_FOUND": "Table not found.",
"TABLE_HAS_OPEN_ORDER": "This table has an open order and can't be removed.",
"TABLE_SECTION_HAS_TABLES": "This section has tables and can't be removed.",
"BRANCH_NOT_FOUND": "Branch not found.",
"SECTION_NOT_FOUND": "Section not found.",
"RATE_LIMITED": "Too many requests. Please wait a moment.",
"SMS_FAILED": "Could not send the SMS. Please try again.",
"INVALID_OTP": "Invalid or expired verification code.",
"TICKET_CLOSED": "This ticket is closed and can't receive messages.",
"ALREADY_REGISTERED": "An account already exists for this number. Please sign in."
},
"brand": {
"name": "Meezi"
},
"languages": {
"fa": "فارسی",
"ar": "العربية",
"en": "English"
},
"auth": {
"title": "Sign in to Meezi",
"subtitle": "We will send a verification code to your phone",
"phone": "Mobile number",
"phonePlaceholder": "09121234567",
"sendOtp": "Send code",
"otp": "Verification code",
"otpPlaceholder": "6 digits",
"verify": "Sign in",
"resend": "Resend",
"rateLimited": "Too many code requests. Wait up to one hour or contact support.",
"notFound": "No account found for this mobile number.",
"smsFailed": "Could not send SMS. Please try again.",
"invalidOtp": "Invalid or expired verification code.",
"register": "Create account",
"registerSubtitle": "Register your cafe on Meezi",
"cafeName": "Cafe or restaurant name",
"cafeNamePlaceholder": "e.g. Roya Cafe",
"createAccount": "Create account",
"alreadyHaveAccount": "Already have an account?",
"loginLink": "Sign in",
"noAccount": "Don't have an account?",
"registerLink": "Register",
"alreadyRegistered": "This phone is already registered. Please sign in.",
"registrationExpired": "Registration session expired. Please try again.",
"chooseCafe": "Choose a café",
"chooseCafeSubtitle": "This number has access to several cafés. Pick one to continue.",
"createNewCafe": "Create a new café",
"createNewCafeHint": "Want to start your own café with this number?",
"tabOtp": "One-time code",
"tabPassword": "Password",
"username": "Username",
"usernamePlaceholder": "Username",
"password": "Password",
"passwordPlaceholder": "Password",
"invalidCredentials": "Incorrect username or password.",
"kojaSlug": "Koja profile address",
"kojaSlugHint": "Customers will find your cafe at this address",
"kojaSlugPlaceholder": "e.g. my-cafe"
},
"roles": {
"owner": "Owner",
"manager": "Manager",
"cashier": "Cashier",
"waiter": "Waiter",
"chef": "Chef",
"delivery": "Delivery",
"unknown": "User"
},
"branchSwitcher": {
"title": "Active branch",
"allBranches": "All branches",
"selectBranch": "Select branch"
},
"branchAccess": {
"title": "Branch access",
"staff": "Staff",
"noStaff": "No staff yet",
"selectStaff": "Select a staff member to manage access",
"ownerNote": "The owner has access to all branches and does not need per-branch roles.",
"noAssignments": "No branch roles assigned yet",
"loading": "Loading...",
"branch": "Branch",
"role": "Role",
"selectBranch": "Select branch",
"add": "Add",
"remove": "Remove"
},
"access": {
"deniedTitle": "No access to this page",
"deniedBody": "Your role doesn't have permission to view this page. Contact a manager or owner if you need access."
},
"nav": {
"aria": "Main navigation",
"collapseSidebar": "Collapse sidebar",
"expandSidebar": "Expand sidebar",
"groups": {
"operations": "Daily operations",
"menuSales": "Menu & sales",
"customers": "Customers",
"finance": "Reports & finance",
"management": "Café management"
},
"pos": "POS",
"tables": "Tables",
"crm": "CRM",
"coupons": "Coupons",
"menu": "Menu",
"inventory": "Inventory",
"hr": "HR",
"reports": "Reports",
"expenses": "Expenses",
"shifts": "Shift close",
"reviews": "Reviews",
"reservations": "Reservations",
"sms": "SMS",
"taxes": "Taxes",
"branches": "Branches",
"subscription": "Plan & billing",
"support": "Support",
"settings": "Settings",
"kds": "Kitchen",
"notifications": "Notifications",
"queue": "Daily queue",
"discover": "Discover cafés"
},
"dashboard": {
"cafeName": "Demo Cafe",
"planPro": "Pro",
"online": "Online",
"offline": "Offline",
"activePlan": "Active plan",
"editCafeSettings": "Café settings",
"viewSubscription": "Plan & billing",
"switchCafe": "Switch café",
"currentCafe": "Current café",
"otherCafes": "Other cafés",
"createNewCafe": "Create a new café",
"openMenu": "Menu",
"switchCafeError": "Could not switch café. Please try again."
},
"overview": {
"title": "Home",
"greeting": "Welcome back",
"todayRevenue": "Today's revenue",
"todayOrders": "Today's orders",
"netIncome": "Net income",
"avgOrder": "Avg. order value",
"revenueChart": "7-day revenue trend",
"tableStatus": "Table status",
"tableFree": "Free",
"tableBusy": "Busy",
"tableCleaning": "Cleaning",
"tableTotal": "Total tables",
"topProducts": "Top sellers",
"vsYesterday": "vs yesterday",
"noData": "No data available",
"quickLinks": "Quick access",
"unit": "items"
},
"pos": {
"order": "Order",
"table": "Table",
"total": "Total",
"subtotal": "Subtotal",
"tax": "Tax",
"discount": "Discount",
"confirmOrder": "Confirm & pay",
"modeOrder": "Take order",
"modePay": "Pay",
"takeOrder": "Order taking",
"submitOrder": "Submit order",
"submitOrderAndPay": "Submit order & pay",
"orderPaidNew": "Order submitted and paid",
"orderPaidAdd": "Items added and paid",
"posDeviceSent": "Amount sent to POS terminal",
"posDeviceError": "Could not send amount to POS terminal",
"posDeviceNotConfigured": "POS terminal not configured — payment recorded in Meezi only",
"posDeviceConnectionFailed": "Could not connect to POS terminal",
"posDeviceTimeout": "POS terminal timed out",
"posDeviceRejected": "POS terminal rejected the payment",
"posDeviceNoBranch": "No branch selected for POS payment",
"kitchenSlip": "Kitchen ticket (preview & print)",
"queueNumber": "Queue #{number}",
"orderPlaced": "Order saved — go to Pay to collect payment",
"guestName": "Guest name",
"guestNamePlaceholder": "e.g. Ali",
"needTableOrName": "Select a table, customer, or guest name",
"openOrders": "Open orders",
"openOrdersHint": "Orders not paid yet",
"noOpenOrders": "No orders waiting for payment",
"payOrder": "Payment",
"payFor": "Pay for",
"selectOrderToPay": "Select an order from the list",
"confirmPay": "Collect payment",
"confirmPayCash": "Collect payment (cash)",
"confirmPayCard": "Collect payment (card)",
"confirmPayCredit": "Collect payment (credit)",
"confirmPaySplit": "Collect payment (split)",
"previewBill": "Preview & print bill",
"paySuccess": "Payment recorded",
"payError": "Payment failed",
"payNeedsOpenShift": "Open the register shift for this branch before taking payment",
"cancelOrder": "Cancel order (no payment)",
"cancelOrderConfirm": "Customer left without paying? The order will be cancelled and the table freed.",
"cancelOrderSuccess": "Order cancelled",
"cancelOrderError": "Could not cancel order",
"cancelReasonPlaceholder": "Cancellation reason (optional)",
"cancelOrderHasPayments": "Refund the recorded payments first, then cancel the order",
"itemsCount": "items",
"applyCoupon": "Apply coupon",
"couponPlaceholder": "Coupon code",
"couponCode": "Coupon code",
"selectTable": "Table",
"emptyCart": "Cart is empty",
"cash": "Cash",
"card": "Card",
"clearCart": "Clear",
"allCategories": "All",
"searchItems": "Search items",
"searchItemsPlaceholder": "Search by item name…",
"searchNoResults": "No items match your search",
"reservationBanner": "Reservation: {name} — add items and tap Confirm & pay",
"orderSuccess": "Order placed",
"orderError": "Failed to place order",
"orderInvalid": "Invalid order (check menu items or table)",
"orderNotOpen": "This order is no longer open",
"orderValidation": "Invalid order details",
"nothingPending": "No new items to send to the kitchen",
"couponApplied": "Coupon «{code}» applied — {amount} off",
"couponActive": "Coupon {code}",
"couponRemoved": "Coupon removed",
"removeCoupon": "Remove",
"couponInvalid": "Invalid coupon code",
"couponExpired": "This coupon has expired",
"couponNotStarted": "This coupon is not active yet",
"couponLimitReached": "This coupon has reached its usage limit",
"couponMinOrder": "Minimum order amount not met",
"couponCartEmpty": "Add items to the cart first",
"couponRequired": "Enter a coupon code",
"guestPhone": "Guest phone",
"guestPhonePlaceholder": "09121234567",
"selectTableBoard": "Select table",
"loadingTables": "Loading tables...",
"selectBranchForTables": "Select a branch first",
"noTablesOnBoard": "No tables for this branch. Add tables in the Tables screen.",
"tablesLoadError": "Could not load tables",
"retryTables": "Try again",
"manageTablesLink": "Go to Tables",
"sessionActive": "Active table session",
"addToOrder": "Added to table order",
"void": "Void",
"voidItem": "Void item",
"voided": "Voided",
"itemNotePlaceholder": "Note for kitchen/bar (optional)",
"confirmVoid": "Are you sure you want to void this item?",
"voidError": "Could not void item",
"transferTable": "Transfer table",
"selectTargetTable": "Select destination table",
"transferSuccess": "Order transferred successfully",
"transferError": "Could not transfer table",
"tableNotAvailable": "Table is being cleaned",
"tableOccupied": "Table is already occupied",
"searchOpenOrder": "Table, name, phone, or order ID...",
"paidSoFar": "Paid",
"remaining": "Remaining",
"loyaltyBalance": "Customer points: {points}",
"loyaltyUseMax": "Max",
"loyaltyRedeemHint": "1 point = 100 T discount on this payment",
"loyaltyRedeemApplied": "Points discount",
"loyaltyNoCustomer": "Attach a customer to the order to redeem points",
"loyaltyInsufficient": "Not enough points",
"splitPayments": "Split payment",
"addPaymentRow": "Add payment row",
"credit": "Credit",
"paySelectTable": "Pick table (occupied)",
"payPickByName": "Or pick by name / open order list",
"payOpenOrdersHint": "Tap an occupied table, use the table dropdown, or search by name/phone",
"allTables": "All tables",
"noOrderOnTable": "No open order on this table",
"noOpenOrdersOnTable": "No open orders for this table",
"customerSection": "Customer",
"existingCustomer": "Existing",
"newCustomer": "New guest",
"customerSearchPlaceholder": "Name, phone, or national ID...",
"customerSearchHint": "Type at least 2 characters to search",
"customerNotFound": "No customer found — add as new guest",
"customerSaved": "Customer saved to CRM",
"customerSaveError": "Could not save customer",
"customerPhoneExists": "Phone already registered — search and select",
"newCustomerHint": "Use for this order only, or tap Add customer to save to CRM",
"offlineQueueNotice": "Offline — order saved in queue and will sync when connected",
"orderTypePicker": "How would you like to take this order?",
"orderTypeTable": "Table",
"orderTypeTableDesc": "Seat guest at a specific table",
"orderTypeCounter": "Counter",
"orderTypeCounterDesc": "Walk-in, no table yet",
"orderTypeTakeaway": "Takeaway",
"orderTypeTakeawayDesc": "Order to go",
"counterBadge": "Counter",
"takeawayBadge": "Takeaway",
"assignTable": "Assign table",
"newOrder": "New order"
},
"print": {
"printReceipt": "Print receipt",
"printKitchen": "Send to kitchen",
"success": "Receipt printed successfully",
"notConfigured": "Printer IP is not configured",
"connectionFailed": "Could not connect to printer",
"testPrint": "Test print",
"printerSettings": "Printer settings",
"receiptPrinter": "Receipt printer",
"kitchenPrinter": "Kitchen printer",
"paperWidth": "Paper width",
"autoCut": "Auto cut",
"port": "Port",
"receiptHeader": "Receipt header",
"receiptFooter": "Receipt footer",
"wifiOnReceipt": "WiFi password on receipt",
"saveSettings": "Save settings",
"settingsSaved": "Printer settings saved",
"noBranchForPrinter": "Add a branch before configuring printers.",
"testPageHint": "Sends a test ticket to your saved printers. Configure IP and port under Printer settings first.",
"testPrintReceipt": "Test receipt printer",
"testPrintKitchen": "Test kitchen printer",
"configurePrinters": "Open printer settings",
"posDeviceSection": "Card POS terminal",
"posDeviceHint": "On card payment, the amount is sent via HTTP (POST /pay) to the device on your LAN.",
"posDeviceIp": "POS device IP address"
},
"receipt": {
"table": "Table",
"order": "Order",
"guest": "Guest",
"total": "Total",
"print": "Print",
"close": "Close",
"thankYou": "Thank you for your visit",
"kitchenTitle": "Kitchen / bar ticket",
"billTitle": "Customer bill",
"kitchenFooter": "— For kitchen —",
"payment": {
"cash": "Cash",
"card": "Card",
"credit": "Credit"
}
},
"crm": {
"title": "Customers",
"searchPlaceholder": "Name, phone, or national ID...",
"addCustomer": "Add customer",
"name": "Name",
"phone": "Phone",
"nationalId": "National ID",
"birthDate": "Birth date (Jalali)",
"group": "Group",
"loyaltyPoints": "Points",
"noCustomers": "No customers found",
"groups": {
"Regular": "Regular",
"Vip": "VIP",
"New": "New",
"Employee": "Employee"
},
"wizard": {
"titleCreate": "Add customer",
"titleEdit": "Edit customer",
"stepOf": "Step {current} of {total}",
"steps": {
"contact": "Contact",
"profile": "Profile",
"loyalty": "Group & points",
"confirm": "Review"
},
"back": "Back",
"next": "Next",
"birthHint": "Jalali format, e.g. 1400/01/01",
"referredBy": "Referred by (optional)",
"loyaltyCreateHint": "Loyalty points can be adjusted after the customer is created.",
"errors": {
"duplicatePhone": "This phone number is already registered.",
"generic": "Could not save. Please try again."
}
}
},
"coupons": {
"title": "Coupons",
"addCoupon": "New coupon",
"code": "Code",
"type": "Type",
"value": "Value",
"usage": "Usage",
"active": "Active",
"inactive": "Inactive",
"types": {
"Percentage": "Percentage",
"FixedAmount": "Fixed amount",
"FreeItem": "Free item"
},
"noCoupons": "No coupons yet"
},
"hr": {
"title": "Human resources",
"tabs": {
"attendance": "Attendance",
"leave": "Leave",
"payroll": "Payroll",
"access": "Branch access",
"credentials": "Login credentials"
},
"myAttendance": "My attendance",
"clockIn": "Clock in",
"clockOut": "Clock out",
"approve": "Approve",
"noLeave": "No pending leave requests",
"paid": "Paid",
"markPaid": "Mark paid",
"employeeCount": "Employees",
"monthYear": "Payroll month",
"credentials": {
"title": "Employee login credentials",
"subtitle": "Set a username and password for each employee so they can sign in without an OTP.",
"selectEmployee": "Select an employee first",
"username": "Username",
"usernamePlaceholder": "e.g. ali_barista",
"password": "Password (min 8 characters)",
"passwordPlaceholder": "New password",
"set": "Save credentials",
"remove": "Remove credentials",
"removeConfirm": "Are you sure? The employee will no longer be able to sign in with a password.",
"saved": "Credentials saved.",
"removed": "Credentials removed.",
"usernameTaken": "This username is already taken."
}
},
"reviews": {
"title": "Customer reviews",
"summary": "Average rating",
"reviewCount": "{count} reviews",
"empty": "No reviews yet.",
"ownerReply": "Cafe reply",
"reply": "Reply",
"replyPlaceholder": "Write your reply..."
},
"sms": {
"title": "SMS marketing",
"message": "Message",
"messagePlaceholder": "Write your SMS text...",
"targetGroup": "Target group",
"allCustomers": "All customers",
"send": "Send",
"usage": "Usage this month",
"unlimited": "Unlimited",
"sent": "Sent",
"failed": "Failed",
"charCount": "{count} chars",
"smsPartsHint": "{parts} SMS",
"balance": "Account credit",
"balanceAmount": "{amount} Rials",
"balanceNotConfigured": "Kavenegar not configured",
"sender": "Sender line",
"recipientsCount": "{count} recipients",
"sendConfirm": "Send to {count} people?",
"sending": "Sending..."
},
"reports": {
"title": "Reports & analytics",
"subtitle": "Sales summary from daily snapshots",
"exportCsv": "Download CSV",
"fromDate": "From",
"toDate": "To",
"branch": "Branch",
"allBranches": "All branches",
"preset": {
"7d": "7 days",
"30d": "30 days",
"90d": "90 days"
},
"kpiTotalRevenue": "Total revenue",
"kpiTotalOrders": "Orders",
"kpiAvgOrder": "Avg. order value",
"kpiNetIncome": "Net income",
"kpiTotalExpenses": "Total expenses",
"vsPrevious": "vs previous period",
"revenueChartTitle": "Daily revenue trend",
"paymentMixTitle": "Payment methods",
"branchCompareTitle": "Branch comparison",
"topProductsTitle": "Top products",
"colProduct": "Product",
"colQuantity": "Qty",
"colRevenue": "Revenue",
"revenue": "Revenue",
"cash": "Cash",
"card": "Card",
"credit": "Credit",
"noData": "No data",
"loading": "Loading...",
"csvDate": "Date",
"csvBranch": "Branch",
"csvTotalRevenue": "Total revenue",
"csvTotalOrders": "Orders",
"csvAvgOrder": "Avg order",
"csvCash": "Cash",
"csvCard": "Card",
"csvCredit": "Credit",
"csvNetIncome": "Net income",
"csvVoids": "Voids",
"csvVoidAmount": "Void amount",
"csvExpenses": "Expenses"
},
"shifts": {
"title": "Cash shift",
"subtitle": "Open and close the register daily",
"branch": "Branch",
"openShift": "Open shift",
"shiftOpen": "Shift is open",
"startShift": "Start shift",
"closeShift": "Close shift",
"confirmClose": "Confirm close",
"openingCash": "Opening float",
"expectedCash": "Expected cash",
"countedCash": "Counted cash",
"opened": "Shift opened",
"closed": "Shift closed"
},
"expenses": {
"title": "Expenses",
"subtitle": "Log and track branch expenses",
"addExpense": "Log expense",
"listTitle": "Expense log",
"branch": "Branch",
"fromDate": "From",
"toDate": "To",
"periodTotal": "Period total",
"category": "Category",
"amount": "Amount",
"note": "Note",
"notePlaceholder": "Optional",
"linkOpenShift": "Deduct from open register (cash withdrawal)",
"noOpenShift": "No open shift — expense will not link to a register",
"colDate": "Date",
"colCategory": "Category",
"colNote": "Note",
"colAmount": "Amount",
"loading": "Loading...",
"empty": "No expenses logged",
"rowCount": "{count} rows",
"categories": {
"Supplies": "Supplies",
"Utilities": "Utilities",
"Salary": "Salary",
"Rent": "Rent",
"Maintenance": "Maintenance",
"Other": "Other"
}
},
"queue": {
"title": "Daily queue",
"subtitle": "Ticket numbers restart at 1 each day (Iran calendar)",
"nowServing": "Now serving",
"lastIssued": "Last issued",
"waitingCount": "{count} waiting",
"issueNext": "New number",
"callNext": "Call next",
"customerLabelPlaceholder": "Guest name (optional)",
"dailyResetHint": "Numbers reset at midnight Iran time.",
"empty": "No tickets issued today yet.",
"issuedOnOrder": "Queue #{number}",
"openDisplay": "TV display",
"displayMode": "Fullscreen",
"exitDisplay": "Back to panel",
"displayWaitingLabel": "In queue",
"displayUpNext": "Up next",
"status": {
"Waiting": "Waiting",
"Called": "Called",
"Done": "Done",
"Cancelled": "Cancelled"
}
},
"kds": {
"title": "Kitchen display",
"pending": "Pending",
"preparing": "Preparing",
"ready": "Ready",
"table": "Table",
"noOrders": "No orders",
"loading": "Loading...",
"live": "Live",
"polling": "Polling",
"advance": "Next step",
"status": {
"Pending": "Pending",
"Confirmed": "Confirmed",
"Preparing": "Preparing",
"Ready": "Ready",
"Delivered": "Delivered",
"Cancelled": "Cancelled"
},
"advanceTo": {
"Confirmed": "Confirm order",
"Preparing": "Start preparing",
"Ready": "Mark ready",
"Delivered": "Mark delivered"
}
},
"tables": {
"title": "Table management",
"addTable": "Add table",
"number": "Table number",
"capacity": "Capacity",
"floor": "Floor",
"floorPlan": "Floor plan",
"empty": "No tables yet.",
"emptyBranch": "No tables for this branch.",
"allBranches": "All branches",
"branchFilter": "Branch filter",
"branch": "Branch",
"branchUnassigned": "No branch",
"branchHint": "Tables belong to your café; branch is optional for POS and reports.",
"tableLabel": "Table {number}",
"meta": "Cap. {capacity} · Floor {floor}",
"status": {
"Free": "Free",
"Busy": "Occupied",
"Reserved": "Reserved",
"Cleaning": "Cleaning",
"free": "Available",
"occupied": "Occupied",
"reserved": "Reserved",
"cleaning": "Cleaning"
},
"markCleaning": "Needs cleaning",
"markReady": "Ready for guests",
"activeOrder": "Active order",
"reserved": "Reserved",
"printQr": "Print QR",
"qrMenuUrl": "Guest menu link",
"openQrUrl": "Open",
"copyQrUrl": "Copy link",
"qrUrlCopied": "Link copied",
"qrUrlCopyFailed": "Could not copy link",
"reprintHint": "Lost QR? Same button — code never changes.",
"deactivate": "Deactivate",
"inactive": "Inactive",
"edit": "Edit",
"editTable": "Edit table",
"reactivate": "Reactivate",
"saveTable": "Save table",
"media": "Table image & video",
"section": "Section",
"sections": "Sections",
"addSection": "Add section",
"noSection": "No section",
"noSectionsYet": "No sections defined yet.",
"sectionTableCount": "{count} tables",
"sectionHasTables": "This section has tables and cannot be deleted",
"tableHasOpenOrder": "This table has an open order",
"deleteTable": "Delete table",
"deleteTableConfirm": "Permanently delete this table? (Only when it has no open order)",
"deleteError": "Could not delete table",
"createError": "Could not add table",
"cleaningError": "Could not update cleaning status"
},
"menuAdmin": {
"title": "Menu management",
"subtitle": "Images, prices, and per-item discounts",
"categories": "Categories",
"items": "Items",
"addCategory": "New category",
"addItem": "Add item",
"name": "Name",
"nameEn": "English name (for international guests)",
"price": "Price (T)",
"category": "Category",
"available": "Available",
"unavailable": "Unavailable",
"discountPercent": "Discount (%)",
"discountBadge": "off",
"uploadImage": "Upload image",
"imageReady": "Image ready",
"empty": "No menu items yet.",
"editItem": "Edit",
"editCategory": "Edit category",
"categoryIcon": "Icon (emoji)",
"categoryImage": "Category image",
"iconTabPreset": "Preset icons",
"iconTabEmoji": "Emoji",
"iconTabImage": "Upload image",
"iconStyleLabel": "Design style",
"iconPreview": "Preview:",
"clearIconPreset": "Clear icon",
"clearIconEmoji": "Clear emoji",
"categoryIconCustom": "Or custom emoji",
"iconPresetGroupDrinks": "Drinks",
"iconPresetGroupFood": "Food",
"iconStyles": {
"flat": "Flat",
"modern": "Modern",
"real": "Real",
"minimal": "Minimal",
"outline": "Outline",
"soft": "Soft",
"bold": "Bold",
"gradient": "Gradient",
"pastel": "Pastel",
"duotone": "Duotone"
},
"iconEmojiGroups": {
"hotDrinks": "Hot drinks",
"coldDrinks": "Cold drinks",
"breakfast": "Breakfast",
"mains": "Main dishes",
"pastaPizza": "Pasta & pizza",
"desserts": "Desserts",
"salads": "Salads",
"seafoodGrill": "Grill & seafood",
"snacks": "Snacks & fast food",
"vegan": "Plant-based",
"specials": "Specials",
"general": "General"
},
"iconPresets": {
"drinks-hot": "Hot coffee",
"drinks-cold": "Cold drinks",
"drinks-tea": "Tea",
"drinks-juice": "Juice",
"drinks-milkshake": "Milk & smoothies",
"drinks-alcohol": "Wine",
"drinks-beer": "Beer",
"breakfast": "Breakfast",
"food-mains": "Main dishes",
"food-fastfood": "Fast food",
"food-rice": "Rice dishes",
"pasta-pizza": "Pasta & pizza",
"dessert": "Dessert",
"ice-cream": "Ice cream",
"bakery": "Bakery",
"salad": "Salad",
"grill": "Grill",
"seafood": "Seafood",
"snacks": "Sandwich",
"snacks-sweet": "Pastries",
"appetizers": "Appetizers",
"vegan": "Plant-based",
"fruits": "Fruits",
"specials": "Specials",
"chef-special": "Chef's pick",
"generic": "General"
},
"media": "Image & video",
"tabCatalog": "Catalog",
"tabBranch": "Branch settings",
"selectBranchForOverrides": "Select a branch above to manage its menu overrides.",
"allItems": "All items",
"searchItemsPlaceholder": "Search items…",
"itemCount": "{count} items",
"noItemsInCategory": "No items in this category yet",
"noItemsMatchSearch": "No items match your search",
"outOfStock": "Out of stock",
"newItem": "New item",
"newCategory": "New category",
"editCategoryTitle": "Edit category",
"close": "Close",
"saving": "Saving…",
"model3d": "3D model",
"nameEnOptional": "English name (optional)",
"addItemSuccess": "Item added",
"updateItemSuccess": "Item updated",
"addCategorySuccess": "Category added",
"updateCategorySuccess": "Category updated"
},
"branchMenu": {
"title": "Branch Menu",
"name": "Name",
"masterPrice": "Master Price",
"branchPrice": "Branch Price",
"availability": "Status",
"available": "Active",
"unavailable": "Hidden",
"resetOverride": "Reset",
"savePrice": "Save",
"actions": "Actions",
"priceOverridePro": "Price overrides require Pro plan",
"overrideActive": "Branch override active",
"confirmReset": "Reset this item to catalog defaults?",
"loading": "Loading..."
},
"media": {
"uploadImage": "Upload image",
"uploadVideo": "Upload video",
"removeImage": "Remove image",
"removeVideo": "Remove video",
"upload3dTitle": "3D view (optional)",
"upload3dHint": "GLB file up to {maxMb} MB — guests can rotate the item on touch",
"upload3dPhotoCount": "Besides cover photo: one GLB is enough. For photo-based 360° (future): {min}{ideal} photos from different angles",
"upload3d": "Upload 3D model",
"remove3d": "Remove model",
"upload3dReady": "3D model will show on the QR menu",
"ai3dTitle": "AI 3D generation",
"ai3dHint": "Build a GLB from the product photo for the QR menu (Business plan and above).",
"ai3dGenerate": "Generate 3D with AI",
"ai3dGenerating": "Generating…",
"ai3dUsage": "Monthly quota: {used} of {limit}",
"ai3dSuccess": "3D model generated.",
"ai3dFailed": "3D generation failed.",
"ai3dLimitReached": "Monthly AI quota (100) is used up.",
"ai3dNoImage": "Upload a product photo first."
},
"taxes": {
"title": "Taxes",
"subtitle": "Rates applied to menu categories",
"addTax": "Add tax",
"name": "Name (e.g. VAT)",
"rate": "Rate (%)",
"hint": "Default tax applies to new categories. Taraz submission is in Settings.",
"empty": "No taxes defined.",
"default": "Default",
"setDefault": "Set default",
"delete": "Remove",
"deleteConfirm": "Remove \"{name}\" from the list? Menu categories using this tax will switch to the next default tax (or no tax).",
"required": "Required",
"optional": "Optional",
"ownerOnly": "Only the café owner can change taxes."
},
"branches": {
"label": "Branch"
},
"inventory": {
"title": "Inventory",
"subtitle": "Materials, menu recipes, and auto-deduction on orders",
"description": "Track ingredient quantities and reorder levels.",
"tabMaterials": "Materials",
"tabRecipes": "Menu recipes",
"addIngredient": "New ingredient",
"name": "Name",
"unit": "Unit",
"unitHint": "g, ml, pcs...",
"unitCustom": "Other (custom)",
"unitCustomPlaceholder": "e.g. cup, shot",
"unitsHelp": "Unit for stock and recipes: pcs, g, ml, etc. Change on-hand qty with +/- on each card.",
"units": {
"piece": "Piece (pcs)",
"gram": "Gram (g)",
"kilogram": "Kilogram (kg)",
"milliliter": "Milliliter (ml)",
"liter": "Liter (l)",
"cc": "cc",
"pack": "Pack",
"can": "Can",
"bag": "Bag"
},
"editIngredient": "Edit material",
"updated": "Material updated",
"quantityEditHint": "on-hand qty changes via +/- on this card only",
"quantity": "On hand",
"parLevel": "Full stock (e.g. 500 g)",
"unitCost": "Unit cost (Toman)",
"warningPercent": "Warning %",
"reorderLevel": "Reorder level",
"reorder": "Reorder at",
"warningAt": "Warn below",
"stockValue": "Stock value",
"lowStock": "Low",
"lowStockAlert": "Below warning level — refill these materials",
"adjust": "Apply",
"adjustDelta": "+/- qty",
"adjustNote": "Manual adjustment",
"adjusted": "Stock updated",
"created": "Ingredient added",
"empty": "No ingredients yet.",
"defaultUnit": "pcs",
"selectMenuItem": "Menu item",
"selectMenuItemPlaceholder": "Select...",
"recipeLines": "Per sold unit",
"perUnit": "Qty",
"pickIngredient": "Ingredient",
"addLine": "Add",
"saveRecipe": "Save recipe",
"recipeSaved": "Recipe saved",
"materialCostPerUnit": "Material cost / unit",
"recipeHint": "Example: 10 g coffee per espresso — 10 orders use 100 g.",
"totalPaid": "Amount paid (Toman)",
"impliedUnitCost": "Calculated unit cost",
"purchaseNote": "Stock purchase",
"purchaseHint": "For stock in (+), enter amount paid — recorded in expenses and reports.",
"purchaseRequired": "Amount paid and branch are required to add stock.",
"purchasesThisMonth": "Material purchases this month",
"purchaseCount": "{count} purchases",
"viewInExpenses": "View in expenses",
"selectBranchForPurchases": "Select a branch in the top bar to record warehouse purchases."
},
"qr": {
"brand": "Meezi",
"notFound": "Table not found",
"loadError": "Failed to load",
"tableLabel": "Table {number}",
"hint": "Open the Meezi app to order, or ask at the counter.",
"discoverCta": "Discover cafés on Meezi"
},
"qrMenu": {
"loading": "Loading...",
"welcome": "Welcome",
"tableLabel": "Table",
"tableNotFound": "Table not found or menu unavailable",
"tableCleaning": "This table is being cleaned — please ask staff",
"loadError": "Could not load menu",
"scanAgain": "Please scan the QR code again",
"addToCart": "Add",
"viewCart": "View cart",
"cartTitle": "Your cart",
"placeOrder": "Place order",
"orderPlaced": "Order placed!",
"orderNumber": "Order #: {number}",
"orderHint": "Staff will prepare your order shortly",
"guestName": "Your name (optional)",
"guestPhone": "Mobile (optional)",
"itemNote": "Note (e.g. no tomato, less sugar)",
"addMoreItems": "Add more items",
"orderError": "Could not place order. Try again.",
"rateLimited": "Too many requests — please wait a few minutes",
"captchaRequired": "Please complete the security check",
"cafeUnavailable": "This café is temporarily unavailable",
"subtotal": "Total",
"searchPlaceholder": "Search menu...",
"allCategories": "All",
"searchNoResults": "No items match your search",
"clearSearch": "Clear search",
"emptyCategory": "No items in this category",
"view3d": "3D",
"view3dHint": "Drag to rotate — model spins live",
"close3d": "Close",
"emptyMenu": "This branch menu is empty or unavailable",
"guestQrBadge": "QR guest",
"tabMenu": "Menu",
"tabOrders": "My orders",
"callWaiter": "Call waiter",
"callWaiterSent": "Waiter is on the way!",
"callWaiterCooldown": "Please wait 60 seconds",
"callWaiterError": "Error — please try again",
"myOrders": "Orders at this table",
"noOrders": "No orders yet",
"tracking": {
"back": "Back to menu",
"orderNumber": "Order number",
"table": "Table",
"loadError": "Could not load tracking",
"currentStep": "In progress",
"readyHint": "Your order is ready — pick it up at the counter or table",
"status": {
"pending": "Waiting for the café",
"seen": "Seen by staff",
"preparing": "Kitchen is preparing",
"ready": "Ready for pickup",
"done": "Delivered",
"cancelled": "Cancelled"
},
"steps": {
"submitted": "Order submitted",
"seen": "Seen by restaurant",
"preparing": "Preparing",
"ready": "Ready",
"done": "Completed",
"cancelled": "Cancelled"
}
}
},
"notifications": {
"title": "Notifications",
"pageTitle": "Notifications",
"empty": "No notifications",
"emptyUnread": "No unread notifications",
"markAllRead": "Mark all read",
"unreadCount": "{count} unread",
"filterLabel": "Filter notifications",
"filterAll": "All",
"filterUnread": "Unread",
"loading": "Loading...",
"refreshing": "Updating...",
"backToList": "Back to list"
},
"reservations": {
"title": "Reservations",
"guest": "Guest",
"phone": "Phone",
"date": "Date",
"time": "Time",
"party": "Guests",
"table": "Table",
"tableOptional": "No specific table",
"tableNumber": "Table {number}",
"notes": "Notes",
"confirm": "Confirm",
"cancel": "Cancel",
"create": "Create reservation",
"newReservation": "Manual reservation",
"newReservationHint": "Pick table and time. When the guest arrives, use “Order & pay” at POS.",
"openPos": "Order & pay",
"markCompleted": "Mark completed",
"empty": "No reservations",
"status": {
"Pending": "Pending",
"Confirmed": "Confirmed",
"Cancelled": "Cancelled",
"Seated": "Seated",
"Completed": "Completed"
}
},
"branchesPage": {
"title": "Branches",
"subtitle": "Each branch has its own login mobile under the café master plan",
"listTitle": "Branch list",
"newName": "Branch name",
"loginPhone": "Branch login mobile",
"managerName": "Branch manager name",
"managerNamePlaceholder": "Optional — defaults to branch name",
"addSection": "New branch",
"add": "Add branch",
"empty": "No branches yet.",
"created": "Branch and login account created.",
"createError": "Could not add branch (duplicate phone or plan limit)",
"branchSelectHint": "Pick the active branch on POS and queue.",
"masterPlanHint": "Billing and taxes are managed only by the café owner.",
"ownerOnly": "Only the café owner can manage branches.",
"delete": "Delete branch",
"deleteTitle": "Delete this branch?",
"deleteWarning": "Tables, staff, branch menu overrides, and related data will be removed. You can restore within 7 days; after that the branch is permanently deleted.",
"deleteConfirm": "Yes, delete branch",
"deleteScheduled": "Branch scheduled for deletion. You can restore it within 7 days.",
"deleteError": "Could not delete branch (maybe it is the last active branch).",
"restore": "Restore",
"restored": "Branch restored.",
"restoreError": "Could not restore branch.",
"pendingTitle": "Pending permanent deletion",
"pendingHint": "These branches are inactive. They will be permanently removed when the timer ends.",
"purgeInDays": "Permanent delete in {days} days",
"purgeInOneDay": "Permanent delete tomorrow",
"purgeToday": "Permanent delete today",
"review": "Review",
"reviewTitle": "Branch details",
"location": "Location"
},
"subscription": {
"title": "Plan & billing",
"subtitle": "Current plan, usage, and upgrades",
"currentPlan": "Current plan",
"expires": "Expires",
"noExpiry": "—",
"refresh": "Refresh",
"ordersToday": "Orders today",
"customers": "Customers",
"smsUsage": "SMS this month",
"paymentSuccess": "Payment successful. Your plan was updated.",
"paymentFailed": "Payment failed.",
"loading": "Loading...",
"ownerOnly": "Only the café owner can manage billing. Branches use the master café plan.",
"paymentMethod": "Payment method",
"planExpired": "Subscription expired",
"featureMenu3d": "3D menu",
"featureDiscover": "Discover profile (AI)",
"featureOn": "Enabled",
"featureOff": "Not included — upgrade",
"featureMenu3dUpgrade": "3D menu is available on Pro and higher plans.",
"featureMenuAi3d": "AI 3D generation",
"featureMenuAi3dUpgrade": "AI 3D generation is on Business and Enterprise (100 per month).",
"checkout": {
"title": "Invoice & Payment",
"subtitle": "Review your order and pay",
"backToPlans": "Back to plans",
"invalidPlan": "The selected plan is not available for online purchase.",
"invoiceLabel": "Proforma invoice",
"invoiceNo": "Invoice no.",
"issuedAt": "Issued",
"billingPeriod": "Billing period",
"monthsCount": "{count} mo",
"description": "Description",
"qty": "Qty",
"unitPrice": "Unit price",
"amount": "Amount",
"planLine": "{plan} plan subscription",
"subtotal": "Subtotal",
"total": "Amount due",
"secureNote": "Payment is processed through a secure bank gateway.",
"payTotal": "Pay {total}",
"redirecting": "Redirecting to gateway...",
"paymentFailed": "Payment failed. Please try again."
}
},
"settings": {
"title": "Settings",
"subtitle": "Shop profile, printers, and integrations",
"terminals": {
"title": "Active terminals",
"hint": "Your plan allows up to {max} concurrent terminals.",
"thisDevice": "This device",
"empty": "No terminals registered",
"revoke": "Remove",
"revoked": "Terminal removed",
"loading": "Loading…"
},
"nav": {
"aria": "Settings menu",
"shop": "Shop & café",
"shopGeneral": "Profile & integrations",
"shopAppearance": "Appearance & colors",
"printer": "Printer",
"printerSettings": "Printer settings",
"printTest": "Print test page",
"shopDiscover": "Discover & AI"
},
"appearance": {
"paletteSection": "Color palette",
"paletteTitle": "Choose a preset palette",
"paletteHint": "Palette colors apply to the dashboard and the guest QR menu.",
"dashboardSection": "Dashboard",
"dashboardTitle": "Dashboard look",
"dashboardDesc": "How admin pages look (POS, inventory, reports) — separate from the table QR menu.",
"dashboardPreviewSection": "Preview",
"dashboardPreviewTitle": "Dashboard sample",
"dashboardPreviewHint": "Sample sidebar and item card in this panel; updates with panel style, density, and corners.",
"panelStyle": "Dashboard panel style",
"guestMenuStyle": "QR menu layout",
"menuTexture": "QR menu background texture",
"guestMenuSection": "Table QR menu",
"guestMenuTitle": "Guest menu template",
"guestMenuDesc": "What guests see when scanning the table QR — separate from your dashboard.",
"guestMenuPreviewSection": "Preview",
"guestMenuPreviewHint": "Mobile preview (QR menu)",
"density": "Density",
"radius": "Corner radius",
"customSection": "Custom colors",
"customTitle": "Your café brand colors",
"customHint": "Leave empty to use the selected palette. Opacity applies to custom or palette colors.",
"colorOpacity": "Opacity",
"resetCustom": "Reset custom colors",
"previewSection": "Preview",
"previewTitle": "Panel & menu sample",
"previewNav": "Menu",
"previewItem": "Latte",
"previewCta": "Add",
"saved": "Appearance saved.",
"palettes": {
"meezi-green": "Meezi green",
"ocean-blue": "Ocean blue",
"royal-purple": "Royal purple",
"sunset-orange": "Sunset orange",
"rose-blush": "Rose blush",
"charcoal-gold": "Charcoal gold",
"espresso": "Espresso",
"forest": "Forest",
"midnight": "Midnight",
"coral": "Coral",
"gold-luxury": "Gold luxury",
"mint-fresh": "Mint fresh",
"wine-bar": "Wine bar",
"slate-modern": "Slate modern",
"cherry": "Cherry",
"teal-wave": "Teal wave",
"sand-cafe": "Sand café"
},
"panelStyles": {
"flat": "Flat",
"modern": "Modern",
"glass": "Glass",
"minimal": "Minimal",
"bold": "Bold",
"soft": "Soft",
"elevated": "Elevated",
"outline": "Outline"
},
"menuStyles": {
"cards": "Cards",
"compact": "Compact",
"grid": "Grid",
"list": "List",
"magazine": "Magazine",
"classic": "Classic"
},
"menuTextures": {
"none": "Plain",
"paper": "Paper",
"linen": "Linen",
"dots": "Dots",
"grid": "Grid",
"marble": "Marble",
"wood": "Wood",
"warm": "Warm café"
},
"densities": {
"compact": "Compact",
"comfortable": "Comfortable",
"spacious": "Spacious"
},
"radiusOptions": {
"none": "Sharp",
"sm": "Small",
"md": "Medium",
"lg": "Large",
"full": "Round"
},
"colors": {
"primary": "Primary",
"secondary": "Secondary",
"accent": "Accent / promo",
"background": "Background",
"surface": "Card / surface",
"text": "Text",
"textMuted": "Muted text",
"destructive": "Error / delete",
"success": "Success"
}
},
"snappfoodVendor": "Snappfood vendor ID",
"saveProfile": "Save profile",
"profile": {
"title": "Café profile",
"name": "Café name",
"city": "City",
"phone": "Phone",
"address": "Address",
"description": "Description",
"logo": "Logo",
"uploadLogo": "Upload logo",
"uploadCover": "Upload cover",
"saved": "Profile saved.",
"reloginHint": "Plan updated; sign out and in again if the badge looks wrong.",
"slug": "Koja profile address",
"slugHint": "Your cafe page on Koja — lowercase letters, digits, hyphens only",
"slugPlaceholder": "my-cafe",
"slugTaken": "This address is already taken. Please choose another.",
"slugInvalid": "Invalid address. Use lowercase letters, digits, and hyphens only.",
"kojaUrl": "Koja URL"
},
"taraz": "Taraz (tax system)",
"tarazHint": "Submit yesterday's invoices to Taraz (demo mode logs only).",
"tarazSubmit": "Submit to Taraz",
"tarazQueued": "Submission queued.",
"plans": {
"compareLabel": "Compare plans",
"compareHint": "Compare features and pick the right plan for your café.",
"featureColumn": "Features",
"popular": "Popular",
"current": "Current",
"perMonth": "/ month",
"freePrice": "Free",
"customPrice": "Contact us",
"unlimited": "Unlimited",
"included": "Included",
"currentPlanBtn": "Your plan",
"contactSales": "Contact sales",
"subscribe": "Get {plan}",
"names": {
"Free": "Free",
"Pro": "Pro",
"Business": "Business",
"Enterprise": "Enterprise"
},
"features": {
"ordersPerDay": "Orders per day",
"terminals": "POS terminals",
"crmCustomers": "CRM customers",
"smsPerMonth": "Marketing SMS",
"branches": "Branches",
"posKds": "POS & kitchen display",
"tablesQr": "Tables & QR ordering",
"menuReservations": "Menu & reservations",
"reports": "Reports",
"hrModule": "HR module",
"snappfoodDelivery": "Snappfood / delivery",
"tarazTax": "Taraz tax integration",
"badges": "Trust badges",
"whiteLabel": "White label",
"apiAccess": "Public API"
},
"levels": {
"basic": "Basic",
"full": "Full"
}
},
"discoverProfile": {
"title": "Discover & AI profile",
"subtitle": "Tags for matching guests to cafés",
"save": "Save",
"saved": "Saved",
"loading": "Loading..."
}
},
"support": {
"title": "Meezi support",
"subtitle": "Open a ticket for platform help",
"newTicket": "New ticket",
"subject": "Subject",
"message": "Your message",
"submit": "Submit ticket",
"myTickets": "My tickets",
"messages": "messages",
"created": "Ticket created",
"createFailed": "Could not create ticket",
"empty": "No tickets yet",
"loadFailed": "Could not load tickets.",
"retry": "Try again",
"loading": "Loading...",
"notFound": "Ticket not found",
"back": "Back",
"reply": "Your reply",
"send": "Send",
"replySent": "Reply sent",
"replyFailed": "Could not send reply",
"fromAdmin": "Meezi support",
"fromYou": "You",
"closedHint": "This ticket is closed — no new replies.",
"status": {
"open": "Open",
"inProgress": "In progress",
"waitingMerchant": "Awaiting your reply",
"resolved": "Resolved",
"closed": "Closed"
}
},
"admin": {
"nav": {
"title": "Platform admin",
"dashboard": "Dashboard",
"plans": "Plans & pricing",
"integrations": "Payments & SMS",
"notifications": "Notifications",
"settings": "App settings",
"features": "Features",
"cafes": "Cafes",
"tickets": "Tickets",
"logout": "Log out"
},
"auth": {
"title": "System admin login",
"subtitle": "Authorized Meezi staff only",
"phone": "Phone",
"sendOtp": "Send code",
"otp": "Verification code",
"login": "Sign in",
"error": "Login failed",
"devHint": "In development the OTP is logged by Admin API (DEV admin OTP)."
},
"dashboard": {
"title": "Platform overview",
"totalCafes": "Total cafes",
"activeCafes": "Active",
"openTickets": "Open tickets",
"plans": "Plans configured"
},
"plans": {
"title": "Subscription plans",
"monthlyPrice": "Monthly price (Toman)",
"maxOrders": "Max orders per day",
"saved": "Plan saved"
},
"settings": {
"title": "Application settings",
"saved": "Saved"
},
"features": {
"title": "Feature flags",
"enabled": "On",
"disabled": "Off"
},
"cafes": {
"title": "Registered cafes",
"suspended": "Suspended",
"suspend": "Suspend",
"activate": "Activate",
"discoverProfile": {
"edit": "Discover profile",
"title": "Discover & AI profile",
"subtitle": "Tags for matching guests to cafés",
"save": "Save",
"saved": "Saved",
"loading": "Loading..."
}
},
"integrations": {
"title": "Payment gateways & Kavenegar",
"save": "Save settings",
"saved": "Settings saved",
"paymentTitle": "Payment gateways",
"kavenegarTitle": "Kavenegar (SMS)",
"active": "Active for billing",
"enabled": "Enabled",
"sandbox": "Sandbox mode",
"merchantId": "Merchant ID",
"apiKey": "API token",
"username": "Username",
"password": "Password",
"branchCode": "Branch code",
"terminalCode": "Terminal code (optional)",
"clientId": "Client ID",
"clientSecret": "Client Secret",
"baseUrl": "API base URL (optional)",
"taraHint": "Tara credit pay — API: api.tara-club.ir/club/api/v1 (login, trace, request, verify)",
"snappPayHint": "Snapp Pay BNPL — OAuth + payment token from Snapp Pay merchant panel",
"otpTemplate": "OTP template name (Kavenegar panel)"
},
"notifications": {
"title": "Notification center",
"broadcastTitle": "Broadcast to all cafes",
"broadcastTitlePlaceholder": "Notification title",
"broadcastBodyPlaceholder": "Body (optional)",
"sendBroadcast": "Send to all",
"broadcastSent": "Sent to {count} cafes",
"allNotifications": "All notifications",
"empty": "No notifications yet"
},
"tickets": {
"title": "Support tickets",
"messages": "messages",
"loading": "Loading...",
"empty": "No tickets",
"notFound": "Ticket not found",
"back": "All tickets",
"replyPlaceholder": "Reply to merchant...",
"sendReply": "Send reply",
"replySent": "Reply sent",
"replyFailed": "Could not send reply",
"resolve": "Mark resolved",
"close": "Close ticket",
"statusUpdated": "Ticket status updated",
"closedHint": "Ticket is closed — replies disabled.",
"fromAdmin": "Meezi support",
"fromCafe": "Cafe",
"filter": {
"all": "All",
"open": "Open",
"closed": "Closed"
}
}
},
"errors": {
"planLimit": "Plan limit reached. Please upgrade.",
"notFound": "Not found",
"unauthorized": "Unauthorized",
"network": "Network error"
},
"discoverPublic": {
"brand": "Meezi",
"title": "Discover cafés",
"subtitle": "Find the right café in Tehran and Karaj",
"searchPlaceholder": "Type: quiet, date night, Wi-Fi, roastery, book café…",
"searchHint": "Smart search — filters are auto-detected from your text",
"aiDetectedLabel": "Detected filters:",
"aiDetectedClear": "Clear",
"loading": "Loading…",
"empty": "No cafés match these filters",
"resultCount": "{count} cafés",
"applyFilters": "Apply filters",
"clearFilters": "Clear",
"viewCafe": "View café",
"backToList": "Back to list",
"notFound": "Café not found",
"exploreMore": "Explore more cafés",
"reviewCount": "{count} reviews",
"mapTitle": "Map",
"openInNeshan": "Open in Neshan",
"reviewsTitle": "Guest reviews",
"ownerReply": "Cafe reply",
"coffeeAdvisor": {
"title": "Drink advisor",
"subtitle": "Tell us your purpose and get tailored suggestions",
"placeholder": "e.g. group work, date night, exam energy…",
"submit": "Suggest",
"loading": "Thinking…",
"notConfigured": "Smart advisor is not enabled for this café yet",
"failed": "Suggestions unavailable. Try again later"
},
"cities": {
"tehran": "Tehran",
"karaj": "Karaj"
},
"sort": {
"rating": "Top rated",
"reviews": "Most reviews",
"name": "Name"
},
"openNow": "Open now",
"openNowLabel": "Open now",
"closedLabel": "Closed",
"galleryTitle": "Gallery",
"workingHoursTitle": "Working hours",
"instagramLabel": "Instagram",
"websiteLabel": "Website",
"days": {
"sat": "Sat",
"sun": "Sun",
"mon": "Mon",
"tue": "Tue",
"wed": "Wed",
"thu": "Thu",
"fri": "Fri"
},
"filters": {
"themes": "Theme",
"vibes": "Vibe",
"occasions": "Good for",
"spaceFeatures": "Space",
"noise": "Noise",
"priceTier": "Price",
"size": "Size"
}
},
"cafePublicProfile": {
"title": "Public profile",
"subtitle": "Information shown to guests on the discovery page",
"tabs": {
"info": "Info",
"gallery": "Gallery",
"hours": "Hours",
"social": "Social"
},
"description": "About your café",
"descriptionPlaceholder": "Describe your café, its ambiance, specialty drinks, and the experience you offer…",
"instagram": "Instagram handle (without @)",
"instagramPlaceholder": "mycafe.tehran",
"website": "Website URL",
"websitePlaceholder": "https://mycafe.ir",
"gallery": "Photo gallery (max 8)",
"galleryHint": "Upload quality photos of your space — JPEG, PNG or WebP up to 5 MB",
"uploadPhoto": "Upload photo",
"uploading": "Uploading…",
"uploadFailed": "Upload failed",
"galleryFull": "Gallery is full. Remove a photo first",
"removePhoto": "Remove",
"workingHours": "Daily working hours",
"isOpen": "Open",
"openTime": "Opens at",
"closeTime": "Closes at",
"days": {
"sat": "Saturday",
"sun": "Sunday",
"mon": "Monday",
"tue": "Tuesday",
"wed": "Wednesday",
"thu": "Thursday",
"fri": "Friday"
},
"save": "Save",
"saved": "Saved",
"saveFailed": "Save failed",
"loading": "Loading…"
},
"discoverProfile": {
"sections": {
"themes": "Theme & style",
"occasions": "Good for (multi)",
"spaceFeatures": "Space features",
"vibes": "Vibe",
"size": "Size",
"floors": "Floors",
"noiseLevel": "Noise",
"priceTier": "Price tier"
},
"hints": {
"themes": "For AI recommendations",
"occasions": "Dates, family, friends, meeting someone new…",
"spaceFeatures": "Indoor, outdoor, terrace, plants…",
"vibes": "Quiet, lively, romantic…"
},
"themes": {
"modern": "Modern",
"minimal": "Minimal",
"vintage": "Vintage",
"industrial": "Industrial",
"scandi": "Scandi",
"persian_traditional": "Persian traditional",
"book_cafe": "Book café",
"roastery": "Roastery",
"dessert_focus": "Dessert focus",
"brunch": "Brunch",
"late_night": "Late night",
"plants_heavy": "Plant-heavy",
"instagrammable": "Instagrammable",
"heritage": "Heritage",
"luxury": "Luxury",
"specialty_coffee": "Specialty coffee",
"tea_house": "Tea house",
"art_gallery": "Art gallery",
"sport_cafe": "Sport café",
"gaming_cafe": "Gaming café"
},
"occasions": {
"date": "Date",
"family": "Family",
"friends": "Friends",
"finding_someone": "Meeting someone new",
"solo": "Solo",
"business_meeting": "Business",
"study_work": "Study & work",
"celebration": "Celebration",
"quick_coffee": "Quick coffee",
"breakfast": "Breakfast",
"brunch": "Brunch",
"after_dinner": "After dinner",
"group_large": "Large group"
},
"spaceFeatures": {
"indoor": "Indoor",
"outdoor": "Outdoor",
"terrace": "Terrace",
"rooftop": "Rooftop",
"garden": "Garden",
"plants": "Plants",
"wifi": "WiFi",
"parking": "Parking",
"wheelchair": "Wheelchair access",
"kids_friendly": "Kid-friendly",
"pet_friendly": "Pet-friendly",
"smoking_area": "Smoking area",
"live_music": "Live music",
"private_room": "Private room",
"counter_only": "Counter only",
"takeaway": "Takeaway",
"hookah": "Hookah",
"board_games": "Board games",
"no_smoking": "Non-smoking",
"prayer_room": "Prayer room"
},
"vibes": {
"quiet": "Quiet",
"lively": "Lively",
"romantic": "Romantic",
"cozy": "Cozy",
"trendy": "Trendy",
"traditional": "Traditional",
"artistic": "Artistic",
"luxury": "Luxury",
"casual": "Casual",
"study_friendly": "Study-friendly"
},
"sizes": {
"tiny": "Tiny",
"cozy": "Cozy",
"medium": "Medium",
"large": "Large",
"spacious": "Spacious"
},
"floors": {
"one": "1 floor",
"two": "2 floors",
"three": "3 floors",
"multi": "Multi-floor"
},
"noiseLevels": {
"quiet": "Quiet",
"moderate": "Moderate",
"lively": "Lively"
},
"priceTiers": {
"budget": "Budget",
"mid": "Mid",
"premium": "Premium"
}
}
}