feat: 统一管理端多语言、配置与票据/结算页面重构

This commit is contained in:
2026-05-20 16:27:06 +08:00
parent 37b13278ef
commit 08a11a1589
81 changed files with 2059 additions and 490 deletions

View File

@@ -5,15 +5,14 @@
"sidebarTitle": "Operations configuration",
"groups": {
"betting": "Betting and display",
"risk_wallet": "Risk and funds"
"risk": "Risk control"
},
"items": {
"plays": "Play types and limits",
"odds": "Odds",
"rebate": "Commission / rebate",
"jackpot": "Jackpot pool",
"risk-cap": "Payout caps",
"wallet": "Wallet thresholds"
"risk-cap": "Payout caps"
}
},
"versionStatus": {
@@ -70,6 +69,31 @@
},
"discard": "Discard changes"
},
"system": {
"title": "Draw and settlement runtime settings",
"runtimeTitle": "Global runtime parameters",
"runtimeIntro1": "This area stores global system parameters that do not belong to play, odds, or risk-control versions. They directly affect wallet transfers, job switches, and runtime policy.",
"runtimeIntro2": "Play, odds, rebate, and cap management stay under operations configuration. System settings only carry cross-module runtime parameters to avoid overlapping responsibilities in admin.",
"description": "Controls review flow after RNG draw generation, cooldown duration, and automatic settlement behavior. These are global runtime policies and do not belong to versioned operations config.",
"loadFailed": "Failed to load system settings",
"saveSuccess": "System settings saved",
"saveFailed": "Failed to save system settings",
"fields": {
"manualReview": "Require manual review for draw results",
"cooldownMinutes": "Cooldown duration (minutes)",
"autoSettlement": "Run settlement automatically"
},
"hints": {
"manualReview": "When enabled, RNG draw results enter pending review and must be published manually in admin.",
"cooldownMinutes": "How long to wait after publishing before entering settling. Use 0 to settle immediately.",
"autoSettlement": "When disabled, tick will not run settlement automatically and admins must trigger it manually."
},
"states": {
"enabled": "Enabled",
"disabled": "Disabled"
},
"discard": "Discard changes"
},
"play": {
"batchGroups": {
"d2": "2D Global",
@@ -79,6 +103,164 @@
"position": "Position Plays",
"box": "Box Plays",
"jackpot": "Jackpot"
},
"validation": {
"minMaxInvalid": "{{playCode}}: min bet cannot exceed max bet"
},
"publishFailed": "Publish failed",
"createDraftSuccess": "Created draft v{{version}}",
"createDraftFailed": "Failed to create draft",
"ruleSavedLocal": "Rule text was saved into the local draft. Save the draft to persist it.",
"deleteFailed": "Delete failed",
"activeVersion": "Active version v{{version}}",
"readOnlyHint": "Limits and rules are read-only. Create a draft first.",
"batchSwitchesTitle": "Batch switches",
"batchSwitchesDesc": "Only updates the current draft. The player betting table refreshes after save and publish.",
"readOnlyDraftHint": "Current version is read-only. Create a draft first.",
"batchEnabledCount": "{{enabledCount}}/{{total}} enabled",
"noPlayTypes": "No play types",
"actions": {
"enable": "Enable",
"disable": "Disable",
"ruleText": "Rule text"
},
"table": {
"playCode": "Play code",
"category": "Category",
"status": "Status",
"displayName": "Display name",
"order": "Order",
"minBet": "Min bet",
"maxBet": "Max bet",
"actions": "Actions"
},
"states": {
"enabled": "Enabled",
"disabled": "Disabled",
"readOnly": "Read only"
},
"aria": {
"enablePlay": "Enable {{playCode}}"
},
"ruleDialog": {
"title": "Rule text (Chinese)",
"description": "Play {{playCode}}. Changes stay in the draft until you save and publish it.",
"fieldLabel": "rule_text_zh",
"apply": "Apply to draft"
}
},
"odds": {
"tabs": {
"all": "All"
},
"category": "Category",
"playType": "Play type",
"noPlayTypes": "No play types in this category.",
"sheetDescription": "Choose a version to view here. Non-draft versions can be rolled back into a new draft.",
"activeVersionPrefix": "Active version:",
"readOnlyHint": "This version is read-only. Create a draft before editing odds.",
"loadingDetails": "Loading details…",
"multiplier": "Multiplier x{{value}} · {{currency}}",
"missingScopeRow": "Missing {{scope}} row. Check seed or version data.",
"rebateRate": "Rebate rate (%)",
"rebateRateHint": "Writes rebate_rate to all prize scopes under this play type.",
"publishFailed": "Publish failed",
"createDraftSuccess": "Created draft v{{version}}",
"createDraftFailed": "Failed to create draft",
"rollbackSuccess": "Cloned v{{fromVersion}} into new draft v{{version}}",
"rollbackFailed": "Rollback failed",
"deleteFailed": "Delete failed",
"rollbackDialog": {
"title": "Confirm rollback",
"description": "A new draft will be cloned from version v{{version}}. The active version will not be overwritten directly.",
"confirm": "Confirm rollback"
},
"publishDialog": {
"title": "Publish odds version?",
"description": "New odds affect new tickets immediately. Existing successful tickets still settle by their saved odds snapshot.",
"confirm": "Confirm publish",
"columns": {
"prizeScope": "Prize scope",
"currentActive": "Current active",
"afterPublish": "After publish"
}
}
},
"rebate": {
"sheetDescription": "Rebate is stored in the odds draft version and shares the same version set as odds.",
"publishLabel": "Publish",
"publishSuccess": "Published odds version with rebate",
"publishFailed": "Publish failed",
"createDraftSuccess": "Created draft v{{version}}",
"createDraftFailed": "Failed to create draft",
"deleteFailed": "Delete failed",
"editingVersion": "Editing version v{{version}} · {{status}}",
"readOnlyHint": "Create a draft before editing rebate.",
"fields": {
"d2": "2D rebate rate (%)",
"d3": "3D rebate rate (%)",
"d4": "4D rebate rate (%)"
},
"winEnjoy": {
"label": "Apply rebate on winning tickets",
"description": "Placeholder field. It can later be aligned with risk and settlement rules and persisted."
},
"effectiveTime": "Effective time (current active odds version)"
},
"riskCap": {
"validation": {
"requireAtLeastOne": "At least one cap row is required",
"defaultGreaterThanZero": "Default cap amount must be greater than 0",
"numberMustBe4Digits": "Number must be 4 digits: {{number}}",
"enterValidCapAmount": "Enter a valid cap amount"
},
"publishFailed": "Publish failed",
"createDraftSuccess": "Created draft v{{version}}",
"createDraftFailed": "Failed to create draft",
"savedLocalDraft": "Saved into local draft. Save the draft to persist it.",
"deleteFailed": "Delete failed",
"effectiveAt": "Effective at: {{value}}",
"note": "Note: {{value}}",
"readOnlyHint": "Read only. Create a draft first.",
"readOnly": "Read only",
"defaultCap": {
"title": "Default cap",
"description": "Numbers without a special cap use this default cap template.",
"fieldLabel": "Cap amount (minor unit)"
},
"specialCaps": {
"title": "Special caps"
},
"loadingDetails": "Loading details…",
"noDetailRows": "No detail rows.",
"table": {
"number": "Number",
"capAmount": "Cap amount",
"used": "Used",
"remaining": "Remaining",
"soldOut": "Sold out",
"ratio": "Ratio",
"actions": "Actions"
},
"occupancy": {
"title": "All number occupancy",
"description": "Placeholder view: filters and exports still need ticket-summary integration. Data below still comes from the current draft list.",
"searchLabel": "Search number",
"searchPlaceholder": "e.g. 8888",
"filterPending": "Sold-out / high-risk preset filter is pending integration",
"exportPending": "CSV export is pending integration"
},
"actions": {
"update": "Update",
"addSpecialCap": "+ Add special cap",
"filterPresets": "Filter presets…",
"exportCsv": "Export CSV",
"close": "Close"
},
"syncDialog": {
"title": "Sync default cap",
"description": "The default cap template will be set to {{value}}. This only changes the draft. Save and publish after confirming.",
"confirm": "Confirm"
}
}
}