{ "common": { "appName": "Sport Admin", "changeLanguage": "Change language", "signedOut": "Signed out", "requires": "requires: {permission}", "planned": "Planned: {milestone}", "sections": { "catalog": "Catalog", "sales": "Sales", "marketing": "Marketing", "settings": "Settings" }, "login": { "title": "Sign in", "body": "Use your back-office account. Sessions are short-lived and refresh automatically.", "email": "Email", "password": "Password", "signIn": "Sign in", "signingIn": "Signing in…", "signOut": "Sign out", "invalid": "Enter a valid email and password.", "throttled": "Too many attempts. Please wait a few minutes.", "networkError": "Could not reach the server. Check your connection." }, "session": { "signedInAs": "Signed in as {name}", "signOut": "Sign out" } }, "pages": { "dashboard": { "title": "Dashboard", "body": "Revenue, orders, conversion and low-stock alerts." }, "products": { "title": "Products", "body": "Product list with status, brand and variant count. The editor manages options, generates the variant matrix and edits per-variant SKU, price and stock." }, "categories": { "title": "Categories", "body": "Drag-to-reorder category tree with materialised-path maintenance." }, "collections": { "title": "Collections", "body": "Manual and rule-based collections, with campaign scheduling." }, "brands": { "title": "Brands", "body": "Brand records, logos and SEO fields." }, "inventory": { "title": "Inventory", "body": "Stock by variant and location, adjustments and the movement ledger." }, "media": { "title": "Media", "body": "Asset library. Uploads go browser → presigned URL → R2; the API only records metadata." }, "orders": { "title": "Orders", "body": "Order list and detail: fulfilment, status transitions, refunds and the audit trail." }, "customers": { "title": "Customers", "body": "Customer records, order history and addresses." }, "reviews": { "title": "Reviews", "body": "Every review comes from a verified purchase. Approve or reject before it appears on the storefront." }, "cms": { "title": "Content", "body": "Journal posts and static pages. Written in Markdown, published per language." }, "users": { "title": "Users", "body": "Back-office accounts and role assignment." }, "roles": { "title": "Roles", "body": "Role editor: a role is a named set of permissions, editable at runtime with no deploy." }, "discounts": { "title": "Discounts", "body": "Promotions and coupon codes. Both run on the same rules — a coupon is simply a promotion that needs a code typed." } }, "settings": { "roles": "Roles", "systemRole": "System role", "permissionCount": "{count} permissions", "loadFailed": "Could not load this data.", "noPermission": "You do not have permission to view this.", "table": { "name": "Name", "email": "Email", "type": "Type", "roles": "Roles", "status": "Status", "lastLogin": "Last sign-in" } }, "catalog": { "searchPlaceholder": "Search name or SKU", "count": "{count} products", "empty": "No products match.", "loadFailed": "Could not load products.", "actionFailed": "That action failed.", "noPermission": "You do not have permission to view this.", "publish": "Publish", "unpublish": "Unpublish", "status": { "ALL": "All", "ACTIVE": "Active", "DRAFT": "Draft", "ARCHIVED": "Archived" }, "table": { "product": "Product", "status": "Status", "variants": "Variants", "stock": "Stock", "price": "Price" }, "newProduct": "New product", "edit": "Edit", "delete": "Retire", "deleteConfirm": "Confirm retire" }, "media": { "chooseFiles": "Choose files", "uploadHint": "PNG, JPEG, WebP or AVIF, up to 25 MB. Uploaded straight to storage.", "uploading": "uploading…", "uploadFailed": "Upload failed.", "deleteFailed": "Could not delete.", "loadFailed": "Could not load the library.", "empty": "No media yet.", "delete": "Delete", "noPermission": "You do not have permission to view this." }, "inventory": { "searchPlaceholder": "Search SKU or product", "lowStockOnly": "Low stock only", "loadFailed": "Could not load stock levels.", "adjustFailed": "Adjustment failed.", "noPermission": "You do not have permission to view this.", "adjust": "Adjust", "apply": "Apply", "cancel": "Cancel", "outOfStock": "Out of stock", "deltaLabel": "Quantity change", "table": { "sku": "SKU", "product": "Product", "onHand": "On hand", "reserved": "Reserved", "available": "Available" } }, "editor": { "createTitle": "New product", "editTitle": "Edit product", "createHint": "Fill in the content and the option axes. Saving generates one variant per combination, which you then price on the Variants tab.", "backToList": "Products", "content": "Content", "facets": "Merchandising", "options": "Options", "generation": "Variant generation", "localeHint": "A language with no name is skipped — the storefront falls back per field.", "name": "Name", "shortDescription": "Short description", "description": "Description", "gender": "Gender", "sport": "Sport", "optionsHint": "Every combination of these values becomes a purchasable variant with its own SKU, price and stock.", "addOption": "Add option", "removeOption": "Remove", "optionKey": "Key", "optionName": "Label", "addValue": "Add value", "removeValue": "Remove", "valueKey": "value", "valueLabel": "Label", "swatch": "Swatch", "skuPrefix": "SKU prefix", "basePrice": "Base price (VND)", "generationHint": "Applied to every generated variant. Adjust individual prices afterwards.", "save": "Save changes", "create": "Create product", "saving": "Saving…", "saved": "Saved", "saveFailed": "Could not save.", "loadFailed": "Could not load this product.", "matrixWarning": "Saving re-runs the variant matrix", "publish": "Publish", "unpublish": "Unpublish", "archive": "Archive", "tab": { "details": "Details", "variants": "Variants", "images": "Images" }, "noVariants": "No variants yet. Add option values on the Details tab.", "variantCount": "{count} active", "archivedCount": "{count} archived", "archived": "Archived", "saveChanged": "Save {count} change(s)", "grid": { "variant": "Variant", "sku": "SKU", "price": "Price", "sale": "Sale price", "stock": "Available / on hand" }, "stockHint": "Stock is read-only here. Adjust it from Inventory so every change lands in the ledger with a reason.", "attached": "Attached images", "library": "Library", "noImages": "No images attached yet.", "saveImages": "Save images", "primary": "Primary", "remove": "Remove", "colourway": "Colourway", "anyColourway": "All colourways", "moveLeft": "Move earlier", "moveRight": "Move later" }, "orders": { "title": "Orders", "detailTitle": "Order", "description": "Placed orders, their stock reservations and where each one is in its lifecycle.", "searchPlaceholder": "Order number, name, email or phone", "count": "{count} orders", "empty": "No orders match.", "view": "View", "backToList": "Orders", "noPermission": "You do not have permission to view orders.", "loadFailed": "Could not load orders.", "updateFailed": "Could not update this order.", "actions": "Actions", "reasonPlaceholder": "Reason for cancelling (required)", "fulfilHint": "Fulfilling ships the reserved stock and writes a ledger entry.", "items": "Items", "subtotal": "Subtotal", "shipping": "Shipping", "discount": "Discount", "total": "Total", "customer": "Customer", "shippingTo": "Shipping to", "timeline": "Timeline", "placed": "Placed", "confirmed": "Confirmed", "cancelled": "Cancelled", "status": { "ALL": "All", "PENDING": "Pending", "CONFIRMED": "Confirmed", "FULFILLED": "Fulfilled", "COMPLETED": "Completed", "CANCELLED": "Cancelled" }, "action": { "CONFIRMED": "Confirm", "FULFILLED": "Mark fulfilled", "COMPLETED": "Complete", "CANCELLED": "Cancel order" }, "payment": { "UNPAID": "Unpaid", "PAID": "Paid", "PARTIALLY_REFUNDED": "Partly refunded", "REFUNDED": "Refunded" }, "column": { "order": "Order", "customer": "Customer", "status": "Status", "items": "Items", "total": "Total", "placed": "Placed" } }, "discounts": { "noPermission": "You do not have permission to manage discounts.", "loadFailed": "Could not load discounts.", "saveFailed": "Could not save this discount.", "searchPlaceholder": "Search by name or code", "create": "New discount", "edit": "Edit", "empty": "No discounts yet. Create one to start running an offer.", "createTitle": "New discount", "editTitle": "Edit discount", "dialogHint": "A coupon is a promotion that needs a code typed. Both use the same rules.", "filter": { "ALL": "All", "CODE": "Coupons", "AUTOMATIC": "Automatic" }, "trigger": "Applies", "triggerCode": "When a code is entered", "triggerAutomatic": "Automatically", "code": "Code", "codeNotApplicable": "Not used for automatic promotions", "type": "Discount", "typePercentage": "Percentage", "typeFixed": "Fixed amount", "valuePercent": "Percent off", "valueAmount": "Amount off", "valuePercentHint": "Rounded down, never up.", "valueAmountHint": "In đồng, e.g. 100000 for 100.000 ₫.", "scope": "Applies to", "scopeOrder": "Whole order", "scopeProduct": "Selected products", "scopeProductHint": "Product targeting is set from the product and collection screens.", "name": "Name", "namePlaceholder": "Summer sale", "nameHint": "Shown to the shopper in their bag and on the order.", "startsAt": "Starts", "endsAt": "Ends", "minSubtotal": "Minimum subtotal", "noMinimum": "No minimum", "usageLimit": "Usage limit", "unlimited": "Unlimited", "alreadyUsed": "Already used {count} time(s).", "priority": "Priority", "priorityShort": "Priority", "priorityHint": "Lower runs first when several apply.", "stackable": "Stackable", "stackableHint": "Can combine with other discounts.", "exclusive": "Exclusive", "active": "Active", "activeHint": "Switch off to stop it applying without deleting it.", "always": "Always", "noEnd": "No end", "cancel": "Cancel", "save": "Save", "saving": "Saving…", "status": { "live": "Live", "paused": "Paused", "scheduled": "Scheduled", "expired": "Expired", "exhausted": "Used up" }, "table": { "name": "Name", "value": "Value", "window": "Window", "usage": "Used", "stacking": "Stacking", "status": "Status" }, "delete": "Retire", "deleteConfirm": "Confirm retire", "deleteFailed": "Could not retire this discount." }, "reviews": { "noPermission": "You do not have permission to moderate reviews.", "loadFailed": "Could not load reviews.", "moderateFailed": "Could not save that decision.", "searchPlaceholder": "Search text or author", "filter": { "PENDING": "Pending", "APPROVED": "Approved", "REJECTED": "Rejected", "ALL": "All" }, "status": { "PENDING": "Pending", "APPROVED": "Approved", "REJECTED": "Rejected" }, "empty": "No reviews match this filter.", "emptyQueue": "Nothing waiting. The queue is clear.", "untitled": "(no title)", "noBody": "No written review — a rating only.", "by": "By {name}", "moderatedBy": "Handled by {name}", "note": "Note", "notePlaceholder": "Why (internal, never shown to the shopper)", "approve": "Approve", "reject": "Reject", "confirmReject": "Confirm reject", "cancel": "Cancel" }, "cms": { "noPermission": "You do not have permission to manage content.", "loadFailed": "Could not load content.", "saveFailed": "Could not save this entry.", "deleteFailed": "Could not retire this entry.", "searchPlaceholder": "Search by title", "filter": { "ALL": "All", "POST": "Posts", "PAGE": "Pages" }, "type": { "POST": "Post", "PAGE": "Page" }, "status": { "DRAFT": "Draft", "PUBLISHED": "Published" }, "table": { "title": "Title", "languages": "Languages", "status": "Status", "updated": "Updated" }, "newPost": "New post", "newPage": "New page", "empty": "Nothing written yet.", "untitled": "(untitled)", "edit": "Edit", "backToList": "Back to content", "title": "Title", "slug": "URL slug", "slugHint": "Lowercase, hyphens. Different per language.", "excerpt": "Excerpt", "excerptHint": "The summary shown on the journal listing.", "body": "Body", "bodyHint": "Markdown. Headings, lists, links, bold and tables.", "seo": "Search engine listing", "metaTitle": "Meta title", "metaDescription": "Meta description", "saveDraft": "Save draft", "saving": "Saving…", "publish": "Publish", "update": "Update", "unpublish": "Unpublish", "delete": "Retire", "deleteConfirm": "Confirm retire" }, "taxonomy": { "noPermission": "You do not have permission to manage this.", "loadFailed": "Could not load.", "saveFailed": "Could not save.", "deleteFailed": "Could not delete.", "dialogHint": "The base name is the fallback; per-language copy overrides it.", "table": { "name": "Name", "products": "Products", "status": "Status" }, "active": "Active", "inactive": "Inactive", "activeHint": "Inactive entries stay in the admin but disappear from the storefront.", "name": "Name", "slug": "URL slug", "slugHint": "Lowercase, hyphens.", "nameLocalised": "Name in this language", "slugLocalised": "Slug in this language", "slugLocalisedHint": "Leave blank to reuse the base slug.", "description": "Description", "edit": "Edit", "delete": "Delete", "deleteConfirm": "Confirm delete", "cancel": "Cancel", "save": "Save", "saving": "Saving…", "brands": { "create": "New brand", "edit": "Edit brand", "empty": "No brands yet." }, "categories": { "create": "New category", "edit": "Edit category", "empty": "No categories yet." }, "collections": { "create": "New collection", "edit": "Edit collection", "empty": "No collections yet." } }, "customers": { "noPermission": "You do not have permission to view customers.", "loadFailed": "Could not load customers.", "searchPlaceholder": "Search name, email or phone", "table": { "customer": "Customer", "orders": "Orders", "spend": "Lifetime spend", "marketing": "Marketing", "joined": "Joined" }, "empty": "No customers yet.", "noMatches": "No customers match that search.", "view": "View", "subscribed": "Subscribed", "notSubscribed": "No", "recentOrders": "Recent orders", "noOrders": "No orders yet.", "addresses": "Saved addresses", "noAddresses": "No saved addresses.", "default": "Default", "lastSeen": "Last sign-in" } }