Files
hi-frontend/apps/admin/public/assets/locales/en-US/lottery.json
T
shanshanzhong147 01591adb86 feat: 后台抽奖活动管理(Stage 1)
- 服务层:12 个 /v1/admin/lottery 接口封装与 API 类型定义
- 活动列表:状态筛选、上架/暂停(带确认)、编辑、管理、发次数
- 奖品管理:3×3 九宫格可视化编辑、概率预览、保底奖警告、佣金元↔分转换、无限库存
- 规则设置:chance_sources 动态编辑,eligibility 简单/高级(JSON)双模式,本地 rulecaps 校验(深度≤8/节点≤64/≤8KB),Stage 1 未接线警示
- 手动发次数:自动生成幂等 source_ref
- 路由 /dashboard/lottery、Commerce 菜单项、en-US/zh-CN 双语文案
- 对接文档见 vpn/aaaa.txt(Stage 1)
2026-07-17 00:19:03 -07:00

182 lines
7.0 KiB
JSON

{
"activityTime": "Activity Time",
"cancel": "Cancel",
"confirm": "Confirm",
"confirmPause": "Are you sure you want to pause this activity?",
"confirmPublish": "Are you sure you want to publish this activity?",
"create": "Create",
"createActivity": "Create Activity",
"createSuccess": "Create Success",
"detail": {
"prizesTab": "Prizes",
"rulesTab": "Rules"
},
"edit": "Edit",
"editActivity": "Edit Activity",
"form": {
"cancel": "Cancel",
"confirm": "Confirm",
"description": "Description",
"descriptionPlaceholder": "Activity description (Markdown supported)",
"endAt": "End Time",
"endAtAfterStartAt": "End time must be later than start time",
"endAtRequired": "End time is required",
"gridSize": "Grid Size",
"selectEndAt": "Select time",
"selectGridSize": "Select grid size",
"selectStartAt": "Select time",
"startAt": "Start Time",
"startAtRequired": "Start time is required",
"title": "Title",
"titlePlaceholder": "Activity title",
"titleRequired": "Title is required"
},
"grant": {
"amount": "Amount",
"description": "Manually grant draw chances to a user for activity: {{title}}",
"sourceRef": "Source Reference",
"sourceRefHint": "Idempotency key: the same reference only grants once. Repeated submissions will not grant again.",
"sourceRefPlaceholder": "grant-20260709-abc123",
"success": "Chances granted",
"title": "Grant Chances",
"userId": "User ID",
"userIdHint": "Enter the numeric user ID. You can find it in the user management list.",
"userIdPlaceholder": "e.g. 87433"
},
"grantChances": "Grant Chances",
"gridSize": "Grid Size",
"id": "ID",
"manage": "Manage",
"pause": "Pause",
"pauseSuccess": "Pause Success",
"pauseWarning": "Users will not be able to draw while the activity is paused.",
"prize": {
"addPrize": "Add Prize",
"amountPrecision": "Amount supports at most 2 decimal places",
"amountRequired": "Amount must be greater than 0",
"amountUnitHint": "Entered in CNY (yuan), stored as cents; up to 2 decimal places",
"amountYuan": "Commission Amount (CNY)",
"cancel": "Cancel",
"centerSlotHint": "Usually the draw button",
"confirm": "Confirm",
"confirmDelete": "Delete",
"createSuccess": "Prize created",
"createTitle": "Add Prize",
"daysSuffix": "days",
"delete": "Delete",
"deleteDescription": "This prize will be removed from the grid. This action cannot be undone.",
"deleteSuccess": "Prize deleted",
"deleteTitle": "Delete this prize?",
"durationDays": "Duration (days)",
"durationDaysPlaceholder": "e.g. 1",
"durationDaysRequired": "Duration days must be a positive integer",
"editTitle": "Edit Prize",
"fallbackBadge": "Fallback",
"fallbackIgnoresWeight": "Fallback prize ignores weight",
"iconUrl": "Icon URL",
"iconUrlInvalid": "Must be a valid URL",
"isFallback": "Fallback Prize",
"isFallbackHint": "Awarded when limited prizes are sold out",
"name": "Prize Name",
"namePlaceholder": "e.g. 1-Day Pass",
"nameRequired": "Name is required",
"noFallbackHint": "Consider configuring a fallback prize so draws never fail when limited prizes run out.",
"noFallbackTitle": "No fallback prize",
"noRandomPrizes": "No prizes participate in the random draw yet",
"noneHint": "No config needed. Consider enabling fallback so users always land on this prize when limited prizes run out.",
"probabilityPreview": "Probability Preview",
"selectType": "Select type",
"slotLabel": "Slot",
"soldOutBadge": "Sold Out",
"stage2Hint": "Available in Stage 2",
"stockShort": "Stock",
"totalStock": "Total Stock",
"totalStockPlaceholder": "e.g. 100",
"totalStockRequired": "Total stock must be a positive integer",
"type": "Prize Type",
"typeCommission": "Commission",
"typeCoupon": "Coupon",
"typeCrypto": "Crypto",
"typeManualOther": "Manual (Other)",
"typeNone": "No Prize (Thanks)",
"typePhysical": "Physical",
"typePoints": "Points",
"typeVpnDuration": "VPN Duration",
"unlimitedStock": "Unlimited Stock",
"updateSuccess": "Prize updated",
"weight": "Weight",
"weightHint": "0 = displayed but excluded from random draw",
"weightInteger": "Weight must be an integer",
"weightMin": "Weight must be at least 0",
"weightShort": "Weight",
"yuanSuffix": "CNY"
},
"publish": "Publish",
"publishSuccess": "Publish Success",
"publishWarning": "Once published, the activity becomes visible to users.",
"rules": {
"addCondition": "Add Condition",
"addSource": "Add Source",
"amount": "Amount",
"cannotSimplify": "This rule tree is too complex for simple mode. Please edit it in Advanced mode.",
"capsBytesExceeded": "Size {{value}} bytes exceeds limit {{limit}} bytes",
"capsDepthExceeded": "Depth {{value}} exceeds limit {{limit}}",
"capsExceeded": "Rule tree exceeds limits",
"capsNodesExceeded": "Node count {{value}} exceeds limit {{limit}}",
"chanceSources": "Chance Sources",
"chanceSourcesDescription": "Configure how users earn draw chances. Each source can only appear once.",
"conditionType": {
"has_subscription": "Has Subscription",
"invite_count": "Invite Count",
"register_days": "Register Days",
"subscription_type": "Subscription Type",
"total_recharge": "Total Recharge",
"user_tag": "User Tag"
},
"dailyLimit": "Daily limit (optional)",
"duplicateSource": "Duplicate source",
"eligibility": "Eligibility",
"jsonInvalid": "Invalid JSON: {{error}}",
"jsonMustBeObject": "Rule tree must be a JSON object",
"jsonPlaceholder": "Rule tree JSON, e.g. {\"op\":\"AND\",\"children\":[...]}. Leave empty for no requirement.",
"noConditions": "No conditions. Everyone is eligible to join.",
"op": "Combine Conditions With",
"opAnd": "AND",
"opOr": "OR",
"param": {
"min": "Min Count",
"minDaysRemaining": "Min Days Remaining",
"minUsdt": "Min USDT",
"planIds": "Plan IDs",
"planIdsPlaceholder": "Comma separated, e.g. 1,2,3",
"tags": "Tags",
"tagsPlaceholder": "Comma separated, e.g. vip,beta",
"windowDays": "Window Days (optional)"
},
"save": "Save Rules",
"saveFailed": "Failed to save rules",
"saveSuccess": "Rules saved",
"selectSource": "Select source",
"simpleMode": "Simple",
"advancedMode": "Advanced (JSON)",
"source": {
"dailySignin": "Daily Sign-in",
"inviteSuccess": "Invite Success",
"manualGrant": "Manual Grant",
"newSubscription": "New Subscription"
},
"stage1Warning": "Stage 1 notice",
"stage1WarningDescription": "The rule context is not wired up in the current version (Stage 1). Configuring eligibility will prevent users from joining the lottery. It is recommended to keep it empty."
},
"status": {
"draft": "Draft",
"ended": "Ended",
"paused": "Paused",
"running": "Running"
},
"statusAll": "All",
"statusLabel": "Status",
"title": "Title",
"updateSuccess": "Update Success"
}