Files
vmall/apps/admin/locales-extra.ts
T
james 9904696e76 feat: wave 2 migration (P3, P5, P7 openspec changes)
Implements, verifies, and archives the three remaining Wave 2 changes from
openspec/MIGRATION-PLAN.md.

- add-wallet-settlement (P3): demo recharge, guarded withdrawal freeze and
  one-time admin review, paginated own fund entries, idempotent per-shop
  weekly/monthly settlement statements with commission rate and one-time
  payout confirmation.
- add-merchant-onboarding (P5): personal/enterprise applications with one live
  application per user, guarded review with mandatory rejection reason, and
  transactional shop + owner provisioning returning one-time credentials;
  mall onboarding/status pages and an admin review console.
- add-membership-messaging (P7): platform member levels, append-only growth
  accrual on order completion with guarded one-way leveling, order/shipment/
  refund system messages with unread/read state and soft deletion, plus the
  mall header unread badge.

Backend: migrations 0019-0023, new wallet, settlement, merchant_onboarding,
membership and messaging modules, event hooks in order/fulfillment/aftersale,
and integration suites for each. Shared contract extended and all three
frontends updated; code indexes, domain docs, backend guidelines and the
migration tracker synced.

Verification: cargo test -p vmall-api green twice consecutively; mall, admin
and shop-admin builds pass; browser smoke on every new surface; openspec
validate --all --strict green (33 passed).

The three changes share the @vmall/shared contract, the mall mock adapter and
per-app locale/nav files, so they are committed together to keep every commit
buildable.
2026-09-25 15:25:29 +00:00

