Files
web_sport/apps/admin/src/messages/en.json
T
2026-08-13 23:20:23 +07:00

502 lines
16 KiB
JSON

{
"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"
}
}