648 lines
28 KiB
JSON
648 lines
28 KiB
JSON
{
|
||
"title": "Configuration Center",
|
||
"nav": {
|
||
"aria": "Operations configuration sub-navigation",
|
||
"sidebarTitle": "Operations configuration",
|
||
"groups": {
|
||
"betting": "Betting and display",
|
||
"risk": "Risk control"
|
||
},
|
||
"items": {
|
||
"plays": "Play types and limits",
|
||
"odds": "Odds",
|
||
"rebate": "Commission / rebate",
|
||
"jackpot": "Jackpot pool",
|
||
"risk-cap": "Payout caps"
|
||
},
|
||
"rulesPlaysTitle": "Play rules",
|
||
"rulesOddsTitle": "Odds & base rebate",
|
||
"rulesOddsDescription": "Odds matrix and base rebate are maintained on one page, sharing the same odds version line.",
|
||
"rulesOddsDescriptionShort": "Pick a play on the left, edit odds and base rebate on the right. Agent/player rebate is added on top of this base, then save and publish.",
|
||
"riskCapTitle": "Risk cap rules"
|
||
},
|
||
"hub": {
|
||
"title": "Operations configuration",
|
||
"description": "Jump to play rules, odds & rebate, jackpot, and risk cap by domain. The sidebar provides direct links; this page is an overview.",
|
||
"playsTitle": "Play rules",
|
||
"playsDesc": "Play switches, limits, and rule copy",
|
||
"oddsTitle": "Odds & base rebate",
|
||
"oddsDesc": "Odds matrix and base rebate in one version stream",
|
||
"jackpotTitle": "Jackpot",
|
||
"jackpotDesc": "Pool parameters and ledger records",
|
||
"riskCapTitle": "Risk cap rules",
|
||
"riskCapDesc": "Per-number payout caps and occupancy",
|
||
"integrationTitle": "Integration sites",
|
||
"integrationDesc": "site_code, JWT secrets, partner wallet URL, iframe allowlist"
|
||
},
|
||
"integrationSites": {
|
||
"title": "Integration sites",
|
||
"description": "Maintain partner integration settings in admin. site_code cannot be changed after creation.",
|
||
"create": "New site",
|
||
"edit": "Edit",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"cancel": "Cancel",
|
||
"copy": "Copy",
|
||
"loading": "Loading…",
|
||
"empty": "No integration sites",
|
||
"loadFailed": "Failed to load integration sites",
|
||
"saveFailed": "Save failed",
|
||
"createSuccess": "Created site {{code}}",
|
||
"updateSuccess": "Updated site {{code}}",
|
||
"connectivityTest": "Test connectivity",
|
||
"connectivityTitle": "Partner wallet connectivity",
|
||
"connectivityDescription": "Call the balance API for site {{code}} using a test player.",
|
||
"connectivityPlayerId": "Test site_player_id",
|
||
"connectivityRun": "Run test",
|
||
"connectivityRunning": "Testing…",
|
||
"connectivitySuccess": "Connectivity OK",
|
||
"connectivityFailed": "Connectivity failed",
|
||
"exportParams": "Export params",
|
||
"exportSuccess": "Exported parameter sheet for {{code}}",
|
||
"exportFailed": "Export failed",
|
||
"rotateSecrets": "Rotate secrets",
|
||
"rotateSuccess": "Rotated secrets for {{code}}",
|
||
"rotateFailed": "Failed to rotate secrets",
|
||
"rotateConfirmTitle": "Rotate secrets?",
|
||
"rotateConfirmDescription": "New SSO and wallet keys will be generated for {{code}}. Old keys stop working immediately.",
|
||
"rotateConfirm": "Rotate",
|
||
"secretsTitle": "Save these secrets now",
|
||
"secretsDescription": "Secrets for {{code}} are shown only once.",
|
||
"secretsDismiss": "I have saved them",
|
||
"copied": "Copied {{field}}",
|
||
"copyFailed": "Copy failed",
|
||
"noPermission": "No permission to view integration sites",
|
||
"codeImmutable": "site_code cannot be changed after creation",
|
||
"statusEnabled": "Enabled",
|
||
"statusDisabled": "Disabled",
|
||
"dialogCreateTitle": "New integration site",
|
||
"dialogEditTitle": "Edit integration site",
|
||
"dialogDescription": "Default wallet paths are fine unless the partner uses custom URLs.",
|
||
"form": {
|
||
"required": "Site name is required",
|
||
"codeRequired": "site_code is required"
|
||
},
|
||
"columns": {
|
||
"code": "site_code",
|
||
"name": "Name",
|
||
"status": "Status",
|
||
"walletUrl": "Wallet API",
|
||
"actions": "Actions"
|
||
},
|
||
"fields": {
|
||
"code": "site_code",
|
||
"name": "Site name",
|
||
"currency": "Default currency",
|
||
"status": "Status",
|
||
"walletApiUrl": "Partner wallet base URL",
|
||
"lotteryH5BaseUrl": "Lottery H5 base URL (optional)",
|
||
"iframeOrigins": "iframe allowlist (one origin per line)",
|
||
"notes": "Notes",
|
||
"ssoSecret": "SSO secret",
|
||
"walletApiKey": "Wallet API key"
|
||
},
|
||
"placeholders": {
|
||
"code": "Enter site identifier, for example partner-a",
|
||
"name": "Enter site name",
|
||
"currency": "Enter currency code, for example NPR",
|
||
"walletApiUrl": "Enter wallet API URL",
|
||
"lotteryH5BaseUrl": "Enter H5 URL",
|
||
"iframeOrigins": "Enter allowed origins, for example https://www.example.com",
|
||
"notes": "Enter notes",
|
||
"connectivityPlayerId": "Enter player ID, for example 10001"
|
||
}
|
||
},
|
||
"versionStatus": {
|
||
"active": "Active",
|
||
"draft": "Draft",
|
||
"archived": "Archived"
|
||
},
|
||
"versionSwitcher": {
|
||
"sheetTitle": "Switch configuration version",
|
||
"sheetDescription": "Choose a version to view on this page. Drafts are editable, while active and archived versions are read-only.",
|
||
"loading": "Loading…",
|
||
"noneSelected": "No version selected",
|
||
"switch": "Switch version",
|
||
"empty": "No version records yet.",
|
||
"count": "{{count}} items",
|
||
"effectiveAt": "Effective at: {{value}}",
|
||
"note": "Note: {{value}}",
|
||
"current": "Current",
|
||
"moreActions": "More actions for v{{version}}",
|
||
"selected": "Selected",
|
||
"view": "View",
|
||
"rollback": "Rollback",
|
||
"delete": "Delete",
|
||
"deleteConfirmTitle": "Delete this version?",
|
||
"deleteConfirmDescription": "Version ID {{id}} (version_no {{version}}) will be permanently deleted. Active versions cannot be deleted."
|
||
},
|
||
"versionToolbar": {
|
||
"draftEditing": "Editing a draft — save and publish to go live"
|
||
},
|
||
"versionActions": {
|
||
"publishCurrent": "Publish",
|
||
"refreshing": "Refreshing",
|
||
"refresh": "Refresh versions",
|
||
"newDraft": "New draft",
|
||
"saveDraft": "Save draft",
|
||
"saveFailed": "Failed to save configuration",
|
||
"rollbackSuccess": "Cloned v{{fromVersion}} into new draft v{{version}}",
|
||
"rollbackFailed": "Rollback 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"
|
||
}
|
||
},
|
||
"wallet": {
|
||
"title": "Wallet transfer limit settings",
|
||
"description": "Amounts use the game's minor currency unit (for example, under NPR, 100 = 1.00 NPR). The minimum amount must be at least 1 minor unit.",
|
||
"loadFailed": "Failed to load",
|
||
"saveSuccess": "Saved successfully",
|
||
"saveFailed": "Save failed",
|
||
"fields": {
|
||
"inMin": "Minimum transfer-in amount",
|
||
"inMax": "Maximum transfer-in amount",
|
||
"outMin": "Minimum transfer-out amount",
|
||
"outMax": "Maximum transfer-out amount"
|
||
},
|
||
"placeholders": {
|
||
"min": "For example: 1.00",
|
||
"max": "For example: 10000.00"
|
||
},
|
||
"hints": {
|
||
"inMin": "Per-order minimum from main wallet to lottery wallet",
|
||
"inMax": "Per-order maximum from main wallet to lottery wallet",
|
||
"outMin": "Per-order minimum from lottery wallet to main wallet",
|
||
"outMax": "Per-order maximum from lottery wallet to main wallet"
|
||
},
|
||
"validation": {
|
||
"amountAtLeastMinorUnit": "{{field}} must be a valid amount and at least 0.01.",
|
||
"inRangeInvalid": "Maximum transfer-in amount cannot be less than the minimum transfer-in amount.",
|
||
"outRangeInvalid": "Maximum transfer-out amount cannot be less than the minimum transfer-out amount."
|
||
},
|
||
"discard": "Discard changes",
|
||
"confirmSaveTitle": "Save wallet limits?",
|
||
"confirmSaveDescription": "This updates per-order transfer-in/out limits and immediately affects player wallet transfers."
|
||
},
|
||
"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",
|
||
"saveRuntimeSuccess": "Draw and settlement parameters saved",
|
||
"saveDrawSuccess": "Draw parameters saved",
|
||
"saveCurrencyFormatSuccess": "Currency display format saved",
|
||
"saveSettlementSuccess": "Settlement automation saved",
|
||
"saveFrontendSuccess": "Front-end display settings saved",
|
||
"sections": {
|
||
"draw": "Draw schedule and review",
|
||
"drawDescription": "Controls draw timing, close window, manual review, and cooldown. Only changed fields in this block are submitted.",
|
||
"currencyFormat": "Currency display format",
|
||
"currencyFormatDescription": "Decimals and separators for amounts across the site (separate from currency master data).",
|
||
"settlement": "Settlement automation",
|
||
"settlementDescription": "Controls whether tick auto-runs settlement, approval, and payout. Only changed fields in this block are submitted."
|
||
},
|
||
"saveFailed": "Failed to save system settings",
|
||
"unsavedChanges": "Unsaved changes",
|
||
"frontendConfig": "Front-end configuration",
|
||
"fields": {
|
||
"manualReview": "Require manual review for draw results",
|
||
"cooldownMinutes": "Cooldown duration (minutes)",
|
||
"defaultCurrency": "Default currency code",
|
||
"drawIntervalMinutes": "Draw interval (minutes)",
|
||
"drawBettingWindowSeconds": "Betting window (seconds)",
|
||
"drawCloseBeforeDrawSeconds": "Close before draw (seconds)",
|
||
"drawBufferDrawsAhead": "Pre-generated future draws",
|
||
"currencyDisplayDecimals": "Display decimals",
|
||
"currencyDecimalSeparator": "Decimal separator",
|
||
"currencyThousandsSeparator": "Thousands separator",
|
||
"autoSettlement": "Run settlement automatically",
|
||
"autoApprove": "Auto-approve settlement batches",
|
||
"autoPayout": "Auto-credit winnings to wallets",
|
||
"applyRebateToPayout": "Deduct rebate again on winning payouts",
|
||
"playRulesHtml": "Play rules HTML (i18n)",
|
||
"playRulesHtmlDesc": "Rendered on the player play-rules page per locale. Leave empty to fall back to another language or the default empty state."
|
||
},
|
||
"placeholders": {
|
||
"defaultCurrency": "Enter default currency code, for example NPR",
|
||
"drawIntervalMinutes": "Enter draw interval in minutes",
|
||
"drawBettingWindowSeconds": "Enter betting window in seconds",
|
||
"drawCloseBeforeDrawSeconds": "Enter seconds to close before draw",
|
||
"drawBufferDrawsAhead": "Enter pre-generated draw count",
|
||
"cooldownMinutes": "Enter cooldown minutes",
|
||
"currencyDisplayDecimals": "Enter display decimal places, for example 2",
|
||
"currencyDecimalSeparator": "Enter decimal separator, for example .",
|
||
"currencyThousandsSeparator": "Enter thousands separator, for example ,"
|
||
},
|
||
"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.",
|
||
"autoApprove": "After cooldown ends and settlement completes, whether batches are automatically marked as approved.",
|
||
"autoPayout": "After a batch is approved, whether tick automatically credits winnings to player wallets.",
|
||
"applyRebateToPayout": "When enabled, payout = gross win × (1 - rebate_rate_snapshot). Default off (rebate already reflected in actual deduct)."
|
||
},
|
||
"states": {
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled"
|
||
},
|
||
"discard": "Discard changes",
|
||
"confirmSaveTitle": "Save system runtime parameters?",
|
||
"confirmSaveDescription": "This updates draw review, cooldown, auto settlement/approval/payout, and play-rules display. It may affect site-wide operation.",
|
||
"confirmSaveRuntimeTitle": "Save draw and settlement parameters?",
|
||
"confirmSaveRuntimeDescription": "This updates draw review, schedule timing, cooldown, and auto settlement/approval/payout. Play-rules HTML is not changed.",
|
||
"confirmSaveDrawTitle": "Save draw parameters?",
|
||
"confirmSaveDrawDescription": "This updates draw review, schedule timing, and cooldown in this block only.",
|
||
"confirmSaveCurrencyFormatTitle": "Save currency display format?",
|
||
"confirmSaveCurrencyFormatDescription": "This updates decimal places and separators.",
|
||
"confirmSaveSettlementTitle": "Save settlement automation?",
|
||
"confirmSaveSettlementDescription": "This updates auto settlement, approval, and payout switches.",
|
||
"confirmSaveFrontendTitle": "Save front-end display settings?",
|
||
"confirmSaveFrontendDescription": "This updates play-rules HTML on the player site. Draw and settlement logic are not changed."
|
||
},
|
||
"currencies": {
|
||
"title": "Currency management",
|
||
"description": "Maintain currency master data for admin operations and control whether a currency is enabled or allowed for betting.",
|
||
"loading": "Loading currencies…",
|
||
"empty": "No currencies yet.",
|
||
"loadFailed": "Failed to load currencies",
|
||
"createSuccess": "Currency created",
|
||
"createFailed": "Failed to create currency",
|
||
"updateSuccess": "Currency updated",
|
||
"updateFailed": "Failed to update currency",
|
||
"deleteSuccess": "Currency {{code}} deleted",
|
||
"deleteFailed": "Failed to delete currency",
|
||
"actions": {
|
||
"create": "Add currency",
|
||
"edit": "Edit",
|
||
"delete": "Delete",
|
||
"openStandalone": "Open dedicated page",
|
||
"backToSettings": "Back to settings"
|
||
},
|
||
"table": {
|
||
"code": "Code",
|
||
"name": "Name",
|
||
"decimals": "Decimals",
|
||
"enabled": "Enabled",
|
||
"bettable": "Bettable",
|
||
"actions": "Actions"
|
||
},
|
||
"dialog": {
|
||
"createTitle": "Add currency",
|
||
"editTitle": "Edit currency",
|
||
"description": "Currency code is immutable after creation. Disabling a currency also turns off bettable status."
|
||
},
|
||
"deleteDialog": {
|
||
"title": "Delete currency?",
|
||
"description": "Delete currency {{code}}? The system blocks deletion when it is still referenced by defaults, wallets, tickets, odds, or jackpot data."
|
||
},
|
||
"form": {
|
||
"code": "Currency code",
|
||
"name": "Currency name",
|
||
"decimals": "Decimal places",
|
||
"codePlaceholder": "Enter currency code, for example NPR",
|
||
"namePlaceholder": "Enter currency name",
|
||
"decimalsPlaceholder": "Enter decimal places, for example 2",
|
||
"enabled": "Enabled status",
|
||
"enabledHint": "Disabled currencies should not be used for new business.",
|
||
"bettable": "Allow betting",
|
||
"bettableHint": "Only enabled currencies can be marked as bettable.",
|
||
"required": "Please fill in the required fields",
|
||
"decimalInvalid": "Enter a valid decimal place value"
|
||
}
|
||
},
|
||
"play": {
|
||
"batchGroups": {
|
||
"d2": "2D Global",
|
||
"d3": "3D Global",
|
||
"d4": "4D Global",
|
||
"big-small": "Big / Small",
|
||
"position": "Position Plays",
|
||
"box": "Box Plays",
|
||
"jackpot": "Jackpot"
|
||
},
|
||
"validation": {
|
||
"minMaxInvalid": "{{playCode}}: min bet cannot exceed max bet",
|
||
"displayNameRequired": "Display name is required"
|
||
},
|
||
"publishFailed": "Publish failed",
|
||
"publishDialog": {
|
||
"title": "Publish play configuration?",
|
||
"description": "New settings affect future bets. Existing tickets still settle by their saved snapshot.",
|
||
"confirm": "Confirm publish"
|
||
},
|
||
"batchSwitchConfirmTitle": "Batch {{action}}?",
|
||
"batchSwitchConfirmDescription": "{{action}} {{count}} play types under «{{group}}» and write to the current draft.",
|
||
"batchSwitchEnable": "Enable",
|
||
"batchSwitchDisable": "Disable",
|
||
"toggleConfirmTitle": "{{action}} play {{playCode}}?",
|
||
"toggleConfirmDescription": "This updates the current draft only. Players see changes after save and publish.",
|
||
"batchPartialEnabled": "{{enabledCount}}/{{total}} enabled (not all on — turn on to enable all)",
|
||
"toggleEnable": "Enable",
|
||
"toggleDisable": "Disable",
|
||
"toggleInstantFailed": "Failed to apply play switch. Try again later.",
|
||
"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",
|
||
"filters": {
|
||
"sectionTitle": "Filter plays",
|
||
"sectionDescription": "Narrow the list first, then use batch switches or row-level edits.",
|
||
"keyword": "Search plays",
|
||
"keywordPlaceholder": "Filter by play code, display name, or category",
|
||
"category": "Category",
|
||
"status": "Status",
|
||
"allCategories": "All categories",
|
||
"allStatuses": "All statuses",
|
||
"uncategorized": "Uncategorized",
|
||
"reset": "Clear filters",
|
||
"empty": "No matching play types",
|
||
"groupCount": "{{count}} plays"
|
||
},
|
||
"actions": {
|
||
"enable": "Enable",
|
||
"disable": "Disable",
|
||
"ruleText": "Rule text",
|
||
"editDisplayName": "Edit name"
|
||
},
|
||
"locales": {
|
||
"zh": "Chinese",
|
||
"en": "English",
|
||
"ne": "Nepali"
|
||
},
|
||
"categories": {
|
||
"standard": "Standard",
|
||
"attribute": "Attribute",
|
||
"position": "Position",
|
||
"box": "Box",
|
||
"jackpot": "Jackpot"
|
||
},
|
||
"table": {
|
||
"playCode": "Play code",
|
||
"category": "Category",
|
||
"status": "Status",
|
||
"displayName": "Display name",
|
||
"order": "Order",
|
||
"minBet": "Min bet",
|
||
"maxBet": "Max bet",
|
||
"actions": "Actions"
|
||
},
|
||
"placeholders": {
|
||
"displayOrder": "Order",
|
||
"minBetAmount": "Minimum amount",
|
||
"maxBetAmount": "Maximum amount"
|
||
},
|
||
"states": {
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"readOnly": "Read only"
|
||
},
|
||
"aria": {
|
||
"enablePlay": "Enable {{playCode}}",
|
||
"batchGroupSwitch": "Toggle batch switch for {{group}}"
|
||
},
|
||
"nameDialog": {
|
||
"title": "Edit display name",
|
||
"description": "Play {{playCode}}. The player site shows this label after you save and publish the draft.",
|
||
"apply": "Apply to draft",
|
||
"savedLocal": "Display names were saved into the local draft. Save the draft to persist them."
|
||
},
|
||
"ruleDialog": {
|
||
"title": "Rule text (i18n)",
|
||
"description": "Play {{playCode}}. Changes stay in the draft until you save and publish it.",
|
||
"apply": "Apply to draft"
|
||
}
|
||
},
|
||
"prizeScopes": {
|
||
"first": "First prize odds",
|
||
"second": "Second prize odds",
|
||
"third": "Third prize odds",
|
||
"starter": "Starter prize odds",
|
||
"consolation": "Consolation prize odds"
|
||
},
|
||
"odds": {
|
||
"sectionHint": "Pick a version to edit prize-tier odds; publishing applies to new tickets immediately.",
|
||
"sections": {
|
||
"playScope": "Play scope",
|
||
"oddsConfig": "Odds"
|
||
},
|
||
"currentSelection": "Selection: {{category}} / {{play}}",
|
||
"playSelectPlaceholder": "Select play type",
|
||
"readOnlyBanner": "This version is read-only. Create a draft to edit odds and base rebate.",
|
||
"table": {
|
||
"prizeScope": "Prize scope",
|
||
"multiplier": "Odds multiplier"
|
||
},
|
||
"draftBar": {
|
||
"unsaved": "Unsaved changes",
|
||
"saved": "Changes kept in local draft"
|
||
},
|
||
"playGroups": {
|
||
"bigSmall": "Big / small",
|
||
"combo4": "4D position",
|
||
"number3": "3D position",
|
||
"number2": "2D position",
|
||
"other": "Other"
|
||
},
|
||
"summary": {
|
||
"title": "Summary",
|
||
"contextTitle": "Version & tips",
|
||
"version": "Editing version",
|
||
"activeVersion": "Active version",
|
||
"statusLabel": "Status",
|
||
"readOnlyTag": "Read-only",
|
||
"readOnlyHint": "This version is read-only. Create a draft to make changes.",
|
||
"draftHint": "Save draft changes before publishing; publish affects new tickets only.",
|
||
"activeHint": "This version is active; new tickets use these settings."
|
||
},
|
||
"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": "Base rebate rate (%)",
|
||
"rebateRateHint": "This is the platform base rebate. It writes rebate_rate to all prize scopes under this play type; agent/player rebate is added on top of it.",
|
||
"placeholders": {
|
||
"multiplier": "Enter odds multiplier",
|
||
"rebateRate": "Enter base rebate rate"
|
||
},
|
||
"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": {
|
||
"sectionHint": "This section configures the base rebate, which is stored in the odds version; select or create an odds draft in the section above first.",
|
||
"lazyLoadHint": "Scroll down to the rebate section to load",
|
||
"embeddedVersionHint": "Base rebate shares the odds version line—switch versions in the Odds section above.",
|
||
"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",
|
||
"publishDialog": {
|
||
"title": "Publish base rebate/odds version?",
|
||
"description": "After publish, the base rebate applies to new tickets. Agent/player extra rebate is still added on top.",
|
||
"confirm": "Confirm publish"
|
||
},
|
||
"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 base rebate.",
|
||
"dimensionRatesMixedHint": "Base rebate within the same dimension (2D/3D/4D) is not identical: the three percentage inputs show the first play (alphabetically) that has the primary prize scope; use the table as the source of truth. Bulk inputs will overwrite all plays in that dimension to one rate.",
|
||
"fields": {
|
||
"d2": "2D base rebate rate (%)",
|
||
"d3": "3D base rebate rate (%)",
|
||
"d4": "4D base rebate rate (%)"
|
||
},
|
||
"placeholders": {
|
||
"d2": "Enter 2D base rebate",
|
||
"d3": "Enter 3D base rebate",
|
||
"d4": "Enter 4D base rebate"
|
||
},
|
||
"winEnjoy": {
|
||
"label": "Deduct rebate on winning payouts",
|
||
"description": "Maps to settlement.apply_rebate_to_payout: when enabled, winning payout uses gross win × (1 - rebate_rate_snapshot).",
|
||
"hint": "Global switch; affects future settlement payouts immediately (not tied to odds version publish).",
|
||
"saveSuccess": "Winning-ticket rebate setting updated",
|
||
"saveFailed": "Update failed"
|
||
},
|
||
"effectiveTime": "Effective time (current active odds version)"
|
||
},
|
||
"riskCap": {
|
||
"placeholders": {
|
||
"defaultCap": "Enter default cap amount",
|
||
"number": "4-digit number",
|
||
"capAmount": "Enter cap amount"
|
||
},
|
||
"validation": {
|
||
"requireAtLeastOne": "At least one cap row is required",
|
||
"defaultGreaterThanZero": "Default cap amount must be greater than 0",
|
||
"defaultCannotBindDraw": "Default cap cannot be bound to a specific draw",
|
||
"specialGreaterThanZero": "Special cap amount must be greater than 0: {{number}}",
|
||
"numberMustBe4Digits": "Number must be 4 digits: {{number}}",
|
||
"enterValidCapAmount": "Enter a valid cap amount"
|
||
},
|
||
"publishFailed": "Publish failed",
|
||
"publishDialog": {
|
||
"title": "Publish cap configuration?",
|
||
"description": "After publish, per-number risk-pool cap limits take effect.",
|
||
"confirm": "Confirm publish"
|
||
},
|
||
"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 (major unit)"
|
||
},
|
||
"specialCaps": {
|
||
"title": "Special caps",
|
||
"description": "No draw selected means a global number cap. Selecting a draw makes it a draw-specific cap."
|
||
},
|
||
"scope": {
|
||
"global": "Global number",
|
||
"drawId": "Draw ID: {{id}}"
|
||
},
|
||
"groups": {
|
||
"globalTitle": "Global number caps",
|
||
"globalDescription": "Long-running caps that are not tied to a specific draw. Use these for normal number-level selling limits.",
|
||
"globalEmpty": "No global number caps yet.",
|
||
"drawTitle": "Draw-specific caps",
|
||
"drawDescription": "Only applies to the selected draw. Use these for temporary tightening or relaxing of a number cap.",
|
||
"drawEmpty": "No draw-specific caps yet.",
|
||
"count": "{{count}} rows"
|
||
},
|
||
"summary": {
|
||
"defaultCap": "Default cap",
|
||
"defaultHint": "Any number without a special rule falls back to this value.",
|
||
"globalCaps": "Global number caps",
|
||
"globalHint": "Long-running rules that do not change with a single draw.",
|
||
"drawCaps": "Draw-specific caps",
|
||
"drawHint": "Temporary rules that only apply to selected draws."
|
||
},
|
||
"loadingDetails": "Loading details…",
|
||
"noDetailRows": "No detail rows.",
|
||
"table": {
|
||
"scope": "Scope",
|
||
"number": "Number",
|
||
"capAmount": "Cap amount",
|
||
"used": "Used",
|
||
"remaining": "Remaining",
|
||
"soldOut": "Sold out",
|
||
"ratio": "Ratio",
|
||
"actions": "Actions"
|
||
},
|
||
"occupancy": {
|
||
"searchLabel": "Search number",
|
||
"searchPlaceholder": "e.g. 8888"
|
||
},
|
||
"runtime": {
|
||
"title": "Per-draw occupancy (live)",
|
||
"description": "Loaded from the draw risk-pool API, not from the version draft above. Select a draw to see used, remaining, and sold-out state.",
|
||
"drawLabel": "Draw",
|
||
"drawPlaceholder": "Select draw",
|
||
"filterAll": "All",
|
||
"filterSoldOut": "Sold out only",
|
||
"filterHighRisk": "High usage",
|
||
"manageHint": "Use the links above for full risk operations on this draw.",
|
||
"noDraws": "No draws available; cannot load occupancy.",
|
||
"soldYes": "Yes",
|
||
"soldNo": "No"
|
||
},
|
||
"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"
|
||
}
|
||
}
|
||
}
|