682 lines
29 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// App-local message extensions, deep-merged over @vmall/shared locales.
// Add keys here (never edit the shared locale files from an app agent).
export const enExtra = {
auth: {
adminHint: "Dev account: admin@vmall.local / admin1234",
wrongRole: "This account does not have platform administrator access.",
},
nav: {
pointsProducts: "Points products",
pointsOrders: "Point redemptions",
content: "Content",
brands: "Brands",
aftersales: "After-sales",
reviews: "Reviews",
withdrawals: "Withdrawals",
settlements: "Settlements",
merchantApplications: "Merchant applications",
memberLevels: "Member levels",
},
admin: {
dashboardTitle: "Platform overview",
refresh: "Refresh",
open: "Open",
totalUsers: "Total users",
totalShops: "Total shops",
totalOrders: "Total orders",
enabledCurrencies: "Enabled currencies",
shopRequired: "Select a shop for shop owners and staff.",
noAssignedShop: "No shop assigned",
created: "Created",
orderShop: "Shop",
orderUser: "User",
orderTotal: "Total",
shopStatus: "Shop status",
currencyCode: "Currency code",
currencyNameEn: "Currency name (English)",
currencyNameZh: "Currency name (中文)",
codeInvalid: "Currency code must be three letters.",
currencyFormTitle: "Add currency",
userManagement: "User management",
shopManagement: "Shop management",
orderManagement: "Order management",
currencyManagement: "Currency management",
pageOf: "Page {page} of {total}",
pointsProductManagement: "Points catalog",
pointsOrderManagement: "Point redemptions",
newPointsProduct: "New points product",
editPointsProduct: "Edit points product",
pointsNameEn: "Name (English)",
pointsNameZh: "Name (中文)",
pointsPrice: "Points price",
pointsStock: "Stock",
pointsImage: "Image URL",
pointsPosition: "Sort order",
pointsRecommend: "Featured",
pointsPublished: "Published",
publishedOn: "Published",
publishedOff: "Draft",
savePointsProduct: "Save points product",
pointsProductSaved: "Points product saved.",
pointsNameRequired: "Both language names are required.",
pointsPriceInvalid: "Points price must be a positive integer.",
pointsStockInvalid: "Stock cannot be negative.",
redemptionNo: "Redemption no.",
redemptionCustomer: "Customer",
redemptionReward: "Reward",
redemptionPoints: "Points",
redemptionStatus: "Status",
fulfillRedemption: "Fulfil",
cancelRedemption: "Cancel",
redemptionFulfilled: "Redemption fulfilled.",
redemptionCancelled: "Redemption cancelled.",
redemptionStatuses: {
pending_fulfillment: "Pending",
fulfilled: "Fulfilled",
cancelled: "Cancelled",
},
contentBanners: "Banners",
contentPromos: "Promotions",
contentQuickLinks: "Quick links",
contentFloorAdverts: "Floor adverts",
contentImage: "Image URL",
contentUrl: "Destination URL",
contentLabelEn: "Label (English)",
contentLabelZh: "Label (中文)",
contentGlyph: "Icon SVG path",
contentAddRow: "Add row",
contentSaved: "Saved.",
contentBannerInvalid: "Image and destination URL are required.",
contentImageRequired: "Image URL is required.",
contentQuickLinkInvalid: "Both labels, URL and icon are required.",
brandSlug: "Slug",
brandSlugInvalid: "Use lowercase letters, numbers, and dashes only.",
brandNameRequired: "Both language names are required.",
brandSlugDuplicate: "Duplicate slug.",
brandsSaved: "Brands saved.",
aftersaleFilterShop: "Shop ID",
aftersaleShopIdPlaceholder: "shop id",
aftersaleBuyerIdPlaceholder: "buyer id",
aftersaleFilterBuyer: "Buyer ID",
aftersaleKind: "Type",
aftersaleAmount: "Amount",
aftersaleId: "Application",
aftersaleShop: "Shop",
aftersaleBuyer: "Buyer",
aftersaleDetail: "After-sale detail",
aftersaleView: "Detail",
aftersaleClose: "Close",
aftersaleCreated: "Created",
aftersaleUpdated: "Updated",
aftersaleReason: "Reason",
aftersaleEvidence: "Evidence",
aftersaleNoEvidence: "No evidence attached",
aftersaleItem: "Order item",
aftersaleOrder: "Order",
aftersaleOrderTotal: "Order total",
aftersaleOrderRefunded: "Order refunded total",
aftersaleRemaining: "Remaining refundable",
aftersaleReturnTracking: "Return tracking",
aftersaleMessages: "Messages",
aftersaleNoMessages: "No messages yet",
aftersaleReopened: "Reopened once",
aftersaleArbitrate: "Arbitration",
aftersaleArbitrateRefund: "Arbitrate: refund",
aftersaleArbitrateReject: "Arbitrate: reject",
aftersaleConfirmRefund:
"Grant a terminal refund to the buyer? This completes the refund and cannot be undone.",
aftersaleConfirmReject:
"Reject this dispute terminally? Only the buyer's one-time reopen can resume it.",
aftersaleArbitratedRefund: "Arbitration complete: refunded.",
aftersaleArbitratedReject: "Arbitration complete: rejected.",
aftersaleOutcomeRefunded:
"Refunded: the customer ledger is credited and the order refund total updated.",
aftersaleOutcomeRejected: "Rejected: only the buyer's one-time reopen can resume it.",
aftersaleOutcomeCancelled: "Cancelled by the buyer.",
aftersaleConflict: "The application state changed; refresh and try again",
aftersaleOrderNotFound: "Order not found in the order list.",
aftersaleKinds: {
refund_only: "Refund only",
return_refund: "Return & refund",
},
aftersaleStatuses: {
pending: "Pending review",
approved: "Approved",
rejected: "Rejected",
buyer_shipping: "Buyer shipping",
merchant_confirmed: "Return received",
refunded: "Refunded",
cancelled: "Cancelled",
},
aftersaleRoles: {
buyer: "Buyer",
merchant: "Merchant",
platform: "Platform",
},
withdrawalReviewTitle: "Withdrawal applications",
withdrawalId: "Application",
withdrawalBuyer: "Buyer email",
withdrawalUser: "User ID",
withdrawalAmount: "Amount",
withdrawalPayout: "Payout details",
withdrawalMethod: "Channel",
withdrawalAccount: "Account",
withdrawalHolder: "Holder",
withdrawalReviewedAt: "Reviewed",
withdrawalReview: "Review",
withdrawalClose: "Close",
withdrawalNote: "Review note (optional)",
withdrawalNotePlaceholder: "Reason kept with the decision",
withdrawalReviewNote: "Note",
withdrawalApprove: "Approve",
withdrawalReject: "Reject",
withdrawalConfirmApprove:
"Approve this withdrawal? The frozen amount is paid out and cannot be undone.",
withdrawalConfirmReject:
"Reject this withdrawal? The frozen amount returns to the buyer's available balance.",
withdrawalApproved: "Withdrawal approved; the frozen balance is settled.",
withdrawalRejected: "Withdrawal rejected; the amount is back in the buyer's balance.",
withdrawalConflict: "This application was already reviewed; the list was refreshed",
withdrawalStatuses: {
pending: "Pending review",
approved: "Approved",
rejected: "Rejected",
},
commissionRateTitle: "Commission rate",
commissionRate: "Commission rate (basis points)",
commissionRateHint: "Integer basis points between 0 and 10000; 100 bps = 1%.",
commissionRateDisplay: "{bps} bps ({percent}%)",
commissionRateCurrent: "Effective rate",
commissionRateSave: "Save rate",
commissionRateInvalid: "Enter an integer between 0 and 10000 basis points.",
commissionRateSaved: "Commission rate saved. New statements snapshot it.",
settlementGenerateTitle: "Manual generation",
settlementGenerateHint:
"Generation is idempotent per shop and closed period: an existing statement is returned instead of a duplicate.",
settlementShop: "Shop",
settlementPeriodKind: "Period",
settlementPeriodKinds: {
week: "Week",
month: "Month",
},
settlementPeriodDate: "Date inside the period",
settlementPeriodDateHint:
"Any date inside the target week/month; the server normalizes it to the period bounds.",
settlementGenerate: "Generate statement",
settlementGenerated: "Statement generated.",
settlementGeneratedExisting:
"An existing statement for this shop and period was returned; nothing was duplicated.",
settlementGeneratedResult: "Returned statement",
settlementPickShop: "Select a shop first.",
settlementPeriodDateInvalid: "Enter a valid date (YYYY-MM-DD).",
settlementPeriodNotClosed: "The period is not closed yet; generation was refused",
settlementListTitle: "Statements",
settlementPeriod: "Period",
settlementOrderCount: "Orders",
settlementGross: "Gross",
settlementRefunds: "Refunds",
settlementCommission: "Commission",
settlementPayable: "Payable",
settlementDetail: "Detail",
settlementClose: "Close",
settlementStatuses: {
pending: "Pending payout",
confirmed: "Confirmed",
},
settlementDetailTitle: "Statement detail",
settlementSnapshot: "Snapshot",
settlementOrders: "Contributing orders",
settlementNoOrders: "No contributing orders in this period.",
settlementOrderNo: "Order no.",
settlementOrderCurrency: "Order currency",
settlementConfirmedAt: "Confirmed",
settlementUpdated: "Updated",
settlementConfirmPayout: "Confirm payout",
settlementConfirmPayoutHint:
"Confirming credits the payable amount to the shop owner's balance exactly once.",
settlementConfirmDialog:
"Confirm this payout? The shop owner's balance is credited and the confirmation cannot be repeated.",
settlementPayoutConfirmed: "Payout confirmed; the shop owner's ledger is credited.",
settlementConflict: "This statement was already confirmed; the list was refreshed",
reviewProduct: "Product",
reviewShop: "Shop",
reviewBuyer: "Buyer",
reviewRating: "Rating",
reviewContent: "Content",
reviewImages: "Images",
reviewReply: "Merchant reply",
reviewHide: "Hide",
reviewDelete: "Delete",
reviewConfirmHide: "Hide this review? It disappears from the storefront list and rating summary.",
reviewConfirmDelete: "Permanently delete this review? This cannot be undone.",
reviewHiddenNotice: "Review hidden.",
reviewDeletedNotice: "Review deleted.",
reviewConflict: "The review state changed; refresh and try again",
reviewStatuses: {
visible: "Visible",
hidden: "Hidden",
},
merchantApplication: "Application",
merchantApplicant: "Applicant email",
merchantEntityType: "Entity type",
merchantEntityName: "Entity name",
merchantSubmittedAt: "Submitted",
merchantUpdated: "Updated",
merchantReviewedAt: "Reviewed",
merchantCreatedShop: "Created shop",
merchantView: "Detail",
merchantClose: "Close",
merchantDetail: "Merchant application detail",
merchantEntityInfo: "Entity information",
merchantRealName: "Real name",
merchantCompanyName: "Company name",
merchantBusinessLicenseNo: "Business license no.",
merchantContact: "Contact",
merchantContactName: "Contact name",
merchantContactPhone: "Phone",
merchantContactEmail: "Contact email",
merchantContactAddress: "Address",
merchantCategories: "Operating categories",
merchantNoCategories: "No categories submitted",
merchantQualification: "Qualification",
merchantIdentityDocument: "Identity document",
merchantBusinessLicense: "Business license",
merchantExtraMaterials: "Extra materials",
merchantNoQualification: "No qualification material provided",
merchantRejectionReason: "Rejection reason",
merchantConfirmApprove:
"Approve this application? A shop and a dedicated shop-owner login are provisioned; the initial password is shown once and cannot be retrieved again.",
merchantConfirmReject:
"Reject this application? The applicant can submit a new application afterwards.",
merchantApprove: "Approve",
merchantReject: "Reject",
merchantRejectReason: "Rejection reason (required)",
merchantRejectReasonPlaceholder: "Tell the applicant why the application was rejected",
merchantRejectReasonRequired: "A rejection reason is required.",
merchantApprovedNotice: "Application approved; the shop and its owner login were provisioned.",
merchantRejectedNotice: "Application rejected.",
merchantOutcomeApproved: "Approved: the shop and owner login were provisioned.",
merchantOutcomeRejected: "Rejected: the applicant can submit a new application.",
merchantConflict: "This application was already reviewed; the list was refreshed",
merchantCredentialsTitle: "One-time initial credentials",
merchantCredentialsWarning:
"Copy these credentials now. The initial password is shown only once and cannot be retrieved again after this dialog is closed.",
merchantCredentialsEmail: "Owner login",
merchantCredentialsPassword: "Initial password",
merchantCredentialsShopSlug: "Shop slug",
merchantCredentialsShopId: "Shop ID",
merchantCredentialsClose: "I have saved the credentials",
merchantStatuses: {
pending: "Pending review",
approved: "Approved",
rejected: "Rejected",
},
merchantEntityTypes: {
personal: "Personal",
enterprise: "Enterprise",
},
memberLevelCreateTitle: "Add member level",
memberLevelEditTitle: "Edit member level",
memberLevelHint:
"Levels list in growth order. Both languages are required, and a growth threshold can be used by exactly one level.",
memberLevelNameEn: "Level name (English)",
memberLevelNameZh: "Level name (中文)",
memberLevelIcon: "Icon",
memberLevelGrowth: "Growth threshold",
memberLevelBenefitsEn: "Benefits (English)",
memberLevelBenefitsZh: "Benefits (中文)",
memberLevelCreate: "Add level",
memberLevelCreated: "Member level created.",
memberLevelUpdated: "Member level updated.",
memberLevelUpdatedAt: "Updated",
memberLevelDeleted: "Member level deleted.",
memberLevelRequired: "Both language names and benefits are required.",
memberLevelIconRequired: "An icon is required.",
memberLevelThresholdInvalid: "Use a growth threshold of zero or greater.",
memberLevelThresholdDuplicate:
"Another level already uses that growth threshold.",
memberLevelConflict: "Growth threshold already in use",
memberLevelInvalid: "The level was rejected by the server",
memberLevelConfirmDelete:
'Delete the level "{name}"? This cannot be undone.',
memberLevelDeleteInUse:
"This level is held by at least one customer, so it cannot be deleted",
memberLevelDiscardEdit: "Discard the unsaved level edits and refresh?",
memberLevelGone:
"That member level no longer exists; the list was refreshed.",
},
} as const;
export const zhExtra = {
auth: {
adminHint: "开发账号:admin@vmall.local / admin1234",
wrongRole: "此账号没有平台管理员权限。",
},
nav: {
pointsProducts: "积分商品",
pointsOrders: "积分兑换单",
content: "内容",
brands: "品牌",
aftersales: "售后仲裁",
reviews: "评价管理",
withdrawals: "提现审核",
settlements: "结算对账",
merchantApplications: "商家入驻审核",
memberLevels: "会员等级",
},
admin: {
dashboardTitle: "平台概览",
refresh: "刷新",
open: "打开",
totalUsers: "用户总数",
totalShops: "店铺总数",
totalOrders: "订单总数",
enabledCurrencies: "启用币种",
shopRequired: "店主和店员必须选择所属店铺。",
noAssignedShop: "未分配店铺",
created: "创建时间",
orderShop: "店铺",
orderUser: "用户",
orderTotal: "合计",
shopStatus: "店铺状态",
currencyCode: "币种代码",
currencyNameEn: "币种名称(英文)",
currencyNameZh: "币种名称(中文)",
codeInvalid: "币种代码必须是三个字母。",
currencyFormTitle: "添加币种",
userManagement: "用户管理",
shopManagement: "店铺管理",
orderManagement: "订单管理",
currencyManagement: "币种管理",
pageOf: "第 {page} 页,共 {total} 页",
pointsProductManagement: "积分商品目录",
pointsOrderManagement: "积分兑换单",
newPointsProduct: "新建积分商品",
editPointsProduct: "编辑积分商品",
pointsNameEn: "名称(英文)",
pointsNameZh: "名称(中文)",
pointsPrice: "积分价格",
pointsStock: "库存",
pointsImage: "图片链接",
pointsPosition: "排序",
pointsRecommend: "推荐",
pointsPublished: "已发布",
publishedOn: "已发布",
publishedOff: "草稿",
savePointsProduct: "保存积分商品",
pointsProductSaved: "积分商品已保存。",
pointsNameRequired: "中英文名称均为必填项。",
pointsPriceInvalid: "积分价格必须为正整数。",
pointsStockInvalid: "库存不能为负数。",
redemptionNo: "兑换单号",
redemptionCustomer: "用户",
redemptionReward: "兑换商品",
redemptionPoints: "积分",
redemptionStatus: "状态",
fulfillRedemption: "发货",
cancelRedemption: "取消",
redemptionFulfilled: "兑换单已发货。",
redemptionCancelled: "兑换单已取消。",
redemptionStatuses: {
pending_fulfillment: "待发货",
fulfilled: "已发货",
cancelled: "已取消",
},
contentBanners: "横幅",
contentPromos: "促销位",
contentQuickLinks: "快捷入口",
contentFloorAdverts: "楼层广告",
contentImage: "图片链接",
contentUrl: "跳转链接",
contentLabelEn: "名称(英文)",
contentLabelZh: "名称(中文)",
contentGlyph: "图标 SVG 路径",
contentAddRow: "添加一行",
contentSaved: "已保存。",
contentBannerInvalid: "图片和跳转链接均为必填项。",
contentImageRequired: "图片链接为必填项。",
contentQuickLinkInvalid: "中英文名称、链接和图标均为必填项。",
brandSlug: "别名",
brandSlugInvalid: "仅允许小写字母、数字和连字符。",
brandNameRequired: "中英文名称均为必填项。",
brandSlugDuplicate: "别名重复。",
brandsSaved: "品牌已保存。",
aftersaleFilterShop: "店铺 ID",
aftersaleShopIdPlaceholder: "店铺 ID",
aftersaleBuyerIdPlaceholder: "买家 ID",
aftersaleFilterBuyer: "买家 ID",
aftersaleKind: "类型",
aftersaleAmount: "金额",
aftersaleId: "售后单",
aftersaleShop: "店铺",
aftersaleBuyer: "买家",
aftersaleDetail: "售后详情",
aftersaleView: "详情",
aftersaleClose: "收起",
aftersaleCreated: "创建时间",
aftersaleUpdated: "更新时间",
aftersaleReason: "原因",
aftersaleEvidence: "凭证",
aftersaleNoEvidence: "无凭证",
aftersaleItem: "订单商品",
aftersaleOrder: "订单",
aftersaleOrderTotal: "订单总额",
aftersaleOrderRefunded: "订单已退款总额",
aftersaleRemaining: "剩余可退金额",
aftersaleReturnTracking: "退货物流",
aftersaleMessages: "留言记录",
aftersaleNoMessages: "暂无留言",
aftersaleReopened: "已重新申请",
aftersaleArbitrate: "仲裁",
aftersaleArbitrateRefund: "仲裁退款",
aftersaleArbitrateReject: "仲裁驳回",
aftersaleConfirmRefund: "确定仲裁退款给买家吗?退款将立即完成且不可撤销。",
aftersaleConfirmReject: "确定仲裁驳回吗?仅买家一次重新申请可恢复。",
aftersaleArbitratedRefund: "仲裁完成:已退款。",
aftersaleArbitratedReject: "仲裁完成:已驳回。",
aftersaleOutcomeRefunded: "已退款:买家账户已入账,订单退款总额已更新。",
aftersaleOutcomeRejected: "已驳回:仅买家一次重新申请可恢复。",
aftersaleOutcomeCancelled: "买家已取消。",
aftersaleConflict: "售后单状态已变化,请刷新后重试",
aftersaleOrderNotFound: "订单列表中未找到该订单。",
aftersaleKinds: {
refund_only: "仅退款",
return_refund: "退货退款",
},
aftersaleStatuses: {
pending: "待处理",
approved: "已通过",
rejected: "已驳回",
buyer_shipping: "买家退货中",
merchant_confirmed: "商家已收货",
refunded: "已退款",
cancelled: "已取消",
},
aftersaleRoles: {
buyer: "买家",
merchant: "商家",
platform: "平台",
},
withdrawalReviewTitle: "提现申请",
withdrawalId: "申请单",
withdrawalBuyer: "买家邮箱",
withdrawalUser: "用户 ID",
withdrawalAmount: "金额",
withdrawalPayout: "收款信息",
withdrawalMethod: "渠道",
withdrawalAccount: "账号",
withdrawalHolder: "户名",
withdrawalReviewedAt: "审核时间",
withdrawalReview: "审核",
withdrawalClose: "收起",
withdrawalNote: "审核备注(可选)",
withdrawalNotePlaceholder: "随审核结果保留的说明",
withdrawalReviewNote: "备注",
withdrawalApprove: "通过",
withdrawalReject: "驳回",
withdrawalConfirmApprove: "确定通过该提现申请吗?冻结金额将打款且不可撤销。",
withdrawalConfirmReject: "确定驳回该提现申请吗?冻结金额将退回买家可用余额。",
withdrawalApproved: "提现已通过,冻结金额已结算。",
withdrawalRejected: "提现已驳回,金额已退回买家余额。",
withdrawalConflict: "该申请已被审核,列表已刷新",
withdrawalStatuses: {
pending: "待审核",
approved: "已通过",
rejected: "已驳回",
},
commissionRateTitle: "佣金比例",
commissionRate: "佣金比例(基点)",
commissionRateHint: "取 0 到 10000 的整数基点,100 基点 = 1%。",
commissionRateDisplay: "{bps} 基点({percent}%)",
commissionRateCurrent: "当前比例",
commissionRateSave: "保存比例",
commissionRateInvalid: "请输入 0 到 10000 之间的整数基点。",
commissionRateSaved: "佣金比例已保存,之后生成的账单将采用新比例。",
settlementGenerateTitle: "手动生成",
settlementGenerateHint:
"同一店铺同一周期幂等:已存在时返回原账单,不会重复生成。",
settlementShop: "店铺",
settlementPeriodKind: "周期",
settlementPeriodKinds: {
week: "周",
month: "月",
},
settlementPeriodDate: "周期内日期",
settlementPeriodDateHint: "填写目标周/月内的任意日期,服务端会归一化为周期边界。",
settlementGenerate: "生成账单",
settlementGenerated: "账单已生成。",
settlementGeneratedExisting: "该店铺该周期已存在账单,已返回原账单,未重复生成。",
settlementGeneratedResult: "返回的账单",
settlementPickShop: "请先选择店铺。",
settlementPeriodDateInvalid: "请输入有效日期(YYYY-MM-DD)。",
settlementPeriodNotClosed: "该周期尚未结束,生成被拒绝",
settlementListTitle: "结算账单",
settlementPeriod: "周期",
settlementOrderCount: "订单数",
settlementGross: "交易总额",
settlementRefunds: "退款",
settlementCommission: "佣金",
settlementPayable: "应付",
settlementDetail: "详情",
settlementClose: "收起",
settlementStatuses: {
pending: "待打款",
confirmed: "已确认",
},
settlementDetailTitle: "账单详情",
settlementSnapshot: "账单快照",
settlementOrders: "关联订单",
settlementNoOrders: "该周期没有关联订单。",
settlementOrderNo: "订单号",
settlementOrderCurrency: "下单币种",
settlementConfirmedAt: "确认时间",
settlementUpdated: "更新时间",
settlementConfirmPayout: "确认打款",
settlementConfirmPayoutHint: "确认后应付金额将一次性计入店主余额。",
settlementConfirmDialog: "确定确认打款吗?店主余额将入账,且不可重复确认。",
settlementPayoutConfirmed: "打款已确认,店主账户已入账。",
settlementConflict: "该账单已确认,列表已刷新",
reviewProduct: "商品",
reviewShop: "店铺",
reviewBuyer: "买家",
reviewRating: "星级",
reviewContent: "内容",
reviewImages: "图片",
reviewReply: "商家回复",
reviewHide: "隐藏",
reviewDelete: "删除",
reviewConfirmHide: "确定隐藏该评价吗?隐藏后将从商品评价列表与评分汇总中移除。",
reviewConfirmDelete: "确定永久删除该评价吗?删除后不可恢复。",
reviewHiddenNotice: "评价已隐藏。",
reviewDeletedNotice: "评价已删除。",
reviewConflict: "评价状态已变化,请刷新后重试",
reviewStatuses: {
visible: "可见",
hidden: "已隐藏",
},
merchantApplication: "申请单",
merchantApplicant: "申请人邮箱",
merchantEntityType: "主体类型",
merchantEntityName: "主体名称",
merchantSubmittedAt: "提交时间",
merchantUpdated: "更新时间",
merchantReviewedAt: "审核时间",
merchantCreatedShop: "创建店铺",
merchantView: "详情",
merchantClose: "收起",
merchantDetail: "商家入驻申请详情",
merchantEntityInfo: "主体信息",
merchantRealName: "真实姓名",
merchantCompanyName: "企业名称",
merchantBusinessLicenseNo: "营业执照号",
merchantContact: "联系方式",
merchantContactName: "联系人",
merchantContactPhone: "联系电话",
merchantContactEmail: "联系邮箱",
merchantContactAddress: "联系地址",
merchantCategories: "经营类目",
merchantNoCategories: "未选择类目",
merchantQualification: "资质材料",
merchantIdentityDocument: "身份证明",
merchantBusinessLicense: "营业执照",
merchantExtraMaterials: "补充材料",
merchantNoQualification: "未提供资质材料",
merchantRejectionReason: "驳回原因",
merchantConfirmApprove:
"确定通过该入驻申请吗?将开通店铺并创建专属店主账号,初始密码仅显示一次且无法再次获取。",
merchantConfirmReject: "确定驳回该入驻申请吗?申请人之后可以重新提交。",
merchantApprove: "通过",
merchantReject: "驳回",
merchantRejectReason: "驳回原因(必填)",
merchantRejectReasonPlaceholder: "请说明驳回原因,供申请人查看",
merchantRejectReasonRequired: "驳回原因不能为空。",
merchantApprovedNotice: "申请已通过,店铺与店主账号已开通。",
merchantRejectedNotice: "申请已驳回。",
merchantOutcomeApproved: "已通过:店铺与店主账号已开通。",
merchantOutcomeRejected: "已驳回:申请人可重新提交。",
merchantConflict: "该申请已被审核,列表已刷新",
merchantCredentialsTitle: "一次性初始凭据",
merchantCredentialsWarning:
"请立即保存以下凭据。初始密码仅显示一次,关闭本弹窗后无法再次获取。",
merchantCredentialsEmail: "店主登录账号",
merchantCredentialsPassword: "初始密码",
merchantCredentialsShopSlug: "店铺别名",
merchantCredentialsShopId: "店铺 ID",
merchantCredentialsClose: "我已保存凭据",
merchantStatuses: {
pending: "待审核",
approved: "已通过",
rejected: "已驳回",
},
merchantEntityTypes: {
personal: "个人",
enterprise: "企业",
},
memberLevelCreateTitle: "新增会员等级",
memberLevelEditTitle: "编辑会员等级",
memberLevelHint:
"等级按成长值升序排列;中英文均为必填,且同一成长值只能用于一个等级。",
memberLevelNameEn: "等级名称(英文)",
memberLevelNameZh: "等级名称(中文)",
memberLevelIcon: "图标",
memberLevelGrowth: "成长值门槛",
memberLevelBenefitsEn: "等级权益(英文)",
memberLevelBenefitsZh: "等级权益(中文)",
memberLevelCreate: "新增等级",
memberLevelCreated: "会员等级已创建。",
memberLevelUpdated: "会员等级已更新。",
memberLevelUpdatedAt: "更新时间",
memberLevelDeleted: "会员等级已删除。",
memberLevelRequired: "中英文等级名称与权益均为必填项。",
memberLevelIconRequired: "图标为必填项。",
memberLevelThresholdInvalid: "成长值门槛必须为不小于 0 的整数。",
memberLevelThresholdDuplicate: "已有其他等级使用该成长值门槛。",
memberLevelConflict: "成长值门槛已被占用",
memberLevelInvalid: "等级被服务端拒绝",
memberLevelConfirmDelete: "确定删除等级“{name}”吗?此操作不可撤销。",
memberLevelDeleteInUse: "该等级已被至少一位客户持有,无法删除",
memberLevelDiscardEdit: "确定放弃未保存的等级修改并刷新吗?",
memberLevelGone: "该会员等级已不存在,列表已刷新。",
},
} as const;