{
  "openSourceLicenses.title": "Open-source licenses",
  "openSourceLicenses.description": "Open-source software and fonts used by this product, credited as their licenses require.",
  "openSourceLicenses.chartsDescription": "Chart engine. TradingView Lightweight Charts™ is copyright TradingView, Inc.",
  "openSourceLicenses.fontDescription": "Interface typeface.",
  "openSourceLicenses.uiDescription": "Unstyled UI component foundation.",
  "apiKeyPool.title": "{{provider}} key pool",
  "apiKeyPool.manage": "Manage keys",
  "apiKeyPool.importTitle": "Bulk import",
  "apiKeyPool.importHint": "One key per line; optional name after tab, comma or pipe. JSON arrays accepted.",
  "apiKeyPool.invalidImport": "Invalid rows: {{lines}}. Nothing imported.",
  "apiKeyPool.limit": "Key limit: {{count}}",
  "apiKeyPool.summary": "Ready: {{ready}} / Total: {{total}}",
  "apiKeyPool.remaining": "Estimated remaining characters",
  "apiKeyPool.runUsage": "Window requests: {{requests}}; confirmed billed characters: {{billed}}; requests without billing receipts: {{unknown}}.",
  "apiKeyPool.policy": "Rotate available keys; respect cooldowns and reserved quota.",
  "apiKeyPool.check": "Check key",
  "apiKeyPool.checkAll": "Check all keys",
  "apiKeyPool.search": "Search name or endpoint",
  "apiKeyPool.disabled": "Disabled",
  "apiKeyPool.cooldown": "Cooling down",
  "apiKeyPool.duplicate": "This key is already in the pool.",
  "apiKeyPool.invalidConfig": "Check the names, keys and official API URLs.",
  "apiKeyPool.quotaBlocked": "Quota unavailable",
  "apiKeyPool.usageScope": "Business request records cover the last 30 days; provider usage follows its billing period.",
  "apiKeyPool.usageUnavailable": "Business usage records are temporarily unavailable.",
  "taskResult.rawOutput": "Raw output",
  "recordViews.userAccounts": "Accounts",
  "recordViews.userEntitled": "Active access",
  "recordViews.userDisabled": "Disabled accounts",
  "recordViews.securityDescription": "Inspect login activity and administrator actions by record type.",
  "recordViews.recentNotifications": "Latest 50 notification records",
  "recordViews.userCountsError": "User statistics could not refresh; existing counts may be stale.",
  "recordViews.notificationHistory": "Notification history",
  "recordViews.securityRecords": "Security records",
  "recordViews.query": "History explorer",
  "recordViews.settings": "Recording management",
  "processing.status.newsTitle": "Announcement detail processing",
  "processing.status.ingestConnected": "Collection connections online",
  "processing.status.title": "Realtime processing",
  "processing.status.snapshotUnavailable": "Runtime snapshot unavailable; settings remain available.",
  "processing.status.computeWaiting": "Awaiting first computation",
  "processing.status.computeWaitingDetail": "Computation interval {{interval}} ms; no result has been committed yet.",
  "processing.status.computeRecorded": "Computation recorded",
  "processing.status.computeOverrun": "Last computation exceeded its interval",
  "processing.status.computeSample": "Last computation {{duration}} ms; computation interval {{interval}} ms.",
  "processing.status.publishIdle": "No publication streams",
  "processing.status.publishIdleDetail": "Connected sessions {{sessions}}; there are no publication streams.",
  "processing.status.publishWaiting": "Awaiting first publication",
  "processing.status.publishWaitingDetail": "Publication streams {{streams}}, connected sessions {{sessions}}; no publication has been recorded yet.",
  "processing.status.publishRecorded": "Publication recorded",
  "processing.status.publishSample": "Publication streams {{streams}}, connected sessions {{sessions}}; last server publication batch {{duration}} ms.",
  "processing.status.dataTitle": "Data services",
  "processing.status.ingestCounts": "Connected {{connected}}, degraded {{degraded}}, interrupted {{disconnected}}, paused {{paused}}.",
  "processing.status.historyAccess": "Queries: {{readable}}; recording: {{recording}}.",
  "processing.status.readable": "available",
  "processing.status.unreadable": "unavailable",
  "processing.status.historyLatest": "Latest history data {{time}}.",
  "processing.status.historyProtected": "History writing has triggered protection and needs attention.",
  "processing.status.historyWriteIssue": "History writing is affected. Open history data for details.",
  "processing.status.historyWriting": "History data is being written.",
  "processing.status.newsUnavailable": "Announcement detail processing is unavailable. Open announcement management.",
  "processing.status.newsActivity": "Processing {{active}}, waiting {{waiting}}.",
  "processing.status.newsIdle": "Detail processing is ready. Open announcement management for source collection status.",
  "processing.status.newsProcessing": "Processing",
  "processing.collectionCredentialsRequired": "Configure market data credentials",
  "processing.collectionWaiting": "Waiting for valid market data",
  "processing.collectionInterrupted": "Market data collection interrupted",
  "processing.collectionDegraded": "Some market data is affected",
  "processing.pause": "Pause",
  "processing.latestData": "Last data",
  "processing.instruments": "Instruments",
  "processing.title": "Realtime processing",
  "processing.ingestTitle": "Market data",
  "processing.operation": "Operation",
  "processing.groups.cadence": "Compute and publication",
  "processing.groups.validity": "Quote validity",
  "processing.groups.connection": "Connection settings",
  "processing.descriptions.cadence": "Configure compute and publication cadence separately. Changes apply when saved.",
  "processing.descriptions.validity": "Determine validity from quote freshness, leg timing and spread bounds.",
  "processing.descriptions.connection": "The heartbeat period checks connection liveness. Changes apply at the next service start.",
  "processing.fields.batch": "Compute interval",
  "processing.fields.publish": "Minimum publish interval",
  "processing.fields.delta": "Maximum leg time difference",
  "processing.fields.stale": "Quote expiry",
  "processing.fields.spread": "Maximum absolute spread",
  "processing.fields.ping": "Connection heartbeat period",
  "processing.effective": "Effective {{value}} {{unit}}",
  "processing.pending": "Saved, awaiting restart · Current {{value}} {{unit}}",
  "processing.unavailable": "This service does not provide this setting",
  "processing.invalid": "Enter a valid {{field}} between {{min}} and {{max}} {{unit}}.",
  "processing.deltaLimit": "Maximum leg time difference cannot exceed quote expiry.",
  "processing.conflict": "These settings changed elsewhere. Your draft is preserved. Review the current values before saving again.",
  "processing.restartPending": "Some settings await restart",
  "processing.restartDescription": "Compute, publication and quote validity apply immediately. The heartbeat period applies at the next service start.",
  "processing.saved": "Settings saved",
  "processing.applied": "Settings have been applied.",
  "processing.savedAt": "Saved {{time}}",
  "processing.running": "Running",
  "processing.notPublished": "No publication yet",
  "processing.publishSummary": "Connections {{sessions}} · Last publication {{duration}} ms",
  "processing.computeSummary": "Last compute {{duration}} ms",
  "processing.readAt": "Read {{time}}",
  "processing.collection": "Collection status",
  "processing.settings": "Exchange settings",
  "processing.quotes": "Quotes",
  "processing.affected": "Affected quotes",
  "processing.publishUnknown": "Publication status unavailable",
  "common.back": "Back",
  "common.numericDraft.invalid": "Enter a valid number.",
  "common.numericDraft.grouping": "Use a decimal point without grouping separators.",
  "common.numericDraft.integer": "Enter a whole number.",
  "common.numericDraft.precision": "Use at most {{digits}} decimal places.",
  "common.numericDraft.min": "Enter a value of at least {{min}}.",
  "common.numericDraft.max": "Enter a value of at most {{max}}.",
  "common.numericDraft.required": "This field is required.",
  "common.language": "Language",
  "common.discardChanges": "Discard changes",
  "common.cancel": "Cancel",
  "common.confirm": "Confirm",
  "common.close": "Close",
  "common.closeNavigation": "Close navigation",
  "common.retry": "Retry",
  "common.reapply": "Apply again",
  "common.save": "Save",
  "common.saving": "Saving…",
  "common.loading": "Loading…",
  "common.readError": "Read failed",
  "common.subscriptionRequired": "Your subscription has lapsed. Renew it to keep reading this data.",
  "common.sessionExpired": "Your session has expired. Sign in again and retry.",
  "common.rateLimited": "Too many requests. Please try again shortly.",
  "common.unrecognizedValue": "Unrecognized ({{value}})",
  "common.moduleError.retryMessage": "This module is temporarily unavailable.",
  "common.moduleError.namedRetryMessage": "{{title}} is temporarily unavailable.",
  "common.snapshot.retained": "Refresh failed. The last successful snapshot remains visible.",
  "common.snapshot.retainedWithError": "Refresh failed. The last successful snapshot remains visible: {{error}}",
  "common.feedback.toastRegion": "Action feedback",
  "common.permissionDenied": "This account is not allowed to read this data.",
  "common.enabled": "Enabled",
  "common.disabled": "Disabled",
  "common.missingValue": "No data",
  "common.showPassword": "Show password",
  "common.hidePassword": "Hide password",
  "common.showValue": "Show {{label}}",
  "common.hideValue": "Hide {{label}}",
  "common.secret": "secret",
  "common.selectPlaceholder": "Select an option",
  "common.unknownOption": "Unknown option: {{value}}",
  "common.optionsAria": "{{label}} options",
  "common.detailsAria": "Details for {{label}}",
  "common.statusLabel.healthy": "Healthy",
  "common.statusLabel.active": "In progress",
  "common.statusLabel.warning": "Degraded",
  "common.statusLabel.error": "Failed",
  "common.statusLabel.idle": "Idle",
  "common.statusLabel.stale": "Stale data",
  "common.statusLabel.offline": "Offline",
  "common.statusLabel.unknown": "Unknown",
  "common.skipToMain": "Skip to main content",
  "common.tableSort.idle": "{{label}}; click to sort",
  "common.tableSort.active": "{{label}}; currently {{current}}; click for {{next}}",
  "common.tableSort.ascending": "ascending",
  "common.tableSort.descending": "descending",
  "common.sortable.targetPosition": "target position",
  "common.sortable.dragStart": "Picked up {{item}}. Use the arrow keys to choose a new position.",
  "common.sortable.dragOverInvalid": "{{item}} is not over a valid position.",
  "common.sortable.dragOverSame": "{{item}} is still in its original position.",
  "common.sortable.dragOver": "{{item}} is now over {{target}}.",
  "common.sortable.dragEndSame": "{{item}} was not moved.",
  "common.sortable.dragEnd": "Moved {{item}} to {{target}}.",
  "common.sortable.dragCancel": "Cancelled moving {{item}}.",
  "common.pagination.first": "First",
  "common.pagination.previous": "Previous",
  "common.pagination.next": "Next",
  "common.pagination.last": "Last",
  "common.pagination.firstPage": "Already on the first page.",
  "common.pagination.lastPage": "Already on the last page.",
  "common.chartData.points": "{{count}} points",
  "common.chartData.pageAria": "{{label}}, page {{page}}",
  "common.chartData.caption": "{{label}} contains {{total}} points; currently showing points {{start}} through {{end}}.",
  "common.chartData.pageStatus": "Page {{page}}/{{pageCount}} · {{start}}–{{end}}/{{total}}",
  "common.chartData.paginationAria": "{{label}} pagination",
  "common.chartData.actionsAria": "Chart actions",
  "common.dataTable.scrollRegion": "{{label}} scroll region",
  "common.lazyRegion.unavailable": "This area is temporarily unavailable",
  "common.transportClose.payloadOverload": "Browser data processing is backed up; reconnecting",
  "common.transportClose.invalidPayload": "Live-data sequence validation failed; reconnecting",
  "common.transportClose.protocolMismatch": "Live protocol version mismatch; reload the page",
  "common.transportClose.unauthorized": "Sign-in expired; sign in again",
  "common.transportClose.forbidden": "This account can no longer hold the live connection; contact an administrator or check your subscription",
  "common.transportClose.abnormal": "Live connection closed unexpectedly; reconnecting",
  "common.workspaceSettings.loadFailed": "Account settings could not be loaded.",
  "common.workspaceSettings.reloadFailed": "Account settings could not be refreshed.",
  "common.workspaceSettings.templateConflict": "Condition templates changed on another page. Choose which version to keep.",
  "common.workspaceSettings.saveFailed": "Account settings could not be saved.",
  "common.workspaceSettings.saveUnconfirmed": "The save result could not be confirmed. Check your connection and try again.",
  "common.workspaceSettings.saveRetry": "Account settings could not be saved. Try again.",
  "common.overlayResize.title": "Drag to resize; double-click, press Enter, or press Space to restore the default width",
  "common.overlayResize.aria": "Resize panel; press Enter or Space to restore the default width",
  "common.overlayResize.defaultWidth": "Default width",
  "common.overlayResize.widthPixels": "{{value}} pixels",
  "common.route.openingPage": "Opening page…",
  "common.route.openingAccount": "Opening account…",
  "common.route.unavailableSr": "Page temporarily unavailable",
  "common.route.openFailed": "This page could not be opened",
  "common.route.recoveringTitle": "Recovering page",
  "common.route.recoveringMessage": "This module is temporarily unavailable and is recovering automatically.",
  "common.route.retryMessage": "This module is still unavailable. You can retry the current page.",
  "common.route.bootstrapFailed": "Application failed to start",
  "common.route.loginUnavailableAria": "Sign-in page temporarily unavailable",
  "common.route.loadException": "The page is temporarily unavailable.",
  "common.route.authUnavailable": "Authentication service temporarily unavailable",
  "common.route.backToMonitor": "Back to monitor",
  "common.route.openInNewTab": "Open in new tab",
  "common.route.reload": "Reload",
  "common.route.notFoundTitle": "Page not found",
  "common.route.notFoundDescription": "Check the address or return to the monitoring page.",
  "common.localeName.zh-CN": "中文",
  "common.localeName.en": "English",
  "common.systemState.healthy": "Healthy",
  "common.systemState.disabled": "Disabled",
  "common.systemState.paused": "Paused",
  "common.systemState.starting": "Starting",
  "common.systemState.adapting": "Adapting",
  "common.systemState.verifying": "Verifying",
  "common.systemState.recordingStopped": "Recording stopped",
  "common.systemState.recovering": "Recovering",
  "common.systemState.warmingUp": "Warming up",
  "common.systemState.degraded": "Degraded",
  "common.systemState.disconnected": "Disconnected",
  "common.systemState.unavailable": "Unavailable",
  "common.systemState.unknown": "Unknown",
  "common.ui.matches": "Matches",
  "common.ui.state": "State",
  "common.ui.queryFailed": "Query failed",
  "common.ui.applyingChanges": "Applying changes",
  "common.ui.availableExchanges": "Available exchanges",
  "common.ui.spotTurnover": "Spot turnover",
  "common.ui.perpetualTurnover": "Perpetual turnover",
  "common.ui.openInterest": "Open interest notional (USD)",
  "common.ui.noMinimum": "No minimum",
  "common.ui.excludedExchanges": "Excluded exchanges",
  "common.ui.excludedCombinations": "Excluded combinations",
  "common.ui.excludedMarkets": "Excluded markets",
  "common.ui.viewFilters": "View filters",
  "common.ui.assetSearch": "Asset search",
  "common.ui.useCurrentView": "Use current view",
  "common.ui.liquidityPerLeg": "Liquidity per leg",
  "common.ui.listOptions": "List options",
  "common.ui.sectionHelp": "{{title}} help",
  "common.ui.displayProperties": "Display properties",
  "common.ui.reset": "Reset",
  "common.ui.ordering": "Ordering",
  "common.ui.direction": "Direction",
  "common.ui.sortDirection": "Sort direction",
  "common.ui.descending": "Descending",
  "common.ui.ascending": "Ascending",
  "common.ui.asset": "Asset",
  "common.ui.spotBasis": "Spot basis",
  "common.ui.spread": "Spread",
  "common.ui.highestPositiveRate": "Highest positive rate",
  "common.ui.lowestNegativeRate": "Lowest negative rate",
  "common.ui.matrixOptions": "Matrix options",
  "common.ui.rateNormalization": "Rate normalization",
  "common.ui.period": "Period",
  "common.ui.exchanges": "Exchanges",
  "common.ui.search": "Search",
  "common.ui.clear": "Clear",
  "common.ui.status": "Status",
  "common.ui.affected": "Affected",
  "common.ui.summary": "Summary",
  "common.ui.instruments": "Instruments",
  "common.ui.excludedStructures": "Excluded structures",
  "common.ui.clearFilters": "Clear filters",
  "common.ui.displayOptions": "Display options",
  "common.ui.tagLiquidityHelp": "Applies only to this tag and its alerts and ZML Trade rules. A missing leg is not restricted; missing required data does not pass.",
  "common.ui.marketExclusionsHelp": "Selected exclusions reject either leg, independently of market pairing.",
  "common.ui.volume24h": "24h traded value (USD)",
  "common.ui.excludeStructure": "Exclude {{structure}}",
  "common.ui.unavailableView": "This view is unavailable or you do not have access. Currently showing “{{name}}”.",
  "common.ui.filter": "Filter",
  "common.ui.searchFilters": "Search filters",
  "common.ui.addFilter": "Add filter…",
  "common.ui.noMatchingFilters": "No matching filters",
  "common.languageSearch": "Search languages",
  "common.languageChangeFailed": "Could not change language. Your previous language is still active.",
  "common.languageNoResults": "No matching languages",
  "common.bootstrap.title": "Page modules could not load",
  "common.bootstrap.recovering": "The service is recovering. This page will reload when its modules are available.",
  "common.bootstrap.unavailable": "Page modules are still unavailable. You can reload this page.",
  "common.bootstrap.reload": "Reload",
  "common.sidebar.autoHide": "Auto-hide sidebar",
  "common.sidebar.keepOpen": "Keep sidebar open",
  "pairs.quoteFamilies.title": "Quote families",
  "pairs.quoteFamilies.description": "Quote assets in the same family can pair with each other.",
  "pairs.quoteFamilies.states.loading": "Loading quote families…",
  "pairs.quoteFamilies.states.unavailable": "Quote families unavailable",
  "pairs.quoteFamilies.states.empty": "No quote families",
  "pairs.quoteFamilies.states.emptyDescription": "Create the first family, then add quote assets that belong together.",
  "pairs.quoteFamilies.states.noMembers": "No members in this family.",
  "pairs.quoteFamilies.memberCount": "{{count}} members",
  "pairs.quoteFamilies.itemCount": "{{count}} items",
  "pairs.quoteFamilies.addToFamily": "Add to {{family}}",
  "pairs.quoteFamilies.addAssetAria": "Add an asset to {{family}}",
  "pairs.quoteFamilies.assetPlaceholder": "Enter a quote asset, for example USDT",
  "pairs.quoteFamilies.newFamily.label": "New family",
  "pairs.quoteFamilies.newFamily.hint": "The name is normalized to lowercase.",
  "pairs.quoteFamilies.newFamily.aria": "New quote family name",
  "pairs.quoteFamilies.newFamily.placeholder": "Enter a family name, for example usd",
  "pairs.quoteFamilies.unassigned.columns.asset": "Quote asset",
  "pairs.quoteFamilies.unassigned.columns.markets": "Markets",
  "pairs.quoteFamilies.unassigned.columns.actions": "Add to family",
  "pairs.quoteFamilies.unassigned.title": "Unassigned quote assets",
  "pairs.quoteFamilies.unassigned.aria": "Unassigned quote assets",
  "pairs.quoteFamilies.unassigned.noMarkets": "No markets",
  "pairs.quoteFamilies.unassigned.empty": "Every observed quote asset is assigned.",
  "pairs.quoteFamilies.unassigned.description": "An unassigned asset pairs only with the exact same asset. Adding it to a family enables family-level pairing.",
  "pairs.quoteFamilies.actions.deleteFamily": "Delete quote family {{family}}",
  "pairs.quoteFamilies.actions.moveUnassigned": "Move {{coin}} to unassigned",
  "pairs.quoteFamilies.actions.addMember": "Add member",
  "pairs.quoteFamilies.actions.createFamily": "Create family",
  "pairs.quoteFamilies.actions.return": "Return",
  "pairs.quoteFamilies.actions.add": "Add",
  "pairs.quoteFamilies.actions.returnAssetAria": "Return {{asset}} to {{family}}",
  "pairs.quoteFamilies.actions.addAssetToFamilyAria": "Add {{asset}} to {{family}}",
  "pairs.quoteFamilies.actions.restoreDefaults": "Restore defaults",
  "pairs.quoteFamilies.actions.discard": "Discard changes",
  "pairs.quoteFamilies.announcements.removedMember": "{{coin}} moved from {{family}} to unassigned.",
  "pairs.quoteFamilies.announcements.addedMember": "{{coin}} added to {{family}}.",
  "pairs.quoteFamilies.announcements.deletedFamily": "{{count}} members from {{family}} moved to unassigned.",
  "pairs.quoteFamilies.announcements.defaultsLoaded": "The default quote-family draft is loaded.",
  "pairs.quoteFamilies.disabled.saving": "Quote families are being saved. Wait for completion.",
  "pairs.quoteFamilies.disabled.unchanged": "Quote families have no unsaved changes.",
  "pairs.quoteFamilies.errors.title": "Action failed",
  "pairs.quoteFamilies.errors.load": "Quote families could not be loaded, so these parameters are not a verified configuration.",
  "pairs.quoteFamilies.errors.previewConflict": "Another administrator updated the configuration. Your draft is preserved; compare it with the latest state and preview again.",
  "pairs.quoteFamilies.errors.preview": "The quote-family preview failed. Nothing was submitted.",
  "pairs.quoteFamilies.errors.saveConflict": "Another administrator saved first. Your draft is preserved; compare it with the latest state and preview again.",
  "pairs.quoteFamilies.errors.save": "Quote families could not be saved, and the backend did not confirm the live update.",
  "pairs.quoteFamilies.confirm.title": "Confirm quote-family changes",
  "pairs.quoteFamilies.confirm.description": "This change removes {{removed}} pairs and adds {{added}} pairs (net {{net}}). It takes effect immediately in monitor tables.",
  "pairs.quoteFamilies.confirm.save": "Confirm and save",
  "pairs.matching.title": "Identity & units",
  "pairs.matching.description": "Read-only pairing identity, display labels, and units.",
  "pairs.matching.help": "Read the in-memory canonicalAssetId pairing key, display and CMC labels, price and size units, and term facts. Price never decides identity.",
  "pairs.matching.instrumentCount": "{{count}} instruments",
  "pairs.matching.tableAria": "Instrument resolution list",
  "pairs.matching.status.all": "All statuses",
  "pairs.matching.status.confirmed": "Confirmed",
  "pairs.matching.status.pending": "Pending decision",
  "pairs.matching.status.conflict": "Conflict",
  "pairs.matching.status.manual": "Manual fact",
  "pairs.matching.assetKey.nameFallback": "Name match · {{value}}",
  "pairs.matching.term.spot": "Spot",
  "pairs.matching.term.perpetual": "Perpetual",
  "pairs.matching.term.future": "Dated future",
  "pairs.matching.term.futureAt": "Dated future · {{time}}",
  "pairs.matching.states.snapshotChanged": "Data is updating. A consistent result is being restored.",
  "pairs.matching.states.snapshotMismatch": "Control-plane snapshots are not fully synchronized",
  "pairs.matching.states.epochMismatch": "List runtime epoch {{list}}; status runtime epoch {{status}}",
  "pairs.matching.states.loading": "Loading identity and unit facts…",
  "pairs.matching.states.listUnavailable": "Identity and unit list unavailable",
  "pairs.matching.states.empty": "No matching instruments",
  "pairs.matching.states.emptyDescription": "Adjust the search or filter.",
  "pairs.matching.errors.status": "Resolver runtime status could not be read.",
  "pairs.matching.errors.list": "The identity and unit list could not be read.",
  "pairs.matching.errors.detail": "Runtime resolution facts for this instrument could not be read.",
  "pairs.matching.search.toolbarAria": "Search instrument resolutions",
  "pairs.matching.search.inputAria": "Search instruments",
  "pairs.matching.search.placeholder": "Instrument ID / pairing key / display or CMC label",
  "pairs.matching.search.statusAria": "Resolution status filter",
  "pairs.matching.columns.instrument": "Instrument / pairing key",
  "pairs.matching.columns.display": "Display / AssetKey label",
  "pairs.matching.columns.exposure": "Exposure / term",
  "pairs.matching.columns.priceUnit": "Price unit",
  "pairs.matching.columns.sizeUnit": "Size unit",
  "pairs.matching.columns.identity": "Identity",
  "pairs.matching.columns.term": "Term",
  "pairs.matching.detail.fallbackTitle": "Instrument identity & units",
  "pairs.matching.detail.description": "Pairing uses local asset identity. Display names and CMC labels do not decide it.",
  "pairs.matching.detail.help": "canonicalAssetId is the only runtime pairing key. displaySlug, CMC, and AssetKey are display labels and evidence only.",
  "pairs.matching.detail.closeAria": "Close identity and unit details",
  "pairs.matching.detail.loading": "Loading resolution details…",
  "pairs.matching.detail.unavailable": "Resolution details unavailable",
  "pairs.matching.pagination.aria": "Instrument resolution pagination",
  "pairs.matching.pagination.status": "Page {{page}} / {{pages}} · {{total}} total",
  "pairs.matching.pagination.updating": "The list is updating.",
  "pairs.matching.runtime.loading": "Loading runtime snapshot…",
  "pairs.matching.runtime.unavailable": "Runtime snapshot unavailable",
  "pairs.matching.runtime.aria": "Resolution runtime summary",
  "pairs.matching.runtime.epoch": "Runtime epoch {{epoch}}",
  "pairs.matching.runtime.total": "Total {{count}}",
  "pairs.matching.runtime.pending": "Pending {{count}}",
  "pairs.matching.runtime.conflicts": "Conflicts {{count}}",
  "pairs.matching.runtime.manual": "Manual facts {{count}}",
  "pairs.matching.runtime.pairable": "Pairable {{count}}",
  "pairs.matching.row.expand": "Expand {{instrument}}",
  "pairs.matching.row.collapse": "Collapse {{instrument}}",
  "pairs.matching.facts.canonicalAssetId": "canonicalAssetId (pairing key)",
  "pairs.matching.facts.displaySlug": "displaySlug (display)",
  "pairs.matching.facts.assetKey": "AssetKey / CMC label",
  "pairs.matching.facts.runtimeEpoch": "runtime epoch",
  "pairs.matching.facts.representation": "representation",
  "pairs.matching.facts.exposureTerm": "Exposure / term",
  "pairs.matching.facts.listingIncarnation": "listing incarnation",
  "pairs.matching.facts.discoveryFingerprint": "discovery fingerprint",
  "pairs.matching.facts.priceUnit": "Price unit",
  "pairs.matching.facts.sizeUnit": "Size unit",
  "pairs.matching.facts.unitEffectiveFrom": "Unit effective from",
  "pairs.matching.facts.identitySource": "Identity source",
  "pairs.matching.facts.identityReason": "Identity basis",
  "pairs.matching.facts.unitSource": "Unit source",
  "pairs.matching.facts.revisions": "evidence / semantic / unit revision",
  "pairs.matching.evidence.title": "Identity evidence",
  "pairs.matching.evidence.empty": "No identity facts",
  "pairs.matching.evidence.emptyDescription": "No identity facts yet.",
  "pairs.matching.evidence.tableAria": "Identity fact list",
  "pairs.matching.evidence.source": "Source",
  "pairs.matching.evidence.reference": "Reference",
  "pairs.matching.evidence.observedAt": "Observed at",
  "pairs.overview.title": "Trading-pair overview",
  "pairs.overview.unsaved": "Unsaved",
  "pairs.overview.pairCount": "{{count}} pairs",
  "pairs.overview.states.loading": "Loading trading-pair information…",
  "pairs.overview.states.unavailable": "Trading-pair overview unavailable",
  "pairs.overview.states.loadFailed": "Trading-pair information could not be loaded. Try again.",
  "pairs.overview.metrics.activePairs": "Active pairs",
  "pairs.overview.metrics.activeInstruments": "Active instruments",
  "pairs.overview.discovery.title": "Discovery control",
  "pairs.overview.discovery.controlsAria": "Trading-pair discovery controls",
  "pairs.overview.discovery.interval": "Discovery interval",
  "pairs.overview.discovery.intervalError": "Enter an integer from 30 through 3600.",
  "pairs.overview.discovery.intervalHint": "Allowed range: 30–3600 seconds.",
  "pairs.overview.discovery.seconds": "sec",
  "pairs.overview.discovery.running": "Discovering",
  "pairs.overview.discovery.runningEllipsis": "Discovering…",
  "pairs.overview.discovery.runNow": "Discover now",
  "pairs.overview.pairClassControl.title": "Pair-class control",
  "pairs.overview.pairClassControl.description": "Choose the pair classes included in monitoring and discovery.",
  "pairs.overview.pairClassControl.updating": "Updating",
  "pairs.overview.pairClasses.spot_swap": "Spot × perpetual",
  "pairs.overview.pairClasses.swap_swap": "Perpetual × perpetual",
  "pairs.overview.pairClasses.spot_spot": "Spot × spot",
  "pairs.overview.pairClasses.spot_future": "Spot × dated future",
  "pairs.overview.pairClasses.swap_future": "Perpetual × dated future",
  "pairs.overview.pairClasses.future_future": "Dated future × dated future",
  "pairs.overview.actions.reset": "Reset",
  "pairs.overview.actions.refresh": "Refresh",
  "pairs.overview.actions.refreshing": "Refreshing…",
  "pairs.overview.disabled.refreshingOverview": "The pair overview is refreshing. Wait for completion.",
  "pairs.overview.disabled.refreshingDiscovery": "Exchange discovery is refreshing. Wait for completion.",
  "pairs.overview.disabled.savingMarkets": "Market switches are being saved. Wait for completion.",
  "pairs.overview.disabled.savingInterval": "The discovery interval is being saved. Wait for completion.",
  "pairs.overview.disabled.togglingClass": "A pair class is being updated. Wait for completion.",
  "pairs.overview.disabled.invalidInterval": "The discovery interval must be an integer from 30 through 3600 seconds.",
  "pairs.overview.disabled.intervalUnchanged": "The discovery interval has no changes to save.",
  "pairs.overview.disabled.noIntervalDraft": "The discovery interval has no unsaved changes.",
  "pairs.overview.disabled.intervalDraftPending": "Save or reset the pending discovery interval first.",
  "pairs.overview.disabled.marketDraftPending": "Apply or reset the pending market-switch draft first.",
  "pairs.overview.disabled.noMarketReset": "There are no market-switch changes to reset.",
  "pairs.overview.disabled.noMarketChanges": "There are no market-switch changes to apply.",
  "pairs.overview.disabled.exchangeDisabled": "This exchange is disabled globally. Enable it in Exchange management first.",
  "pairs.overview.disabled.marketDisabled": "This market is disabled. Enable the market before selecting settlement assets.",
  "pairs.overview.disabled.marketGenerationConflict": "Backend market capabilities changed. Reset the draft and edit from the latest configuration.",
  "pairs.overview.refreshResult.totalInstruments": "Total instruments",
  "pairs.overview.refreshResult.added": "New listings",
  "pairs.overview.refreshResult.removed": "Delisted",
  "pairs.overview.refreshResult.detailsAria": "Instrument refresh details",
  "pairs.overview.columns.exchange": "Exchange",
  "pairs.overview.columns.market": "Market",
  "pairs.overview.columns.count": "Count",
  "pairs.overview.columns.change": "Change",
  "pairs.overview.columns.spot": "Spot",
  "pairs.overview.columns.perpetual": "Perpetual",
  "pairs.overview.columns.lastDiscovery": "Last discovery",
  "pairs.overview.columns.status": "Status",
  "pairs.overview.venues.title": "Instrument distribution by exchange",
  "pairs.overview.venues.description": "Review exchange connections and market coverage, then apply market-switch drafts in one batch.",
  "pairs.overview.venues.unsavedSuffix": "changes unsaved",
  "pairs.overview.venues.draftAria": "Exchange market-switch draft",
  "pairs.overview.venues.pendingChanges": "{{count}} market-switch changes ready to apply",
  "pairs.overview.venues.confirmed": "Market switches match the backend-confirmed state",
  "pairs.overview.venues.draftDescription": "Draft mode; nothing has been submitted yet.",
  "pairs.overview.venues.applying": "Applying…",
  "pairs.overview.venues.apply": "Apply and save",
  "pairs.overview.venues.empty": "No exchange data",
  "pairs.overview.venues.emptyDescription": "Waiting for the backend to connect exchanges.",
  "pairs.overview.venues.tableAria": "Exchange-market enablement status",
  "pairs.overview.venues.settlementsAria": "{{market}} settlement assets",
  "pairs.overview.venues.generationConflict": "Backend market capabilities changed while you were editing. This draft is preserved but cannot be applied; reset it and reselect.",
  "pairs.overview.venues.changedUnsaved": "Changed, not yet saved",
  "pairs.overview.refreshOutcome.partialTitle": "Discovery partially complete",
  "pairs.overview.refreshOutcome.convergingTitle": "Discovery still converging",
  "pairs.overview.refreshOutcome.partialDescription": "This run confirmed {{refreshed}}/{{expected}} markets. {{instruments}} authoritative instruments are visible; connectors will continue converging unfinished markets.",
  "pairs.overview.refreshOutcome.noMarketsTitle": "No enabled markets to refresh",
  "pairs.overview.refreshOutcome.noMarketsDescription": "The enabled-market set is empty; the system still shows {{instruments}} authoritative instruments.",
  "pairs.overview.refreshOutcome.completedTitle": "Discovery refresh complete",
  "pairs.overview.refreshOutcome.completedDescription": "Refreshed {{refreshed}} markets and found {{instruments}} instruments.",
  "pairs.overview.notices.refreshFailed.title": "Refresh failed",
  "pairs.overview.notices.refreshFailed.message": "The last successful trading-pair overview remains visible.",
  "pairs.overview.notices.classUpdated.title": "Pair classes updated",
  "pairs.overview.notices.classUpdated.message": "The backend confirmed the pair classes and applied the live update.",
  "pairs.overview.notices.classStatsFailed.title": "Pair classes updated; statistics refresh failed",
  "pairs.overview.notices.classStatsFailed.message": "The pair classes are live, but current statistics could not be refreshed. Try again shortly.",
  "pairs.overview.notices.classConflictReloaded.title": "Configuration updated",
  "pairs.overview.notices.classConflictReloaded.message": "Another administrator changed the pair classes. The latest configuration is loaded; repeat your action.",
  "pairs.overview.notices.classConflictFailed.title": "Configuration conflict",
  "pairs.overview.notices.classConflictFailed.message": "Another administrator changed the configuration, and the latest state could not be loaded. Try again shortly.",
  "pairs.overview.notices.classUpdateFailed.title": "Pair-class update failed",
  "pairs.overview.notices.classUpdateFailed.message": "The backend did not confirm the pair-class change.",
  "pairs.overview.notices.intervalUpdated.title": "Discovery interval updated",
  "pairs.overview.notices.intervalUpdated.message": "The interval is saved and the runtime parameter is live.",
  "pairs.overview.notices.intervalConflictReloaded.title": "Discovery interval updated elsewhere",
  "pairs.overview.notices.intervalConflictReloaded.message": "Another administrator saved a new interval. The authoritative baseline is refreshed and your local input remains; review it before saving again.",
  "pairs.overview.notices.intervalConflictFailed.title": "Discovery-interval conflict",
  "pairs.overview.notices.intervalConflictFailed.message": "Another administrator changed the interval, and the latest value could not be loaded. Try again shortly.",
  "pairs.overview.notices.intervalSaveFailed.title": "Discovery interval not saved",
  "pairs.overview.notices.intervalSaveFailed.message": "The current runtime parameter is unchanged.",
  "pairs.overview.notices.intervalReset.title": "Draft reset",
  "pairs.overview.notices.intervalReset.message": "The unsaved discovery interval now matches the current runtime value.",
  "pairs.overview.notices.discoveryOverviewFailed.completedTitle": "Discovery complete; overview refresh failed",
  "pairs.overview.notices.discoveryOverviewFailed.completedMessage": "The backend confirmed discovery completion, but the latest overview could not be refreshed. Try again shortly.",
  "pairs.overview.notices.discoveryOverviewFailed.partialTitle": "Discovery converging; overview refresh failed",
  "pairs.overview.notices.discoveryOverviewFailed.partialMessage": "The backend returned partial progress and unfinished markets will continue converging; the latest overview is temporarily unavailable.",
  "pairs.overview.notices.discoveryFailed.title": "Discovery failed",
  "pairs.overview.notices.discoveryFailed.message": "The backend did not return a discovery result.",
  "pairs.overview.notices.marketsUpdated.title": "Market switches updated",
  "pairs.overview.notices.marketsUpdated.message": "The market configuration is saved. Disabled entries were drained; enabled entries will continue updating their live runtime state.",
  "pairs.overview.notices.marketStatsFailed.title": "Market switches updated; statistics refresh failed",
  "pairs.overview.notices.marketStatsFailed.message": "The switches are live, but current instrument statistics could not be refreshed. Try again shortly.",
  "pairs.overview.notices.marketConflict.title": "Market configuration updated elsewhere",
  "pairs.overview.notices.marketConflict.message": "Another administrator submitted a new configuration. The authoritative baseline is refreshed and your local draft remains; review it before saving again.",
  "pairs.overview.notices.marketUpdateFailed.title": "Market switches not fully confirmed",
  "pairs.overview.notices.marketUpdateFailed.message": "The actual configuration was re-read, but the backend did not confirm that this runtime transition completed in full.",
  "pairs.overview.notices.marketReset.title": "Draft reset",
  "pairs.overview.notices.marketReset.message": "Unsaved market-switch changes now match the backend-confirmed state.",
  "linkage.time.unknown": "Unknown",
  "linkage.time.justNow": "Just now",
  "linkage.time.milliseconds": "{{value}} ms",
  "linkage.time.seconds": "{{value}} sec",
  "linkage.time.minutes": "{{value}} min",
  "linkage.time.hours": "{{value}} hr",
  "linkage.time.minutesSeconds": "{{minutes}} min {{seconds}} sec",
  "linkage.time.daysHours": "{{days}} d {{hours}} hr",
  "linkage.time.hoursMinutes": "{{hours}} hr {{minutes}} min",
  "linkage.time.minutesAgo": "{{value}} min ago",
  "linkage.time.hoursAgo": "{{value}} hr ago",
  "linkage.time.daysAgo": "{{value}} d ago",
  "linkage.pair.title": "Pair drilldown",
  "linkage.pair.description": "The server precisely recomputes persisted facts on demand to show score evolution and the current-window scatter. No score history is stored.",
  "linkage.pair.inputPlaceholder": "Pair ID (number)",
  "linkage.pair.actions.drillDown": "Drill down",
  "linkage.pair.errors.notFound": "This pair currently has no usable linkage-window facts.",
  "linkage.pair.errors.server": "The server could not compute the drilldown. Try again.",
  "linkage.pair.errors.load": "Load failed",
  "linkage.pair.states.idleTitle": "Enter a pair number",
  "linkage.pair.states.idleDescription": "Enter a pair number to view score evolution and the current window.",
  "linkage.pair.states.loading": "Recomputing the 7-day score evolution for {{id}}…",
  "linkage.pair.states.errorTitle": "Drilldown failed",
  "linkage.pair.metrics.score": "Current score",
  "linkage.pair.metrics.representedMinutes": "Represented window minutes",
  "linkage.pair.metrics.representedValue": "{{minutes}} ({{share}}%)",
  "linkage.pair.metrics.validBuckets": "Valid window buckets",
  "linkage.pair.metrics.fingerprint": "Segment fingerprint",
  "linkage.pair.curveTitle": "Score evolution (15-minute steps · curve resolution matches bucket resolution)",
  "linkage.pair.scatter.title": "Current-window scatter",
  "linkage.pair.scatter.aria": "Linkage-window scatter",
  "linkage.pair.scatter.xAxis": "x: spread state →",
  "linkage.pair.scatter.yAxis": "↑ y: net hourly funding",
  "linkage.pair.scatter.description": "Upper-right/lower-left move together; upper-left/lower-right move inversely. Fainter points are older.",
  "linkage.pair.scatter.help": "Points aligned toward the upper-right/lower-left produce a more positive score (same direction); upper-left/lower-right produce a more negative score (inverse). Disorder trends toward 0. More transparent points are older and carry less weight.",
  "linkage.overview.summary.status": "Operation",
  "linkage.overview.summary.ready": "Available",
  "linkage.overview.summary.delayed": "Update delayed",
  "linkage.overview.summary.attention": "Data checks need attention",
  "linkage.overview.summary.attentionDescription": "Data checks found an issue. The latest results and coverage remain below.",
  "linkage.overview.title": "Funding linkage",
  "linkage.overview.description": "How funding and spread move together.",
  "linkage.overview.errors.load": "Load failed",
  "linkage.overview.states.loading": "Loading linkage overview…",
  "linkage.overview.states.stale": "Refresh failed; the previous snapshot is still shown: {{error}}",
  "linkage.overview.states.unavailable": "Linkage overview temporarily unavailable",
  "linkage.overview.states.recoveringTitle": "Linkage scoring engine recovering",
  "linkage.overview.states.recoveringDescription": "The scoring window is being restored from historical data. Progress updates automatically.",
  "linkage.overview.states.warmStart": "Showing the last published score from {{age}}. The scoring window is recovering and updates automatically.",
  "linkage.overview.metrics.lastPublished": "Last published",
  "linkage.overview.metrics.lastPublishedValue": "{{time}} ({{age}})",
  "linkage.overview.metrics.lastPublishedDescription": "Published once per minute",
  "linkage.overview.metrics.latency": "End-to-end latency (fact → score)",
  "linkage.overview.metrics.latencyDescription": "Delivery {{delivery}} + full-book scoring {{score}}",
  "linkage.overview.metrics.coverage": "Window coverage",
  "linkage.overview.metrics.coverageDescription": "Scored {{scored}} / measurable {{measurable}} / full book {{total}} pairs",
  "linkage.overview.metrics.accuracy": "Accuracy",
  "linkage.overview.metrics.selfCheckValue": "Self-check ≤{{points}} pts",
  "linkage.overview.metrics.calibratedValue": "Calibrated ±{{points}} pts",
  "linkage.overview.metrics.selfCheckDescription": "{{count}} pairs recomputed hourly · {{time}} · calibration ±{{points}}",
  "linkage.overview.metrics.calibratedDescription": "Offline calibration p90 ±{{points}} pts · first self-check about 3 minutes after startup",
  "linkage.overview.formula.title": "Formula and interpretation",
  "linkage.overview.formula.description": "The score answers one question: over the past 7 days, did spread state and net funding state move monotonically in the same (+) or inverse (−) direction?",
  "linkage.overview.formula.waiver": "Bridge waiver remaining {{duration}}",
  "linkage.overview.formula.scoreBefore": "+100 is strong same-direction, −100 is strong inverse, and absolute value is strength; ",
  "linkage.overview.formula.zeroMeaning": "0 only means the current window is not measurable",
  "linkage.overview.formula.scoreAfter": ", not proof of no relationship.",
  "linkage.overview.formula.details": "Formula details (parameters · x/y definitions · accuracy calibration)",
  "linkage.overview.formula.hardWindow": "Hard window",
  "linkage.overview.formula.hardWindowValue": "Last {{days}} days ({{minutes}} minutes); weight is always 0 outside the window",
  "linkage.overview.formula.timeWeight": "Time weight",
  "linkage.overview.formula.timeWeightValue": "Weight halves every {{hours}} hours: about one-half at 3 days and one-fifth at the 7-day edge",
  "linkage.overview.formula.representation": "Representation",
  "linkage.overview.formula.representationValue": "{{buckets}} × {{minutes}}-minute buckets plus the live current bucket",
  "linkage.overview.formula.identity": "Segment identity",
  "linkage.overview.formula.identityValue": "The window is recomputed when its meaning changes",
  "linkage.overview.formula.calibrationDescription": ": {{note}} — mean ±{{mae}} pts, p90 ±{{p90}} pts. This error comes from the 15-minute bucket representation and is the decided speed/accuracy tradeoff.",
  "linkage.overview.coverage.title": "Window coverage distribution",
  "linkage.overview.coverage.description": "{{count}} full-book pairs grouped by window completeness",
  "linkage.overview.coverage.note": "Gaps can occur when funding or spread observations are unavailable. New combinations build coverage as valid data arrives; use the latest update and operation status to assess availability.",
  "linkage.overview.coverage.rows.full": "Full window (≥90%)",
  "linkage.overview.coverage.rows.high": "Mostly full (50–90%)",
  "linkage.overview.coverage.rows.low": "Sparse (<50%)",
  "linkage.overview.coverage.rows.insufficient": "Insufficient samples (contract score 0)",
  "linkage.overview.coverage.rows.zeroVariance": "No series variance (contract score 0)",
  "linkage.overview.storage.title": "Data and storage",
  "linkage.overview.storage.spread1m": "1-minute fact table",
  "linkage.overview.storage.spread15m": "15-minute bucket table",
  "linkage.overview.storage.clickhouseTable": "ClickHouse table",
  "linkage.overview.storage.listingIncarnations": "Listing-incarnation ledger",
  "linkage.overview.storage.calibratedEvidence": "Calibrated unit evidence",
  "linkage.overview.storage.postgresTable": "PostgreSQL table",
  "linkage.overview.storage.clickhouseValue": "{{bytes}} · {{rows}} rows · latest bucket {{age}}",
  "linkage.overview.storage.postgresValue": "{{bytes}} · {{rows}} rows",
  "linkage.overview.storage.unavailable": "Storage inventory unavailable; retrying automatically every 60 seconds.",
  "linkage.overview.integrity.title": "Data integrity",
  "linkage.overview.integrity.issue": "Issues present",
  "linkage.overview.integrity.mirrorMismatches": "Mirror mismatches",
  "linkage.overview.integrity.invalidFingerprints": "Invalid fingerprint rows",
  "linkage.overview.integrity.dirtyBuckets": "Dirty buckets pending repair",
  "linkage.overview.integrity.duplicatePublished": "Duplicate publications",
  "linkage.overview.integrity.segmentResets": "Segment resets {{count}}",
  "linkage.overview.integrity.retired": "Retired {{count}}",
  "linkage.overview.integrity.ingested": "Ingested {{count}} rows",
  "linkage.overview.integrity.recovery": "Latest recovery {{time}} ({{age}}), duration {{duration}}: {{windowRows}} window rows + {{tailRows}} current-bucket tail rows, stale-fingerprint rate {{staleRatio}}. A sustained rise indicates identity drift in retained data.",
  "ipRules.denyTitle": "IP denylist",
  "ipRules.allowTitle": "IP allowlist",
  "ipRules.ruleCount": "{{count}} rules",
  "ipRules.whitelistNote": "When enabled, only listed IPs may sign in and access APIs; existing realtime connections are revalidated too. CIDR notation is supported, such as 192.168.0.0/16.",
  "ipRules.states.loading": "Loading IP rules…",
  "ipRules.states.unavailable": "IP controls unavailable",
  "ipRules.states.empty": "No rules",
  "ipRules.states.emptyDescription": "{{title}} currently has no rules.",
  "ipRules.errors.readFailed": "IP rules and security configuration could not be loaded.",
  "ipRules.errors.missingConfig": "Security configuration is missing.",
  "ipRules.errors.policyFailed": "The backend did not confirm the policy change.",
  "ipRules.errors.addFailed": "The backend did not confirm the new rule.",
  "ipRules.errors.deleteFailed": "The backend did not confirm rule deletion.",
  "ipRules.notice.policyUpdatedTitle": "IP controls updated",
  "ipRules.notice.policyUpdated": "The policy save result was returned. Use the runtime application status above to confirm when it is effective.",
  "ipRules.notice.conflictTitle": "Another administrator updated the IP policy",
  "ipRules.notice.conflict": "The current policy was reloaded. Review it before trying again.",
  "ipRules.notice.policyFailedTitle": "IP control update failed",
  "ipRules.notice.addedTitle": "Rule added",
  "ipRules.notice.addedAllow": "{{ip}} was added to the allowlist.",
  "ipRules.notice.addedDeny": "{{ip}} was added to the denylist.",
  "ipRules.notice.addFailedTitle": "IP rule could not be added",
  "ipRules.notice.deletedTitle": "Rule deleted",
  "ipRules.notice.deletedAllow": "{{ip}} was removed from the allowlist.",
  "ipRules.notice.deletedDeny": "{{ip}} was removed from the denylist.",
  "ipRules.notice.deleteFailedTitle": "IP rule could not be deleted",
  "ipRules.confirm.allowTitle": "Delete IP allowlist rule",
  "ipRules.confirm.denyTitle": "Delete IP denylist rule",
  "ipRules.confirm.allowDescription": "Delete “{{ip}}”? While the allowlist is enabled, sign-in, API access, and realtime connections from this address may be denied.",
  "ipRules.confirm.denyDescription": "Delete “{{ip}}”? This address will no longer be constrained by this denylist rule.",
  "ipRules.status.updating": "Updating",
  "ipRules.status.enabledEmpty": "Enabled · no rules",
  "ipRules.status.empty": "No rules",
  "ipRules.status.enabled": "Enabled",
  "ipRules.status.disabled": "Not enabled",
  "ipRules.toggleAria": "{{title}}: {{status}}",
  "ipRules.whitelist.enabledEmpty": "The allowlist is enabled but has no allow rules. Sign-in and API access may be denied from every IP.",
  "ipRules.whitelist.empty": "The allowlist has no allow rules. Add at least one trusted IP or CIDR before enabling it to avoid locking out sign-in and API access.",
  "ipRules.tableAria": "{{title}} rules",
  "ipRules.columns.ip": "IP / CIDR",
  "ipRules.columns.note": "Note",
  "ipRules.columns.actions": "Actions",
  "ipRules.disabled.mutation": "Another IP control change is in progress. Wait for it to finish.",
  "ipRules.disabled.ruleMutation": "A security-rule change is in progress. Wait for it to finish.",
  "ipRules.disabled.enterIp": "Enter an IP address or CIDR.",
  "ipRules.actions.delete": "Delete rule",
  "ipRules.actions.deleting": "Deleting…",
  "ipRules.actions.deleteAria": "Delete rule for {{ip}}",
  "ipRules.actions.addRule": "Add rule",
  "ipRules.actions.add": "Add",
  "ipRules.actions.adding": "Adding…",
  "ipRules.add.aria": "Add IP rule",
  "ipRules.add.ipLabel": "IP or CIDR",
  "ipRules.add.ipPlaceholder": "For example, 203.0.113.10 or 203.0.113.0/24",
  "ipRules.add.notePlaceholder": "Optional",
  "announcementManagement.dataAsOf": "Data as of {{time}}",
  "announcementManagement.actions.saveSection": "Save current section",
  "announcementManagement.actions.reloadDiscardAria": "Reload and discard the current announcement-settings draft",
  "announcementManagement.actions.reloadAria": "Reload announcement settings",
  "announcementManagement.actions.reloadDiscard": "Discard draft and reload",
  "announcementManagement.actions.refresh": "Refresh",
  "announcementManagement.states.loadingSettings": "Loading announcement settings…",
  "announcementManagement.states.forbidden": "No announcement-management permission",
  "announcementManagement.states.settingsUnavailable": "Announcement settings unavailable",
  "announcementManagement.states.loadingCatalogue": "Loading source catalog…",
  "announcementManagement.states.catalogueForbidden": "No permission to read the source catalog",
  "announcementManagement.states.catalogueUnavailable": "Source catalog unavailable",
  "announcementManagement.states.loadingHealth": "Loading source-health snapshot…",
  "announcementManagement.states.healthUnavailable": "Source health unavailable",
  "announcementManagement.errors.conflict": "Another administrator updated these settings. The current version updates automatically; review your preserved draft before saving again.",
  "announcementManagement.errors.unknown": "Unknown error",
  "announcementManagement.errors.catalogueChanged": "The source catalog changed and is being aligned. Review your collection choices before saving.",
  "announcementManagement.errors.collectionNotLoaded": "Collection settings have not loaded.",
  "announcementManagement.errors.invalidEndpoint": "Every DeepL endpoint needs a name and URL. New endpoints also require an API key.",
  "announcementManagement.errors.staleSettings": "Settings refresh failed. Showing the latest successful snapshot from {{time}}: {{error}}",
  "announcementManagement.errors.permissionLost": "The current account no longer has announcement-management permission. The latest snapshot remains available for review, but all editing is disabled.",
  "announcementManagement.errors.noCatalogue": "No authoritative catalog has been received.",
  "announcementManagement.errors.staleCatalogue": "Source-catalog refresh failed. Candidates and runtime status remain from {{time}}: {{error}}",
  "announcementManagement.errors.catalogueMismatch": "Settings and the source catalog use different revisions. Saving is paused while the catalog aligns; your draft is preserved.",
  "announcementManagement.errors.noSnapshot": "No snapshot available",
  "announcementManagement.errors.staleHealth": "Status refresh failed. Showing the latest successful snapshot from {{time}}: {{error}}",
  "announcementManagement.collection.title": "Official sources",
  "announcementManagement.collection.description": "Choose which sources in this server-provided list should be collected. Status badges show what is currently running.",
  "announcementManagement.collection.revision": "Catalog r{{revision}}",
  "announcementManagement.collection.empty": "The authoritative server catalog explicitly returned no supported sources.",
  "announcementManagement.collection.enableAria": "Enable announcement collection for {{source}}",
  "announcementManagement.collection.disableAria": "Disable announcement collection for {{source}}",
  "announcementManagement.collection.running": "Running",
  "announcementManagement.collection.notRunning": "Not running",
  "announcementManagement.collectionState.live": "Collecting",
  "announcementManagement.collectionState.starting": "Starting",
  "announcementManagement.collectionState.degraded": "Degraded",
  "announcementManagement.collectionState.interrupted": "Interrupted",
  "announcementManagement.collectionState.disabled": "Disabled",
  "announcementManagement.publicationState.recent": "Recently published",
  "announcementManagement.publicationState.quiet": "Publication quiet",
  "announcementManagement.publicationState.old": "No recent items",
  "announcementManagement.publicationState.none": "No publication record",
  "announcementManagement.providerState.ready": "Ready",
  "announcementManagement.providerState.quotaExhausted": "Quota exhausted",
  "announcementManagement.providerState.invalid": "Invalid credential",
  "announcementManagement.providerState.unreachable": "Unreachable",
  "announcementManagement.providerState.unchecked": "Awaiting validation",
  "announcementManagement.providerState.unconfigured": "Not configured",
  "announcementManagement.disabledReason.venueDisabled": "The exchange is disabled. Enable it to collect from this source.",
  "announcementManagement.disabledReason.sourceOverride": "This source is disabled in collection settings.",
  "announcementManagement.disabledReason.unknown": "This source is disabled; the reason is currently unrecognized.",
  "announcementManagement.health.title": "Source runtime status",
  "announcementManagement.health.description": "Collection and publication are shown separately. Having no recent announcements does not mean collection has failed.",
  "announcementManagement.health.empty": "The authoritative catalog currently has no source entries.",
  "announcementManagement.health.attentionPriority": "Needs attention",
  "announcementManagement.health.supported": "Supported",
  "announcementManagement.health.unsupported": "Unsupported",
  "announcementManagement.health.configured": "Configured",
  "announcementManagement.health.unconfigured": "Not configured",
  "announcementManagement.health.effective": "Effective",
  "announcementManagement.health.ineffective": "Not effective",
  "announcementManagement.health.consecutiveFailures": "{{count}} consecutive failures",
  "announcementManagement.health.lastAttempt": "Latest attempt: ",
  "announcementManagement.health.lastSuccess": "Latest success: ",
  "announcementManagement.health.latestDocument": "Latest document: ",
  "announcementManagement.health.constituentsAria": "Health constituents for {{source}}",
  "announcementManagement.health.failedCount": " · {{count}} failed",
  "announcementManagement.health.coverage": "Coverage: {{items}}",
  "announcementManagement.health.coverageGaps": "Coverage gaps: {{items}}",
  "announcementManagement.constituents.transport": "Transport",
  "announcementManagement.constituents.schema": "Schema",
  "announcementManagement.constituents.pagination": "Pagination",
  "announcementManagement.constituents.detail": "Detail",
  "announcementManagement.constituents.translation": "Translation",
  "announcementManagement.constituents.coverage": "Coverage",
  "announcementManagement.localization.title": "Announcement translation",
  "announcementManagement.localization.description": "Translate announcements with DeepL. Keys stay masked; provider errors remain available.",
  "announcementManagement.localization.enabled": "Enable localization",
  "announcementManagement.localization.endpointsTitle": "DeepL endpoint pool",
  "announcementManagement.localization.endpointsDescription": "Leave a replacement key empty to keep the saved key. Changes take effect after saving.",
  "announcementManagement.localization.addEndpoint": "Add endpoint",
  "announcementManagement.localization.empty": "No DeepL endpoints configured. This is the authoritative empty state while localization is off.",
  "announcementManagement.localization.endpointFallback": "Endpoint {{index}}",
  "announcementManagement.localization.enableAria": "Enable {{name}}",
  "announcementManagement.localization.deleteAria": "Delete {{name}}",
  "announcementManagement.localization.delete": "Delete",
  "announcementManagement.localization.endpointName": "Endpoint name",
  "announcementManagement.localization.currentKey": "Current key",
  "announcementManagement.localization.configured": "Configured",
  "announcementManagement.localization.unconfigured": "Not configured",
  "announcementManagement.localization.previewLabel": "Key preview for {{name}}",
  "announcementManagement.localization.replaceKey": "Replace key (leave empty to keep)",
  "announcementManagement.localization.apiKey": "API key",
  "announcementManagement.localization.clearAfterSave": "Clear when saved",
  "announcementManagement.localization.keepExisting": "Leave empty to keep the existing key",
  "announcementManagement.localization.showKey": "Show new key for {{name}}",
  "announcementManagement.localization.hideKey": "Hide new key for {{name}}",
  "announcementManagement.localization.clearKey": "Clear key",
  "announcementManagement.localization.lastValidated": "Latest validation: {{time}}",
  "announcementManagement.localization.usage": "Usage: {{count}}{{limit}}",
  "announcementManagement.localization.unknown": "Unknown",
  "announcementManagement.policy.title": "Delisting alerts",
  "announcementManagement.policy.description": "Only verified official delistings enter alerts and notifications.",
  "announcementManagement.policy.help": "Only delistings with a verified official source, exact pair, product type, and final delisting time enter alerts, pair badges, and notifications. Ordinary announcements are unaffected.",
  "announcementManagement.policy.enabled": "Enable delisting alerts",
  "cmcIdentity.description": "Manage asset reference data, API keys, and refresh frequency.",
  "cmcIdentity.help": "CMC supplies identity and metadata evidence only; it never decides pairing. API keys are stored in the database with protected reveal, automatic rotation, and request distribution.",
  "cmcIdentity.retry.ready": "Ready to retry now",
  "cmcIdentity.retry.after": "Retry available in {{age}}",
  "cmcIdentity.status.loading": "Loading",
  "cmcIdentity.status.failed": "Load failed",
  "cmcIdentity.status.unknown": "Unknown",
  "cmcIdentity.status.refreshing": "Refreshing",
  "cmcIdentity.status.configured": "Configured",
  "cmcIdentity.status.unconfigured": "Not configured",
  "cmcIdentity.actions.refresh": "Collect data again",
  "cmcIdentity.actions.refreshing": "Collecting…",
  "cmcIdentity.actions.clearCache": "Clear cache",
  "cmcIdentity.actions.clearing": "Clearing…",
  "cmcIdentity.actions.manageKeys": "Manage CMC keys",
  "cmcIdentity.actions.discard": "Discard changes",
  "cmcIdentity.actions.saveSettings": "Save parameters",
  "cmcIdentity.actions.saving": "Saving…",
  "cmcIdentity.states.loading": "Loading CMC and resolution status…",
  "cmcIdentity.states.unavailable": "CMC data-source status unavailable",
  "cmcIdentity.errors.readFailed": "Could not load CMC and identity/unit resolution status.",
  "cmcIdentity.errors.refreshTitle": "Status refresh failed",
  "cmcIdentity.errors.staleSnapshot": "The current status could not be refreshed. The latest successful snapshot remains visible.",
  "cmcIdentity.feedback.refreshComplete": "CMC catalogs and the identity projection have both refreshed.",
  "cmcIdentity.feedback.refreshConverging": "CMC catalogs refreshed; the identity projection is still converging in the background. Current pairing is unaffected.",
  "cmcIdentity.feedback.refreshIncomplete": "The CMC refresh did not complete. Review cache errors and backoff status.",
  "cmcIdentity.feedback.refreshFailed": "The CMC refresh request failed.",
  "cmcIdentity.feedback.clearComplete": "CMC cache cleared.",
  "cmcIdentity.feedback.clearFailed": "CMC cache could not be cleared.",
  "cmcIdentity.failure.derivativesCoverage": "Neither the CMC derivatives catalog nor exchange catalog contains this exchange identifier. This is a coverage gap and will not retry.",
  "cmcIdentity.failure.exchangeCoverage": "The CMC exchange catalog does not currently contain this exchange identifier. This is a coverage gap and will not retry.",
  "cmcIdentity.failure.safetyBudget": "All CMC keys are currently unusable. Latest reason: key “{{key}}” would exceed the monthly safety budget (projected {{projected}}, safety limit {{limit}}).",
  "cmcIdentity.failure.forbidden": "Some reference data is outside the current CMC plan or permissions. Check the key's plan.",
  "cmcIdentity.failure.rateLimited": "CMC has rate-limited requests. The system will retry automatically later.",
  "cmcIdentity.failure.timeout": "The CMC request timed out. Previous data remains available and the system will retry automatically.",
  "cmcIdentity.failure.upstream": "Some CMC reference data could not be updated. Retry later.",
  "cmcIdentity.failure.line": "{{cache}}: {{reason}}",
  "cmcIdentity.failure.latestTitle": "Latest CMC request issue",
  "cmcIdentity.coverage.title": "Exchange or market not yet covered by CMC",
  "cmcIdentity.coverage.description": "These markets have no unique CMC mapping. Current pairing is unchanged.",
  "cmcIdentity.coverage.help": "These entries have no unique mapping in the CMC catalog. They are coverage gaps, not request failures, and consume no retry credits. The latest successful snapshot and in-memory pairing remain active.",
  "cmcIdentity.coverage.more": "{{count}} more CMC coverage gaps.",
  "cmcIdentity.retryFailures.title": "Some reference data is unavailable",
  "cmcIdentity.retryFailures.description": "Each failing cache key backs off independently. The latest successful snapshot and in-memory pairing remain active.",
  "cmcIdentity.retryFailures.retry": " ({{count}} consecutive failures; {{retry}})",
  "cmcIdentity.retryFailures.more": "{{count}} more failing cache keys.",
  "cmcIdentity.keyPool.title": "CMC API key pool",
  "cmcIdentity.keyPool.description": "Requests rotate across keys and switch when one is rate-limited.",
  "cmcIdentity.keyPool.help": "Keys are stored in the database and revealed on demand. Requests rotate across all usable keys and switch automatically when one key is rate-limited or exhausts its budget.",
  "cmcIdentity.keyPool.summary": "Key status: {{enabled}} / {{total}} enabled · {{ready}} ready · {{attention}} cooling down or failing",
  "cmcIdentity.refreshSettings.title": "CMC refresh parameters",
  "cmcIdentity.refreshSettings.description": "Shorter refresh uses CMC credits faster. Live monitor quotes are unaffected.",
  "cmcIdentity.refreshSettings.help": "Controls how often data is fetched again from CMC and therefore the rate of credit consumption. Live market data on the monitor comes from exchange connectors and is independent of these parameters. Changes apply immediately after saving.",
  "cmcIdentity.refreshSettings.catalogLabel": "Catalog refresh interval (hours)",
  "cmcIdentity.refreshSettings.catalogHint": "Shorter intervals use more credits. Default: 24 hours.",
  "cmcIdentity.refreshSettings.detailLabel": "Detail refresh interval (hours)",
  "cmcIdentity.refreshSettings.detailHint": "Affects asset-detail pages. Default: 1 hour.",
  "cmcIdentity.refreshSettings.validation.catalog": "The catalog refresh interval must be between 1 and 168 hours.",
  "cmcIdentity.refreshSettings.validation.detail": "The detail refresh interval must be between 5 minutes and 48 hours.",
  "cmcIdentity.refreshSettings.validation.order": "The detail refresh interval cannot exceed the catalog refresh interval.",
  "cmcIdentity.refreshSettings.saved": "Refresh parameters saved and applied immediately.",
  "cmcIdentity.refreshSettings.saveFailed": "Save failed.",
  "cmcIdentity.refreshSettings.saveFailedWithReason": "Save failed: {{reason}}",
  "cmcIdentity.usage.title": "Total monthly credit usage",
  "cmcIdentity.usage.updatedAt": "Updated {{time}}",
  "cmcIdentity.usage.used": "<used>{{used}}</used> used / <total>{{total}}</total> total",
  "cmcIdentity.usage.remainingPrefix": "· Remaining",
  "cmcIdentity.usage.budgetPrefix": "<percent>{{percent}}%</percent> safety-budget remainder",
  "cmcIdentity.datasets.title": "Cache datasets",
  "cmcIdentity.datasets.description": "Inspect cache age, items, and latest errors by family.",
  "cmcIdentity.datasets.unavailable": "Cache status is temporarily unavailable.",
  "cmcIdentity.datasets.empty": "No CMC cache data yet.",
  "cmcIdentity.datasets.errorCount": "{{count}} errors",
  "cmcIdentity.datasets.healthy": "Healthy",
  "cmcIdentity.datasets.age": "{{age}} ago",
  "cmcKeyPool.title": "Manage CMC key pool",
  "cmcKeyPool.unnamed": "Unnamed",
  "cmcKeyPool.stats.aria": "CMC key statistics",
  "cmcKeyPool.stats.total": "{{count}} total",
  "cmcKeyPool.stats.enabled": "{{count}} enabled",
  "cmcKeyPool.stats.configured": "{{count}} configured",
  "cmcKeyPool.stats.ready": "{{count}} ready",
  "cmcKeyPool.stats.attention": "{{count}} cooling down or failing",
  "cmcKeyPool.toolbar.aria": "Search and filter CMC keys",
  "cmcKeyPool.toolbar.searchAria": "Search CMC keys",
  "cmcKeyPool.toolbar.showSearch": "Show search value",
  "cmcKeyPool.toolbar.hideSearch": "Hide search value",
  "cmcKeyPool.toolbar.searchPlaceholder": "Name / key",
  "cmcKeyPool.toolbar.filterAria": "Filter CMC key status",
  "cmcKeyPool.filters.all": "All statuses",
  "cmcKeyPool.filters.attention": "Cooldown / issue",
  "cmcKeyPool.status.ready": "Ready",
  "cmcKeyPool.status.cooldown": "Cooldown",
  "cmcKeyPool.status.error": "Issue",
  "cmcKeyPool.status.unverified": "Unverified",
  "cmcKeyPool.status.unsaved": "Unsaved",
  "cmcKeyPool.status.disabled": "Disabled",
  "cmcKeyPool.status.unconfigured": "Not configured",
  "cmcKeyPool.status.testing": "Testing…",
  "cmcKeyPool.disabled.testing": "A test is running. Wait for it to finish.",
  "cmcKeyPool.disabled.saving": "The key pool is being saved. Wait for it to finish.",
  "cmcKeyPool.actions.testAll": "Test all",
  "cmcKeyPool.actions.testingAll": "Testing {{done}}/{{total}}",
  "cmcKeyPool.actions.import": "Bulk import",
  "cmcKeyPool.actions.add": "Add key",
  "cmcKeyPool.actions.enableSelected": "Enable selected",
  "cmcKeyPool.actions.disableSelected": "Disable selected",
  "cmcKeyPool.actions.deleteSelected": "Delete selected",
  "cmcKeyPool.actions.confirmImport": "Import keys",
  "cmcKeyPool.actions.save": "Save key pool",
  "cmcKeyPool.actions.delete": "Delete key",
  "cmcKeyPool.actions.collapse": "Collapse",
  "cmcKeyPool.actions.edit": "Edit key",
  "cmcKeyPool.pagination.aria": "CMC key pagination",
  "cmcKeyPool.selection.selected": "{{count}} selected",
  "cmcKeyPool.selection.pageAria": "Select CMC keys on the current page",
  "cmcKeyPool.selection.page": "Select current page",
  "cmcKeyPool.selection.pageCount": "{{count}} keys",
  "cmcKeyPool.import.descriptionBefore": "Enter one key per line, optionally as",
  "cmcKeyPool.import.descriptionAfter": "(separated by a comma, pipe, or tab).",
  "cmcKeyPool.import.aria": "Bulk import CMC API keys",
  "cmcKeyPool.import.placeholder": "8a5adb2dbace4d449c9812ce0bc8a17f\n399f9100...,backup-10",
  "cmcKeyPool.import.show": "Show bulk-import keys",
  "cmcKeyPool.import.hide": "Hide bulk-import keys",
  "cmcKeyPool.import.preview": "Preview: {{count}} entries",
  "cmcKeyPool.import.defaultLabel": "CMC import #{{index}}",
  "cmcKeyPool.columns.name": "Key name",
  "cmcKeyPool.columns.enabled": "Enabled",
  "cmcKeyPool.columns.status": "Status",
  "cmcKeyPool.columns.monthlyCredits": "Monthly credits",
  "cmcKeyPool.columns.actions": "Actions",
  "cmcKeyPool.states.empty": "No CMC keys yet. Select Add key or Bulk import.",
  "cmcKeyPool.states.noMatches": "No matching keys.",
  "cmcKeyPool.listAria": "CMC keys",
  "cmcKeyPool.note": "Changes take effect when saved. If another administrator edits the pool at the same time, reload before saving again.",
  "cmcKeyPool.confirm.deleteTitle": "Delete CMC key",
  "cmcKeyPool.confirm.deleteDescription": "Delete “{{label}}”? The key will be removed from the pool after saving.",
  "cmcKeyPool.confirm.bulkDeleteTitle": "Delete CMC keys",
  "cmcKeyPool.confirm.bulkDeleteDescription": "Delete the {{count}} selected keys? The change takes effect after saving.",
  "cmcKeyPool.feedback.noValidImport": "No valid keys were parsed.",
  "cmcKeyPool.feedback.imported": "Imported {{count}} keys. Save the pool to apply them.",
  "cmcKeyPool.feedback.importedWithSkipped": "Imported {{count}} keys and skipped {{skipped}} duplicates. Save the pool to apply them.",
  "cmcKeyPool.feedback.enterKeyFirst": "Enter a key before testing",
  "cmcKeyPool.feedback.testFailed": "Test failed",
  "cmcKeyPool.feedback.noTestableKeys": "There are no configured, enabled keys to test.",
  "cmcKeyPool.feedback.tested": "Tested {{count}} keys.",
  "cmcKeyPool.feedback.copied": "API key copied.",
  "cmcKeyPool.feedback.copyFailed": "Copy failed. Check browser clipboard permission.",
  "cmcKeyPool.feedback.savedUsageIssue": "The key pool was saved, but usage refresh reported an issue: {{error}}",
  "cmcKeyPool.feedback.saved": "The key pool was saved and usage refreshed for each key.",
  "cmcKeyPool.feedback.saveFailed": "Save failed",
  "cmcKeyPool.row.unnamed": "Unnamed key {{index}}",
  "cmcKeyPool.row.accessibleName": "CMC key {{index}}: {{name}}",
  "cmcKeyPool.row.selectAria": "Select {{name}}",
  "cmcKeyPool.row.nameAria": "Key name: {{name}}",
  "cmcKeyPool.row.namePlaceholder": "Key name or note",
  "cmcKeyPool.row.enableAria": "Enable {{name}}",
  "cmcKeyPool.row.statusDetailAria": "View status details for {{name}}",
  "cmcKeyPool.row.testAria": "Test {{name}}",
  "cmcKeyPool.row.copyTooltip": "Copy the key for {{name}}",
  "cmcKeyPool.row.copyAria": "Copy the key for {{name}}",
  "cmcKeyPool.row.deleteTooltip": "Delete {{name}}",
  "cmcKeyPool.row.deleteAria": "Delete {{name}}",
  "cmcKeyPool.row.secretLabel": "API key for {{name}}",
  "cmcKeyPool.row.budgetRemaining": "· Budget remaining {{count}}",
  "cmcKeyPool.row.rpm": "· RPM {{count}}",
  "cmcKeyPool.row.requests": "· Requests {{total}} / failed {{failed}}",
  "cmcKeyPool.row.unsavedNote": "· Unsaved: saving will verify the key and collect usage",
  "cmcKeyPool.row.collapseEditAria": "Collapse editor for {{name}}",
  "cmcKeyPool.row.editAria": "Edit {{name}}",
  "cmcKeyPool.row.apiKey": "API key",
  "cmcKeyPool.row.apiKeyAria": "API key: {{name}}",
  "cmcKeyPool.row.apiKeyPlaceholder": "CMC API key",
  "cmcKeyPool.row.showSecret": "Show API key for {{name}}",
  "cmcKeyPool.row.hideSecret": "Hide API key for {{name}}",
  "networkEgress.title": "Network egress",
  "networkEgress.description": "Changes outbound egress for selected exchanges only.",
  "networkEgress.help": "Route all outbound connections for selected exchanges only. The frontend, API, database, operations, and ordinary system traffic stay on the local route.",
  "networkEgress.readyCount": "Ready {{ready}}/{{total}}",
  "networkEgress.running": "Running",
  "networkEgress.secondsShort": "{{value}} sec",
  "networkEgress.states.loading": "Loading network-egress configuration and runtime status…",
  "networkEgress.states.unavailable": "Network-egress status unavailable",
  "networkEgress.errors.readFailed": "Network-egress status could not be read.",
  "networkEgress.errors.requestFailed": "The request failed. Try again.",
  "networkEgress.errors.refreshTitle": "Status refresh failed",
  "networkEgress.errors.staleSnapshot": "{{error}} The last successful snapshot remains visible.",
  "networkEgress.feedback.operationInProgress.title": "Operation already in progress",
  "networkEgress.feedback.operationInProgress.message": "Wait for the current network-egress operation to finish.",
  "networkEgress.feedback.acceptedTitle": "Operation accepted",
  "networkEgress.feedback.completedTitle": "Operation complete",
  "networkEgress.feedback.acceptedMany": "{{action}} accepted {{count}} concurrent operations. Status will update automatically.",
  "networkEgress.feedback.accepted": "{{action}} was accepted. Status will update automatically.",
  "networkEgress.feedback.completed": "{{action}} completed.",
  "networkEgress.feedback.failedTitle": "{{action}} failed",
  "networkEgress.feedback.gatewayInUse": "Egress server in use",
  "networkEgress.feedback.updateUnavailable": "Egress server cannot be updated",
  "networkEgress.disabled.busy": "A network-egress operation is currently running.",
  "networkEgress.disabled.activeOperation": "Another network-egress operation is already running.",
  "networkEgress.disabled.selectAssignment": "Select at least one changed egress assignment first.",
  "networkEgress.disabled.targetNotReady": "A selected target has not completed interface, tunnel, and egress-IP verification.",
  "networkEgress.actions.refresh": "Refresh",
  "networkEgress.actions.refreshing": "Refreshing…",
  "networkEgress.actions.addGateway": "Add egress server",
  "networkEgress.actions.updateGateway": "Update egress server",
  "networkEgress.actions.batchSave": "Save network egress in batch",
  "networkEgress.actions.clearSelection": "Clear selection",
  "networkEgress.actions.selectAllPending": "Select all pending changes",
  "networkEgress.actions.clearAllPending": "Clear all pending selections",
  "networkEgress.actions.install": "Install",
  "networkEgress.actions.reconcile": "Reconcile configuration",
  "networkEgress.actions.retryInstall": "Retry installation",
  "networkEgress.actions.testSsh": "Test SSH",
  "networkEgress.actions.editGateway": "Edit server",
  "networkEgress.actions.editSwitchFirst": "Edit (switch first)",
  "networkEgress.actions.disable": "Disable tunnel configuration",
  "networkEgress.actions.disableSwitchFirst": "Disable (switch first)",
  "networkEgress.actions.uninstall": "Uninstall network configuration",
  "networkEgress.actions.uninstallSwitchFirst": "Uninstall (switch first)",
  "networkEgress.actions.deleteGateway": "Delete server",
  "networkEgress.actions.deleteSwitchFirst": "Delete (switch first)",
  "networkEgress.actions.saveChanges": "Save changes",
  "networkEgress.actionLabels.test": "Test SSH for {{gateway}}",
  "networkEgress.actionLabels.install": "Install or reconcile network configuration for {{gateway}}",
  "networkEgress.actionLabels.disable": "Disable the tunnel configuration for {{gateway}}",
  "networkEgress.actionLabels.uninstall": "Uninstall network configuration for {{gateway}}",
  "networkEgress.actionLabels.delete": "Delete {{gateway}}",
  "networkEgress.columns.select": "Select",
  "networkEgress.columns.server": "Server",
  "networkEgress.columns.liveTraffic": "Live traffic",
  "networkEgress.columns.reachability": "Reachability",
  "networkEgress.columns.tunnelEgress": "Tunnel / egress",
  "networkEgress.columns.feedback": "Status feedback",
  "networkEgress.columns.actions": "Actions",
  "networkEgress.columns.exchange": "Exchange",
  "networkEgress.columns.desiredEgress": "Desired egress",
  "networkEgress.columns.effectiveEgress": "Effective egress",
  "networkEgress.columns.selectEgress": "Select egress manually",
  "networkEgress.target.local": "Local public egress",
  "networkEgress.target.unknown": "Unknown server {{id}}",
  "networkEgress.gateways.title": "Egress servers",
  "networkEgress.gateways.description": "Install and keep the tunnel on the egress host. Status comes from local observation.",
  "networkEgress.gateways.help": "Idempotently install standard WireGuard, nftables, IP forwarding, and persistent systemd configuration over private SSH. Status comes from ZML Monitor's local tunnel observations, not a custom remote agent.",
  "networkEgress.gateways.count": "{{count}} servers",
  "networkEgress.gateways.empty": "No egress servers",
  "networkEgress.gateways.emptyDescription": "Add an egress host reachable from this machine, test the connection, then install.",
  "networkEgress.gateways.tableAria": "Egress servers",
  "networkEgress.gateways.notInUse": "Not in use",
  "networkEgress.gateways.credentialMissing": "Credential missing",
  "networkEgress.gateways.fingerprint": "Fingerprint {{value}}",
  "networkEgress.gateways.trafficTotal": "Total ↓ {{rx}} · ↑ {{tx}}",
  "networkEgress.gateways.trafficTotalLabel": "Cumulative traffic",
  "networkEgress.gateways.trafficObservedLabel": "Traffic observed",
  "networkEgress.gateways.detailsExpand": "Show tunnel and traffic details for {{gateway}}",
  "networkEgress.gateways.detailsCollapse": "Hide tunnel and traffic details for {{gateway}}",
  "networkEgress.gateways.interface": "Interface",
  "networkEgress.gateways.tunnel": "Tunnel",
  "networkEgress.gateways.tunnelObservation": "Tunnel RTT {{rtt}} · observed {{time}}",
  "networkEgress.gateways.publicIp": "Public IP",
  "networkEgress.gateways.publicIpHistorical": "Public IP (historical)",
  "networkEgress.gateways.probeFailed": "Current probe failed",
  "networkEgress.gateways.probeFailedWithIp": "{{ip}} · current probe failed",
  "networkEgress.gateways.peer": "Peer",
  "networkEgress.gateways.installFailed": "Network configuration installation failed.",
  "networkEgress.gateways.noIssues": "No issues",
  "networkEgress.gateways.installAria": "Install or reconcile standard network configuration for {{gateway}}",
  "networkEgress.gateways.installing": "Installing…",
  "networkEgress.gateways.moreActionsAria": "More actions for {{gateway}}",
  "networkEgress.gateways.actionsAria": "Server actions for {{gateway}}",
  "networkEgress.gateways.usageReason": "Used by {{exchanges}}. Explicitly switch those exchanges to local or another egress first.",
  "networkEgress.assignments.title": "Exchange egress",
  "networkEgress.assignments.description": "All outbound traffic for an exchange uses one egress. A failed switch stays disconnected.",
  "networkEgress.assignments.help": "All WS, REST, SBE, FIX, announcement, and other outbound connections for each exchange use one selected egress. Switching stops the exchange, drains old connections, commits the unique mapping, and reconnects. Failure stays disconnected and never falls back silently.",
  "networkEgress.assignments.count": "{{count}} mappings",
  "networkEgress.assignments.batchAria": "Save exchange egress in batch",
  "networkEgress.assignments.selected": "{{count}} selected",
  "networkEgress.assignments.changed": "{{count}} changed",
  "networkEgress.assignments.tableAria": "Exchange network egress",
  "networkEgress.assignments.selectPendingAria": "Select pending egress for {{exchange}}",
  "networkEgress.assignments.selectEgressAria": "Select network egress for {{exchange}}",
  "networkEgress.assignments.notEffective": "Not effective (disconnected)",
  "networkEgress.assignments.exchangeDisabled": "Exchange disabled",
  "networkEgress.assignments.targetNotReady": "The target egress has not completed readiness verification",
  "networkEgress.assignments.missing": "Exchange-egress configuration missing",
  "networkEgress.assignments.missingDescription": "The backend did not return a unique egress mapping for each exchange. This page will not infer or create an implicit default.",
  "networkEgress.dialog.createTitle": "Add egress server",
  "networkEgress.dialog.editTitle": "Edit egress server",
  "networkEgress.dialog.description": "Save private connection details to install egress. The password is never echoed back.",
  "networkEgress.dialog.help": "Save private SSH connection details to test and idempotently install standard WireGuard, nftables, IP forwarding, and systemd configuration. The password is submitted only to the authenticated backend and is never returned.",
  "networkEgress.dialog.name": "Name",
  "networkEgress.dialog.namePlaceholder": "For example: Japan egress 1",
  "networkEgress.dialog.privateIp": "Private IP",
  "networkEgress.dialog.privateIpHint": "Must be reachable from ZML Monitor's private network; do not use a public address.",
  "networkEgress.dialog.sshUser": "SSH user",
  "networkEgress.dialog.sshPort": "SSH port",
  "networkEgress.dialog.password": "SSH password",
  "networkEgress.dialog.passwordStoredHint": "A password is stored. Leave blank to keep it or enter a replacement.",
  "networkEgress.dialog.passwordEditHint": "Leave blank to preserve credential status or enter a new password.",
  "networkEgress.dialog.passwordCreateHint": "Used for testing and installation; never returned.",
  "networkEgress.dialog.passwordKeepPlaceholder": "Leave blank to keep the stored password",
  "networkEgress.dialog.passwordPlaceholder": "Enter SSH password",
  "networkEgress.dialog.showPassword": "Show SSH password",
  "networkEgress.dialog.hidePassword": "Hide SSH password",
  "networkEgress.validation.name": "Enter a server name.",
  "networkEgress.validation.privateIp": "Enter a private IP.",
  "networkEgress.validation.sshUser": "Enter an SSH user.",
  "networkEgress.validation.sshPort": "The port must be an integer from 1 through 65535.",
  "networkEgress.validation.password": "A password is required when adding a server.",
  "networkEgress.confirm.batchTitle": "Save egress for {{count}} exchanges",
  "networkEgress.confirm.batchDescription": "Changes: {{changes}}. The system concurrently stops and drains selected exchange connections, commits the unique egress mappings, then rebuilds all market-data, REST, and announcement connections. This is a controlled short reconnect, not zero TCP interruption. {{publicIpSummary}}Check credential IP allowlists first. A failed target stays honestly disconnected and never falls back automatically.",
  "networkEgress.confirm.publicIps": "Confirmed target public IPs: {{ips}}. ",
  "networkEgress.confirm.noPublicIps": "Targets are local or have no verified public IP to show. ",
  "networkEgress.confirm.batchConfirm": "Save and switch",
  "networkEgress.confirm.thisGateway": "this server",
  "networkEgress.confirm.installTitle": "Install or reconcile network configuration for {{gateway}}",
  "networkEgress.confirm.installDescription": "The system verifies the host over private SSH and idempotently installs standard WireGuard, nftables, IP forwarding, and persistent systemd configuration. It deploys no ZML Monitor remote program or status endpoint. A server in use by an exchange cannot run this action.",
  "networkEgress.confirm.reconcile": "Start reconciliation",
  "networkEgress.confirm.install": "Start installation",
  "networkEgress.confirm.disableTitle": "Disable the tunnel configuration for {{gateway}}",
  "networkEgress.confirm.disableDescription": "Disable persistent WireGuard configuration locally and remotely. Only an unused server can be disabled; the system never switches exchange egress implicitly.",
  "networkEgress.confirm.disable": "Confirm disable",
  "networkEgress.confirm.uninstallTitle": "Uninstall network configuration for {{gateway}}",
  "networkEgress.confirm.uninstallDescription": "Remove ZML-Monitor-managed WireGuard, nftables, and systemd configuration over private SSH while keeping server connection details. Only an unused server can be uninstalled.",
  "networkEgress.confirm.uninstall": "Confirm uninstall",
  "networkEgress.confirm.deleteTitle": "Delete {{gateway}}",
  "networkEgress.confirm.deleteDescription": "Clean only ZML-Monitor-managed local WireGuard, routes, nftables, temporary keys, and the server record. The operation does not connect to or depend on the remote server. Remove any remote residue on that host. Only an unused server can be deleted.",
  "networkEgress.reachability.failed": "Failed",
  "networkEgress.reachability.unknown": "Unknown",
  "networkEgress.readiness.installing": "Installing",
  "networkEgress.readiness.installFailed": "Installation failed",
  "networkEgress.readiness.disabled": "Not enabled",
  "networkEgress.readiness.interfaceNotReady": "Interface not ready",
  "networkEgress.readiness.tunnelUnreachable": "Tunnel unreachable",
  "networkEgress.readiness.handshakeUnknown": "WG handshake unconfirmed",
  "networkEgress.readiness.handshakeExpired": "WG handshake expired",
  "networkEgress.readiness.ipProbeFailed": "Egress IP probe failed",
  "networkEgress.readiness.ipUnconfirmed": "Egress IP unconfirmed",
  "networkEgress.readiness.notReady": "Not ready",
  "networkEgress.installState.notInstalled": "Not installed",
  "networkEgress.installState.installing": "Installing",
  "networkEgress.installState.ready": "Installed",
  "networkEgress.installState.disabled": "Disabled",
  "networkEgress.installState.failed": "Installation failed",
  "networkEgress.installState.readyOperational": "Installed · ready",
  "networkEgress.installState.readyNotOperational": "Installed · not ready",
  "networkEgress.assignmentPhase.stable": "Stable",
  "networkEgress.assignmentPhase.switching": "Switching",
  "networkEgress.assignmentPhase.failed": "Failed",
  "networkEgress.operationPhase.queued": "Queued",
  "networkEgress.operationPhase.running": "Running",
  "networkEgress.operationPhase.succeeded": "Completed",
  "networkEgress.operationPhase.failed": "Failed",
  "networkEgress.operationPhase.superseded": "Superseded",
  "assetCatalog.title": "Asset catalog",
  "assetCatalog.description": "Open an asset to inspect instruments, units, and combinations.",
  "assetCatalog.all": "All",
  "assetCatalog.filterLabel": "Asset classification filter",
  "assetCatalog.tableAria": "Asset catalog list",
  "assetCatalog.catalogOnlyGroup": "Catalog only · not a runtime group",
  "assetCatalog.catalogData": "Catalog data",
  "assetCatalog.actions.refresh": "Refresh",
  "assetCatalog.actions.refreshing": "Refreshing…",
  "assetCatalog.errors.load": "The asset catalog could not be loaded.",
  "assetCatalog.states.loading": "Loading asset catalog…",
  "assetCatalog.states.unavailable": "Asset catalog unavailable",
  "assetCatalog.states.staleTitle": "List not updated",
  "assetCatalog.states.staleDescription": "The last snapshot remains visible with the last successfully read data.",
  "assetCatalog.states.noMatches": "No matching assets",
  "assetCatalog.states.noMatchesDescription": "No assets match the current classification and search.",
  "assetCatalog.states.empty": "No assets",
  "assetCatalog.states.emptyDescription": "Waiting for the backend to discover instruments and aggregate the catalog.",
  "assetCatalog.coverage.runtime": "Runtime assets {{count}}",
  "assetCatalog.coverage.leveraged": "Leveraged reset products {{count}}",
  "assetCatalog.coverage.security": "Structured securities {{count}}",
  "assetCatalog.coverage.cmcLabeled": "CMC identified {{count}}",
  "assetCatalog.coverage.ambiguous": "Ambiguous {{count}}",
  "assetCatalog.coverage.conflict": "Identity conflicts {{count}}",
  "assetCatalog.coverage.catalogOnly": "Catalog only {{count}}",
  "assetCatalog.classification.resolved": "Identified",
  "assetCatalog.classification.leveraged": "Leveraged reset product",
  "assetCatalog.classification.security": "Structured security",
  "assetCatalog.classification.ambiguous": "CMC ambiguous",
  "assetCatalog.classification.conflict": "Identity conflict",
  "assetCatalog.classification.unavailable": "CMC unidentified",
  "assetCatalog.search.toolbarAria": "Search asset catalog",
  "assetCatalog.search.inputAria": "Asset catalog search",
  "assetCatalog.search.placeholder": "Search asset, exchange symbol, name or CMC ID",
  "assetCatalog.search.total": "{{count}} total",
  "assetCatalog.search.matchedOfTotal": "{{matched}} of {{total}}",
  "assetCatalog.columns.asset": "Asset",
  "assetCatalog.columns.assetKey": "CMC ID",
  "assetCatalog.columns.identity": "Identity status",
  "assetCatalog.columns.name": "Name",
  "assetCatalog.columns.classification": "Classification",
  "assetCatalog.columns.rank": "CMC rank",
  "assetCatalog.columns.instruments": "Instruments",
  "assetCatalog.columns.pairs": "Pairs",
  "assetCatalog.columns.underlying": "Economic underlying",
  "assetCatalog.pagination.aria": "Asset catalog pagination",
  "assetCatalog.pagination.status": "Page {{page}} / {{pages}} · {{total}} assets",
  "assetCatalog.pagination.updating": "The asset catalog is updating.",
  "assetCatalog.group.pageCount": "{{page}} on this page / {{total}} products total",
  "assetCatalog.group.count": "{{count}} products",
  "assetCatalog.detail.title": "Asset pairing details",
  "assetCatalog.detail.runtimeDescription": "View this asset's current tradable instruments and actual combinations.",
  "assetCatalog.detail.catalogDescription": "This entry contains catalog data only and has no runtime instruments or pairs.",
  "assetCatalog.detail.instrumentCount": "Instruments {{count}}",
  "assetCatalog.detail.pairCount": "Directed combinations {{count}}",
  "assetCatalog.detail.errors.load": "Runtime pairing details could not be read.",
  "assetCatalog.detail.states.loading": "Loading in-memory pairings…",
  "assetCatalog.detail.states.unavailable": "Pairing details unavailable",
  "assetCatalog.detail.states.catalogOnly": "No runtime pairings",
  "assetCatalog.detail.states.catalogOnlyDescription": "This asset is not currently traded in the monitored markets. View its reference data below.",
  "assetCatalog.detail.states.staleTitle": "Refresh failed; showing a stale snapshot",
  "assetCatalog.detail.states.staleDescription": "Showing the last successfully loaded instruments and combinations. Retry to refresh.",
  "assetCatalog.detail.tabs.aria": "Asset pairing details",
  "assetCatalog.detail.tabs.instruments": "Instruments",
  "assetCatalog.detail.tabs.pairs": "Actual combinations",
  "assetCatalog.detail.pagination.status": "Page {{page}} / {{pages}} · {{size}} per page · {{total}} total",
  "assetCatalog.detail.actions.refresh": "Refresh pairings",
  "assetCatalog.detail.actions.coinLookup": "Coin lookup",
  "assetCatalog.detail.unit.standard": "Standard unit",
  "assetCatalog.detail.unit.multiplier": "Multiplier ×{{value}}",
  "assetCatalog.detail.instruments.empty": "No runtime instruments",
  "assetCatalog.detail.instruments.emptyDescription": "This asset has no displayable exchange instruments.",
  "assetCatalog.detail.instruments.tableAria": "Asset runtime instruments",
  "assetCatalog.detail.instruments.symbol": "Native symbol",
  "assetCatalog.detail.instruments.exchangeMarket": "Exchange / market",
  "assetCatalog.detail.instruments.rawAsset": "Raw asset name",
  "assetCatalog.detail.instruments.quoteUnit": "Quote unit",
  "assetCatalog.detail.instruments.pairingStatus": "Pairing status",
  "assetCatalog.detail.instruments.combinations": "Combinations",
  "assetCatalog.detail.instruments.pairable": "Included in pairing",
  "assetCatalog.detail.instruments.notPairable": "Not included in pairing",
  "assetCatalog.detail.opportunities.empty": "No actual combinations",
  "assetCatalog.detail.opportunities.emptyDescription": "No combinations are published under the current pair classes, quote families, and blacklist rules.",
  "assetCatalog.detail.opportunities.tableAria": "Asset actual combinations",
  "assetCatalog.detail.opportunities.class": "Class",
  "assetCatalog.detail.opportunities.direction": "Actual direction",
  "assetCatalog.detail.opportunities.id": "Opportunity ID",
  "systemParams.title": "System parameters",
  "systemParams.errors.readTitle": "Read failed",
  "systemParams.errors.readFailed": "System parameters could not be read. Check backend status and retry.",
  "systemParams.errors.refreshTitle": "System parameter refresh failed",
  "systemParams.summary.effective": "Effective value",
  "systemParams.summary.persisted": "Persisted value",
  "systemParams.summary.range": "Allowed range",
  "systemParams.editor.title": "Unified compute interval",
  "systemParams.editor.parameter": "Parameter",
  "systemParams.editor.mode": "Mode:",
  "systemParams.editor.persistence": ". Saving persists immediately and applies from the next compute batch.",
  "systemParams.editor.controlsAria": "Unified compute interval controls",
  "systemParams.editor.field": "Unified compute interval",
  "systemParams.disabled.saving": "Compute parameters are being saved. Wait for completion.",
  "systemParams.disabled.refreshFailed": "The parameter snapshot refresh failed. Refresh successfully before saving.",
  "systemParams.actions.refresh": "Refresh",
  "systemParams.actions.retry": "Retry",
  "systemParams.actions.saving": "Saving…",
  "systemParams.actions.save": "Save",
  "systemParams.feedback.error": "Action failed",
  "systemParams.feedback.saved": "Saved",
  "systemParams.details.title": "Runtime and configuration",
  "systemParams.details.overruns": "Budget overruns",
  "systemParams.details.source": "Parameter source",
  "systemParams.details.revision": "Parameter revision",
  "systemParams.details.savedAt": "Last saved",
  "systemParams.details.neverSaved": "No saved revision",
  "billingManagement.errors.signedOut": "Your session has expired. Sign in again and retry.",
  "billingManagement.errors.forbidden": "This account cannot manage billing or orders.",
  "billingManagement.pricing.title": "Pricing",
  "billingManagement.pricing.description": "Price changes apply only to new orders. Existing orders keep the amount captured at checkout.",
  "billingManagement.pricing.loading": "Loading billing configuration…",
  "billingManagement.pricing.fields.monthlyPrice": "Monthly price",
  "billingManagement.pricing.fields.maxDevices": "Concurrent signed-in devices",
  "billingManagement.pricing.fields.orderTtl": "Order validity",
  "billingManagement.pricing.units.devices": "devices",
  "billingManagement.pricing.units.minutes": "minutes",
  "billingManagement.pricing.units.seconds": "seconds",
  "billingManagement.pricing.sales.title": "Accept new orders",
  "billingManagement.pricing.sales.description": "When off, users cannot open new orders. Existing orders are unaffected.",
  "billingManagement.pricing.entitlement.title": "Stop service after expiry",
  "billingManagement.pricing.entitlement.description": "When on, accounts without an active subscription cannot see monitoring data.",
  "billingManagement.pricing.entitlement.help": "When on, accounts without an active subscription cannot use monitoring data; they can still sign in, review their subscription, and renew. When off, tiers are recorded and displayed without access enforcement.",
  "billingManagement.pricing.entitlement.warning": "Before saving, confirm that accounts needing continued access have a permanent or unexpired subscription.",
  "billingManagement.pricing.tiers.title": "Tiers",
  "billingManagement.pricing.tiers.description": "With tiers, users pick price and device count. Access still follows status and expiry.",
  "billingManagement.pricing.tiers.help": "When tiers are defined, users choose one during checkout. With no tiers, the single price and device allowance above are used. Tiers affect price and device allowance only; tier status and expiry determine access.",
  "billingManagement.pricing.receiving.title": "Payment receiving",
  "billingManagement.pricing.receiving.description": "Configure the TRC20 receiving address and payment lookup.",
  "billingManagement.pricing.receiving.address": "TRC20 receiving address",
  "billingManagement.pricing.receiving.addressPlaceholder": "34-character address beginning with T",
  "billingManagement.pricing.receiving.usdtContract": "USDT contract address",
  "billingManagement.pricing.receiving.trongridKey": "TronGrid read-only key",
  "billingManagement.pricing.receiving.optional": "Leave blank to disable",
  "billingManagement.pricing.receiving.showKey": "Show TronGrid key",
  "billingManagement.pricing.receiving.hideKey": "Hide TronGrid key",
  "billingManagement.pricing.receiving.pollInterval": "Polling interval",
  "billingManagement.pricing.receiving.addressWarning": "The receiving address has changed. An incorrect address makes every payment unrecoverable; verify it character by character before saving.",
  "billingManagement.pricing.actions.discard": "Discard changes",
  "billingManagement.pricing.actions.saving": "Saving…",
  "billingManagement.pricing.actions.savePricing": "Save pricing",
  "billingManagement.pricing.actions.saveReceiving": "Save receiving configuration",
  "billingManagement.pricing.confirmAddress.title": "Change the receiving address?",
  "billingManagement.pricing.confirmAddress.description": "New address: {{address}}\nAll subsequent orders will require payment to this address. An incorrect address makes funds unrecoverable.",
  "billingManagement.pricing.confirmAddress.confirm": "Change address",
  "billingManagement.pricing.feedback.pricingSaved": "Pricing saved. New orders use it immediately.",
  "billingManagement.pricing.feedback.receivingSaved": "Payment receiving configuration saved.",
  "billingManagement.pricing.validation.monthlyPrice": "Monthly price must be a valid number greater than 0 and less than 1,000,000.",
  "billingManagement.pricing.validation.maxDevices": "Concurrent signed-in devices must be an integer from 1 to 10.",
  "billingManagement.pricing.validation.orderTtl": "Order validity must be an integer from 5 to 1,440 minutes.",
  "billingManagement.pricing.validation.tooManyTiers": "You can define at most 12 purchase tiers.",
  "billingManagement.pricing.validation.tierIdFormat": "Tier {{position}} ID may contain only letters, numbers, underscores, and hyphens, with a maximum of 32 characters.",
  "billingManagement.pricing.validation.duplicateTierId": "Tier ID “{{id}}” is duplicated.",
  "billingManagement.pricing.validation.tierName": "Tier {{position}} name is required and cannot exceed 40 characters.",
  "billingManagement.pricing.validation.tierPrice": "Tier {{position}} monthly price must be a valid positive number.",
  "billingManagement.pricing.validation.tierDevices": "Tier {{position}} device allowance must be an integer from 1 to 10.",
  "billingManagement.pricing.validation.pollInterval": "Polling interval must be an integer from 30 to 3,600 seconds.",
  "billingManagement.pricing.errors.loadStatus": "Billing configuration could not be loaded (HTTP {{status}}).",
  "billingManagement.pricing.errors.loadFailed": "Billing configuration could not be loaded. Try again shortly.",
  "billingManagement.pricing.errors.saveConfigFailed": "Pricing could not be saved. Try again shortly.",
  "billingManagement.pricing.errors.saveReceivingFailed": "Payment receiving configuration could not be saved. Try again shortly.",
  "billingManagement.orders.title": "Orders",
  "billingManagement.orders.description": "Each payable amount includes a unique fractional suffix for automatic matching. Use manual reconciliation when an incoming payment does not match.",
  "billingManagement.orders.statusAria": "Order status",
  "billingManagement.orders.status.all": "All",
  "billingManagement.orders.status.pending": "Awaiting payment",
  "billingManagement.orders.status.paid": "Received",
  "billingManagement.orders.status.expired": "Expired",
  "billingManagement.orders.status.cancelled": "Cancelled",
  "billingManagement.orders.errors.loadStatus": "Orders and payment receipts could not be loaded (HTTP {{status}}).",
  "billingManagement.orders.errors.loadFailed": "Orders and payment receipts could not be loaded. Try again shortly.",
  "billingManagement.orders.errors.settleFailed": "The order could not be reconciled. Try again shortly.",
  "billingManagement.orders.feedback.settled": "Payment confirmed and the subscription for {{username}} was extended.",
  "billingManagement.orders.accountFallback": "this account",
  "billingManagement.orders.stale": "Showing the last successfully loaded records.",
  "billingManagement.orders.filteredEmpty.title": "No orders with this status",
  "billingManagement.orders.filteredEmpty.description": "Choose another status to view other orders.",
  "billingManagement.orders.loading": "Loading orders…",
  "billingManagement.orders.empty.title": "No orders",
  "billingManagement.orders.empty.description": "Orders appear here after a user checks out.",
  "billingManagement.orders.table.aria": "Order list",
  "billingManagement.orders.table.account": "Account",
  "billingManagement.orders.table.duration": "Duration",
  "billingManagement.orders.table.amount": "Amount due (USDT)",
  "billingManagement.orders.table.status": "Status",
  "billingManagement.orders.table.createdAt": "Created",
  "billingManagement.orders.table.actions": "Actions",
  "billingManagement.orders.months": "{{count}} months",
  "billingManagement.orders.months_one": "{{count}} month",
  "billingManagement.orders.months_other": "{{count}} months",
  "billingManagement.orders.actions.manualSettle": "Reconcile manually",
  "billingManagement.orders.settleDialog.title": "Confirm receipt of this payment?",
  "billingManagement.orders.settleDialog.targetChanged": "This order has changed. Close this dialog and review the current order.",
  "billingManagement.orders.settleDialog.description": "Confirming immediately extends <username>{{username}}</username> by <months>{{months}}</months> months. First verify on-chain that <amount>{{amount}} USDT</amount> has arrived.",
  "billingManagement.orders.settleDialog.confirm": "Confirm receipt",
  "billingManagement.receipts.title": "Unmatched receipts",
  "billingManagement.receipts.description": "On-chain transfers that could not be matched to an order. Modified amounts, late transfers, and duplicate payments appear here.",
  "billingManagement.receipts.loading": "Loading payment receipts…",
  "billingManagement.receipts.empty.title": "No receipts need attention",
  "billingManagement.receipts.empty.description": "No incoming payments currently require manual review.",
  "billingManagement.receipts.status.unmatched": "Unmatched",
  "billingManagement.receipts.status.matched": "Matched",
  "billingManagement.receipts.table.aria": "Unmatched payment receipts",
  "billingManagement.receipts.table.txHash": "Transaction hash",
  "billingManagement.receipts.table.amount": "Amount (USDT)",
  "billingManagement.receipts.table.status": "Status",
  "billingManagement.receipts.table.fromAddress": "Sender address",
  "billingManagement.receipts.table.observedAt": "Received",
  "billingManagement.tiers.fields.id": "Tier ID",
  "billingManagement.tiers.fields.name": "Display name",
  "billingManagement.tiers.fields.monthlyPrice": "Monthly price · USDT",
  "billingManagement.tiers.fields.devices": "Devices",
  "billingManagement.tiers.standardName": "Standard",
  "billingManagement.tiers.deleteAria": "Delete tier {{tier}}",
  "billingManagement.tiers.identityWarning": "Once an order uses a tier ID, do not change or reuse it: historical orders still point to that ID, so changing it rewrites the meaning of issued receipts. Deleting a tier does not affect existing subscribers; their current entitlement remains until expiry.",
  "billingManagement.tiers.add": "Add tier",
  "systemManagement.deferred.observabilityLoading": "Loading subscription and traffic observability…",
  "systemManagement.deferred.observabilityUnavailable": "Subscription and traffic observability could not be loaded. Try again.",
  "systemManagement.deferred.paramsTitle": "System parameters",
  "systemManagement.format.uptime.seconds": "{{seconds}} sec",
  "systemManagement.format.uptime.minutes": "{{minutes}} min {{seconds}} sec",
  "systemManagement.format.uptime.hours": "{{hours}} hr {{minutes}} min",
  "systemManagement.format.relative.seconds": "{{count}} sec ago",
  "systemManagement.format.relative.minutes": "{{count}} min ago",
  "systemManagement.format.relative.hours": "{{count}} hr ago",
  "systemManagement.format.relative.days": "{{count}} d ago",
  "systemManagement.format.streamType.bookTicker": "Top of book",
  "systemManagement.format.streamType.markPrice": "$t(zml:zml.metric.mark_price)",
  "systemManagement.format.streamType.funding": "Funding",
  "systemManagement.format.streamType.ticker24h": "24h ticker",
  "systemManagement.format.streamType.other": "Other",
  "systemManagement.format.ingestEvent.connected": "Connected",
  "systemManagement.format.ingestEvent.disconnected": "Disconnected",
  "systemManagement.format.ingestEvent.reconnecting": "Reconnecting",
  "systemManagement.format.ingestEvent.error": "Error",
  "systemManagement.format.ingestEvent.degraded": "Degraded",
  "systemManagement.format.ingestEvent.restored": "Restored",
  "systemManagement.format.ingestEvent.subscribed": "Subscribed",
  "systemManagement.format.ingestEvent.recovered": "Message flow restored",
  "systemManagement.format.ingestEvent.watchdog_stalled": "Watchdog stalled",
  "systemManagement.format.ingestEvent.symbol_stale_repair": "Single-symbol refresh",
  "systemManagement.format.invalidReason.none": "None",
  "systemManagement.format.invalidReason.long_stale": "Long-leg freshness issue",
  "systemManagement.format.invalidReason.short_stale": "Short-leg freshness issue",
  "systemManagement.format.invalidReason.legs_desynced": "Legs out of sync",
  "systemManagement.format.invalidReason.spread_out_of_range": "Spread beyond sanity bound",
  "systemManagement.format.historyReason.recordingStopped": "New history recording is stopped; saved data remains available",
  "systemManagement.format.historyReason.rollupRepair": "Higher intervals are being rebuilt from 1-minute data",
  "systemManagement.format.historyReason.storeUnavailable": "History store unavailable",
  "systemManagement.format.historyReason.spread1mMissing": "1-minute rollup missing",
  "systemManagement.format.historyReason.spread5mMissing": "5-minute rollup missing",
  "systemManagement.format.historyReason.spread15mMissing": "15-minute rollup missing",
  "systemManagement.format.historyReason.spread30mMissing": "30-minute rollup missing",
  "systemManagement.format.historyReason.spread1hMissing": "1-hour rollup missing",
  "systemManagement.format.historyReason.spread1dMissing": "1-day rollup missing",
  "systemManagement.format.historyReason.recording": "History recording, rollups, and queries are healthy",
  "systemManagement.format.historyReason.degraded": "The history pipeline is degraded",
  "systemManagement.format.historyReason.unavailable": "The history pipeline is unavailable",
  "systemManagement.page.backendUnavailable": "Backend unavailable",
  "systemManagement.page.viewportReadFailed": "Viewport data-plane diagnostics could not be read; metrics may be stale.",
  "systemManagement.page.statusReadFailed": "System status could not be read.",
  "systemManagement.page.paramsReadFailed": "Realtime compute parameters could not be read.",
  "systemManagement.page.checkBackend": "Check whether zml-monitor is running.",
  "systemManagement.page.refresh": "Refresh",
  "systemManagement.page.refreshing": "Refreshing…",
  "systemManagement.page.refreshFailed": "System status refresh failed",
  "systemManagement.page.retainedSnapshot": "The last successful snapshot remains visible: {{error}}",
  "systemManagement.page.publishTitle": "Query publication overview",
  "systemManagement.page.publishDescription": "Whether publishing is keeping up, and whether it needs attention.",
  "systemManagement.page.validation.integerMilliseconds": "Enter a valid whole number of milliseconds.",
  "systemManagement.page.validation.millisecondRange": "Enter a value from {{min}} to {{max}} ms.",
  "systemManagement.page.feedback.connectorDegraded": "{{venue}} was placed in manual pause.",
  "systemManagement.page.feedback.connectorRestored": "{{venue}} was restored to operation.",
  "systemManagement.page.errors.computeConflict": "Another operator updated the configuration. The authoritative baseline has refreshed; review the current input and save again.",
  "systemManagement.page.errors.publishConflict": "Another operator updated publication settings. The latest authoritative baseline has loaded and your local input remains; review it and save again.",
  "systemManagement.page.errors.saveFailed": "Save failed. Check backend status and retry.",
  "systemManagement.page.errors.connectorRefreshFailed": "The {{venue}} action was submitted, but connector status could not be refreshed.",
  "systemManagement.page.errors.connectorActionFailed": "The {{venue}} action failed. Check backend status or the audit log.",
  "systemManagement.overview.view": "View",
  "systemManagement.overview.resource.sampling": "Sampling CPU",
  "systemManagement.overview.resource.shared": "Shared runtime",
  "systemManagement.overview.resource.dedicated": "Dedicated threads",
  "systemManagement.overview.resource.coverage": "CPU coverage",
  "systemManagement.overview.resource.hotThread": "Hot thread {{thread}}{{cpu}}",
  "systemManagement.overview.healthTitle": "Pipeline health",
  "systemManagement.overview.health.ingest": "Market ingestion",
  "systemManagement.overview.health.ingestDescription": "{{connected}} online / {{disconnected}} disconnected",
  "systemManagement.overview.health.compute": "Realtime compute",
  "systemManagement.overview.health.computeDescription": "{{commit}} ms commit · {{interval}} ms interval",
  "systemManagement.overview.health.publish": "Query publication",
  "systemManagement.overview.health.publishDescription": "{{sessions}} WS sessions",
  "systemManagement.overview.health.sharedRuntime": "Shared async runtime",
  "systemManagement.overview.health.sharedRuntimeDescription": "Tokio workers · {{count}} native tasks in flight",
  "systemManagement.overview.health.history": "Historical data",
  "systemManagement.overview.metrics.uptime": "Uptime",
  "systemManagement.overview.metrics.memory": "Memory (RSS)",
  "systemManagement.overview.metrics.exchanges": "Exchanges",
  "systemManagement.overview.metrics.combinations": "Combinations",
  "systemManagement.overview.metrics.shards": "Shards",
  "systemManagement.overview.runtime.title": "Runtime",
  "systemManagement.overview.runtime.startedAt": "Started",
  "systemManagement.overview.runtime.orchestrator": "Orchestrator state",
  "systemManagement.overview.announcements.title": "Announcement ingestion",
  "systemManagement.overview.announcements.pipeline": "Native detail pipeline",
  "systemManagement.overview.announcements.ready": "Ready",
  "systemManagement.overview.announcements.idle": "Idle",
  "systemManagement.overview.announcements.queue": "Queued / in flight",
  "systemManagement.overview.announcements.duration": "Latest native detail / Gate duration",
  "systemManagement.overview.history.title": "History and degradation",
  "systemManagement.overview.history.ingress": "History ingestion",
  "systemManagement.overview.history.running": "Running",
  "systemManagement.overview.history.stopped": "Stopped",
  "systemManagement.overview.history.outbox": "Durable pending chunks / rows / bytes",
  "systemManagement.overview.history.volatile": "In-memory batches / rows / bytes",
  "systemManagement.overview.history.critical": "Critical history-ingress failure",
  "systemManagement.overview.history.latched": "Latched; awaiting process-level action",
  "systemManagement.overview.history.status": "History status",
  "systemManagement.overview.history.degradedReasons": "Degradation reasons",
  "systemManagement.ingest.tabs.connectors": "Connections",
  "systemManagement.ingest.tabs.subscriptions": "Subscriptions & traffic",
  "systemManagement.ingest.tabs.benchmark": "Benchmark market",
  "systemManagement.ingest.tabs.suspicious": "Suspicious combinations",
  "systemManagement.ingest.actionFailed": "Action failed",
  "systemManagement.ingest.diagnostics": "Ingestion diagnostics",
  "systemManagement.ingest.disconnected": "{{count}} channels are disconnected.",
  "systemManagement.ingest.degraded": "{{count}} channels are degraded.",
  "systemManagement.benchmark.asset": "Benchmark asset",
  "systemManagement.benchmark.allAssets": "All",
  "systemManagement.benchmark.loading": "Loading benchmark market data…",
  "systemManagement.benchmark.loadFailed": "Benchmark market data could not be read.",
  "systemManagement.benchmark.stale": "Data is stale",
  "systemManagement.benchmark.noSourceTimestamp": "Source timestamp unavailable",
  "systemManagement.benchmark.snapshot": "Snapshot: {{time}}",
  "systemManagement.benchmark.refreshFailed": "Benchmark market refresh failed",
  "systemManagement.benchmark.unavailable": "Benchmark market unavailable",
  "systemManagement.benchmark.empty.title": "No market data",
  "systemManagement.benchmark.empty.description": "Confirm that the backend is ingesting the selected assets.",
  "systemManagement.benchmark.table.aria": "Benchmark market",
  "systemManagement.benchmark.table.symbol": "Symbol",
  "systemManagement.benchmark.table.exchange": "Exchange",
  "systemManagement.benchmark.table.type": "Type",
  "systemManagement.benchmark.table.bidAsk": "Best bid / ask",
  "systemManagement.benchmark.table.spread": "Spread",
  "systemManagement.benchmark.table.fundingRate": "$t(zml:zml.metric.funding_rate)",
  "systemManagement.benchmark.table.fundingCap": "Bounds",
  "systemManagement.benchmark.table.interval": "Interval",
  "systemManagement.benchmark.table.openInterest": "$t(zml:zml.metric.open_interest_notional)",
  "systemManagement.benchmark.table.volume24h": "$t(zml:zml.metric.quote_volume_24h)",
  "systemManagement.connectors.statusTitle": "Connection status",
  "systemManagement.connectors.overviewTitle": "Connector diagnostics",
  "systemManagement.connectors.currentFocus": "Current focus",
  "systemManagement.connectors.groupCount": "{{count}} groups",
  "systemManagement.connectors.refreshedAt": "Refreshed {{time}}",
  "systemManagement.connectors.waiting": "Waiting for data",
  "systemManagement.connectors.summary.groups": "Exchange / market groups",
  "systemManagement.connectors.summary.streams": "Logical streams",
  "systemManagement.connectors.summary.abnormalGroups": "Abnormal groups",
  "systemManagement.connectors.summary.abnormalStreams": "Abnormal streams",
  "systemManagement.connectors.summary.watchdog5m": "5-minute watchdog",
  "systemManagement.connectors.summary.fallback": "Compatibility placeholders",
  "systemManagement.connectors.table.aria": "Connector diagnostics overview",
  "systemManagement.connectors.table.exchange": "Exchange",
  "systemManagement.connectors.table.market": "Market",
  "systemManagement.connectors.table.overallStatus": "Overall status",
  "systemManagement.connectors.table.instrumentsStreams": "Instruments / streams",
  "systemManagement.connectors.table.transportAge": "Worst transport age",
  "systemManagement.connectors.table.businessAge": "Worst business-event age",
  "systemManagement.connectors.table.reconnectErrors": "Reconnects / errors",
  "systemManagement.connectors.table.actions": "Actions",
  "systemManagement.connectors.abnormalStreams": "{{count}} abnormal streams",
  "systemManagement.connectors.noStreamTypes": "No stream types",
  "systemManagement.connectors.latestTransport": "Latest transport {{time}}",
  "systemManagement.connectors.connectedFor": "Connected for {{duration}}",
  "systemManagement.connectors.latestBusiness": "Latest business event {{time}}",
  "systemManagement.connectors.stallWatchdog": "Stalls {{stalls}} · watchdog {{watchdog}}",
  "systemManagement.connectors.fallbackOnly": "Only compatibility placeholder rows are available",
  "systemManagement.connectors.coveredStreams": "Covered streams: {{streams}}",
  "systemManagement.connectors.issue.disabledHeadline": "This exchange or market is disabled and excluded from anomaly counts",
  "systemManagement.connectors.issue.disabledTag": "Disabled",
  "systemManagement.connectors.issue.abnormalStreams": "{{count}} abnormal streams",
  "systemManagement.connectors.issue.watchdogHistory": "Historical watchdog reconnects {{count}}",
  "systemManagement.connectors.issue.errorHistory": "Historical errors {{count}}",
  "systemManagement.connectors.issue.fallback": "Compatibility placeholder",
  "systemManagement.connectors.issue.authenticatedWsMissing": "Authenticated WS credentials disabled",
  "systemManagement.connectors.issue.noRealStreams": "No live streams",
  "systemManagement.connectors.issue.abnormalHeadline": "{{count}} streams have issues",
  "systemManagement.connectors.issue.authenticatedWsHeadline": "Coinbase International {{market}} authenticated WS credentials are missing or disabled",
  "systemManagement.connectors.issue.fallbackHeadline": "Only compatibility placeholder rows are available",
  "systemManagement.connectors.issue.healthyHeadline": "No stream-level issues detected",
  "systemManagement.connectors.actions.running": "Running",
  "systemManagement.connectors.actions.runningEllipsis": "Running…",
  "systemManagement.connectors.actions.disabled": "Disabled in control plane",
  "systemManagement.connectors.actions.busyReason": "A connector action is running. Wait for it to finish.",
  "systemManagement.connectors.actions.restore": "Restore",
  "systemManagement.connectors.actions.degrade": "Degrade",
  "systemManagement.connectors.actions.expand": "Expand",
  "systemManagement.connectors.actions.collapse": "Collapse",
  "systemManagement.connectors.streams.empty": "No stream-level details are available.",
  "systemManagement.connectors.streams.aria": "{{venue}} stream details",
  "systemManagement.connectors.streams.type": "Stream type",
  "systemManagement.connectors.streams.name": "Stream name",
  "systemManagement.connectors.streams.chunk": "Chunk",
  "systemManagement.connectors.streams.subscriptions": "Subscriptions",
  "systemManagement.connectors.streams.status": "Status",
  "systemManagement.connectors.streams.lastEvent": "Latest valid event",
  "systemManagement.connectors.streams.freshness": "Stream freshness",
  "systemManagement.connectors.streams.watchdog": "Watchdog",
  "systemManagement.connectors.streams.stalls": "Stalls",
  "systemManagement.connectors.streams.errors": "Errors",
  "systemManagement.connectors.streams.rowAria": "{{venue}} {{market}} {{type}} {{stream}}{{chunk}}",
  "systemManagement.connectors.streams.chunkSuffix": " chunk {{chunk}}",
  "systemManagement.connectors.streams.errorAria": "View latest error for {{stream}}",
  "systemManagement.connectors.empty": "No connector diagnostics are available.",
  "systemManagement.connectors.loadingData": "Loading connector diagnostics…",
  "systemManagement.connectors.errors.dataLoad": "Connector diagnostics could not be read.",
  "systemManagement.connectors.errors.dataRefresh": "Connector diagnostics refresh failed",
  "systemManagement.connectors.errors.dataUnavailable": "Connector diagnostics unavailable",
  "systemManagement.connectors.logs.title": "Live event log",
  "systemManagement.connectors.logs.eventType": "Event type",
  "systemManagement.connectors.logs.all": "All",
  "systemManagement.connectors.logs.scope": "Log scope",
  "systemManagement.connectors.logs.focus": "Current focus: {{venue}} / {{market}}",
  "systemManagement.connectors.logs.global": "Global",
  "systemManagement.connectors.logs.recent": "Latest {{count}}",
  "systemManagement.connectors.logs.connection": "Connection",
  "systemManagement.connectors.logs.stream": "Stream",
  "systemManagement.connectors.logs.connector": "Connector",
  "systemManagement.connectors.logs.empty": "No live events match the current filters.",
  "systemManagement.suspicious.retainedSnapshotPrefix": "The last successful snapshot remains visible: ",
  "systemManagement.suspicious.presentation.side.long": "Long leg",
  "systemManagement.suspicious.presentation.side.short": "Short leg",
  "systemManagement.suspicious.presentation.assessment.desynced": "Leg freshness is out of sync; realtime values are frozen",
  "systemManagement.suspicious.presentation.assessment.longStale": "Long-leg freshness failed; realtime values are frozen",
  "systemManagement.suspicious.presentation.assessment.shortStale": "Short-leg freshness failed; realtime values are frozen",
  "systemManagement.suspicious.presentation.assessment.nearInvalid": "The combination is nearing invalidity; inspect leg freshness",
  "systemManagement.suspicious.presentation.assessment.valid": "The combination is currently valid in realtime",
  "systemManagement.suspicious.presentation.rootCause.sideHeadline": "{{side}}: {{label}}",
  "systemManagement.suspicious.presentation.rootCause.nearThresholdHeadline": "Combination near diagnostic thresholds",
  "systemManagement.suspicious.presentation.rootCause.nearThresholdDetail": "The combination remains valid, but long-leg freshness {{longAge}}, short-leg freshness {{shortAge}}, and leg delta {{delta}} are nearing diagnostic thresholds.",
  "systemManagement.suspicious.presentation.rootCause.unknown": "Diagnostic assessment unavailable",
  "systemManagement.suspicious.presentation.diagnostic.no_quote.label": "No quote received",
  "systemManagement.suspicious.presentation.diagnostic.no_quote.detail": "No usable quote snapshot is available for {{venue}} {{symbol}}.",
  "systemManagement.suspicious.presentation.diagnostic.fresh.label": "Quote is fresh",
  "systemManagement.suspicious.presentation.diagnostic.fresh.detail": "The {{venue}} {{symbol}} quote is inside the realtime window.",
  "systemManagement.suspicious.presentation.diagnostic.no_price_stream.label": "Quote source unavailable",
  "systemManagement.suspicious.presentation.diagnostic.no_price_stream.detail": "{{venue}} {{symbol}} currently has no available quote source.",
  "systemManagement.suspicious.presentation.diagnostic.stream_unhealthy.label": "Quote source disconnected",
  "systemManagement.suspicious.presentation.diagnostic.stream_unhealthy.detail": "The quote source for {{venue}} {{symbol}} is currently disconnected.",
  "systemManagement.suspicious.presentation.diagnostic.official_book_not_two_sided.label": "Incomplete bid and ask",
  "systemManagement.suspicious.presentation.diagnostic.official_book_not_two_sided.detail": "{{venue}} {{symbol}} does not currently provide a complete bid and ask. Old quotes are not used to update the live spread.",
  "systemManagement.suspicious.presentation.diagnostic.upstream_symbol_sparse.label": "Exchange has not updated this pair",
  "systemManagement.suspicious.presentation.diagnostic.upstream_symbol_sparse.detail": "The quote for {{venue}} {{symbol}} is {{age}} old. The exchange connection is running, but no new quote has arrived for this pair.",
  "systemManagement.suspicious.presentation.diagnostic.unknown.label": "Data status unknown",
  "systemManagement.suspicious.presentation.diagnostic.unknown.detail": "The quote status cannot currently be determined.",
  "systemManagement.suspicious.thresholds.title": "Quote validity settings",
  "systemManagement.suspicious.thresholds.deltaValue": "Leg delta {{value}}",
  "systemManagement.suspicious.thresholds.staleValue": "Single leg {{value}}",
  "systemManagement.suspicious.thresholds.controlsAria": "Diagnostic threshold controls",
  "systemManagement.suspicious.thresholds.deltaField": "Leg delta · s",
  "systemManagement.suspicious.thresholds.staleField": "Single-leg timeout · s",
  "systemManagement.suspicious.validation.validSeconds": "Enter a valid number of seconds.",
  "systemManagement.suspicious.validation.legDeltaRange": "Leg delta must be from {{min}} to {{max}}.",
  "systemManagement.suspicious.validation.legStaleRange": "Single-leg timeout must be from {{min}} to {{max}}.",
  "systemManagement.suspicious.validation.deltaExceedsStale": "Leg delta cannot exceed the single-leg timeout.",
  "systemManagement.suspicious.feedback.thresholdSaved": "Updated live and persisted.",
  "systemManagement.suspicious.disabled.saving": "Diagnostic thresholds are being saved. Wait for completion.",
  "systemManagement.suspicious.disabled.refreshFailed": "Runtime threshold refresh failed. Refresh successfully before saving.",
  "systemManagement.suspicious.disabled.notLoaded": "Runtime thresholds have not loaded and cannot be saved.",
  "systemManagement.suspicious.disabled.refreshFailedLabel": "Refresh failed",
  "systemManagement.suspicious.disabled.notLoadedLabel": "Not loaded",
  "systemManagement.suspicious.actions.saving": "Saving…",
  "systemManagement.suspicious.actions.save": "Save",
  "systemManagement.suspicious.actions.viewDiagnostics": "View reason",
  "systemManagement.suspicious.actions.viewStream": "View market data connection",
  "systemManagement.suspicious.errors.thresholdLoad": "Diagnostic thresholds could not be read.",
  "systemManagement.suspicious.errors.thresholdRefresh": "Diagnostic threshold refresh failed",
  "systemManagement.suspicious.errors.thresholdConflict": "Another operator updated the thresholds. The latest authoritative baseline has loaded and your local input remains; review it and save again.",
  "systemManagement.suspicious.errors.listLoad": "Suspicious combinations could not be read.",
  "systemManagement.suspicious.errors.listRefresh": "Suspicious combination refresh failed",
  "systemManagement.suspicious.errors.listUnavailable": "Suspicious combinations unavailable",
  "systemManagement.suspicious.errors.detailLoad": "Combination diagnostics could not be read.",
  "systemManagement.suspicious.errors.detailRefresh": "Combination diagnostic refresh failed",
  "systemManagement.suspicious.metrics.invalid": "Invalid combinations",
  "systemManagement.suspicious.metrics.currentList": "Current list",
  "systemManagement.suspicious.metrics.reconnects5m": "Reconnects · 5m",
  "systemManagement.suspicious.metrics.worstVenue": "Worst exchange",
  "systemManagement.suspicious.list.title": "Suspicious combinations",
  "systemManagement.suspicious.list.description": "Shows confirmed freshness failures only; near-threshold combinations are excluded.",
  "systemManagement.suspicious.list.filterAria": "Filter suspicious combinations",
  "systemManagement.suspicious.list.baseAssetAria": "System diagnostic base asset",
  "systemManagement.suspicious.list.baseAssetPlaceholder": "Base asset, e.g. BTC",
  "systemManagement.suspicious.list.invalidOnly": "Confirmed failures only",
  "systemManagement.suspicious.list.openHint": "Select a row or use View diagnostics to inspect its authoritative snapshot",
  "systemManagement.suspicious.list.loading": "Loading suspicious combinations…",
  "systemManagement.suspicious.list.empty": "No suspicious combinations match.",
  "systemManagement.suspicious.list.freshnessInvalid": "Freshness failure",
  "systemManagement.suspicious.list.table.aria": "Suspicious combinations",
  "systemManagement.suspicious.list.table.asset": "Base asset",
  "systemManagement.suspicious.list.table.route": "Combination",
  "systemManagement.suspicious.list.table.status": "Status",
  "systemManagement.suspicious.list.table.spread": "Open spread",
  "systemManagement.suspicious.list.table.funding8h": "8h-equivalent net funding",
  "systemManagement.suspicious.list.table.longAge": "Long-leg freshness",
  "systemManagement.suspicious.list.table.shortAge": "Short-leg freshness",
  "systemManagement.suspicious.list.table.delta": "Leg delta",
  "systemManagement.suspicious.list.table.diagnostics": "Diagnostics",
  "systemManagement.suspicious.detail.title": "Affected opportunity",
  "systemManagement.suspicious.detail.description": "Review why this opportunity is invalid and the quotes on both legs.",
  "systemManagement.suspicious.detail.readingLive": "Current snapshot",
  "systemManagement.suspicious.detail.waitingSelection": "Waiting for a selection",
  "systemManagement.suspicious.detail.selectTitle": "Select a combination to inspect",
  "systemManagement.suspicious.detail.selectDescription": "The list shows confirmed freshness failures. Select one to load its authoritative snapshot here.",
  "systemManagement.suspicious.detail.loading": "Loading combination diagnostics…",
  "systemManagement.suspicious.detail.assessment": "Current condition",
  "systemManagement.suspicious.detail.readingSnapshot": "Reading the latest diagnostic snapshot.",
  "systemManagement.suspicious.detail.freshness": "Combination freshness",
  "systemManagement.suspicious.detail.statusTitle": "Combination status",
  "systemManagement.suspicious.detail.status": "Status",
  "systemManagement.suspicious.detail.valid": "Valid",
  "systemManagement.suspicious.detail.invalid": "Invalid",
  "systemManagement.suspicious.detail.reason": "Reason",
  "systemManagement.suspicious.detail.longAge": "Long-leg freshness",
  "systemManagement.suspicious.detail.shortAge": "Short-leg freshness",
  "systemManagement.suspicious.detail.delta": "Leg delta",
  "systemManagement.suspicious.detail.spreadFunding": "Open spread / 8h-equivalent net funding",
  "systemManagement.suspicious.detail.longLeg": "Long-leg quote",
  "systemManagement.suspicious.detail.shortLeg": "Short-leg quote",
  "systemManagement.suspicious.streams.title": "Related streams",
  "systemManagement.suspicious.streams.description": "Stream-health snapshots for the current legs",
  "systemManagement.suspicious.streams.empty": "No related stream snapshots are available.",
  "systemManagement.suspicious.streams.aria": "Combination diagnostic related-stream status",
  "systemManagement.suspicious.streams.stream": "Stream",
  "systemManagement.suspicious.streams.status": "Status",
  "systemManagement.suspicious.streams.lastEvent": "Latest valid event",
  "systemManagement.suspicious.streams.freshness": "Stream freshness",
  "systemManagement.suspicious.streams.watchdog": "Watchdog",
  "systemManagement.suspicious.events.title": "Recent connection events",
  "systemManagement.suspicious.events.description": "Only live events directly related to the two current legs",
  "systemManagement.suspicious.events.empty": "No recent connection events match.",
  "systemManagement.suspicious.events.aria": "Combination diagnostic recent connection events",
  "systemManagement.suspicious.events.time": "Time",
  "systemManagement.suspicious.events.exchange": "Exchange",
  "systemManagement.suspicious.events.stream": "Stream",
  "systemManagement.suspicious.events.event": "Event",
  "systemManagement.suspicious.events.detail": "Details",
  "systemManagement.suspicious.leg.exchange": "Exchange",
  "systemManagement.suspicious.leg.market": "Market",
  "systemManagement.suspicious.leg.symbol": "Symbol",
  "systemManagement.suspicious.leg.displayPrice": "Display price",
  "systemManagement.suspicious.leg.diagnostics": "Data status",
  "systemManagement.suspicious.leg.bidAsk": "Best bid / ask",
  "systemManagement.suspicious.leg.quoteAge": "Quote freshness",
  "systemManagement.suspicious.leg.streamAge": "Stream freshness",
  "systemManagement.suspicious.leg.volumeOpenInterest": "24h volume / open interest",
  "systemManagement.suspicious.leg.funding": "Funding",
  "systemManagement.suspicious.leg.relatedStream": "Related stream",
  "systemManagement.compute.warning.title": "Compute diagnostics",
  "systemManagement.compute.warning.description": "The latest commit is close to or beyond the current compute interval. Inspect shard metrics and dirty-row volume together.",
  "systemManagement.compute.paramsTitle": "Compute parameters",
  "systemManagement.compute.shards.title": "Shard status ({{count}})",
  "systemManagement.compute.shards.aria": "Compute shard status",
  "systemManagement.compute.shards.shard": "Shard",
  "systemManagement.compute.shards.rows": "Rows",
  "systemManagement.compute.shards.dirtyRows": "Dirty rows",
  "systemManagement.compute.shards.latestDirty": "Latest dirty rows",
  "systemManagement.compute.shards.composition": "Impact composition",
  "systemManagement.compute.shards.p99": "P99 latency",
  "systemManagement.degradeDialog.title": "Confirm pause",
  "systemManagement.degradeDialog.description": "Manually disconnect <strong>{{venue}}</strong>? This pauses all market-data ingestion for the exchange until you restore it.",
  "systemManagement.degradeDialog.confirm": "Pause exchange",
  "settingsManagement.exchangeFrame.title": "Exchange management",
  "settingsManagement.exchangeFrame.preparing": "Preparing module",
  "settingsManagement.exchangeFrame.unavailable": "Module unavailable",
  "settingsManagement.exchangeFrame.reset": "Reset",
  "settingsManagement.exchanges.errors.signedOut": "Your session has expired. Sign in again and retry.",
  "settingsManagement.exchanges.errors.forbidden": "This account cannot manage exchange configuration.",
  "settingsManagement.exchanges.errors.loadStatus": "Exchange configuration could not be loaded (HTTP {{status}}).",
  "settingsManagement.exchanges.errors.loadFailed": "Exchange configuration could not be loaded. Try again shortly.",
  "settingsManagement.exchanges.errors.saveFailed": "Exchange configuration could not be saved. Try again shortly.",
  "settingsManagement.exchanges.errors.conflict": "Another administrator submitted a newer configuration. The authoritative baseline has refreshed and your local draft is preserved; review it and save again.",
  "settingsManagement.exchanges.errors.loadTitle": "Exchange management could not be loaded",
  "settingsManagement.exchanges.disabled.refreshing": "Exchange status is refreshing.",
  "settingsManagement.exchanges.disabled.loading": "Exchange status is loading.",
  "settingsManagement.exchanges.disabled.saving": "Exchange configuration is being saved.",
  "settingsManagement.exchanges.disabled.dirtyRefresh": "Save the pending exchange enablement changes before refreshing.",
  "settingsManagement.exchanges.disabled.noSnapshot": "No editable exchange snapshot has loaded yet.",
  "settingsManagement.exchanges.disabled.clean": "The current configuration has no unsaved changes.",
  "settingsManagement.exchanges.disabled.nothingToReset": "There are no unsaved changes to reset.",
  "settingsManagement.exchanges.disabled.refreshingToggle": "Exchange status is refreshing. You can make changes when it finishes.",
  "settingsManagement.exchanges.disabled.loadingToggle": "Exchange status is loading. You can make changes when it finishes.",
  "settingsManagement.exchanges.disabled.savingToggle": "Exchange configuration is being saved. You can make changes when it finishes.",
  "settingsManagement.exchanges.notice.saveFailed": "Save failed",
  "settingsManagement.exchanges.notice.retainedAfterSaveFailure": "{{error}} The last successful snapshot remains visible.",
  "settingsManagement.exchanges.notice.refreshFailed": "Refresh failed",
  "settingsManagement.exchanges.feedback.synced.title": "Configuration synced",
  "settingsManagement.exchanges.feedback.synced.message": "Exchange configuration was saved.",
  "settingsManagement.exchanges.feedback.persisted.title": "Configuration persisted",
  "settingsManagement.exchanges.feedback.persisted.message": "The authoritative configuration is confirmed; connectors and runtime topology will continue converging on the current state.",
  "settingsManagement.exchanges.status.refreshing": "Refreshing",
  "settingsManagement.exchanges.status.staleSnapshot": "Stale snapshot",
  "settingsManagement.exchanges.status.unsaved": "Unsaved",
  "settingsManagement.exchanges.status.synced": "Synced",
  "settingsManagement.exchanges.snapshot": "Snapshot",
  "settingsManagement.exchanges.actions.refreshing": "Refreshing…",
  "settingsManagement.exchanges.actions.refresh": "Refresh",
  "settingsManagement.exchanges.empty.title": "No exchanges",
  "settingsManagement.exchanges.empty.staleTitle": "No exchanges in the last snapshot",
  "settingsManagement.exchanges.empty.staleDescription": "This refresh failed, so the previous empty snapshot remains visible.",
  "settingsManagement.exchanges.table.aria": "Exchange runtime and enablement status",
  "settingsManagement.exchanges.table.exchange": "Exchange",
  "settingsManagement.exchanges.table.global": "Global",
  "settingsManagement.exchanges.table.runtime": "Runtime",
  "settingsManagement.exchanges.table.discovery": "Discovery",
  "settingsManagement.exchanges.table.announcements": "Announcements",
  "settingsManagement.exchanges.table.instruments": "Instruments",
  "settingsManagement.exchanges.table.disabledSupported": "Disabled / supported",
  "settingsManagement.exchanges.table.toggleAria": "{{venue}} global enablement; currently {{state}}",
  "settingsManagement.exchanges.table.enabled": "enabled",
  "settingsManagement.exchanges.table.disabled": "disabled",
  "settingsManagement.exchanges.table.marketCountAria": "{{disabled}} of {{total}} markets disabled",
  "settingsManagement.exchanges.capability.available": "Available",
  "settingsManagement.exchanges.capability.unavailable": "Unavailable",
  "settingsManagement.credentialsFrame.title": "API credentials",
  "settingsManagement.credentials.errors.signedOut": "Your session has expired. Sign in again and retry.",
  "settingsManagement.credentials.errors.forbidden": "This account cannot manage exchange credentials.",
  "settingsManagement.credentials.errors.loadStatus": "API credentials could not be loaded (HTTP {{status}}).",
  "settingsManagement.credentials.errors.loadFailed": "API credentials could not be loaded. Try again shortly.",
  "settingsManagement.credentials.errors.saveFailed": "API credentials could not be saved. Try again shortly.",
  "settingsManagement.credentials.errors.loadTitle": "API credentials could not be loaded",
  "settingsManagement.credentials.errors.noSnapshot": "No exchange API credential snapshot is available yet.",
  "settingsManagement.credentials.disabled.saving": "API credentials are being saved. You can continue editing when it finishes.",
  "settingsManagement.credentials.disabled.refreshing": "API credentials are refreshing. You can continue editing when it finishes.",
  "settingsManagement.credentials.disabled.loading": "API credentials are loading. You can continue editing when it finishes.",
  "settingsManagement.credentials.disabled.clean": "The current draft has no unsaved changes.",
  "settingsManagement.credentials.disabled.nothingToReset": "There are no unsaved changes to reset.",
  "settingsManagement.credentials.disabled.dirtyRefresh": "Save or reset the credential draft before refreshing.",
  "settingsManagement.credentials.disabled.emptyDraft": "The current draft is already empty.",
  "settingsManagement.credentials.notice.saveFailed": "Save failed",
  "settingsManagement.credentials.notice.refreshFailed": "Refresh failed",
  "settingsManagement.credentials.notice.updated": "Credentials updated",
  "settingsManagement.credentials.status.refreshing": "Refreshing…",
  "settingsManagement.credentials.status.stale": "Stale snapshot",
  "settingsManagement.credentials.status.staleUnsaved": "Stale snapshot · Unsaved",
  "settingsManagement.credentials.status.unsaved": "Unsaved",
  "settingsManagement.credentials.status.configured": "Configured",
  "settingsManagement.credentials.status.notConfigured": "Not configured",
  "settingsManagement.credentials.description.loading": "Loading credential status",
  "settingsManagement.credentials.description.noSnapshot": "No credential snapshot available",
  "settingsManagement.credentials.description.lastSaved": "Last saved:",
  "settingsManagement.credentials.description.neverSaved": "Never saved",
  "settingsManagement.credentials.fields.apiKey": "API key",
  "settingsManagement.credentials.fields.apiSecret": "API secret",
  "settingsManagement.credentials.fields.passphrase": "Passphrase",
  "settingsManagement.credentials.fields.showApiKey": "Show API key",
  "settingsManagement.credentials.fields.hideApiKey": "Hide API key",
  "settingsManagement.credentials.fields.showApiSecret": "Show API secret",
  "settingsManagement.credentials.fields.hideApiSecret": "Hide API secret",
  "settingsManagement.credentials.fields.showPassphrase": "Show passphrase",
  "settingsManagement.credentials.fields.hidePassphrase": "Hide passphrase",
  "settingsManagement.credentials.wsEnabled": "Enable authenticated {{venue}} market-data connections",
  "settingsManagement.credentials.actions.clearDraft": "Clear draft",
  "settingsManagement.credentials.actions.clearing": "Clearing…",
  "settingsManagement.credentials.actions.clearCredentials": "Clear credentials",
  "settingsManagement.pairs.tabs.overview": "Overview",
  "settingsManagement.pairs.tabs.matching": "Identity & units",
  "settingsManagement.pairs.tabs.quoteFamilies": "Quote families",
  "metadata.documentTitles.monitor": "Monitor · ZML Monitor",
  "metadata.documentTitles.funding": "$t(zml:zml.metric.funding_rate) · ZML Monitor",
  "metadata.documentTitles.history": "History · ZML Monitor",
  "metadata.documentTitles.historyCurve": "History chart · ZML Monitor",
  "metadata.documentTitles.historyFunding": "Funding history · ZML Monitor",
  "metadata.documentTitles.news": "News · ZML Monitor",
  "metadata.documentTitles.notificationSettings": "Notification settings · ZML Monitor",
  "metadata.documentTitles.tools": "Toolbox · ZML Monitor",
  "metadata.documentTitles.notFound": "Page not found · ZML Monitor",
  "metadata.descriptions.default": "Real-time cross-exchange market, funding, news, and alert monitoring in one place.",
  "metadata.descriptions.login": "Sign in to ZML Monitor for secure access to cross-exchange market, funding, news, and alerts.",
  "metadata.descriptions.register": "Verify with Google, create your ZML Monitor account, and start monitoring across exchanges.",
  "metadata.descriptions.management": "Manage ZML Monitor users, billing, sign-in methods, data sources, and system operations.",
  "metadata.descriptions.history": "Review historical spreads, funding, and settlement records across exchanges.",
  "metadata.descriptions.notificationSettings": "Manage ZML Monitor web and Feishu notification channels.",
  "metadata.descriptions.notFound": "This address does not exist. Return to the ZML Monitor monitoring console.",
  "standalone.historyCurve.title": "Combination history",
  "standalone.historyCurve.loadingStatus": "Loading",
  "standalone.historyCurve.errorStatus": "Load failed",
  "standalone.historyCurve.loading": "Loading history curve…",
  "standalone.historyCurve.errorTitle": "History curve unavailable",
  "standalone.historyCurve.missingTitle": "History curve cannot be opened",
  "standalone.historyCurve.missingDescription": "This link is missing valid combination details. Open the curve again from Monitor or its alert card.",
  "standalone.fundingHistory.title": "Funding history",
  "standalone.fundingHistory.loadingStatus": "Loading",
  "standalone.fundingHistory.moduleErrorStatus": "Load failed",
  "standalone.fundingHistory.loading": "Loading funding history…",
  "standalone.fundingHistory.moduleErrorTitle": "Funding history unavailable",
  "standalone.fundingHistory.missingTitle": "Funding history cannot be opened",
  "standalone.fundingHistory.missingDescription": "This link is missing valid combination details. Open funding history again from Monitor or its alert card.",
  "standalone.fundingHistory.requestErrorStatus": "Read failed",
  "standalone.fundingHistory.requestErrorTitle": "Funding history could not be read",
  "standalone.fundingHistory.requestErrorFallback": "Funding history could not be loaded.",
  "standalone.notificationSettings.title": "Notification settings",
  "standalone.notificationSettings.loading": "Loading notification settings…",
  "standalone.notificationSettings.moduleErrorTitle": "Notification settings could not be displayed",
  "standalone.notificationSettings.quickPause": "Quick pause",
  "standalone.notificationSettings.missingTitle": "Feishu notification pause cannot be opened",
  "standalone.notificationSettings.missingDescription": "This link does not identify a valid combination. Open notification pause again from its alert card.",
  "standalone.notificationSettings.context.currentCombination": "Current combination",
  "standalone.notificationSettings.context.target": "Target",
  "standalone.notificationSettings.context.scope": "Scope",
  "standalone.notificationSettings.context.duration": "Duration",
  "standalone.notificationSettings.context.muteDuration": "Mute duration",
  "standalone.notificationSettings.context.customDuration": "Custom duration",
  "standalone.notificationSettings.context.minuteUnit": "minutes",
  "standalone.notificationSettings.context.invalidDuration": "Custom duration must be a whole number from 1 to 43,200 minutes.",
  "standalone.notificationSettings.context.invalidDurationField": "Enter a whole number from 1 to 43,200.",
  "standalone.notificationSettings.context.selectTarget": "Select at least one notification target.",
  "standalone.notificationSettings.context.ruleLoadFailed": "Could not confirm the current mute rules: {{error}} They will be re-read automatically.",
  "standalone.notificationSettings.context.busyReading": "Reading the current notification rules…",
  "standalone.notificationSettings.context.busyConfirming": "Confirming the current notification rules…",
  "standalone.notificationSettings.context.busyUpdating": "Notification rules are being updated. Wait for the current operation to finish.",
  "standalone.notificationSettings.context.sourceTabNotice": "Source filter tab: {{tab}}. The source only explains where you entered; pausing still covers every matching tab and channel in this account.",
  "standalone.notificationSettings.context.deletedSourceTab": "Deleted or unavailable source tab",
  "standalone.notificationSettings.context.idle.webBadge": "Row highlighting active",
  "standalone.notificationSettings.context.idle.soundCooldown": "Alert sound interval {{duration}}",
  "standalone.notificationSettings.context.idle.soundOff": "Muted on this browser",
  "standalone.notificationSettings.context.idle.settingsNotReady": "Notification settings are not ready",
  "standalone.notificationSettings.context.idle.feishu": "Covers every matching tab and channel in this account",
  "standalone.notificationSettings.context.state.reading": "Reading",
  "standalone.notificationSettings.context.state.readingDetail": "Confirming the current pause rule",
  "standalone.notificationSettings.context.state.unknown": "Status unknown",
  "standalone.notificationSettings.context.state.unknownDetail": "The current pause rule could not be confirmed",
  "standalone.notificationSettings.context.state.paused": "Paused",
  "standalone.notificationSettings.context.state.clear": "Not paused",
  "standalone.notificationSettings.context.notice.paused": "Paused {{targets}}.",
  "standalone.notificationSettings.context.notice.pauseFailed": "Pause did not take effect: {{reason}}",
  "standalone.notificationSettings.context.notice.restored": "Restored {{target}}.",
  "standalone.notificationSettings.context.notice.restoreFailed": "Restore did not take effect: {{reason}}",
  "standalone.notificationSettings.context.notice.extended": "Extended {{target}}.",
  "standalone.notificationSettings.context.notice.extendFailed": "Extension did not take effect: {{reason}}",
  "standalone.notificationSettings.context.submit.syncing": "Syncing",
  "standalone.notificationSettings.context.submit.submitting": "Submitting",
  "standalone.notificationSettings.context.submit.confirm": "Confirm pause",
  "standalone.notificationSettings.context.accountSound.title": "Alert sound",
  "standalone.notificationSettings.context.accountSound.current": "Current",
  "standalone.notificationSettings.context.accountSound.recent": "Latest",
  "standalone.notificationSettings.context.accountSound.on": "On in this browser",
  "standalone.notificationSettings.context.accountSound.off": "Muted in this browser",
  "standalone.notificationSettings.context.accountSound.cooldown": "alert sound interval {{duration}}",
  "standalone.notificationSettings.context.accountSound.loading": "Loading notification settings…",
  "standalone.notificationSettings.context.accountSound.notReady": "Notification settings are not ready",
  "standalone.notificationSettings.context.accountSound.readingReason": "Reading this account's notification settings.",
  "standalone.notificationSettings.context.accountSound.test": "Test",
  "standalone.notificationSettings.context.accountSound.openSettings": "Open alert sound settings",
  "standalone.notificationSettings.context.accountSound.cooldownSeconds": "{{count}}s",
  "standalone.notificationSettings.context.accountSound.status.played": "Played",
  "standalone.notificationSettings.context.accountSound.status.disabled": "Sound disabled",
  "standalone.notificationSettings.context.accountSound.status.cooldown": "Skipped within the alert sound interval",
  "standalone.notificationSettings.context.accountSound.status.blocked": "Blocked by browser",
  "standalone.notificationSettings.context.accountSound.status.error": "Playback error",
  "nav.monitor": "Monitor",
  "nav.funding": "$t(zml:zml.metric.funding_rate)",
  "nav.news": "News",
  "nav.tools": "Tools",
  "nav.linkage": "Funding linkage",
  "nav.management": "Admin",
  "notificationRules.targets.web_badge.label": "Web badge",
  "notificationRules.targets.web_badge.shortLabel": "Badge",
  "notificationRules.targets.web_badge.caption": "Row highlight / badge",
  "notificationRules.targets.web_sound.label": "Web sound",
  "notificationRules.targets.web_sound.shortLabel": "Sound",
  "notificationRules.targets.web_sound.caption": "Play an alert sound",
  "notificationRules.targets.feishu.label": "Feishu notification",
  "notificationRules.targets.feishu.shortLabel": "Feishu",
  "notificationRules.targets.feishu.caption": "Group notification",
  "notificationRules.scopes.opportunity": "This opportunity",
  "notificationRules.scopes.symbol": "This asset",
  "notificationRules.scopes.exchange_pair": "This exchange pair",
  "notificationRules.scopes.workspace": "Entire account",
  "notificationRules.durations.15m": "15 minutes",
  "notificationRules.durations.1h": "1 hour",
  "notificationRules.durations.4h": "4 hours",
  "notificationRules.durations.24h": "24 hours",
  "notificationRules.durations.3d": "3 days",
  "notificationRules.durations.custom": "Custom",
  "notificationRules.remaining.expired": "Expired",
  "notificationRules.remaining.minutes": "{{count}} minutes left",
  "notificationRules.remaining.hours": "{{count}} hours left",
  "notificationRules.remaining.days": "{{count}} days left",
  "notificationRules.matrix.aria": "Notification targets",
  "notificationRules.matrix.busy": "Notification rules are being updated. Wait for the current operation to finish.",
  "notificationRules.matrix.unselected": "Not selected",
  "notificationRules.matrix.extending": "Extending",
  "notificationRules.matrix.extend": "Extend",
  "notificationRules.matrix.restoring": "Restoring",
  "notificationRules.matrix.restore": "Restore",
  "notificationRules.workspace.title": "Pause the entire account",
  "notificationRules.workspace.description": "Pausing affects only the selected notification targets in this account.",
  "notificationRules.workspace.targetLegend": "Notification targets",
  "notificationRules.workspace.duration": "Pause duration",
  "notificationRules.workspace.create": "Create pause",
  "notificationRules.workspace.activeTitle": "Active pause rules",
  "notificationRules.workspace.activeDescription": "Restoring a rule immediately resumes that notification target.",
  "notificationRules.workspace.emptyTitle": "No active pause rules",
  "notificationRules.workspace.emptyDescription": "New pauses will appear here.",
  "notificationRules.workspace.restore": "Restore",
  "notificationRules.workspace.selectTarget": "Select at least one notification target",
  "notificationRules.workspace.created": "Account pause rule created",
  "notificationRules.workspace.restored": "Restored {{target}}",
  "notificationRules.errors.workspace_required": "The current account could not be confirmed.",
  "notificationRules.errors.string_required": "{{field}} must be a non-empty string.",
  "notificationRules.errors.invalid_response": "The notification-rule response is invalid.",
  "notificationRules.errors.workspace_mismatch": "These notification settings do not match the current account. Reload and try again.",
  "notificationRules.errors.invalid_target": "The notification target is invalid.",
  "notificationRules.errors.invalid_scope": "The notification scope is invalid.",
  "notificationRules.errors.invalid_reason": "The notification-rule reason must be a string or null.",
  "notificationRules.errors.invalid_list": "The notification-rule list response is invalid.",
  "notificationRules.errors.targets_required": "At least one valid notification target is required.",
  "notificationRules.errors.scope_key_required": "Choose a notification scope.",
  "notificationRules.errors.muted_until_invalid": "The notification pause expiry is invalid.",
  "notificationRules.errors.load_failed": "The service returned no notification rules (HTTP {{status}}).",
  "notificationRules.errors.create_failed": "The service rejected the notification-rule write (HTTP {{status}}). Try again shortly.",
  "notificationRules.errors.rule_ids_required": "Choose at least one notification rule.",
  "notificationRules.errors.restore_failed": "The service rejected the notification-rule restore (HTTP {{status}}). Try again shortly.",
  "notificationRules.errors.restore_response_invalid": "The restore response is invalid.",
  "notificationRules.errors.unknown": "The notification-rule operation failed.",
  "marketCatalog.contracts": "contracts",
  "marketCatalog.title": "Market instruments",
  "marketCatalog.all": "All",
  "marketCatalog.allVenues": "All exchanges",
  "marketCatalog.allKinds": "All markets",
  "marketCatalog.allSettlements": "All settlements",
  "marketCatalog.venue": "Exchange",
  "marketCatalog.kind": "Market",
  "marketCatalog.settlement": "Settlement",
  "marketCatalog.instrument": "Instrument",
  "marketCatalog.bid": "Best bid",
  "marketCatalog.ask": "Best ask",
  "marketCatalog.quoteAge": "Quote time",
  "marketCatalog.search": "Search instruments",
  "marketCatalog.searchPlaceholder": "Asset or native product code…",
  "marketCatalog.loadFailed": "Unable to load instruments",
  "marketCatalog.loading": "Loading instruments…",
  "marketCatalog.empty": "No matching instruments",
  "marketCatalog.refreshFailed": "Quotes are temporarily unavailable; existing values may be stale.",
  "marketCatalog.count": "{{count}} instruments",
  "marketCatalog.previous": "Previous",
  "marketCatalog.next": "Next",
  "marketCatalog.payoff.linear": "Linear",
  "marketCatalog.payoff.inverse": "Inverse",
  "marketCatalog.payoff.quanto": "Quanto",
  "marketCatalog.quoteState.pending": "Awaiting quote",
  "marketCatalog.quoteState.empty_book": "Empty book",
  "marketCatalog.quoteState.bid_unavailable": "No bid",
  "marketCatalog.quoteState.ask_unavailable": "No ask",
  "marketCatalog.quoteState.book_unavailable": "Quote unavailable",
  "toolsPage.title": "Tools",
  "toolsPage.loading": "Loading tool…",
  "toolsPage.items.markets.label": "Market instruments",
  "toolsPage.items.markets.description": "Browse native quotes by exchange, market and settlement currency",
  "toolsPage.items.coin.label": "Asset lookup",
  "toolsPage.items.coin.description": "Search by name or symbol to inspect cross-exchange markets, volume distribution, and service status",
  "fundingPage.view.copyName": "{{name}} copy",
  "fundingPage.views.default": "Default",
  "fundingPage.views.aria": "Funding-rate views",
  "fundingPage.views.optionsAria": "Funding view options",
  "fundingPage.views.contextMenuAria": "{{name}} view options",
  "fundingPage.views.all": "All funding-rate views",
  "fundingPage.views.namePlaceholder": "View name",
  "fundingPage.views.nameLabel": "View name",
  "fundingPage.views.assets": "Assets",
  "fundingPage.views.renameTitle": "Rename funding view",
  "fundingPage.views.renameDescription": "Change the name while keeping the window, filters and ordering.",
  "fundingPage.views.createNew": "Create funding view",
  "fundingPage.views.deleteTitle": "Delete funding view",
  "fundingPage.views.deleteLast": "Keep at least one funding view",
  "fundingPage.views.deleteDescription": "Delete “{{name}}”? Its window, exchange, and search settings will be removed. You can undo for a few seconds after deleting.",
  "fundingPage.views.deleteConfirm": "Delete view",
  "fundingPage.views.reorder": "Reorder {{name}} view",
  "fundingPage.status.applying": "Applying",
  "fundingPage.status.reconnecting": "Reconnecting",
  "fundingPage.status.ariaSeparator": "; ",
  "fundingPage.retrySave": "Retry save",
  "fundingPage.reload": "Reload",
  "fundingPage.errors.settingsLoadFailed": "Funding settings are temporarily unavailable. Reload and try again.",
  "fundingPage.errors.settingsSaveFailed": "Funding settings could not be saved. The current view is unchanged.",
  "fundingPage.errors.queryRejected": "The current funding results could not be loaded. Try again.",
  "fundingPage.errors.queryRejectedRetained": "The new filters could not be applied. The previous results remain visible.",
  "fundingPage.errors.connectionInterrupted": "The live funding connection was interrupted and is recovering.",
  "fundingPage.sourceUnavailableTitle": "Accumulated data unavailable",
  "fundingPage.loadFailed": "Load failed",
  "fundingPage.sourceUnavailableDescription": "The selected accumulated window is temporarily unavailable. Try again shortly.",
  "fundingPage.loadingMatrix": "Loading funding matrix…",
  "fundingPage.emptyTitle": "No funding data",
  "fundingPage.emptyDescription": "No assets have been produced within the monitoring scope yet.",
  "fundingPage.filteredEmptyTitle": "No matching assets",
  "fundingPage.filteredEmptyDescription": "The current asset search or exchange filter matched nothing. Clear them to see everything.",
  "fundingPage.detail.title": "{{coin}} funding details",
  "fundingPage.detail.allVenues": "Funding across all exchanges",
  "fundingPage.detail.collapse": "Collapse",
  "fundingPage.detail.loadErrorFallback": "Asset funding could not be loaded.",
  "fundingPage.detail.loading": "Loading asset funding…",
  "fundingPage.detail.spotBasis": "Basis (long spot / short perpetual)",
  "fundingPage.detail.aggregation": "{{spot}} spot · {{perpetual}} perpetual",
  "fundingPage.detail.bestLong": "Best long",
  "fundingPage.detail.bestShort": "Best short",
  "fundingPage.detail.venueTableAria": "Asset funding details by exchange",
  "fundingPage.detail.exchange": "Exchange",
  "fundingPage.detail.liveFold": "Live ({{fold}})",
  "fundingPage.detail.interval": "Interval",
  "fundingPage.detail.settlementTableAria": "Recent asset funding settlements",
  "fundingPage.detail.settlementTime": "Settlement time",
  "fundingPage.detail.rate": "$t(zml:zml.metric.funding_rate)",
  "fundingPage.detail.noSettlements": "No settlement records",
  "fundingPage.detail.viewPrefix": "View",
  "fundingPage.detail.viewSuffix": "details",
  "fundingPage.detail.stale": "Stale",
  "fundingPage.detail.predictedRate": "Predicted funding rate",
  "fundingPage.detail.nextSettlement": "Next settlement",
  "fundingPage.detail.settlingSoon": "Settling soon",
  "fundingPage.detail.rateCap": "Native interval absolute cap",
  "fundingPage.detail.rateRange": "Native interval floor / ceiling",
  "fundingPage.detail.coverage30d": "30-day coverage",
  "fundingPage.detail.source": "Source",
  "fundingPage.sourceMode.officialOnly": "Official only",
  "fundingPage.sourceMode.mixed": "Official + live capture",
  "fundingPage.sourceMode.capturedOnly": "Live capture only",
  "fundingPage.sourceMode.empty": "No source",
  "fundingPage.sourceMode.unknown": "Unknown source",
  "fundingPage.matrix.aria": "Funding matrix",
  "fundingPage.matrix.coin": "Asset",
  "fundingPage.matrix.unknownAsset": "Unknown asset",
  "fundingPage.matrix.basis": "Basis",
  "fundingPage.matrix.basisLongLabel": "Long spot / short perpetual basis",
  "fundingPage.matrix.basisTooltip": "Long spot / short perpetual basis = (perpetual reference price − spot reference price) ÷ spot reference price × 100%. Both sides use mid-market prices; stale quotes are removed before 24-hour-turnover weighting with a median ±3% clamp. Positive means the perpetual trades at a premium.",
  "fundingPage.matrix.ariaSeparator": ", ",
  "fundingPage.matrix.oiLabel": "$t(zml:zml.metric.open_interest_notional)",
  "fundingPage.matrix.volume24hLabel": "$t(zml:zml.metric.quote_volume_24h)",
  "fundingPage.matrix.bestLongAria": "Exchange with the best funding rate for a long position (receives funding or pays the least)",
  "fundingPage.matrix.bestShortAria": "Exchange with the best funding rate for a short position (receives the most funding)",
  "fundingPage.matrix.missingSpotReference": "No spot reference price",
  "fundingPage.matrix.missingPerpetualReference": "No perpetual reference price",
  "fundingPage.matrix.missingBasis": "No basis",
  "fundingPage.matrix.spotVenueLabel": "spot exchanges",
  "fundingPage.matrix.perpetualVenueLabel": "perpetual exchanges",
  "fundingPage.matrix.missingRepresentative": "No current representative contract",
  "fundingPage.matrix.unavailableFunding": "No funding rate available",
  "fundingPage.matrix.readingGuide": "Extra rows, top to bottom, are the enabled OI / volume stats (USD); colored rates mark the best long / short venue, and background depth compares rate magnitude within the asset.",
  "fundingPage.matrix.reorder": "Reorder {{label}} with the keyboard",
  "fundingPage.matrix.sort.assetAsc": "A to Z",
  "fundingPage.matrix.sort.assetDesc": "Z to A",
  "fundingPage.matrix.sort.spreadDesc": "largest to smallest spread",
  "fundingPage.matrix.sort.spreadAsc": "smallest to largest spread",
  "fundingPage.matrix.sort.basisDesc": "largest to smallest basis",
  "fundingPage.matrix.sort.basisAsc": "smallest to largest basis",
  "fundingPage.matrix.sort.positiveDesc": "most positive to most negative",
  "fundingPage.matrix.sort.positiveAsc": "most negative to most positive",
  "fundingPage.matrix.sort.rateAsc": "most negative to most positive",
  "fundingPage.matrix.sort.rateDesc": "most positive to most negative",
  "fundingPage.matrix.sort.activeAria": "{{label}} is sorted {{current}}; click to switch to {{next}}",
  "fundingPage.matrix.sort.idleAria": "Sort {{label}} {{direction}}",
  "fundingPage.matrix.sort.activeTooltip": "{{label}}: {{current}} · click for {{next}}",
  "fundingPage.matrix.sort.idleTooltip": "{{label}}: click to sort {{direction}}",
  "fundingPage.filters.openSettings": "Filter settings…",
  "fundingPage.filters.searchAria": "Search assets",
  "fundingPage.filters.searchPlaceholder": "Asset",
  "fundingPage.filters.period.group": "Funding window",
  "fundingPage.filters.period.aria": "Funding window: {{value}}",
  "fundingPage.filters.period.trigger": "Window · {{value}}",
  "fundingPage.filters.period.values.realtime": "Live",
  "fundingPage.filters.period.values.1d": "1D",
  "fundingPage.filters.period.values.2d": "2D",
  "fundingPage.filters.period.values.3d": "3D",
  "fundingPage.filters.period.values.5d": "5D",
  "fundingPage.filters.period.values.7d": "7D",
  "fundingPage.filters.period.values.14d": "14D",
  "fundingPage.filters.period.values.30d": "30D",
  "fundingPage.filters.foldGroup": "Funding normalization interval",
  "fundingPage.filters.fold.native": "Native",
  "fundingPage.filters.fold.1h": "1H",
  "fundingPage.filters.fold.4h": "4H",
  "fundingPage.filters.fold.8h": "8H",
  "fundingPage.filters.exchanges.trigger": "Exchanges",
  "fundingPage.filters.exchanges.legend": "Exchanges",
  "fundingPage.filters.exchanges.all": "All",
  "fundingPage.filters.exchanges.selected": "{{count}} selected",
  "fundingPage.filters.exchanges.aria": "Exchange filter: {{selection}}",
  "fundingPage.filterSettings.description": "Monitoring scope is this matrix's visibility floor: it decides which coin rows exist at all; view filters then pick from what is left.",
  "fundingPage.masterFilter.notSet": "No funding monitoring scope",
  "fundingPage.masterFilter.trigger": "Monitoring scope",
  "fundingPage.masterFilter.leave.title": "Discard unsaved funding monitoring-scope changes?",
  "fundingPage.masterFilter.leave.description": "Closing now will discard unsaved monitoring-scope changes.",
  "fundingPage.masterFilter.leave.confirm": "Discard and close",
  "fundingPage.masterFilter.leave.cancel": "Continue editing",
  "fundingPage.masterFilter.summary": "Funding monitoring scope: {{summary}}",
  "fundingPage.masterFilter.notReady": "Funding filter settings are not ready yet.",
  "fundingPage.masterFilter.title": "Funding monitoring scope",
  "fundingPage.masterFilter.description": "Applies to every funding view in this account and is saved with the current account settings. An asset remains only when at least one exchange meets every configured threshold.",
  "fundingPage.masterFilter.conditionsAria": "Funding monitoring-scope conditions",
  "fundingPage.masterFilter.placeholder": "Not set",
  "fundingPage.masterFilter.willApply": "Will apply",
  "fundingPage.masterFilter.invalidThreshold": "Filter thresholds must be numbers greater than or equal to 0. Leave a field blank to disable that threshold.",
  "fundingPage.masterFilter.fields.minVol24hM.label": "24-hour turnover ≥",
  "fundingPage.masterFilter.fields.minVol24hM.summary": "24-hour turnover",
  "fundingPage.masterFilter.fields.minOiM.label": "$t(zml:zml.metric.open_interest_notional) ≥",
  "fundingPage.masterFilter.fields.minOiM.summary": "$t(zml:zml.metric.open_interest_notional)",
  "fundingPage.masterFilter.loadFailed": "Funding settings could not be loaded. Reload and try again.",
  "fundingPage.masterFilter.saveFailed": "Funding settings could not be saved.",
  "fundingPage.masterFilter.saveApply": "Save and apply now",
  "monitorWorkspace.workspaceErrors.load": "The account could not be loaded. Try again.",
  "monitorWorkspace.workspaceErrors.activation": "The account content could not be loaded. Try again.",
  "monitorWorkspace.workspaceErrors.operations.create": "Create tab",
  "monitorWorkspace.workspaceErrors.operations.update": "Update tab",
  "monitorWorkspace.workspaceErrors.operations.delete": "Delete tab",
  "monitorWorkspace.workspaceErrors.operations.duplicate": "Duplicate tab",
  "monitorWorkspace.workspaceErrors.operations.reorder": "Reorder tabs",
  "monitorWorkspace.workspaceErrors.mutationConflict": "{{operation}} failed because the current tab rules do not allow this change.",
  "monitorWorkspace.workspaceErrors.mutation": "{{operation}} failed. Try again.",
  "monitorWorkspace.sound.on": "Alert sound on",
  "monitorWorkspace.sound.off": "Alert sound off",
  "monitorWorkspace.gridAria": "Monitoring data grid",
  "monitorWorkspace.tableAria": "Monitored combination table",
  "monitorWorkspace.rowsAria": "Monitored combination rows",
  "monitorWorkspace.favorite": "Favorited",
  "monitorWorkspace.favoriteToggle.add": "Favorite",
  "monitorWorkspace.favoriteToggle.remove": "Remove from favorites",
  "monitorWorkspace.favoriteToggle.label": "Favorite",
  "monitorWorkspace.blacklistDialog.title": "Quick blacklist",
  "monitorWorkspace.blacklistDialog.description": "Blacklist this combination by default · {{asset}} · {{route}}",
  "monitorWorkspace.blacklistDialog.selectTarget": "Choose a target to blacklist",
  "monitorWorkspace.blacklistDialog.targetAria": "Blacklist target",
  "monitorWorkspace.blacklistDialog.targets.opportunity": "This combination",
  "monitorWorkspace.blacklistDialog.targets.longInstrument": "Long-leg pair",
  "monitorWorkspace.blacklistDialog.targets.shortInstrument": "Short-leg pair",
  "monitorWorkspace.blacklistDialog.targets.baseAsset": "Asset",
  "monitorWorkspace.blacklistDialog.targets.baseAssetSummary": "{{asset}} · hide every combination containing this asset",
  "monitorWorkspace.blacklistDialog.feedback.added": "Added to your blacklist and hidden from your views and alerts",
  "monitorWorkspace.blacklistDialog.feedback.existing": "This target is already in your blacklist",
  "monitorWorkspace.blacklistDialog.feedback.failed": "The backend did not confirm the blacklist update",
  "monitorWorkspace.blacklistDialog.actions.close": "Close",
  "monitorWorkspace.blacklistDialog.actions.cancel": "Cancel",
  "monitorWorkspace.blacklistDialog.actions.confirmOpportunity": "Blacklist combination",
  "monitorWorkspace.blacklistDialog.actions.confirm": "Blacklist",
  "monitorWorkspace.route.buy": "Buy",
  "monitorWorkspace.route.sell": "Sell",
  "monitorWorkspace.route.long": "Long",
  "monitorWorkspace.route.short": "Short",
  "monitorWorkspace.route.aria": "Combination: {{route}}",
  "monitorWorkspace.route.unknown": "Unknown",
  "monitorWorkspace.route.incomplete": "Identity details unavailable",
  "monitorWorkspace.route.quotedIn": "Quoted in {{asset}}",
  "monitorWorkspace.assetType.crypto": "Crypto",
  "monitorWorkspace.assetType.equity": "$t(zml:zml.asset_class.equity)",
  "monitorWorkspace.assetType.etf": "ETF",
  "monitorWorkspace.assetType.commodity": "Commodity",
  "monitorWorkspace.assetType.fx": "FX",
  "monitorWorkspace.assetType.index": "Index",
  "monitorWorkspace.assetType.government_security": "Gov bond",
  "monitorWorkspace.assetType.real_estate": "Real estate",
  "monitorWorkspace.assetType.other": "Other",
  "monitorWorkspace.assetType.unknown": "Unclassified",
  "monitorWorkspace.columns.asset.label": "Asset",
  "monitorWorkspace.columns.asset.title": "Asset name and type",
  "monitorWorkspace.columns.pair.label": "Pair",
  "monitorWorkspace.columns.pair.title": "Asset · quote when it differs",
  "monitorWorkspace.columns.exchange.label": "Venue",
  "monitorWorkspace.columns.exchange.title": "Venue mark · market",
  "monitorWorkspace.columns.price.label": "Price",
  "monitorWorkspace.columns.price.title": "Current price",
  "monitorWorkspace.columns.open.label": "$t(zml:zml.metric.bbo_executable_open_spread_pct)",
  "monitorWorkspace.columns.open.title": "$t(zml:zml.metric.bbo_executable_open_spread_pct)",
  "monitorWorkspace.columns.close.label": "$t(zml:zml.metric.bbo_executable_close_spread_pct)",
  "monitorWorkspace.columns.close.title": "$t(zml:zml.metric.bbo_executable_close_spread_pct)",
  "monitorWorkspace.columns.gap.label": "$t(zml:zml.metric.spread_gap_pct)",
  "monitorWorkspace.columns.gap.title": "$t(zml:zml.metric.spread_gap_pct)",
  "monitorWorkspace.columns.funding.label": "$t(zml:zml.metric.net_funding_8h_pct.short)",
  "monitorWorkspace.columns.funding.title": "$t(zml:zml.metric.net_funding_8h_pct)",
  "monitorWorkspace.columns.fundingDetail.label": "Funding detail",
  "monitorWorkspace.columns.fundingDetail.title": "Funding detail",
  "monitorWorkspace.columns.fsl.label": "Funding linkage",
  "monitorWorkspace.columns.fsl.title": "Funding linkage: −100 to +100, measuring monotonic linkage between the spread and eight-hour equivalent net funding. Positive values move together; negative values move inversely.",
  "monitorWorkspace.columns.f1d.label": "Funding Δ 1D",
  "monitorWorkspace.columns.f1d.title": "1-day funding difference",
  "monitorWorkspace.columns.f2d.label": "Funding Δ 2D",
  "monitorWorkspace.columns.f2d.title": "2-day funding difference",
  "monitorWorkspace.columns.f3d.label": "Funding Δ 3D",
  "monitorWorkspace.columns.f3d.title": "3-day funding difference",
  "monitorWorkspace.columns.f4d.label": "Funding Δ 4D",
  "monitorWorkspace.columns.f4d.title": "4-day funding difference",
  "monitorWorkspace.columns.f5d.label": "Funding Δ 5D",
  "monitorWorkspace.columns.f5d.title": "5-day funding difference",
  "monitorWorkspace.columns.market-depth.label": "24h turnover",
  "monitorWorkspace.columns.market-depth.title": "24-hour turnover",
  "monitorWorkspace.columns.oi.label": "$t(zml:zml.metric.open_interest_notional.short)",
  "monitorWorkspace.columns.oi.title": "$t(zml:zml.metric.open_interest_notional)",
  "monitorWorkspace.columns.age.label": "Freshness",
  "monitorWorkspace.columns.age.title": "Data freshness",
  "monitorWorkspace.fundingHeader.intervalFilterAria": "Funding-interval quick filters",
  "monitorWorkspace.fundingHeader.addInterval": "Show combinations with a {{interval}} funding interval",
  "monitorWorkspace.fundingHeader.removeInterval": "Remove the {{interval}} funding-interval filter",
  "monitorWorkspace.age.legsDesynced": "Legs desynced {{duration}}",
  "monitorWorkspace.age.stale": "{{exchange}} stale {{duration}}",
  "monitorWorkspace.age.now": "now",
  "monitorWorkspace.age.secondsAgo": "{{count}}s ago",
  "monitorWorkspace.age.minutesAgo": "{{count}}m ago",
  "monitorWorkspace.age.hoursAgo": "{{count}}h ago",
  "monitorWorkspace.linkage.unavailable": "Unavailable",
  "monitorWorkspace.linkage.sameStrong": "Strong same-direction",
  "monitorWorkspace.linkage.same": "Same-direction",
  "monitorWorkspace.linkage.sameWeak": "Weak same-direction",
  "monitorWorkspace.linkage.inverseStrong": "Strong inverse",
  "monitorWorkspace.linkage.inverse": "Inverse",
  "monitorWorkspace.linkage.inverseWeak": "Weak inverse",
  "monitorWorkspace.linkage.none": "No clear linkage",
  "monitorWorkspace.linkage.cellTitleSuffix": "Interpretation: strong positive linkage means spreads widen as funding rises, making entry and exit timing more sensitive; near-zero linkage means funding carry is decoupled from spread state; strong negative linkage means spreads narrow as funding rises. Descriptive only, not trading advice.",
  "monitorWorkspace.cellTitle.pair": "Long-leg pair {{long}} / short-leg pair {{short}}",
  "monitorWorkspace.cellTitle.price": "Long-leg price {{long}} / short-leg price {{short}}",
  "monitorWorkspace.cellTitle.open": "Entry spread {{open}} / entry–exit gap {{gap}}",
  "monitorWorkspace.cellTitle.openStale": "Entry spread {{open}} / entry–exit gap {{gap}} · leg prices are out of sync; the live value is frozen",
  "monitorWorkspace.cellTitle.metric": "{{label}} {{value}}",
  "monitorWorkspace.cellTitle.metricStale": "{{label}} {{value}} · leg prices are out of sync; the live value is frozen",
  "monitorWorkspace.cellTitle.funding": "{{value}}",
  "monitorWorkspace.cellTitle.fundingStale": "{{value}} · leg prices are out of sync; the live value is frozen",
  "monitorWorkspace.cellTitle.fundingDetail": "Long-leg funding {{long}} / short-leg funding {{short}}",
  "monitorWorkspace.cellTitle.volume": "Long-leg 24-hour turnover {{long}} / short-leg 24-hour turnover {{short}}",
  "monitorWorkspace.cellTitle.oi": "{{firstMarket}} OI {{long}} / {{secondMarket}} OI {{short}} (USD; total for this instrument in each market; pairs ordered by the smaller perpetual-market OI)",
  "monitorWorkspace.cellTitle.diagnostic": "{{age}} · click to inspect diagnostics",
  "monitorWorkspace.cellTitle.linkage": "Funding linkage {{display}}/100 ({{label}}): positive means spread and net hourly funding tend to move together; negative means they tend to move inversely. {{suffix}}",
  "monitorWorkspace.cellTitle.linkageUnavailable": "Funding linkage: not measurable in the current window, so no score is given. {{suffix}}",
  "monitorWorkspace.drawer.complete.title": "Market data",
  "monitorWorkspace.drawer.complete.copy": "Copy original values",
  "monitorWorkspace.drawer.complete.copied": "Original values copied",
  "monitorWorkspace.drawer.complete.copyFailed": "Copy failed",
  "monitorWorkspace.drawer.complete.long": "Long leg",
  "monitorWorkspace.drawer.complete.short": "Short leg",
  "monitorWorkspace.drawer.complete.price": "Price",
  "monitorWorkspace.drawer.complete.volume": "24h volume",
  "monitorWorkspace.drawer.complete.oi": "Open interest",
  "monitorWorkspace.drawer.complete.funding": "Funding rate",
  "monitorWorkspace.drawer.complete.cap": "Funding rate cap",
  "monitorWorkspace.drawer.complete.period": "Settlement interval",
  "monitorWorkspace.drawer.complete.notApplicable": "Not applicable",
  "monitorWorkspace.drawer.actionsAria": "Combination actions",
  "monitorWorkspace.drawer.actions.history-curve": "History chart",
  "monitorWorkspace.drawer.actions.funding-detail": "Funding detail",
  "monitorWorkspace.drawer.actions.coin-detail": "Asset detail",
  "monitorWorkspace.drawer.actions.feishu-mute": "Notifications",
  "monitorWorkspace.drawer.actions.send-trade": "Send to ZML Trade",
  "monitorWorkspace.drawer.actions.blacklist": "Blacklist",
  "monitorWorkspace.drawer.actions.favorite": "Favorite",
  "monitorWorkspace.drawer.openHistoryCurve": "Open this combination's history chart",
  "monitorWorkspace.drawer.openFundingDetail": "Open this combination's funding history",
  "monitorWorkspace.drawer.openCoinDetail": "Open asset details",
  "monitorWorkspace.drawer.openNotificationSettings": "Open notification settings",
  "monitorWorkspace.drawer.sendToTrade": "Send the current opportunity snapshot to ZML Trade",
  "monitorWorkspace.drawer.blacklist": "Blacklist this combination",
  "monitorWorkspace.drawer.asset.marketSummaryAria": "Asset market summary",
  "monitorWorkspace.drawer.asset.rank": "Rank",
  "monitorWorkspace.drawer.asset.marketCap": "$t(zml:zml.metric.market_capitalization)",
  "monitorWorkspace.drawer.asset.change24h": "24H change",
  "monitorWorkspace.drawer.asset.volume24h": "$t(zml:zml.metric.quote_volume_24h)",
  "monitorWorkspace.drawer.asset.circulation": "Circulating supply",
  "monitorWorkspace.drawer.coin.title": "Asset details",
  "monitorWorkspace.drawer.coin.loading": "Loading asset details…",
  "monitorWorkspace.drawer.coin.loadFailed": "Unable to load asset details",
  "monitorWorkspace.drawer.coin.retry": "Retry",
  "monitorWorkspace.drawer.coin.openInToolbox": "Open in Toolbox",
  "monitorWorkspace.drawer.coin.unavailable": "Asset details unavailable",
  "monitorWorkspace.drawer.coin.cachedAt": "Last updated: {{age}}",
  "monitorWorkspace.drawer.coin.updatedAt": "Last updated: {{age}}",
  "monitorWorkspace.drawer.coin.lookup.refreshing": "Refreshing…",
  "monitorWorkspace.drawer.coin.lookup.refresh": "Refresh asset data",
  "monitorWorkspace.drawer.coin.lookup.emptyTitle": "Search for an asset to view details",
  "monitorWorkspace.drawer.coin.lookup.emptyDescription": "Enter an asset name or symbol to inspect cross-exchange markets, volume distribution, and service status.",
  "monitorWorkspace.drawer.coin.cache.unknown": "time unknown",
  "monitorWorkspace.drawer.coin.cache.justNow": "just now",
  "monitorWorkspace.drawer.coin.cache.minutesAgo": "{{count}} min ago",
  "monitorWorkspace.drawer.coin.cache.hoursAgo": "{{count}} hr ago",
  "monitorWorkspace.drawer.coin.filters.typeAria": "Asset-source filter",
  "monitorWorkspace.drawer.coin.filters.typeLabel": "Source",
  "monitorWorkspace.drawer.coin.filters.type.all": "All",
  "monitorWorkspace.drawer.coin.filters.type.cex": "Centralized exchanges",
  "monitorWorkspace.drawer.coin.filters.marketAria": "Asset-market filter",
  "monitorWorkspace.drawer.coin.filters.marketLabel": "Market",
  "monitorWorkspace.drawer.coin.filters.market.spot": "Spot",
  "monitorWorkspace.drawer.coin.filters.market.perpetual": "Perpetuals",
  "monitorWorkspace.drawer.coin.filters.market.futures": "Futures",
  "monitorWorkspace.drawer.coin.filters.totalPairs": "{{count}} pairs",
  "monitorWorkspace.drawer.coin.header.marketCap": "$t(zml:zml.metric.market_capitalization)",
  "monitorWorkspace.drawer.coin.header.volume24h": "$t(zml:zml.metric.quote_volume_24h)",
  "monitorWorkspace.drawer.coin.header.circulation": "Circulating",
  "monitorWorkspace.drawer.coin.header.marketCapRank": "Market cap <rank>{{rank}}</rank>",
  "monitorWorkspace.drawer.coin.featureTabs.market": "Market data",
  "monitorWorkspace.drawer.coin.links.homepage": "Website",
  "monitorWorkspace.drawer.coin.links.followers": "{{count}} followers",
  "monitorWorkspace.drawer.coin.links.subscribers": "{{count}} subscribers",
  "monitorWorkspace.drawer.coin.links.linksAria": "Project links",
  "monitorWorkspace.drawer.coin.links.resourcesAria": "Project resources",
  "monitorWorkspace.drawer.coin.links.resources": "Project resources",
  "monitorWorkspace.drawer.coin.links.expandDescription": "Show overview",
  "monitorWorkspace.drawer.coin.links.collapseDescription": "Hide overview",
  "monitorWorkspace.drawer.coin.search.searching": "Searching…",
  "monitorWorkspace.drawer.coin.search.failed": "Search failed. Try again.",
  "monitorWorkspace.drawer.coin.search.recent": "Recently viewed",
  "monitorWorkspace.drawer.coin.search.aria": "Search assets",
  "monitorWorkspace.drawer.coin.search.placeholder": "Search assets…",
  "monitorWorkspace.drawer.coin.search.empty": "No matching assets",
  "monitorWorkspace.drawer.coin.search.resultsAria": "Asset search results",
  "monitorWorkspace.drawer.coin.hover.loading": "Loading asset summary…",
  "monitorWorkspace.drawer.coin.hover.unavailable": "Asset summary unavailable",
  "monitorWorkspace.drawer.coin.hover.partial": "Partial data",
  "monitorWorkspace.drawer.coin.hover.rank": "Rank",
  "monitorWorkspace.drawer.coin.hover.marketCap": "$t(zml:zml.metric.market_capitalization)",
  "monitorWorkspace.drawer.coin.hover.volume24h": "$t(zml:zml.metric.quote_volume_24h)",
  "monitorWorkspace.drawer.coin.hover.circulation": "Circulating",
  "monitorWorkspace.drawer.coin.hover.change24h": "24H change",
  "monitorWorkspace.drawer.coin.volume.other": "Other",
  "monitorWorkspace.drawer.coin.volume.title": "Turnover distribution",
  "monitorWorkspace.drawer.coin.volume.description": "Aggregated by exchange",
  "monitorWorkspace.drawer.coin.volume.emptySummary": "No turnover-distribution data is available.",
  "monitorWorkspace.drawer.coin.volume.empty": "No turnover data",
  "monitorWorkspace.drawer.coin.volume.summary": "Turnover is grouped into <count>{{count}}</count> entries; <name>{{name}}</name> is largest at <volume>{{volume}}</volume>, or <percentage>{{percentage}}%</percentage>.",
  "monitorWorkspace.drawer.coin.volume.total": "Aggregated by exchange · Total turnover <total>{{total}}</total>",
  "monitorWorkspace.drawer.coin.volume.aria": "Trading-turnover distribution by exchange",
  "monitorWorkspace.drawer.coin.table.emptySpot": "No spot pairs",
  "monitorWorkspace.drawer.coin.table.emptyDerivatives": "No derivative contracts",
  "monitorWorkspace.drawer.coin.table.spotAria": "Asset spot-market table",
  "monitorWorkspace.drawer.coin.table.derivativesAria": "Asset derivatives-market table",
  "monitorWorkspace.drawer.coin.table.exchange": "Exchange",
  "monitorWorkspace.drawer.coin.table.pair": "Pair",
  "monitorWorkspace.drawer.coin.table.contract": "Contract",
  "monitorWorkspace.drawer.coin.table.settlement": "{{quote}} · Settles in {{settlement}}",
  "monitorWorkspace.drawer.coin.table.columns.price": "Price",
  "monitorWorkspace.drawer.coin.table.columns.volume": "24-hour turnover",
  "monitorWorkspace.drawer.coin.table.columns.spread": "Spread",
  "monitorWorkspace.drawer.coin.table.columns.volumePct": "Volume share",
  "monitorWorkspace.drawer.coin.table.columns.trust": "Source",
  "monitorWorkspace.drawer.coin.table.columns.updated": "Updated",
  "monitorWorkspace.drawer.coin.table.columns.funding": "$t(zml:zml.metric.funding_rate)",
  "monitorWorkspace.drawer.coin.table.columns.openInterest": "$t(zml:zml.metric.open_interest_notional)",
  "monitorWorkspace.drawer.coin.table.columns.basis": "Basis",
  "monitorWorkspace.drawer.coin.table.columns.change": "24H change",
  "monitorWorkspace.drawer.coin.table.source.official": "Official",
  "monitorWorkspace.drawer.coin.table.age.justNow": "just now",
  "monitorWorkspace.drawer.coin.table.age.minutesAgo": "{{count}} min ago",
  "monitorWorkspace.drawer.coin.table.age.hoursAgo": "{{count}} hr ago",
  "monitorWorkspace.drawer.coin.table.age.daysAgo": "{{count}} d ago",
  "monitorWorkspace.drawer.coin.table.pagination.aria": "Pair pagination",
  "monitorWorkspace.drawer.coin.table.pagination.empty": "There are no pairs.",
  "monitorWorkspace.drawer.coin.table.pagination.firstPage": "Already on the first page.",
  "monitorWorkspace.drawer.coin.table.pagination.lastPage": "Already on the last page.",
  "monitorWorkspace.drawer.coin.table.pagination.range": "{{start}}–{{end}} / {{total}}",
  "monitorWorkspace.drawer.coin.table.pagination.previousAria": "Previous pair page",
  "monitorWorkspace.drawer.coin.table.pagination.nextAria": "Next pair page",
  "monitorWorkspace.drawer.coin.settings.aria": "Page settings",
  "monitorWorkspace.drawer.coin.settings.syncErrorAria": "Page settings; preferences are out of sync",
  "monitorWorkspace.drawer.coin.settings.title": "Asset-detail settings",
  "monitorWorkspace.drawer.coin.settings.description": "Filter and table preferences are saved to this account.",
  "monitorWorkspace.drawer.coin.settings.defaultMarket": "Default market",
  "monitorWorkspace.drawer.coin.settings.exchangeType": "Exchange type",
  "monitorWorkspace.drawer.coin.settings.exchangeTypes.all": "All",
  "monitorWorkspace.drawer.coin.settings.exchangeTypes.cex": "Centralized",
  "monitorWorkspace.drawer.coin.settings.pageSize": "Rows per page",
  "monitorWorkspace.drawer.coin.settings.tableDensity": "Table density",
  "monitorWorkspace.drawer.coin.settings.density.compact": "Compact",
  "monitorWorkspace.drawer.coin.settings.density.standard": "Standard",
  "monitorWorkspace.drawer.coin.settings.density.relaxed": "Relaxed",
  "monitorWorkspace.drawer.coin.settings.visibleColumns": "Visible columns",
  "monitorWorkspace.drawer.coin.settings.hiddenExchanges": "Hidden exchanges",
  "monitorWorkspace.drawer.coin.priceChart.title": "Candlestick chart",
  "monitorWorkspace.drawer.coin.priceChart.up": "Up",
  "monitorWorkspace.drawer.coin.priceChart.down": "Down",
  "monitorWorkspace.drawer.coin.priceChart.legendAria": "Candlestick up and down legend",
  "monitorWorkspace.drawer.coin.priceChart.rangeAria": "Candlestick range",
  "monitorWorkspace.drawer.coin.priceChart.ranges.oneDay": "1D",
  "monitorWorkspace.drawer.coin.priceChart.ranges.sevenDays": "7D",
  "monitorWorkspace.drawer.coin.priceChart.ranges.fourteenDays": "14D",
  "monitorWorkspace.drawer.coin.priceChart.ranges.thirtyDays": "30D",
  "monitorWorkspace.drawer.coin.priceChart.asset": "Asset",
  "monitorWorkspace.drawer.coin.priceChart.chartAria": "{{coin}} {{days}}-day candlestick chart",
  "monitorWorkspace.drawer.coin.priceChart.loading": "Loading candlestick data…",
  "monitorWorkspace.drawer.coin.priceChart.warming": "Backfilling candlestick data…",
  "monitorWorkspace.drawer.coin.priceChart.loadFailed": "Candlestick data unavailable",
  "monitorWorkspace.drawer.coin.priceChart.retry": "Retry",
  "monitorWorkspace.drawer.coin.priceChart.empty": "No candlestick data",
  "monitorWorkspace.drawer.coin.priceChart.noCoin": "No asset selected",
  "monitorWorkspace.drawer.coin.priceChart.noCoinDescription": "Select an asset to view OHLC data.",
  "monitorWorkspace.drawer.coin.priceChart.summary.notLoaded": "Candlestick data has not loaded yet.",
  "monitorWorkspace.drawer.coin.priceChart.summary.reinitializing": "Reinitializing the candlestick chart.",
  "monitorWorkspace.drawer.coin.priceChart.summary.initializationFailed": "The candlestick chart could not be initialized.",
  "monitorWorkspace.drawer.coin.priceChart.summary.noCoin": "No asset is selected.",
  "monitorWorkspace.drawer.coin.priceChart.summary.loading": "Loading {{days}} days of candlestick data.",
  "monitorWorkspace.drawer.coin.priceChart.summary.warming": "Backfilling {{days}} days of candlestick data.",
  "monitorWorkspace.drawer.coin.priceChart.summary.empty": "No complete {{days}}-day official candlestick history is available.",
  "monitorWorkspace.drawer.coin.priceChart.summary.requestFailed": "The {{days}}-day candlestick request failed.",
  "monitorWorkspace.drawer.coin.priceChart.summary.coverageIncomplete": "Official <days>{{days}}</days>-day history covers <hours>{{coverageHours}}/{{expectedHours}}</hours> hours (<coveragePct>{{coveragePct}}%</coveragePct>), so it is not shown as complete history.",
  "monitorWorkspace.drawer.coin.priceChart.summary.ready": "<days>{{days}}</days>-day candlestick chart with <count>{{count}}</count> candles; high <high>{{high}}</high>, low <low>{{low}}</low>, latest close <close>{{close}}</close>.",
  "monitorWorkspace.drawer.coin.priceChart.errors.initializationFailed": "The candlestick chart could not be initialized. Try again.",
  "monitorWorkspace.drawer.coin.priceChart.errors.requestFailed": "Candlestick data could not be loaded. Try again shortly.",
  "monitorWorkspace.drawer.coin.priceChart.dataTable.label": "{{coin}} candlestick data points",
  "monitorWorkspace.drawer.coin.priceChart.dataTable.time": "Time",
  "monitorWorkspace.drawer.coin.priceChart.dataTable.open": "Open",
  "monitorWorkspace.drawer.coin.priceChart.dataTable.high": "High",
  "monitorWorkspace.drawer.coin.priceChart.dataTable.low": "Low",
  "monitorWorkspace.drawer.coin.priceChart.dataTable.close": "Close",
  "monitorWorkspace.drawer.coin.modules.unavailableTitle": "Module temporarily unavailable",
  "monitorWorkspace.drawer.coin.modules.retry": "Retry",
  "monitorWorkspace.drawer.coin.modules.volumeTitle": "Volume distribution",
  "monitorWorkspace.drawer.coin.modules.volumeDescription": "Aggregated by exchange",
  "monitorWorkspace.drawer.coin.modules.volumeLoading": "Loading volume chart…",
  "monitorWorkspace.drawer.coin.modules.orderbookLoading": "Loading market details…",
  "monitorWorkspace.drawer.coin.modules.chartTitle": "Candlestick chart",
  "monitorWorkspace.drawer.coin.modules.chartDescription": "OHLC · USD",
  "monitorWorkspace.drawer.coin.modules.priceLoading": "Loading price chart…",
  "monitorWorkspace.drawer.coin.errors.requestFailed": "Asset details request failed. Please try again later.",
  "monitorWorkspace.drawer.coin.errors.identityAmbiguous": "Several similar assets were found. Select one and try again.",
  "monitorWorkspace.drawer.coin.errors.identityNotFound": "No matching asset was found.",
  "monitorWorkspace.drawer.coin.errors.identityUnresolved": "Asset details are not available for this combination yet.",
  "monitorWorkspace.drawer.coin.errors.catalogNotReady": "Asset details are being prepared. Please try again shortly.",
  "monitorWorkspace.drawer.coin.errors.invalidDomain": "Asset details are not supported for this asset yet.",
  "monitorWorkspace.drawer.coin.errors.serviceUnavailable": "The asset detail service is temporarily unavailable.",
  "monitorWorkspace.drawer.coin.errors.unrecognized": "The asset detail request could not be completed.",
  "monitorWorkspace.drawer.coin.errors.dataUnavailable": "No asset detail data is available.",
  "monitorWorkspace.drawer.coin.errors.idNotFound": "The requested asset was not found.",
  "monitorWorkspace.drawer.coin.errors.symbolNotFound": "No asset matching this symbol was found.",
  "monitorWorkspace.drawer.coin.errors.candidateUnavailable": "Matching candidates were found, but their details are temporarily unavailable.",
  "monitorWorkspace.drawer.coin.errors.upstreamFailed": "Live market data is temporarily unavailable. Please try again later.",
  "monitorWorkspace.drawer.coin.errors.backgroundRefresh": "Fresh data is not ready yet. A background refresh is in progress.",
  "monitorWorkspace.drawer.coin.errors.identityDataMissing": "Details for this asset are currently incomplete.",
  "monitorWorkspace.drawer.coin.errors.partialBackgroundRefresh": "Some data is from the latest available snapshot while a background refresh continues.",
  "monitorWorkspace.drawer.coin.errors.partialUpstreamFailed": "Some live data could not be refreshed; the available snapshot remains visible.",
  "monitorWorkspace.drawer.deferred.unavailableTitle": "Temporarily unavailable",
  "monitorWorkspace.drawer.deferred.retry": "Retry",
  "monitorWorkspace.drawer.deferred.moduleError": "Module error",
  "monitorWorkspace.drawer.deferred.loading": "Loading",
  "monitorWorkspace.drawer.funding.title": "Funding history",
  "monitorWorkspace.drawer.funding.loadingShort": "Loading",
  "monitorWorkspace.drawer.funding.refreshingShort": "Refreshing",
  "monitorWorkspace.drawer.funding.errorShort": "Load error",
  "monitorWorkspace.drawer.funding.staleShort": "Stale snapshot",
  "monitorWorkspace.drawer.funding.emptyShort": "No details",
  "monitorWorkspace.drawer.funding.loading": "Loading funding history…",
  "monitorWorkspace.drawer.funding.loadFailed": "Unable to load funding history",
  "monitorWorkspace.drawer.funding.retry": "Retry",
  "monitorWorkspace.drawer.funding.emptyTitle": "No funding history available",
  "monitorWorkspace.drawer.funding.emptyDescription": "Funding history is temporarily unavailable for this combination.",
  "monitorWorkspace.drawer.funding.spot": "Spot",
  "monitorWorkspace.drawer.funding.days": "{{count}}D",
  "monitorWorkspace.drawer.funding.cumulativeNet": "Cumulative net funding difference",
  "monitorWorkspace.drawer.funding.longLeg": "Long",
  "monitorWorkspace.drawer.funding.shortLeg": "Short",
  "monitorWorkspace.drawer.funding.netDifference": "Net difference",
  "monitorWorkspace.drawer.funding.breakdown": "Combination breakdown",
  "monitorWorkspace.drawer.funding.breakdownAria": "Funding-history combination breakdown",
  "monitorWorkspace.drawer.funding.coverage": "Coverage",
  "monitorWorkspace.drawer.funding.latestSettlement": "Latest settlement",
  "monitorWorkspace.drawer.funding.intervalMismatch": "Legs use different settlement intervals",
  "monitorWorkspace.drawer.funding.settlementDetail": "Settlement details · last 5 days",
  "monitorWorkspace.drawer.funding.noSettlementTitle": "No settlement details",
  "monitorWorkspace.drawer.funding.noSettlementDescription": "There are no settlement records to display for the last 5 days.",
  "monitorWorkspace.drawer.funding.settlementAria": "Funding-history settlement details",
  "monitorWorkspace.drawer.funding.settlementTime": "Settlement time",
  "monitorWorkspace.drawer.funding.longRate": "Long rate",
  "monitorWorkspace.drawer.funding.shortRate": "Short rate",
  "monitorWorkspace.drawer.funding.quality.partial": "Data status: partial coverage; the last 5 days of funding history may be incomplete.",
  "monitorWorkspace.drawer.funding.quality.newListing": "Data status: less than 5 days of history; cumulative values use available records. The first record does not establish the listing date.",
  "monitorWorkspace.drawer.funding.quality.stale": "Data status: settlement updates are stale; compare them with live funding in the main table.",
  "monitorWorkspace.drawer.funding.quality.missing": "Data status: no usable settlement records were available in the last 5 days.",
  "monitorWorkspace.drawer.funding.quality.warmingUp": "Data status: funding history is warming up and will continue to fill in.",
  "monitorWorkspace.drawer.diagnostics.title": "Combination diagnostics",
  "monitorWorkspace.drawer.diagnostics.thresholds.title": "Diagnostic thresholds",
  "monitorWorkspace.drawer.diagnostics.thresholds.description": "Changes are persisted to runtime parameters and take effect from the next compute batch.",
  "monitorWorkspace.drawer.diagnostics.thresholds.legDelta": "Leg delta · s",
  "monitorWorkspace.drawer.diagnostics.thresholds.legStale": "Single-leg timeout · s",
  "monitorWorkspace.drawer.diagnostics.save": "Save",
  "monitorWorkspace.drawer.diagnostics.refresh": "Refresh",
  "monitorWorkspace.drawer.diagnostics.retry": "Retry",
  "monitorWorkspace.drawer.diagnostics.refreshFailed": "Diagnostics refresh failed",
  "monitorWorkspace.drawer.diagnostics.refreshing": "Refreshing combination diagnostics…",
  "monitorWorkspace.drawer.diagnostics.loading": "Loading combination diagnostics…",
  "monitorWorkspace.drawer.diagnostics.loadFailed": "Unable to load combination diagnostics",
  "monitorWorkspace.drawer.diagnostics.empty": "No diagnostic details available",
  "monitorWorkspace.drawer.diagnostics.disabled.saving": "Diagnostic thresholds are being saved. Please wait.",
  "monitorWorkspace.drawer.diagnostics.disabled.refreshing": "Diagnostics are refreshing. Please wait.",
  "monitorWorkspace.drawer.diagnostics.disabled.paramsUnconfirmed": "Runtime thresholds are not confirmed yet. Refresh first.",
  "monitorWorkspace.drawer.diagnostics.disabled.paramsMissing": "Runtime thresholds have not loaded yet.",
  "monitorWorkspace.drawer.diagnostics.messages.detailLoadFailed": "Unable to load combination diagnostics. Check backend status and retry.",
  "monitorWorkspace.drawer.diagnostics.messages.paramsLoadFailed": "Unable to load runtime thresholds. Check backend status and retry.",
  "monitorWorkspace.drawer.diagnostics.messages.invalidSeconds": "Enter valid values in seconds.",
  "monitorWorkspace.drawer.diagnostics.messages.outOfRange": "A threshold is outside the range accepted by the backend.",
  "monitorWorkspace.drawer.diagnostics.messages.deltaExceedsStale": "The leg-delta threshold cannot exceed the single-leg timeout.",
  "monitorWorkspace.drawer.diagnostics.messages.saved": "Hot-updated and persisted.",
  "monitorWorkspace.drawer.diagnostics.messages.conflict": "Another user updated these settings. The authoritative baseline is refreshed and your local draft is preserved; review and save again.",
  "monitorWorkspace.drawer.diagnostics.messages.saveFailed": "Save failed. Check backend status and retry.",
  "monitorWorkspace.drawer.diagnostics.snapshot.title": "Market snapshot",
  "monitorWorkspace.drawer.diagnostics.snapshot.openClose": "Entry / exit",
  "monitorWorkspace.drawer.diagnostics.snapshot.netFunding8h": "8H-equivalent net funding",
  "monitorWorkspace.drawer.diagnostics.snapshot.legDelta": "Leg time delta",
  "monitorWorkspace.drawer.diagnostics.legs.long": "Long leg",
  "monitorWorkspace.drawer.diagnostics.legs.short": "Short leg",
  "monitorWorkspace.drawer.diagnostics.legs.diagnostic": "Diagnostic",
  "monitorWorkspace.drawer.diagnostics.legs.price": "Price",
  "monitorWorkspace.drawer.diagnostics.legs.quoteAge": "Quote age",
  "monitorWorkspace.drawer.diagnostics.legs.streamAge": "Stream age",
  "monitorWorkspace.drawer.diagnostics.streams.title": "Related streams",
  "monitorWorkspace.drawer.diagnostics.streams.empty": "No related stream information",
  "monitorWorkspace.drawer.diagnostics.streams.lastEvent": "Last event {{age}}",
  "monitorWorkspace.drawer.diagnostics.streams.noError": "No error",
  "monitorWorkspace.drawer.diagnostics.streams.statusAria": "Runtime status: {{status}}",
  "monitorWorkspace.drawer.diagnostics.streams.reconnects": "Reconnects {{count}}",
  "monitorWorkspace.drawer.diagnostics.streams.errors": "Errors {{count}}",
  "monitorWorkspace.drawer.notifications.title": "Notification settings",
  "monitorWorkspace.tradeSend.sending": "Sending {{opportunityId}} to ZML Trade",
  "monitorWorkspace.tradeSend.delivering": "{{opportunityId}} is awaiting ZML Trade delivery confirmation",
  "monitorWorkspace.tradeSend.delivered": "{{opportunityId}} was delivered to ZML Trade",
  "monitorWorkspace.tradeSend.rejected": "{{opportunityId}} was rejected: {{reason}}",
  "monitorWorkspace.tradeSend.reasons.offline": "ZML Trade is not accepting manual imports. Enable Manual Import in ZML Trade and try again",
  "monitorWorkspace.tradeSend.reasons.backpressure": "ZML Trade has reached its safe processing limit. Try again shortly",
  "monitorWorkspace.tradeSend.reasons.expired": "This opportunity snapshot has expired. Review the latest market data and send it again",
  "monitorWorkspace.tradeSend.reasons.instrumentIdentityIncomplete": "The market identity is incomplete, so the system rejected it safely",
  "monitorWorkspace.tradeSend.reasons.generic": "ZML Trade did not accept this import ({{code}})",
  "monitorWorkspace.tabs.fixed.favoritesAlerts.label": "Favorites",
  "monitorWorkspace.tabs.fixed.favoritesAlerts.title": "Favorites & alerts",
  "monitorWorkspace.tabs.navAria": "Combination tabs",
  "monitorWorkspace.tabs.optionsAria": "Combination tab options",
  "monitorWorkspace.tabs.allViews": "All views",
  "monitorWorkspace.tabs.allViewsCount_one": "{{count}} view",
  "monitorWorkspace.tabs.allViewsCount_other": "{{count}} views",
  "monitorWorkspace.tabs.overflowMore_one": "{{count}} more",
  "monitorWorkspace.tabs.overflowMore_other": "{{count}} more",
  "monitorWorkspace.tabs.newTab": "New combination tab",
  "monitorWorkspace.tabs.copyName": "{{name}} copy",
  "monitorWorkspace.tabs.fixedViewAria": "{{label}}{{alerts}}",
  "monitorWorkspace.tabs.alertCountSuffix_one": ", {{count}} alert",
  "monitorWorkspace.tabs.alertCountSuffix_other": ", {{count}} alerts",
  "monitorWorkspace.tabs.reorder": "Reorder combination tab {{name}}",
  "monitorWorkspace.tabs.more": "More",
  "monitorWorkspace.tabs.overflowAria": "{{label}}, {{count}} total",
  "monitorWorkspace.tabs.overflowAriaWithAlerts_one": "{{label}}, {{itemCount}} total, {{count}} alert",
  "monitorWorkspace.tabs.overflowAriaWithAlerts_other": "{{label}}, {{itemCount}} total, {{count}} alerts",
  "monitorWorkspace.tabs.currentView": "Current view",
  "monitorWorkspace.tabs.itemAlerts_one": "{{count}} alert",
  "monitorWorkspace.tabs.itemAlerts_other": "{{count}} alerts",
  "monitorWorkspace.tabs.itemAriaSeparator": ", ",
  "monitorWorkspace.tabs.contextMenuAria": "{{name}} tab menu",
  "monitorWorkspace.tabs.actions.settings": "Settings",
  "monitorWorkspace.tabs.actions.rename": "Rename",
  "monitorWorkspace.tabs.actions.duplicate": "Duplicate",
  "monitorWorkspace.tabs.actions.delete": "Delete",
  "monitorWorkspace.tabs.closeFeedback": "Dismiss message",
  "monitorWorkspace.tabs.renameDialog.title": "Rename combination tab",
  "monitorWorkspace.tabs.renameDialog.description": "Enter a new tab name. Its current filters stay unchanged.",
  "monitorWorkspace.tabs.renameDialog.label": "Combination-tab name",
  "monitorWorkspace.tabs.renameDialog.placeholder": "Enter a tab name",
  "monitorWorkspace.tabs.deleteDialog.title": "Delete combination tab",
  "monitorWorkspace.tabs.deleteDialog.description": "Delete “{{name}}”? Its base filter, alert settings, independent Feishu channel selection and ZML Trade delivery rules will be removed. You can undo for a few seconds after deleting.",
  "monitorWorkspace.tabs.deleteDialog.dirtySuffix": " Deleting the current tab will also discard its unsaved base-filter, alert, ZML Trade delivery, or embedded-template drafts.",
  "monitorWorkspace.tabs.deleteDialog.confirm": "Delete",
  "monitorWorkspace.tabs.leave.createTitle": "Discard unsaved tab settings and create a tab?",
  "monitorWorkspace.tabs.leave.createDescription": "The new tab opens immediately after creation. Continuing discards unsaved base-filter, alert, ZML Trade delivery, and embedded-template drafts on the current tab.",
  "monitorWorkspace.tabs.leave.createConfirm": "Discard and create",
  "monitorWorkspace.tabs.leave.creatingDescription": "Creating the combination tab. If the remote operation fails, current unsaved settings are preserved; they are discarded only after creation succeeds and the view actually switches.",
  "monitorWorkspace.tabs.leave.duplicatingDescription": "Duplicating the combination tab. If the remote operation fails, current unsaved settings are preserved; they are discarded only after duplication succeeds and the view actually switches.",
  "monitorWorkspace.tabs.leave.defaultTitle": "Discard unsaved tab settings?",
  "monitorWorkspace.tabs.leave.defaultDescription": "This combination tab has unsaved base-filter, alert, ZML Trade delivery, or embedded-template changes. Continuing discards those drafts.",
  "monitorWorkspace.tabs.leave.defaultConfirm": "Discard and continue",
  "monitorWorkspace.tabs.leave.defaultCancel": "Keep editing",
  "monitorWorkspace.tabs.leave.mutationTitle": "Completing operation…",
  "monitorWorkspace.tabs.leave.mutationDescription": "Current unsaved settings are preserved until the remote operation completes. They are discarded only after the operation succeeds and the view actually changes.",
  "monitorWorkspace.tabs.leave.mutationConfirm": "Working…",
  "monitorWorkspace.tabs.leave.mutationCancel": "Please wait",
  "monitorWorkspace.tabs.leave.savingDescription": "Tab settings are being saved and applied. You cannot close, switch tabs, or leave until that finishes.",
  "monitorWorkspace.tabs.leave.savingConfirm": "Saving…",
  "monitorWorkspace.filters.capability.loading": "Syncing available markets.",
  "monitorWorkspace.filters.capability.stale": "Available markets changed. Current results are syncing.",
  "monitorWorkspace.filters.capability.error": "Available markets could not be refreshed. Current results keep the last snapshot; try again later.",
  "monitorWorkspace.filters.capability.retry": "Sync available markets",
  "monitorWorkspace.filters.groups.settlement": "Settlement",
  "monitorWorkspace.filters.groups.market": "Market",
  "monitorWorkspace.filters.groups.openSpread": "Entry spread",
  "monitorWorkspace.filters.groups.spreadGap": "Entry–exit gap",
  "monitorWorkspace.filters.groups.realtimeFunding": "Live funding",
  "monitorWorkspace.filters.groups.accumulatedFunding": "Accumulated funding",
  "monitorWorkspace.filters.groups.liquidity": "Liquidity",
  "monitorWorkspace.filters.groups.venueExclusion": "Excluded exchanges",
  "monitorWorkspace.filters.activeCount": "{{label}} · {{count}}",
  "monitorWorkspace.filters.groupAria": "{{group}} filter: {{state}}",
  "monitorWorkspace.filters.notEnabled": "not enabled",
  "monitorWorkspace.filters.baseAsset": "Base asset",
  "monitorWorkspace.filters.baseAssetHint": "Separate base assets with spaces; a trailing space requests an exact match",
  "monitorWorkspace.filters.baseAssetAria": "Base-asset filter. {{hint}}",
  "monitorWorkspace.filters.baseAssetHelpAria": "Base-asset filter help: {{hint}}",
  "monitorWorkspace.filters.conditionRow.add": "Add filter condition",
  "monitorWorkspace.filters.conditionRow.clear": "Clear",
  "monitorWorkspace.filters.conditionRow.remove": "Remove condition: {{label}}",
  "monitorWorkspace.filters.conditionRow.operatorMenu": "Operator for {{label}}",
  "monitorWorkspace.filters.conditionRow.valueCount": "{{count}} {{unit}}",
  "monitorWorkspace.filters.conditionRow.operators.gte": "≥",
  "monitorWorkspace.filters.conditionRow.operators.lte": "≤",
  "monitorWorkspace.filters.conditionRow.operators.absGte": "abs ≥",
  "monitorWorkspace.filters.conditionRow.operators.anyOf": "is any of",
  "monitorWorkspace.filters.conditionRow.operators.notIn": "is not",
  "monitorWorkspace.filters.conditionRow.operators.requires": "requires",
  "monitorWorkspace.filters.conditionRow.operators.is": "is",
  "monitorWorkspace.filters.conditionRow.units.settlement": "settlement currencies",
  "monitorWorkspace.filters.conditionRow.units.interval": "intervals",
  "monitorWorkspace.filters.conditionRow.units.venue": "exchanges",
  "monitorWorkspace.filters.conditionRow.values.bothLegsEqual": "both legs equal",
  "monitorWorkspace.filters.conditionRow.empty.title": "No combinations match the current filters",
  "monitorWorkspace.filters.conditionRow.empty.hidden": "{{count}} hidden by filters",
  "monitorWorkspace.filters.summary.settlementMatch": "Matching settlement assets",
  "monitorWorkspace.filters.summary.noCombination": "No opportunity structures selected",
  "monitorWorkspace.filters.summary.combinationCount": "{{count}} opportunity structures",
  "monitorWorkspace.filters.summary.entryGte": "Entry ≥ {{value}}%",
  "monitorWorkspace.filters.summary.entryAbsGte": "Entry |·| ≥ {{value}}%",
  "monitorWorkspace.filters.summary.gapGte": "Entry–exit ≥ {{value}}%",
  "monitorWorkspace.filters.summary.gapLte": "Entry–exit ≤ {{value}}%",
  "monitorWorkspace.filters.summary.volumeGte": "24-hour turnover ≥ {{value}}M",
  "monitorWorkspace.filters.summary.intervalMatch": "Matching intervals",
  "monitorWorkspace.filters.pool.all": "All, dynamically",
  "monitorWorkspace.filters.pool.allExcept": "All dynamically · {{count}} excluded",
  "monitorWorkspace.filters.pool.only": "Only {{count}} selected",
  "monitorWorkspace.filters.pool.none": "None selected",
  "monitorWorkspace.filters.panel.openSettings": "Filter settings…",
  "monitorWorkspace.filters.panel.inherited": "No added conditions · inherits the combination tab",
  "monitorWorkspace.filters.panel.unrestricted": "No restrictions",
  "monitorWorkspace.filters.panel.clearGroup": "Clear group",
  "monitorWorkspace.filters.panel.deferred.loading": "Opening filter controls…",
  "monitorWorkspace.filters.panel.deferred.unavailableTitle": "Filter controls are temporarily unavailable",
  "monitorWorkspace.filters.panel.settlement.inheritedMustMatch": "The combination tab already requires either leg to match {{values}} and both legs to use the same settlement asset, so these assets are the current capability ceiling.",
  "monitorWorkspace.filters.panel.settlement.viewMustMatch": "The combination tab already requires either leg to match {{values}}. This view also requires both legs to match, so the tab's assets are the current capability ceiling.",
  "monitorWorkspace.filters.panel.settlement.anotherLeg": "The combination tab already requires either leg to match {{values}}. This view may still select assets available on the other leg; both either-leg conditions must match.",
  "monitorWorkspace.filters.panel.settlement.match": "Matching settlement assets",
  "monitorWorkspace.filters.panel.settlement.matchInherited": "Enabled by the combination tab and inherited here",
  "monitorWorkspace.filters.panel.settlement.matchDescription": "Keep only combinations whose long and short legs use the same settlement asset",
  "monitorWorkspace.filters.panel.settlement.selectionAria": "Settlement-asset selection",
  "monitorWorkspace.filters.panel.settlement.hint": "Selected assets may match either leg. The asset condition and Matching settlement assets switch must both match.",
  "monitorWorkspace.filters.panel.market.combinationType": "Combination structure",
  "monitorWorkspace.filters.panel.market.spot": "Spot markets",
  "monitorWorkspace.filters.panel.market.perpetual": "Perpetual markets",
  "monitorWorkspace.filters.panel.market.unavailableBoth": "The current combination structures have no spot or perpetual market legs",
  "monitorWorkspace.filters.panel.market.unavailableSpot": "The current combination structures have no spot market leg",
  "monitorWorkspace.filters.panel.market.unavailablePerpetual": "The current combination structures have no perpetual market leg",
  "monitorWorkspace.filters.panel.market.hint": "These markets apply together with the tab conditions. One exchange market includes that group's full market; two or more pair only inside the selected pool and stay within the tab.",
  "monitorWorkspace.filters.panel.venueExclusion.unavailable": "Market structure is narrowed to an explicit selection, so exchange visibility is decided by the market condition",
  "monitorWorkspace.filters.panel.venueExclusion.hint": "Checked exchanges appear on neither leg in this view. It applies to this view only: tab definitions stay untouched, and alert and push triggers are unaffected. To hide a exchange everywhere including alerts, change the monitoring scope instead.",
  "monitorWorkspace.filters.panel.spread.openSigned": "Positive entry spread ≥",
  "monitorWorkspace.filters.panel.spread.openAbsolute": "Absolute entry spread ≥",
  "monitorWorkspace.filters.panel.spread.gapMinimum": "Entry–exit minimum ≥",
  "monitorWorkspace.filters.panel.spread.gapMaximum": "Entry–exit maximum ≤",
  "monitorWorkspace.filters.panel.spread.minimumTooHigh": "The minimum cannot exceed the maximum",
  "monitorWorkspace.filters.panel.spread.maximumTooLow": "The maximum cannot be below the minimum",
  "monitorWorkspace.filters.panel.realtimeFunding.eightHourSigned": "8H-equivalent net funding ≥",
  "monitorWorkspace.filters.panel.realtimeFunding.eightHourAbsolute": "8H-equivalent absolute funding ≥",
  "monitorWorkspace.filters.panel.realtimeFunding.interval": "Funding interval",
  "monitorWorkspace.filters.panel.realtimeFunding.inheritedMustMatch": "The combination tab already requires either leg to match {{values}} and both legs to use the same interval, so these intervals are the current capability ceiling.",
  "monitorWorkspace.filters.panel.realtimeFunding.viewMustMatch": "The combination tab already requires either leg to match {{values}}. This view also requires both legs to match, so the tab's intervals are the current capability ceiling.",
  "monitorWorkspace.filters.panel.realtimeFunding.singleLeg": "The combination tab already requires either leg to match {{values}}. The effective combination structures exclude perpetual and perpetual, so both interval conditions can only match the same perpetual leg and the tab's intervals are the current capability ceiling.",
  "monitorWorkspace.filters.panel.realtimeFunding.anotherLeg": "The combination tab already requires either leg to match {{values}}. This view may still select an interval on the other perpetual leg; both conditions must match.",
  "monitorWorkspace.filters.panel.realtimeFunding.match": "Matching funding intervals",
  "monitorWorkspace.filters.panel.realtimeFunding.matchInherited": "Enabled by the combination tab and inherited here",
  "monitorWorkspace.filters.panel.realtimeFunding.zeroResultWarning": "The effective combination structures exclude perpetual and perpetual. Matching intervals requires funding intervals on both legs, so this condition will return zero results.",
  "monitorWorkspace.filters.panel.realtimeFunding.hint": "All funding conditions must match. Once a threshold is enabled, combinations missing that funding metric do not pass.",
  "monitorWorkspace.filters.panel.accumulatedFunding.signedMinimum": "Positive minimum",
  "monitorWorkspace.filters.panel.accumulatedFunding.absoluteMinimum": "Absolute minimum",
  "monitorWorkspace.filters.panel.accumulatedFunding.signedAria": "{{day}}D accumulated-funding positive minimum",
  "monitorWorkspace.filters.panel.accumulatedFunding.absoluteAria": "{{day}}D accumulated-funding absolute minimum",
  "monitorWorkspace.filters.panel.accumulatedFunding.hint": "Every entered day and positive/absolute threshold must match. Combinations missing that accumulated-funding metric do not pass.",
  "monitorWorkspace.filters.panel.liquidity.oi": "$t(zml:zml.metric.open_interest_notional) ≥",
  "monitorWorkspace.filters.panel.liquidity.volume": "Lower-leg 24-hour turnover ≥",
  "monitorWorkspace.filters.panel.liquidity.hint": "For spot/perpetual combinations, open-interest value checks the perpetual leg; perpetual pairs use the smaller leg. Turnover uses the smaller of both legs. Once a threshold is enabled, combinations missing any participating metric do not pass.",
  "monitorWorkspace.filters.panel.numeric.nonNegative": "Enter a number greater than or equal to 0",
  "monitorWorkspace.filters.panel.numeric.invalid": "Enter a valid number",
  "monitorWorkspace.filters.panel.option.title": "{{label}}: {{description}}{{suffix}}",
  "monitorWorkspace.filters.panel.option.unavailable": "Unavailable",
  "monitorWorkspace.filters.panel.option.unavailableDescription": "Unavailable in the current runtime catalog",
  "monitorWorkspace.filters.panel.option.notApplicable": "Not applicable",
  "monitorWorkspace.filters.panel.option.notApplicableDescription": "Does not match the current combination structures",
  "monitorWorkspace.filters.panel.option.outsideParent": "Outside tab scope",
  "monitorWorkspace.filters.panel.option.outsideParentDescription": "Outside the current tab's base filter scope",
  "monitorWorkspace.filters.panel.option.removableSuffix": "; can be removed",
  "monitorWorkspace.filters.panel.pool.disabled": "The current combination structure does not use this market leg",
  "monitorWorkspace.filters.panel.pool.selectAll": "Select all",
  "monitorWorkspace.filters.panel.pool.clear": "Clear",
  "monitorWorkspace.filters.panel.pool.effectiveVenueCount": "{{count}} effective exchange markets",
  "monitorWorkspace.filters.panel.pool.retainedInactive": "Retained; currently inactive",
  "monitorWorkspace.filters.panel.pool.retained": "Retained",
  "monitorWorkspace.filters.panel.pool.parentRestricted": "Not included in the parent scope. Existing selections can be removed and resume automatically when the parent scope returns.",
  "monitorWorkspace.filters.panel.pool.runtimeUnavailable": "Live market data is temporarily unavailable.",
  "monitorWorkspace.filters.panel.pool.invalidated": "Invalidated",
  "monitorWorkspace.filters.panel.pool.settlementUnavailable": "{{currency}} is not currently selectable.",
  "monitorWorkspace.filters.panel.pool.disabledReasons.exchange": "This exchange is disabled",
  "monitorWorkspace.filters.panel.pool.disabledReasons.market": "This market on the exchange is disabled",
  "monitorWorkspace.filters.panel.pool.disabledReasons.settlement": "This settlement asset is disabled",
  "monitorWorkspace.filters.panel.pool.disabledReasons.marketType": "This market type is not supported",
  "monitorWorkspace.filters.panel.pool.disabledReasons.unknown": "Disabled upstream; no reason registered",
  "monitorWorkspace.filters.panel.pool.settlementAria": "{{exchange}} settlement assets",
  "monitorWorkspace.filters.panel.pool.settlementOptionAria": "{{exchange}} {{currency}} settlement asset",
  "monitorWorkspace.settingsSheet.sectionsAria": "Combination-tab settings sections",
  "monitorWorkspace.settingsSheet.sections.filter": "Base filter",
  "monitorWorkspace.settingsSheet.sections.alerts": "Alerts",
  "monitorWorkspace.settingsSheet.sections.templates": "Condition templates",
  "monitorWorkspace.settingsSheet.sections.trade": "ZML Trade delivery",
  "monitorWorkspace.settingsSheet.hedgeTypes.title": "Opportunity structures",
  "monitorWorkspace.settingsSheet.hedgeTypes.description": "Only selected opportunity structures can enter this channel. This narrows the tab result and never expands its base filter.",
  "monitorWorkspace.settingsSheet.hedgeTypes.emptyWarning": "Select at least one hedge structure; otherwise this tag has nothing to match.",
  "monitorWorkspace.settingsSheet.hedgeTypes.outsideBaseFilter": "Not included in the base filter",
  "monitorWorkspace.settingsSheet.hedgeTypes.outsideBaseFilterWarning": "A saved opportunity structure is not included in the base filter and will not apply. Remove it before saving.",
  "monitorWorkspace.settingsSheet.hedgeTypes.templateSkippedWarning": "Template opportunity structures outside the base filter were skipped ({{count}}); explicitly save the current draft to apply it.",
  "monitorWorkspace.settingsSheet.trade.loading": "Loading ZML Trade delivery settings…",
  "monitorWorkspace.settingsSheet.trade.unavailable": "ZML Trade delivery settings are temporarily unavailable. Try again later.",
  "monitorWorkspace.settingsSheet.trade.manageConnection": "Manage ZML Trade connection",
  "monitorWorkspace.settingsSheet.trade.delivery.title": "Send to ZML Trade",
  "monitorWorkspace.settingsSheet.trade.delivery.description": "A match sends the opportunity only. ZML Trade owns trading and risk.",
  "monitorWorkspace.settingsSheet.trade.delivery.help": "A match sends opportunity facts only. ZML Trade owns accounts, parameters, and risk controls. Instruments with active unit-calibration anomalies are blocked from automatic signals but remain available for manual review.",
  "monitorWorkspace.settingsSheet.trade.delivery.enabled": "Enable ZML Trade delivery for this tab",
  "monitorWorkspace.settingsSheet.trade.delivery.enabledHint": "Requires an active connection. Offline signals are not replayed.",
  "monitorWorkspace.settingsSheet.trade.delivery.enableBlockedHint": "The connection is unavailable. Reconnect before enabling; offline signals are not replayed.",
  "monitorWorkspace.settingsSheet.trade.delivery.disableAvailableHint": "The connection is unavailable. You can still disable this rule; offline signals are not replayed.",
  "monitorWorkspace.settingsSheet.trade.delivery.duration": "Continuous match duration",
  "monitorWorkspace.settingsSheet.trade.delivery.durationHint": "A new signal forms only after every condition remains matched for this duration.",
  "monitorWorkspace.settingsSheet.trade.delivery.seconds": "sec",
  "monitorWorkspace.settingsSheet.trade.conditions.title": "Delivery conditions",
  "monitorWorkspace.settingsSheet.trade.conditions.description": "Configure delivery conditions separately. All added conditions must match.",
  "monitorWorkspace.settingsSheet.trade.conditions.empty": "Add at least one condition. An empty set never matches.",
  "monitorWorkspace.settingsSheet.trade.conditions.emptyWarning": "No delivery condition is configured, so no signal will be sent.",
  "monitorWorkspace.settingsSheet.trade.application.applied": "Applied",
  "monitorWorkspace.settingsSheet.trade.application.pending": "Applying",
  "monitorWorkspace.settingsSheet.trade.application.failed": "Apply failed",
  "monitorWorkspace.settingsSheet.trade.application.hint": "Applied means the saved delivery settings are in effect.",
  "monitorWorkspace.settingsSheet.trade.errors.load": "Unable to load this tab's ZML Trade settings.",
  "monitorWorkspace.settingsSheet.trade.errors.save": "Unable to save this tab's ZML Trade settings.",
  "monitorWorkspace.settingsSheet.trade.footer.saving": "Saving ZML Trade settings",
  "monitorWorkspace.settingsSheet.trade.footer.conflict": "Server version changed",
  "monitorWorkspace.settingsSheet.trade.footer.dirty": "ZML Trade settings not saved",
  "monitorWorkspace.settingsSheet.trade.footer.saved": "ZML Trade settings saved",
  "monitorWorkspace.settingsSheet.trade.footer.save": "Save and apply",
  "monitorWorkspace.settingsSheet.trade.leave.title": "Discard unsaved ZML Trade settings?",
  "monitorWorkspace.settingsSheet.trade.leave.description": "Closing now discards this tab's unsaved delivery conditions and switch state.",
  "monitorWorkspace.settingsSheet.trade.leave.confirm": "Discard and close",
  "monitorWorkspace.settingsSheet.trade.leave.cancel": "Keep editing",
  "monitorWorkspace.settingsSheet.footer.templateDirty": "Templates not saved",
  "monitorWorkspace.settingsSheet.footer.discard": "Discard changes",
  "monitorWorkspace.settingsSheet.footer.saving": "Saving…",
  "monitorWorkspace.settingsSheet.footer.alertSavingReason": "Alert settings are being saved and applied. Please wait.",
  "monitorWorkspace.settingsSheet.footer.noAlertChanges": "There are no unsaved alert changes.",
  "monitorWorkspace.settingsSheet.footer.saveAndApply": "Save and apply",
  "monitorWorkspace.settingsSheet.dialogs.overwrite.title": "Overwrite the server alert settings?",
  "monitorWorkspace.settingsSheet.dialogs.overwrite.description": "Alert settings changed on another page. Continuing overwrites those updates with this draft.",
  "monitorWorkspace.settingsSheet.dialogs.overwrite.confirm": "Overwrite and apply",
  "monitorWorkspace.settingsSheet.dialogs.overwrite.cancel": "Return to compare",
  "monitorWorkspace.settingsSheet.status.loading.label": "Loading alert settings",
  "monitorWorkspace.settingsSheet.status.loading.short": "Loading",
  "monitorWorkspace.settingsSheet.status.saving.label": "Saving alert settings",
  "monitorWorkspace.settingsSheet.status.saving.short": "Saving",
  "monitorWorkspace.settingsSheet.status.conflict.label": "Alert settings changed on another page",
  "monitorWorkspace.settingsSheet.status.conflict.short": "Conflict",
  "monitorWorkspace.settingsSheet.status.error.label": "Alert settings failed to save or refresh",
  "monitorWorkspace.settingsSheet.status.error.short": "Save failed",
  "monitorWorkspace.settingsSheet.status.dirty.label": "Alert settings have unsaved changes",
  "monitorWorkspace.settingsSheet.status.dirty.short": "Unsaved",
  "monitorWorkspace.settingsSheet.status.applying.label": "Applying alert settings",
  "monitorWorkspace.settingsSheet.status.applying.short": "Applying",
  "monitorWorkspace.settingsSheet.status.applyFailed.label": "Alert settings application failed",
  "monitorWorkspace.settingsSheet.status.applyFailed.short": "Apply failed",
  "monitorWorkspace.settingsSheet.status.applied.label": "Alert settings applied",
  "monitorWorkspace.settingsSheet.status.applied.short": "Applied",
  "monitorWorkspace.settingsSheet.status.synced.label": "Alert settings synced and applied",
  "monitorWorkspace.settingsSheet.status.synced.short": "Synced",
  "monitorWorkspace.settingsSheet.filter.invalidDraft": "The base-filter draft contains an invalid value. Fix it before saving.",
  "monitorWorkspace.settingsSheet.filter.saveFailed": "The base filter failed to save. Check the connection and try again.",
  "monitorWorkspace.settingsSheet.filter.footer.save": "Save base filter",
  "monitorWorkspace.settingsSheet.filter.footer.savingReason": "The base filter is being saved. Please wait.",
  "monitorWorkspace.settingsSheet.filter.footer.noChanges": "There are no unsaved base-filter changes.",
  "monitorWorkspace.settingsSheet.filter.status.saving": "Saving base filter",
  "monitorWorkspace.settingsSheet.filter.status.savingShort": "Saving",
  "monitorWorkspace.settingsSheet.filter.status.conflict": "Base filter changed on another page",
  "monitorWorkspace.settingsSheet.filter.status.conflictShort": "Conflict",
  "monitorWorkspace.settingsSheet.filter.status.error": "Base filter failed to save",
  "monitorWorkspace.settingsSheet.filter.status.errorShort": "Save failed",
  "monitorWorkspace.settingsSheet.filter.status.dirty": "Base filter has unsaved changes",
  "monitorWorkspace.settingsSheet.filter.status.dirtyShort": "Unsaved",
  "monitorWorkspace.settingsSheet.filter.status.saved": "Base filter saved",
  "monitorWorkspace.settingsSheet.filter.status.savedShort": "Saved",
  "monitorWorkspace.settingsSheet.filter.overwrite.title": "Overwrite the server base filter?",
  "monitorWorkspace.settingsSheet.filter.overwrite.description": "The base filter changed on another page. Continuing merges only fields changed in this draft into the latest version.",
  "monitorWorkspace.settingsSheet.filter.overwrite.confirm": "Overwrite and save",
  "monitorWorkspace.settingsSheet.filter.overwrite.cancel": "Keep comparing",
  "monitorWorkspace.settingsSheet.filter.settlementCurrencies": "Either-leg quote / settlement asset",
  "monitorWorkspace.settingsSheet.filter.settlementCurrenciesAria": "Combination-tab either-leg settlement-asset selection",
  "monitorWorkspace.settingsSheet.filter.unrestrictedDynamic": "Unrestricted (all dynamically)",
  "monitorWorkspace.settingsSheet.filter.unavailable": "Unavailable now",
  "monitorWorkspace.settingsSheet.filter.settlementHint": "At least one leg must match a selected asset. The market pool determines which exchanges and settlement assets each relevant leg may use. Unrestricted dynamically includes future assets.",
  "monitorWorkspace.settingsSheet.filter.monitorType": "Opportunity structure",
  "monitorWorkspace.settingsSheet.filter.monitorStructure.spot_swap": "Spot and perpetual",
  "monitorWorkspace.settingsSheet.filter.monitorStructure.swap_swap": "Perpetual and perpetual",
  "monitorWorkspace.settingsSheet.filter.perpetualMarkets": "Perpetual markets",
  "monitorWorkspace.settingsSheet.filter.spotMarkets": "Spot markets",
  "monitorWorkspace.settingsSheet.filter.noPerpetualLeg": "The current combination structure has no perpetual leg",
  "monitorWorkspace.settingsSheet.filter.noSpotLeg": "The current combination structure has no spot leg",
  "monitorWorkspace.settingsSheet.filter.marketPairingHint": "Top-level market groups pair automatically. With one exchange market selected, every selected settlement asset in that group links to the whole market; with two or more, all valid pairings stay within the selected pool. Dynamic selection includes future markets automatically.",
  "monitorWorkspace.settingsSheet.filter.constraintsAndIntervals": "Settlement matching / funding interval",
  "monitorWorkspace.settingsSheet.filter.settlementMustMatch": "Require matching settlement assets",
  "monitorWorkspace.settingsSheet.filter.intervalMustMatch": "Require matching funding intervals",
  "monitorWorkspace.settingsSheet.filter.intervalLabel": "Intervals:",
  "monitorWorkspace.settingsSheet.filter.zeroResultWarning": "Perpetual-vs-perpetual is not selected. Matching intervals require funding intervals on both legs, so this tab will return zero results.",
  "monitorWorkspace.settingsSheet.filter.numericConditions": "Numeric conditions",
  "monitorWorkspace.settingsSheet.filter.numericHint": "$t(zml:zml.metric.open_interest_notional) checks the perpetual leg for spot/perpetual combinations and the smaller perpetual leg for perpetual pairs. $t(zml:zml.metric.quote_volume_24h) uses the smaller leg. When a threshold is enabled, a missing participating metric does not pass and is never treated as zero.",
  "monitorWorkspace.settingsSheet.conditions.title": "Match conditions",
  "monitorWorkspace.settingsSheet.conditions.description": "A match occurs only when every added condition passes. Metrics that are not added do not participate.",
  "monitorWorkspace.settingsSheet.conditions.empty": "No match conditions have been added. Alerts never trigger without a condition.",
  "monitorWorkspace.settingsSheet.conditions.noConditionWarning": "No match condition yet, so this tag will not alert. Adding a condition turns alerts on.",
  "monitorWorkspace.settingsSheet.conditions.groups.spread": "Spread",
  "monitorWorkspace.settingsSheet.conditions.groups.funding": "$t(zml:zml.metric.funding_rate)",
  "monitorWorkspace.settingsSheet.conditions.groups.liquidity": "Liquidity",
  "monitorWorkspace.settingsSheet.conditions.fields.openSpreadGte": "Entry spread ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.openSpreadAbsGte": "Absolute entry spread ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.closeSpreadLte": "Exit spread ≤",
  "monitorWorkspace.settingsSheet.conditions.fields.spreadGapGte": "Entry–exit gap ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.spreadGapLte": "Entry–exit gap ≤",
  "monitorWorkspace.settingsSheet.conditions.fields.netFunding8hGte": "8H-equivalent net funding ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.netFunding8hAbsGte": "Absolute 8H-equivalent net funding ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.fundingSpreadGte": "Funding linkage ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.fundingDiff1dGte": "1D funding difference ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.fundingDiff2dGte": "2D funding difference ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.fundingDiff3dGte": "3D funding difference ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.fundingDiff4dGte": "4D funding difference ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.fundingDiff5dGte": "5D funding difference ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.oiGteM": "$t(zml:zml.metric.open_interest_notional) ≥",
  "monitorWorkspace.settingsSheet.conditions.fields.volume24hGteM": "Lower-leg 24-hour turnover ≥",
  "monitorWorkspace.settingsSheet.conditions.validation.unfilled": "Enter a value for “{{label}}”",
  "monitorWorkspace.settingsSheet.conditions.validation.invalid": "“{{label}}” requires a valid number",
  "monitorWorkspace.settingsSheet.conditions.validation.negative": "“{{label}}” cannot be negative",
  "monitorWorkspace.settingsSheet.conditions.editor.remove": "Remove condition: {{label}}",
  "monitorWorkspace.settingsSheet.conditions.editor.placeholder": "Enter a value",
  "monitorWorkspace.settingsSheet.conditions.editor.selectionSummary": "Choose conditions ({{selected}}/{{total}} selected)",
  "monitorWorkspace.settingsSheet.alerts.unavailable": "Alert settings for this combination tab have not loaded and cannot be edited yet.",
  "monitorWorkspace.settingsSheet.alerts.application.applied": "Applied",
  "monitorWorkspace.settingsSheet.alerts.application.pending": "Awaiting application",
  "monitorWorkspace.settingsSheet.alerts.application.failed": "Application failed",
  "monitorWorkspace.settingsSheet.alerts.application.failureHint": "The settings were saved, but have not been applied. Status updates automatically; you can adjust the settings and save again.",
  "monitorWorkspace.settingsSheet.alerts.application.refresh": "Refresh application status",
  "monitorWorkspace.settingsSheet.alerts.application.retrySync": "Retry sync",
  "monitorWorkspace.settingsSheet.alerts.methods.title": "Notification methods",
  "monitorWorkspace.settingsSheet.alerts.methods.description": "Alert settings take effect only after Save and apply. The base filter also requires an explicit save on its own page.",
  "monitorWorkspace.settingsSheet.alerts.methods.feishu": "Feishu alert",
  "monitorWorkspace.settingsSheet.alerts.methods.feishuHint": "Send only to the channel selected independently for this combination tab.",
  "monitorWorkspace.settingsSheet.alerts.channel.title": "Feishu channel",
  "monitorWorkspace.settingsSheet.alerts.channel.description": "Channels belong to the account, while each combination tab selects its own destination.",
  "monitorWorkspace.settingsSheet.alerts.channel.label": "Feishu channel for this tab",
  "monitorWorkspace.settingsSheet.alerts.channel.required": "Choose a channel before enabling Feishu alerts",
  "monitorWorkspace.settingsSheet.alerts.channel.unavailable": "The previous channel was deleted or no longer belongs to this account. Choose another channel.",
  "monitorWorkspace.settingsSheet.alerts.channel.disabledHint": "Turning Feishu off keeps the preselected channel for the next time it is enabled.",
  "monitorWorkspace.settingsSheet.alerts.channel.loading": "Loading channels…",
  "monitorWorkspace.settingsSheet.alerts.channel.placeholder": "Choose a Feishu channel",
  "monitorWorkspace.settingsSheet.alerts.channel.none": "No channel selected",
  "monitorWorkspace.settingsSheet.alerts.channel.testing": "Testing…",
  "monitorWorkspace.settingsSheet.alerts.channel.test": "Test current channel",
  "monitorWorkspace.settingsSheet.alerts.channel.manage": "Manage Feishu channels",
  "monitorWorkspace.settingsSheet.alerts.channel.reload": "Reload channels",
  "monitorWorkspace.settingsSheet.alerts.channel.testFailed": "Test delivery failed",
  "monitorWorkspace.settingsSheet.alerts.channel.testSucceeded": "Test message sent to “{{name}}”",
  "monitorWorkspace.settingsSheet.alerts.channel.loadFailed": "The Feishu channel list is temporarily unavailable. Your current selection is preserved and will not be cleared automatically.",
  "monitorWorkspace.settingsSheet.alerts.delivery.title": "Delivery cadence",
  "monitorWorkspace.settingsSheet.alerts.delivery.description": "Send after the match holds for the set duration. Frequency is the shortest repeat interval.",
  "monitorWorkspace.settingsSheet.alerts.delivery.duration": "Match duration ≥",
  "monitorWorkspace.settingsSheet.alerts.delivery.frequency": "Notification frequency",
  "monitorWorkspace.settingsSheet.alerts.delivery.seconds": "seconds",
  "monitorWorkspace.settingsSheet.alerts.conflict.description": "The server alert settings changed. Load the server version, or confirm again in the footer to overwrite it with this draft.",
  "monitorWorkspace.settingsSheet.alerts.conflict.loadServer": "Load server version",
  "monitorWorkspace.settingsSheet.alerts.messages.notLoaded": "Alert settings have not loaded",
  "monitorWorkspace.settingsSheet.alerts.messages.channelRequired": "Choose this tab's Feishu channel before enabling Feishu alerts",
  "monitorWorkspace.settingsSheet.alerts.messages.hedgeTypeRequired": "Select at least one opportunity structure before enabling alerts",
  "monitorWorkspace.settingsSheet.alerts.messages.durationInvalid": "Match duration must be a non-negative whole number of seconds",
  "monitorWorkspace.settingsSheet.alerts.messages.intervalInvalid": "Repeat interval must be a whole number of seconds, at least 5.",
  "monitorWorkspace.settingsSheet.alerts.messages.invalidValue": "Alert settings contain an invalid value",
  "monitorWorkspace.settingsSheet.alerts.messages.savedApplied": "Alert settings were saved and applied.",
  "monitorWorkspace.settingsSheet.alerts.messages.savedApplyFailed": "Alert settings were saved, but background application failed.",
  "monitorWorkspace.settingsSheet.alerts.messages.savedPending": "Alert settings were saved and are awaiting background application.",
  "monitorWorkspace.settingsSheet.alerts.messages.saveFailed": "Alert settings failed to save",
  "monitorWorkspace.settingsSheet.alerts.messages.refreshFailed": "Alert settings failed to refresh",
  "monitorWorkspace.settingsSheet.alerts.messages.discarded": "Unsaved alert changes were discarded.",
  "monitorWorkspace.settingsSheet.alerts.messages.loadedLatest": "The latest server alert settings were loaded.",
  "monitorWorkspace.settingsSheet.templates.title": "Condition templates",
  "monitorWorkspace.settingsSheet.templates.alertTitle": "Alert condition templates",
  "monitorWorkspace.settingsSheet.templates.tradeTitle": "Delivery condition templates",
  "monitorWorkspace.settingsSheet.templates.description": "Templates save structures, conditions, and duration. Applying copies them into the draft, which must be saved separately.",
  "monitorWorkspace.settingsSheet.templates.help": "Templates save opportunity structures, additional conditions, and match duration only. Create, edit, and delete require an explicit save. Applying copies into the current channel draft without saving or retaining a link.",
  "monitorWorkspace.settingsSheet.templates.capacity": "Up to {{count}} templates",
  "monitorWorkspace.settingsSheet.templates.create": "New template",
  "monitorWorkspace.settingsSheet.templates.discard": "Discard template changes",
  "monitorWorkspace.settingsSheet.templates.saving": "Saving templates…",
  "monitorWorkspace.settingsSheet.templates.save": "Save templates",
  "monitorWorkspace.settingsSheet.templates.conflict": "Templates changed on another page. Saving now overwrites those changes with this draft; you can also discard and reload.",
  "monitorWorkspace.settingsSheet.templates.loading": "Loading templates…",
  "monitorWorkspace.settingsSheet.templates.unavailableTitle": "Condition templates are temporarily unavailable",
  "monitorWorkspace.settingsSheet.templates.loadFailed": "Templates failed to load",
  "monitorWorkspace.settingsSheet.templates.saveFailed": "Templates failed to save",
  "monitorWorkspace.settingsSheet.templates.openLibrary": "Open template library",
  "monitorWorkspace.settingsSheet.templates.closeLibrary": "Collapse template library",
  "monitorWorkspace.settingsSheet.templates.listAria": "Condition template list",
  "monitorWorkspace.settingsSheet.templates.detailHint": "Edit this template, then save templates explicitly to apply the changes.",
  "monitorWorkspace.settingsSheet.templates.preview.title": "Template preview",
  "monitorWorkspace.settingsSheet.templates.preview.directions": "Opportunity structures",
  "monitorWorkspace.settingsSheet.templates.preview.conditions": "Additional conditions",
  "monitorWorkspace.settingsSheet.templates.preview.duration": "Continuous match duration",
  "monitorWorkspace.settingsSheet.templates.preview.none": "None selected",
  "monitorWorkspace.settingsSheet.templates.preview.defaultDuration": "Use the channel default",
  "monitorWorkspace.settingsSheet.templates.preview.durationSeconds": "{{count}} seconds",
  "monitorWorkspace.settingsSheet.templates.empty": "No condition templates yet. Create one, choose common conditions, and save it to merge them into alert settings later.",
  "monitorWorkspace.settingsSheet.templates.defaultName": "Template {{index}}",
  "monitorWorkspace.settingsSheet.templates.copyName": "{{name}} copy",
  "monitorWorkspace.settingsSheet.templates.copyAria": "Copy template: {{name}}",
  "monitorWorkspace.settingsSheet.templates.collapse": "Collapse template",
  "monitorWorkspace.settingsSheet.templates.expand": "Expand template",
  "monitorWorkspace.settingsSheet.templates.conditionCount": "{{count}} conditions",
  "monitorWorkspace.settingsSheet.templates.conditionCountTitle": "{{name}} ({{count}} conditions)",
  "monitorWorkspace.settingsSheet.templates.name": "Template name",
  "monitorWorkspace.settingsSheet.templates.hedgeTypes": "Opportunity structures",
  "monitorWorkspace.settingsSheet.templates.duration": "Continuous match duration",
  "monitorWorkspace.settingsSheet.templates.durationHint": "Leave blank to use the channel's runtime default duration.",
  "monitorWorkspace.settingsSheet.templates.duplicateName": "A template with this name already exists",
  "monitorWorkspace.settingsSheet.templates.emptyConditions": "This template has no conditions and will add nothing when applied.",
  "monitorWorkspace.settingsSheet.templates.delete.title": "Delete template “{{name}}”?",
  "monitorWorkspace.settingsSheet.templates.delete.description": "Deletion takes effect after saving and does not affect any configured combination tab.",
  "monitorWorkspace.settingsSheet.templates.delete.confirm": "Delete template",
  "monitorWorkspace.settingsSheet.templates.delete.aria": "Delete template: {{name}}",
  "monitorWorkspace.settingsSheet.templates.apply.title": "Apply a saved template",
  "monitorWorkspace.settingsSheet.templates.apply.empty": "No condition templates yet",
  "monitorWorkspace.settingsSheet.templates.apply.manage": "Manage templates",
  "monitorWorkspace.settingsSheet.templates.apply.added": "{{count}} added",
  "monitorWorkspace.settingsSheet.templates.apply.filled": "{{count}} filled",
  "monitorWorkspace.settingsSheet.templates.apply.kept": "{{count}} existing values kept",
  "monitorWorkspace.settingsSheet.templates.apply.separator": ", ",
  "monitorWorkspace.settingsSheet.templates.apply.result": "Merged “{{name}}”: {{details}}",
  "monitorWorkspace.settingsSheet.templates.apply.copiedToDraft": "Copied “{{name}}” into the current draft. Save to apply it.",
  "monitorWorkspace.settingsSheet.summary.sections.mode": "Type",
  "monitorWorkspace.settingsSheet.summary.sections.settlement": "Either-leg settlement",
  "monitorWorkspace.settingsSheet.summary.sections.market": "Market",
  "monitorWorkspace.settingsSheet.summary.sections.constraints": "Constraints",
  "monitorWorkspace.settingsSheet.summary.sections.status": "Status",
  "monitorWorkspace.settingsSheet.summary.noTypes": "None selected (zero results)",
  "monitorWorkspace.settingsSheet.summary.settlementMustMatch": "Matching settlement assets",
  "monitorWorkspace.settingsSheet.summary.intervalMustMatch": "Matching funding intervals",
  "monitorWorkspace.settingsSheet.summary.intervals": "Funding intervals {{values}}",
  "monitorWorkspace.settingsSheet.summary.applying": "Applying",
  "monitorWorkspace.settingsSheet.summary.applyFailed": "Application failed",
  "monitorWorkspace.settingsSheet.summary.applied": "Applied",
  "monitorWorkspace.settingsSheet.summary.lastApplied": "Last confirmed as applied",
  "monitorWorkspace.settingsSheet.summary.applyFailureDetail": "The last confirmed settings were applied; the active configuration cannot be confirmed, so alerts are paused",
  "monitorWorkspace.settingsSheet.summary.feishuOn": "Feishu {{channel}}",
  "monitorWorkspace.settingsSheet.summary.feishuOff": "Feishu off",
  "monitorWorkspace.settingsSheet.summary.channelUnavailable": "channel unavailable",
  "monitorWorkspace.settingsSheet.summary.duration": "Duration {{count}}s",
  "monitorWorkspace.settingsSheet.summary.frequency": "Frequency {{count}}s",
  "monitorWorkspace.settingsSheet.summary.noFilters": "No filter conditions",
  "monitorWorkspace.settingsSheet.summary.all": "All",
  "monitorWorkspace.settingsSheet.summary.moreValues": "{{values}} +{{count}}",
  "monitorWorkspace.settingsSheet.summary.noneSelected": "None selected",
  "monitorWorkspace.settingsSheet.summary.dynamicExcept": "All dynamically, except {{values}}",
  "monitorWorkspace.settingsSheet.summary.dynamicAll": "All dynamically",
  "monitorWorkspace.settingsSheet.summary.exceptValue": "except {{value}}",
  "monitorWorkspace.settingsSheet.summary.wholeVenue": "{{exchange}} (whole exchange)",
  "monitorWorkspace.settingsSheet.summary.itemCount": "{{count}} items",
  "monitorWorkspace.tagAdmission.fields.spotVolume24hGteM.label": "Spot 24-hour turnover ≥",
  "monitorWorkspace.tagAdmission.fields.spotVolume24hGteM.summary": "Spot 24-hour turnover",
  "monitorWorkspace.tagAdmission.fields.swapVolume24hGteM.label": "Perpetual 24-hour turnover ≥",
  "monitorWorkspace.tagAdmission.fields.swapVolume24hGteM.summary": "Perpetual 24-hour turnover",
  "monitorWorkspace.tagAdmission.fields.swapOiGteM.label": "Perpetual open-interest value ≥",
  "monitorWorkspace.tagAdmission.fields.swapOiGteM.summary": "Perpetual open-interest value",
  "monitorWorkspace.tagAdmission.comboKinds.spot_swap": "Spot × perpetual",
  "monitorWorkspace.tagAdmission.comboKinds.swap_swap": "Perpetual × perpetual",
  "monitorWorkspace.status.connection.open": "Connected",
  "monitorWorkspace.status.connection.connecting": "Connecting",
  "monitorWorkspace.status.connection.closed": "Disconnected",
  "monitorWorkspace.status.connection.unauthorized": "Sign-in expired",
  "monitorWorkspace.status.connection.browserOffline": "Browser offline",
  "monitorWorkspace.status.connection.unknown": "Unknown",
  "monitorWorkspace.status.connection.reconnecting": "Reconnecting",
  "monitorWorkspace.status.connection.error": "Connection error",
  "monitorWorkspace.status.connection.idle": "Waiting to connect",
  "monitorWorkspace.status.connection.summary": "Live connection {{statusLabel}} · Round trip {{latency}} · Received {{rate}}",
  "monitorWorkspace.status.liveRealtimeIssue": "Quote issues have paused live updates for {{count}} combinations",
  "monitorWorkspace.status.liveVenueIssue": "; data unavailable from {{count}} exchanges",
  "monitorWorkspace.status.liveMarketDataIssue": "; some market data is affected",
  "monitorWorkspace.status.venuesAffected": "{{count}} exchanges affected",
  "monitorWorkspace.status.marketDataAffected": "Some data affected",
  "monitorWorkspace.status.soundLoading": "Notification settings are loading",
  "monitorWorkspace.status.soundOff": "Turn alert sounds off",
  "monitorWorkspace.status.soundOn": "Turn alert sounds on",
  "monitorWorkspace.status.details.connection": "Monitor connection",
  "monitorWorkspace.status.details.latency": "Latency",
  "monitorWorkspace.status.details.lastUpdate": "Last update",
  "monitorWorkspace.status.details.combinations": "Combinations",
  "monitorWorkspace.status.details.pairCount": "{{count}} pairs",
  "monitorWorkspace.status.details.exchanges": "Exchanges",
  "monitorWorkspace.status.details.ready": "{{ready}}/{{total}} available",
  "monitorWorkspace.status.details.availabilityUnknown": "Checking",
  "monitorWorkspace.status.details.marketDataAffected": "Some market data is affected",
  "monitorWorkspace.status.details.realtimeIssue": "Live protection",
  "monitorWorkspace.status.details.realtimeIssueDescription": "Live updates are paused for {{count}} combinations because quotes are stale or the two legs are out of sync. They resume automatically when valid quotes arrive for both legs.",
  "monitorWorkspace.workbench.openingFundingHistory": "Opening funding history…",
  "monitorWorkspace.workbench.openingHistoryCurve": "Opening history chart…",
  "monitorWorkspace.workbench.openingAssetDetails": "Opening asset details…",
  "monitorWorkspace.workbench.openingDiagnostics": "Opening combination diagnostics…",
  "monitorWorkspace.workbench.openingNotifications": "Opening notification settings…",
  "monitorWorkspace.workbench.settlementLoadFailed": "Settlement assets could not be loaded. Check the backend and try again.",
  "monitorWorkspace.workbench.settlementRefreshFailed": "The settlement-asset refresh failed. The last successful result remains visible.",
  "monitorWorkspace.workbench.fundingDetailLoadFailed": "Funding-history details could not be loaded.",
  "monitorWorkspace.workbench.assetDetailLoadFailed": "Asset details could not be loaded. Check the backend and try again.",
  "monitorWorkspace.workbench.settingsSyncFailed": "Account settings could not be synced. Try again shortly.",
  "monitorWorkspace.workbench.disconnected": "Connection lost",
  "monitorWorkspace.workbench.reconnecting": ", trying to reconnect...",
  "monitorWorkspace.workbench.leave.fixedTitle": "Discard unsaved tab settings and switch views?",
  "monitorWorkspace.workbench.leave.fixedDescription": "This combination tab has unsaved base-filter, alert, ZML Trade delivery, or embedded-template changes. Continuing discards those drafts before switching to the fixed view.",
  "monitorWorkspace.workbench.leave.tabTitle": "Discard unsaved tab settings and switch tabs?",
  "monitorWorkspace.workbench.leave.tabDescription": "This combination tab has unsaved base-filter, alert, ZML Trade delivery, or embedded-template changes. Continuing discards those drafts before switching to the target tab.",
  "monitorWorkspace.workbench.leave.switchConfirm": "Discard and switch",
  "monitorWorkspace.workbench.leave.closeTitle": "Discard unsaved tab settings?",
  "monitorWorkspace.workbench.leave.closeDescription": "Unsaved base-filter, alert, ZML Trade delivery, or embedded-template drafts remain. Closing discards those drafts.",
  "monitorWorkspace.workbench.leave.closeConfirm": "Discard and close",
  "monitorWorkspace.workbench.alerts": "Alerts {{count}}",
  "monitorWorkspace.workbench.applying": "Applying",
  "monitorWorkspace.workbench.loadFailed": "Live view failed to load",
  "monitorWorkspace.workbench.rejected": "The request could not be completed. Try again shortly.",
  "monitorWorkspace.workbench.waitingForStream": "Waiting for the live stream to recover...",
  "monitorWorkspace.workbench.loading": "Loading the live view...",
  "monitorWorkspace.workbench.switchFailed": "The view switch did not complete; the previous view remains visible.",
  "monitorWorkspace.workbench.noFavorites": "No favorites or alerts",
  "monitorWorkspace.workbench.noFavoritesHint": "Double-click the Pair column to add a favorite. Combinations that trigger alerts also appear here.",
  "monitorWorkspace.workbench.noTabHits": "No opportunities match this tab",
  "monitorWorkspace.workbench.noTabHitsHint": "Nothing matches the current filters. Update this tab's filters and the view will refresh automatically.",
  "shell.sidebar.customize": "Customize sidebar",
  "shell.sidebar.favorites": "Favorites",
  "shell.sidebar.customizeDescription": "Adjust navigation visibility, order and favorites.",
  "shell.sidebar.showDestination": "Show {{label}}",
  "shell.sidebar.favoriteDestination": "Favorite {{label}}",
  "shell.sidebar.favoriteAction": "Favorite",
  "shell.sidebar.moveUp": "Move {{label}} up",
  "shell.sidebar.moveDown": "Move {{label}} down",
  "shell.sidebar.unreadMarker": "Unread marker",
  "shell.sidebar.unreadMarkerCount": "Number",
  "shell.sidebar.unreadMarkerDot": "Dot",
  "shell.sidebar.unreadMarkerNone": "Hidden",
  "shell.sidebar.restoreDefaults": "Restore defaults",
  "shell.navigationAria": "Primary navigation",
  "shell.unreadNewsCount": "{{count}} unread news items",
  "shell.unreadAnnouncementsCount": "{{count}} unread announcements",
  "shell.openUnreadAnnouncements": "Open unread announcements, {{count}} total",
  "shell.theme.toggle": "Switch theme",
  "shell.theme.system": "Follow system",
  "shell.theme.light": "Light",
  "shell.theme.dark": "Dark",
  "shell.accountMenu.aria": "Account menu",
  "shell.accountMenu.triggerAria": "{{username}} account menu",
  "shell.accountMenu.settingsSection": "Settings sections",
  "shell.accountMenu.unavailable": "Temporarily unavailable",
  "shell.leaveDraft.formTitle": "Discard unsaved form changes?",
  "shell.leaveDraft.formDescription": "The current form has unsaved changes. Continuing discards them. To keep them, cancel and save in the form first.",
  "shell.leaveDraft.formPendingDescription": "An operation is being submitted. Wait for it to finish before discarding changes or leaving this page.",
  "shell.leaveDraft.navigationTitle": "Discard unsaved tab settings and leave this page?",
  "shell.leaveDraft.navigationDescription": "This combination tab has unsaved base-filter, alert, ZML Trade delivery, or embedded-template changes. Continuing discards those drafts before opening the destination.",
  "shell.leaveDraft.navigationConfirm": "Discard and leave",
  "shell.leaveDraft.navigationCombinedTitle": "Discard the unsaved monitoring scope and tab settings, and leave this page?",
  "shell.leaveDraft.navigationCombinedDescription": "Both the account-level monitoring scope and this combination tab have unsaved changes. The monitoring scope affects every view and alert; the tab settings affect only this tab. Continuing discards both drafts before opening the destination.",
  "shell.leaveDraft.signOutTitle": "Discard unsaved tab settings and sign out?",
  "shell.leaveDraft.signOutDescription": "This combination tab has unsaved base-filter, alert, ZML Trade delivery, or embedded-template changes. Signing out discards those drafts.",
  "shell.leaveDraft.signOutConfirm": "Discard and sign out",
  "account.menu": "Account menu",
  "account.settings": "Settings",
  "account.signOut": "Sign out",
  "account.settingsTitle": "Settings",
  "account.appearanceTitle": "Appearance",
  "account.timeZoneInvalidTime": "This time is invalid, missing or repeated in the selected time zone. Choose a different time.",
  "account.themeLabel": "Theme",
  "account.languageLabel": "Language",
  "account.languageDescription": "Interface copy only. Numbers, dates, and business formats stay as they are.",
  "account.groups.personal": "Personal",
  "account.groups.workspace": "Workspace",
  "account.sections.general": "Profile",
  "account.sections.security": "Sign-in & security",
  "account.sections.notifications": "Notifications",
  "account.sections.blacklist": "My blacklist",
  "account.sections.subscription": "My subscription",
  "account.sections.trade": "ZML Trade",
  "account.blacklist.kinds.all": "All",
  "account.blacklist.kinds.baseAsset": "Asset",
  "account.blacklist.kinds.instrument": "Instrument",
  "account.blacklist.kinds.opportunity": "Combination",
  "account.blacklist.fallback.instrument": "Instrument details unavailable",
  "account.blacklist.fallback.baseAsset": "Asset details unavailable",
  "account.blacklist.fallback.opportunity": "Combination details unavailable",
  "account.blacklist.fallback.detailsUnavailable": "Details unavailable",
  "account.blacklist.reasons.saved": "Saved by you",
  "account.blacklist.reasons.comboAction": "Added from a combination action",
  "account.blacklist.reasons.settingsAction": "Added from account settings",
  "account.blacklist.add.title": "Add to blacklist",
  "account.blacklist.add.description": "Search for targets to hide from this account. This affects only your views and alerts, never other users.",
  "account.blacklist.add.collapse": "Collapse",
  "account.blacklist.add.expand": "Add",
  "account.blacklist.add.kindLabel": "Blacklist type",
  "account.blacklist.searchMeta.baseAsset.placeholder": "Asset name, for example BTC",
  "account.blacklist.searchMeta.baseAsset.ariaLabel": "Search assets; add a trailing space for an exact match",
  "account.blacklist.searchMeta.instrument.placeholder": "Exchange / trading symbol",
  "account.blacklist.searchMeta.instrument.ariaLabel": "Search instruments",
  "account.blacklist.searchMeta.opportunity.placeholder": "Asset / exchange / combination",
  "account.blacklist.searchMeta.opportunity.ariaLabel": "Search combinations",
  "account.blacklist.disabled.searching": "Search is in progress. Wait for it to finish.",
  "account.blacklist.disabled.enterSearch": "Enter a search term first.",
  "account.blacklist.disabled.adding": "Targets are being added. Wait for completion.",
  "account.blacklist.disabled.selectResult": "Select at least one search result first.",
  "account.blacklist.actions.search": "Search",
  "account.blacklist.actions.searching": "Searching…",
  "account.blacklist.actions.selectAll": "Select all",
  "account.blacklist.actions.clearAll": "Clear all",
  "account.blacklist.actions.processing": "Processing…",
  "account.blacklist.actions.addSelected": "Blacklist selected",
  "account.blacklist.actions.clearFilters": "Clear filters",
  "account.blacklist.actions.clearSelection": "Clear selection",
  "account.blacklist.actions.removeSelected": "Remove selected",
  "account.blacklist.actions.remove": "Remove",
  "account.blacklist.errors.load": "The blacklist could not be read, so this list is not a verified empty state.",
  "account.blacklist.errors.search": "Search failed before the backend returned results.",
  "account.blacklist.errors.stale": "The blacklist could not be refreshed; the last successful result remains visible.",
  "account.blacklist.states.listUnavailable": "Blacklist unavailable",
  "account.blacklist.states.loading": "Loading your blacklist…",
  "account.blacklist.states.noMatches": "No matching blacklist entries",
  "account.blacklist.states.noMatchesDescription": "Try another term or type.",
  "account.blacklist.states.empty": "No blacklist entries",
  "account.blacklist.states.emptyDescription": "Search above to add one, or use the quick blacklist action in a monitor combination drawer.",
  "account.blacklist.states.searchEmpty": "No matches found",
  "account.blacklist.states.searchEmptyDescription": "No results were returned for “{{query}}”.",
  "account.blacklist.columns.select": "Select",
  "account.blacklist.columns.target": "Target",
  "account.blacklist.columns.type": "Type",
  "account.blacklist.columns.reason": "Reason",
  "account.blacklist.columns.time": "Time",
  "account.blacklist.columns.actions": "Actions",
  "account.blacklist.listAria": "My blacklist",
  "account.blacklist.selectAllCurrent": "Select the current list",
  "account.blacklist.selectTarget": "Select {{target}}",
  "account.blacklist.removeTarget": "Remove {{target}} from the blacklist",
  "account.blacklist.baseAssetCounts": "{{instruments}} instruments · {{pairs}} pairs",
  "account.blacklist.searchResults": "{{count}} search results · “{{query}}”",
  "account.blacklist.selectedCount": "{{count}} selected",
  "account.blacklist.itemCount": "{{count}} items",
  "account.blacklist.list.title": "My blacklist",
  "account.blacklist.list.description": "These targets are excluded from your monitor tables and alerts. Removing one makes it visible again.",
  "account.blacklist.list.filterLabel": "Filter by type",
  "account.blacklist.list.searchAria": "Search my blacklist",
  "account.blacklist.list.searchPlaceholder": "Asset / exchange / instrument / combination / reason",
  "account.blacklist.feedback.partialAdded": "Added {{added}}; {{rejected}} could not be added. Review the selection.",
  "account.blacklist.feedback.rejected": "{{rejected}} could not be added. Review the selection.",
  "account.blacklist.feedback.alreadyOne": "That target is already in your blacklist.",
  "account.blacklist.feedback.alreadyMany": "All {{count}} targets are already in your blacklist.",
  "account.blacklist.feedback.addedWithExisting": "Added {{added}}; {{existing}} were already in the list.",
  "account.blacklist.feedback.added": "Added {{count}} to your blacklist.",
  "account.blacklist.feedback.addFailed": "The backend did not confirm the blacklist update.",
  "account.blacklist.feedback.removed": "Removed {{count}}.",
  "account.blacklist.feedback.batchRemoveFailed": "Batch removal failed. The list remains at its last backend-confirmed state.",
  "account.blacklist.feedback.removeSuccess": "Removed. The target will appear in your views again.",
  "account.blacklist.feedback.removeFailed": "Removal failed. The list remains at its last backend-confirmed state.",
  "account.blacklist.dialog.batchTitle": "Remove selected blacklist entries",
  "account.blacklist.dialog.batchDescription": "Remove the {{count}} selected entries? They will appear in your monitor tables and alerts again.",
  "account.blacklist.dialog.batchConfirm": "Remove {{count}}",
  "account.blacklist.dialog.removeTitle": "Remove blacklist entry",
  "account.blacklist.dialog.removeDescription": "Remove “{{target}}”? It will appear in your monitor tables and alerts again.",
  "account.notificationSettings.states.loading": "Loading this account's notification settings…",
  "account.notificationSettings.states.logLoading": "Loading notification history…",
  "account.notificationSettings.states.logReadError": "Could not load notification history.",
  "account.notificationSettings.states.readError": "Notification settings could not be loaded",
  "account.notificationSettings.states.unavailable": "Notification settings not loaded",
  "account.notificationSettings.states.noSnapshot": "No notification settings snapshot is available for this account.",
  "account.notificationSettings.states.actionError": "The action could not be completed. Try again shortly.",
  "account.notificationSettings.channels.title": "Feishu channels",
  "account.notificationSettings.channels.description": "Manage the Feishu bot channels available to this account's product surfaces.",
  "account.notificationSettings.channels.add": "Add channel",
  "account.notificationSettings.channels.signed": "Signature enabled",
  "account.notificationSettings.channels.unsigned": "No signature",
  "account.notificationSettings.channels.test": "Test",
  "account.notificationSettings.channels.testing": "Testing…",
  "account.notificationSettings.channels.edit": "Edit channel",
  "account.notificationSettings.channels.actionsAria": "Actions for {{channel}}",
  "account.notificationSettings.channels.moreActionsAria": "More actions for {{channel}}",
  "account.notificationSettings.channels.empty.title": "No Feishu channels",
  "account.notificationSettings.channels.empty.description": "Add a channel to make it available to this account's notification rules.",
  "account.notificationSettings.channels.usage.tabsAndNews": "Used by {{count}} tabs and News center",
  "account.notificationSettings.channels.usage.tabs": "Used by {{count}} tabs",
  "account.notificationSettings.channels.usage.news": "Used by News center",
  "account.notificationSettings.channels.usage.unused": "Not currently used",
  "account.notificationSettings.channels.usage.tabDetails": "Combination tabs: {{tabs}}",
  "account.notificationSettings.channels.usage.newsCenter": "News center",
  "account.notificationSettings.channels.usage.noReferences": "No combination tabs or News center settings reference this channel",
  "account.notificationSettings.channels.feedback.testSent": "A test message was sent through “{{channel}}”.",
  "account.notificationSettings.channels.feedback.saved": "Feishu channel saved.",
  "account.notificationSettings.channels.feedback.deleted": "“{{channel}}” was deleted.",
  "account.notificationSettings.channels.errors.testFailed": "The test message could not be sent.",
  "account.notificationSettings.channels.errors.deleteFailed": "The channel could not be deleted. Try again shortly.",
  "account.notificationSettings.channels.errors.saveFailed": "The channel could not be saved. Check the details and try again.",
  "account.notificationSettings.channels.delete.action": "Delete channel",
  "account.notificationSettings.channels.delete.title": "Delete Feishu channel",
  "account.notificationSettings.channels.delete.inUseTitle": "Feishu channel still in use",
  "account.notificationSettings.channels.delete.description": "Delete “{{channel}}” from this account? The server will recheck current references and delivery history first.",
  "account.notificationSettings.channels.delete.inUseDescription": "“{{channel}}” is still referenced by this account. Remove those references before deleting it.",
  "account.notificationSettings.channels.delete.acknowledge": "Got it",
  "account.notificationSettings.channels.delete.deleting": "Deleting…",
  "account.notificationSettings.channels.delete.confirm": "Delete channel",
  "account.notificationSettings.channels.delete.back": "Back",
  "account.notificationSettings.channels.dialog.createTitle": "Add Feishu channel",
  "account.notificationSettings.channels.dialog.editTitle": "Edit Feishu channel",
  "account.notificationSettings.channels.dialog.description": "The server never returns the webhook or signing secret. Leave either field blank while editing to keep its current value.",
  "account.notificationSettings.channels.dialog.name": "Channel name",
  "account.notificationSettings.channels.dialog.webhook": "Webhook URL",
  "account.notificationSettings.channels.dialog.webhookKeep": "Webhook URL (leave blank to keep)",
  "account.notificationSettings.channels.dialog.showWebhook": "Show Webhook URL",
  "account.notificationSettings.channels.dialog.hideWebhook": "Hide Webhook URL",
  "account.notificationSettings.channels.dialog.secretKeep": "Signing secret (leave blank to keep)",
  "account.notificationSettings.channels.dialog.secretOptional": "Signing secret (optional)",
  "account.notificationSettings.channels.dialog.showSecret": "Show signing secret",
  "account.notificationSettings.channels.dialog.hideSecret": "Hide signing secret",
  "account.notificationSettings.channels.dialog.clearSecret": "Remove the current signing secret",
  "account.notificationSettings.sound.title": "Alert sound",
  "account.notificationSettings.sound.description": "Sound, volume and alert sound interval for this account. Whether this browser plays it is the bell on the workspace bar.",
  "account.notificationSettings.sound.fileLabel": "Sound",
  "account.notificationSettings.sound.files.default": "Default alert",
  "account.notificationSettings.sound.files.urgent": "Urgent alarm",
  "account.notificationSettings.sound.files.gentle": "Gentle chime",
  "account.notificationSettings.sound.volumeLabel": "Volume",
  "account.notificationSettings.sound.currentVolume": "Currently {{value}}%",
  "account.notificationSettings.sound.volumeAria": "Web sound volume",
  "account.notificationSettings.sound.cooldownLabel": "Alert sound interval",
  "account.notificationSettings.sound.seconds": "{{value}} sec",
  "account.notificationSettings.sound.preview": "Preview",
  "account.trade.title": "ZML Trade connection",
  "account.trade.readStale": "Connection information may be outdated. The last result remains visible; actions resume after a successful read.",
  "account.trade.targetChanged": "The paired instance has changed. Close this dialog and confirm the current instance.",
  "account.trade.description": "Each account connects to one Trade. The device code is generated locally by Trade.",
  "account.trade.status.loading": "Loading",
  "account.trade.status.error": "Connection error",
  "account.trade.status.unpaired": "Not paired",
  "account.trade.status.awaiting_local_confirm": "Awaiting ZML Trade confirmation",
  "account.trade.status.active": "Connected",
  "account.trade.status.paused": "Paused",
  "account.trade.instance": "ZML Trade instance",
  "account.trade.lastSeen": "Last seen",
  "account.trade.deviceCode": "Device code",
  "account.trade.deviceCodeHint": "Generate it on ZML Trade's Signals page, then enter it here.",
  "account.trade.claiming": "Pairing…",
  "account.trade.claim": "Connect ZML Trade",
  "account.trade.awaitingConfirm": "ZML Monitor claimed the device code. Return to the local ZML Trade to finish confirmation.",
  "account.trade.refresh": "Refresh connection status",
  "account.trade.pause": "Pause delivery",
  "account.trade.resume": "Resume delivery",
  "account.trade.revoke": "Unpair",
  "account.trade.authority": "ZML Monitor sends matched opportunity facts only. It never reads trading accounts or decides parameters, risk, or whether to trade.",
  "account.trade.errors.load": "Unable to load the ZML Trade connection",
  "account.trade.errors.mutation": "The ZML Trade connection action failed",
  "account.trade.revokeDialog.title": "Unpair ZML Trade?",
  "account.trade.revokeDialog.description": "New signal delivery stops immediately and offline signals are not replayed. A new device code is required to reconnect.",
  "account.trade.revokeDialog.confirm": "Unpair",
  "account.trade.revokeDialog.cancel": "Cancel",
  "account.avatar.title": "Account avatar",
  "account.avatar.controlsAria": "Account avatar controls",
  "account.avatar.fallbackInitial": "A",
  "account.avatar.replace": "Replace avatar",
  "account.avatar.upload": "Upload avatar",
  "account.avatar.moreActions": "More avatar actions",
  "account.avatar.actionsAria": "Avatar actions",
  "account.avatar.edit": "Edit avatar",
  "account.avatar.clear": "Remove avatar",
  "account.avatar.clearing": "Removing…",
  "account.avatar.help": "Supports PNG, JPEG, WebP, and GIF. After selecting an image, zoom and drag the circular crop, then save it for all devices.",
  "account.avatar.saved": "Saved",
  "account.avatar.errors.tooLarge": "The avatar is too large. The maximum size is 2 MiB.",
  "account.avatar.errors.invalidType": "The avatar must be a PNG, JPEG, WebP, or GIF image.",
  "account.avatar.errors.sourceSize": "The source image must be between 1 byte and 12 MiB.",
  "account.avatar.errors.missingCurrent": "This account does not have an avatar to edit yet.",
  "account.avatar.errors.croppedTooLarge": "The cropped avatar is larger than 2 MiB. Use a smaller crop or another image.",
  "account.avatar.errors.validationFailed": "The cropped avatar did not pass image validation. Check the crop and try again.",
  "account.avatar.errors.clearFailed": "The avatar could not be removed. Try again.",
  "account.avatar.crop.title": "Edit avatar",
  "account.avatar.crop.description": "Drag the image to position it, use the slider to zoom, and keep the part you want inside the circular crop.",
  "account.avatar.crop.invalidDimensions": "The image dimensions could not be read.",
  "account.avatar.crop.loadFailed": "The image could not be loaded. Choose another image and try again.",
  "account.avatar.crop.loading": "Loading image…",
  "account.avatar.crop.zoom": "Zoom",
  "account.avatar.crop.canvasUnavailable": "This browser cannot create the avatar crop canvas.",
  "account.avatar.crop.webpUnavailable": "This browser cannot export a WebP avatar.",
  "account.avatar.crop.confirm": "Use avatar",
  "account.password.title": "Change password",
  "account.password.description": "A successful change signs this account out on every device.",
  "account.password.strength.weak": "Weak",
  "account.password.strength.fair": "Fair",
  "account.password.strength.strong": "Strong",
  "account.password.strength.veryStrong": "Very strong",
  "account.password.disabled.submitting": "Your password change is being submitted. Wait for it to finish.",
  "account.password.disabled.currentRequired": "Enter your current password.",
  "account.password.disabled.tooShort": "The new password must contain at least {{count}} characters.",
  "account.password.disabled.tooLong": "The new password cannot exceed {{count}} characters.",
  "account.password.disabled.confirmationRequired": "Enter the new password again.",
  "account.password.disabled.mismatch": "The new passwords do not match.",
  "account.password.errors.currentRequired": "Enter your current password.",
  "account.password.errors.tooShort": "The new password must contain at least {{count}} characters.",
  "account.password.errors.tooLong": "The new password cannot exceed {{count}} characters.",
  "account.password.errors.mismatch": "The new passwords do not match.",
  "account.password.errors.currentIncorrect": "The current password is incorrect.",
  "account.password.errors.rateLimited": "Too many attempts. Try again later.",
  "account.password.errors.failed": "The password could not be changed. Try again later.",
  "account.password.updated": "Password updated",
  "account.password.redirecting": "Redirecting to sign in…",
  "account.password.currentLabel": "Current password",
  "account.password.newLabel": "New password",
  "account.password.confirmLabel": "Confirm new password",
  "account.password.minimumHint": "At least {{count}} characters",
  "account.password.strengthHint": "At least {{count}} characters · Strength: {{strength}}",
  "account.password.strengthMeterLabel": "Password strength",
  "account.password.mismatch": "The passwords do not match",
  "account.password.logoutWarning": "Changing your password signs out every active device",
  "account.password.submitting": "Submitting",
  "account.password.confirm": "Change password",
  "account.signIn.title": "Sign-in methods",
  "account.signIn.accountIdLabel": "Account ID",
  "account.signIn.accountIdHint": "Your permanent sign-in identifier. Contact an administrator if it must be changed.",
  "account.signIn.googleLinked": "Google linked",
  "account.signIn.googleNotLinked": "Google not linked",
  "account.signIn.googleChecking": "Checking Google sign-in status…",
  "account.signIn.googleDisabled": "Google sign-in is disabled",
  "account.signIn.googleDisabledHint": "Google sign-in is not enabled for this site.",
  "account.signIn.googleUnavailable": "Google sign-in status is temporarily unavailable.",
  "account.signIn.retryGoogleStatus": "Retry",
  "account.signIn.linkedEmailUnavailable": "Account linked; email is temporarily unavailable.",
  "account.signIn.linkHint": "Once linked, you can sign in without entering a password.",
  "account.signIn.link": "Link Google",
  "account.signIn.unlink": "Unlink",
  "account.signIn.linkedNotice": "Google is linked. You can now use it to sign in directly.",
  "account.signIn.unlinkedNotice": "Google has been unlinked. Use your account ID and password next time.",
  "account.signIn.resultUnreadable": "The Google link result could not be read.",
  "account.signIn.linkDialogTitle": "Link Google",
  "account.signIn.linkDialogDescription": "Once linked, this Google account can open your current account directly. Verify your current password first to prevent a stolen session from adding a new sign-in method.",
  "account.signIn.verifyAndContinue": "Verify and continue",
  "account.signIn.unlinkDialogTitle": "Unlink Google",
  "account.signIn.unlinkDialogDescription": "After unlinking, only your account ID and password will work. Make sure you remember the password; otherwise an administrator will need to reset it.",
  "account.signIn.currentPassword": "Current password",
  "account.devices.title": "Signed-in devices",
  "account.devices.loading": "Loading signed-in devices…",
  "account.devices.unavailable": "Signed-in devices unavailable",
  "account.devices.browserFallback": "Browser",
  "account.devices.allowance": "Multiple tabs in the same browser count as one device. This account can be signed in on up to {{count}} devices at once.",
  "account.devices.targetScope": "Managed account: {{target}}.",
  "account.devices.evictionHint": "At the device limit, a new sign-in signs out the earliest signed-in device.",
  "account.devices.empty": "No signed-in devices",
  "account.devices.emptyHint": "The next sign-in will appear here.",
  "account.devices.current": "Current device",
  "account.devices.lastSeen": "Last seen {{value}}",
  "account.devices.currentTitle": "Current device",
  "account.devices.othersTitle": "Other devices",
  "account.devices.othersEmpty": "No other signed-in devices",
  "account.devices.othersEmptyHint": "This is the only device currently signed in.",
  "account.devices.revokeAll": "Sign out all devices",
  "account.devices.revokeAllDialog.title": "Sign out all devices",
  "account.devices.revokeAllDialog.description": "Every session on this account is revoked immediately, including this device — you will be returned to the sign-in page and every device must sign in again.",
  "account.devices.revokeAllDialog.confirm": "Sign out everywhere",
  "account.devices.revoke": "Sign out",
  "account.devices.errors.load": "The signed-in devices could not be loaded",
  "account.devices.errors.revoke": "The device could not be signed out",
  "account.devices.errors.revokeAll": "The devices could not be signed out",
  "account.devices.dialog.title": "Sign out this device",
  "account.devices.dialog.description": "Sign out “{{device}}”? The device must sign in again to continue.",
  "account.devices.dialog.confirm": "Sign out",
  "account.devices.dialog.target": "Affected account: {{target}}",
  "account.loginEvents.title": "Sign-in activity",
  "account.loginEvents.browserFallback": "Other browser",
  "account.loginEvents.localDevice": "Issued on this server",
  "account.loginEvents.localSource": "Local server",
  "account.loginEvents.methods.unknown": "Historical sign-in",
  "account.loginEvents.methods.local": "Local sign-in",
  "account.loginEvents.methods.password": "Password",
  "account.loginEvents.methods.google": "Google",
  "account.loginEvents.filters.aria": "Filter sign-in activity",
  "account.loginEvents.filters.statusAria": "Filter by sign-in result",
  "account.loginEvents.filters.ipAria": "Search sign-in IP",
  "account.loginEvents.filters.ipPlaceholder": "Search IP",
  "account.loginEvents.filters.all": "All",
  "account.loginEvents.filters.success": "Success",
  "account.loginEvents.filters.failed": "Failed",
  "account.loginEvents.columns.time": "Time",
  "account.loginEvents.columns.result": "Result",
  "account.loginEvents.columns.source": "Source",
  "account.loginEvents.columns.device": "Device",
  "account.loginEvents.state.refreshing": "Updating results…",
  "account.loginEvents.state.loading": "Loading sign-in activity…",
  "account.loginEvents.state.unavailable": "Sign-in activity unavailable",
  "account.loginEvents.state.staleTitle": "Results not updated",
  "account.loginEvents.state.empty": "No sign-in activity",
  "account.loginEvents.state.emptyHint": "The next sign-in will be recorded here.",
  "account.loginEvents.state.filteredEmpty": "No matching sign-in activity",
  "account.loginEvents.state.filteredEmptyHint": "No sign-in events match the current filters. Clear them to see everything.",
  "account.loginEvents.pagination.aria": "Sign-in activity pagination",
  "account.loginEvents.pagination.total": "{{count}} events",
  "account.loginEvents.pagination.previous": "Previous sign-in activity page",
  "account.loginEvents.pagination.next": "Next sign-in activity page",
  "account.loginEvents.pagination.pending": "Sign-in activity is updating.",
  "account.loginEvents.pagination.first": "This is the first sign-in activity page.",
  "account.loginEvents.pagination.last": "This is the last sign-in activity page.",
  "account.loginEvents.errors.load": "Sign-in activity could not be loaded.",
  "subscription.title": "My subscription",
  "subscription.description": "Your subscription decides what you can use.",
  "subscription.inactive": "Inactive",
  "subscription.lifetime": "Lifetime access",
  "subscription.lifetimeHint": "Lifetime access never expires and needs no renewal.",
  "subscription.subscribed": "Subscribed",
  "subscription.expiredOn": "Expired on {{date}}",
  "subscription.validUntil": "Subscribed · valid until {{date}}",
  "subscription.notSubscribed": "Not subscribed",
  "subscription.perMonth": "<price>{{price}} USDT</price> / month",
  "subscription.subscribe": "Subscribe for a month",
  "subscription.renew": "Renew for a month",
  "subscription.creating": "Creating order…",
  "subscription.salesPaused": "Ordering is currently closed",
  "subscription.readStale": "Subscription information may be outdated. The last result remains visible; ordering resumes after a successful read.",
  "subscription.tierUnavailable": "The selected plan is no longer available. Choose another plan.",
  "subscription.pendingOrder": "Awaiting payment",
  "subscription.payInstruction": "Send exactly <amount>{{amount}} USDT</amount> (TRC20) to the address below",
  "subscription.suffixHint": "The cents in the amount identify this order. Send the exact amount — access opens automatically once it arrives.",
  "subscription.paymentAmount": "Amount due",
  "subscription.copyAmount": "Copy amount",
  "subscription.amountCopied": "Amount copied",
  "subscription.receivingAddress": "Receiving address",
  "subscription.copyAddress": "Copy address",
  "subscription.addressCopied": "Address copied",
  "subscription.paymentNetwork": "Transfer network: TRON (TRC20)",
  "subscription.amountCopiedFeedback": "The exact amount was copied. Send precisely this amount.",
  "subscription.addressCopiedFeedback": "The receiving address was copied. Check the network and address again before sending.",
  "subscription.copyFailed": "Copy failed. Check the browser's clipboard permission and try again.",
  "subscription.orderExpiresAt": "Order valid until {{time}}. After that the amount is released and you will need a new order.",
  "subscription.ordersTitle": "Orders",
  "subscription.ordersDescription": "Your past orders and payments.",
  "subscription.noOrders": "No orders yet",
  "subscription.months": "{{count}} month(s)",
  "subscription.deviceAllowance": "<price>{{price}} USDT</price>/mo · <devices>{{devices}}</devices> device(s)",
  "subscription.status.pending": "Awaiting payment",
  "subscription.status.paid": "Paid",
  "subscription.status.expired": "Expired",
  "subscription.status.cancelled": "Cancelled",
  "subscription.errors.loadFailed": "Subscription information could not be loaded.",
  "subscription.errors.orderFailed": "The order could not be created. Try again shortly.",
  "subscription.perYear": "<price>{{price}} USDT</price> / year",
  "subscription.billingTerm": "Billing term",
  "subscription.termMonthly": "Monthly",
  "subscription.termYearly": "Yearly",
  "subscription.yearlySaving": "Pay for a year and save {{percent}}%.",
  "notice.lapsed": "Your subscription has expired. Renew to restore full monitoring data.",
  "notice.expiringSoon": "Your subscription expires in {{days}} days. Renew early to avoid interruption.",
  "notice.renewNow": "Renew",
  "notice.later": "Later",
  "announcements.officialDocument": "Official announcement",
  "announcements.documentStates.loading": "Content loading",
  "announcements.documentStates.ready": "Content ready",
  "announcements.documentStates.retrying": "Content retrying",
  "announcements.documentStates.unavailable": "Content unavailable",
  "announcements.localizationStates.original": "Official original",
  "announcements.localizationStates.loading": "Translating",
  "announcements.localizationStates.ready": "Translation ready",
  "announcements.localizationStates.retrying": "Translation retrying",
  "announcements.localizationStates.unavailable": "Translation unavailable",
  "announcements.delisting.simpleDescription": "Upcoming delistings announced by exchanges.",
  "announcements.delisting.verifiedSummaryTitle": "Delisting details",
  "announcements.delisting.disabledTitle": "Delisting alerts unavailable",
  "announcements.delisting.disabledDescription": "Delisting data is currently disabled. The announcement feed remains available.",
  "announcements.delisting.emptyTitle": "No upcoming delistings",
  "announcements.delisting.emptyDescription": "There are no active upcoming delistings.",
  "announcements.delisting.filteredEmptyTitle": "No matching delistings",
  "announcements.delisting.filteredEmptyDescription": "The current search or filters matched nothing. Clear them to see everything.",
  "announcements.delisting.delistingTime": "Delisting time",
  "announcements.delisting.instrument": "Pair / asset",
  "announcements.delisting.product": "Product",
  "announcements.delisting.countdownColumn": "Countdown",
  "announcements.delisting.listAria": "Delisting alerts",
  "announcements.delisting.openAlert": "Open delisting announcement: {{instrument}}",
  "announcements.allCategories": "All",
  "announcements.categories.listing": "Listings",
  "announcements.categories.delisting": "Delistings",
  "announcements.categories.maintenance": "Maintenance",
  "announcements.categories.migration": "Migration / rename",
  "announcements.categories.trading": "Trading changes",
  "announcements.categories.promotion": "Airdrops / campaigns",
  "announcements.categories.funding": "$t(zml:zml.metric.funding_rate)",
  "announcements.categories.other": "Other",
  "announcements.overview.delistingsTitle": "Current delistings",
  "announcements.overview.delistingsEmptyTitle": "No active delistings",
  "announcements.overview.delistingsEmptyDescription": "No active delisting alerts.",
  "announcements.overview.todayTitle": "Today",
  "announcements.overview.todayEmptyTitle": "Nothing to watch today",
  "announcements.overview.todayEmptyDescription": "Listings, delistings, maintenance, migrations, trading changes, and funding notices land here.",
  "announcements.overview.todayMore": "View all announcements",
  "announcements.overview.readerEmptyTitle": "Select an announcement",
  "announcements.overview.readerEmptyDescription": "Open an item from the list to read it.",
  "announcements.page.title": "News center",
  "announcements.page.loading": "Loading announcements...",
  "announcements.page.refresh": "Refresh",
  "announcements.page.refreshing": "Refreshing",
  "announcements.page.destination": "News section",
  "announcements.page.overview": "Overview",
  "announcements.page.announcements": "Announcements",
  "announcements.page.delistings": "Delistings",
  "announcements.page.affectedOnly": "Affecting my combos",
  "announcements.page.announcementFeed": "Announcements",
  "announcements.page.delistingAlerts": "Delistings",
  "announcements.page.searchDelistingAria": "Search delisting announcements",
  "announcements.page.searchAria": "Search announcements",
  "announcements.page.searchDelistingPlaceholder": "Search assets or announcements...",
  "announcements.page.searchPlaceholder": "Search announcements...",
  "announcements.page.categoryFilter": "Announcement categories",
  "announcements.page.exchangeFilter": "Exchange filter",
  "announcements.page.filters": "Filter",
  "announcements.page.filtersNone": "All announcements",
  "announcements.page.filtersAria": "Exchange filters: {{summary}}",
  "announcements.page.exchangeCount": "{{count}} exchanges",
  "announcements.page.loadFailedTitle": "Announcements failed to load",
  "announcements.page.emptyTitle": "No announcements",
  "announcements.page.emptyDescription": "Official sources have not produced any announcements yet.",
  "announcements.page.filteredEmptyTitle": "No matching announcements",
  "announcements.page.filteredEmptyDescription": "The current search or filters matched nothing. Clear them to see everything.",
  "announcements.page.exchange": "Exchange",
  "announcements.page.time": "Time",
  "announcements.page.category": "Category",
  "announcements.page.titleColumn": "Announcement",
  "announcements.inbox.showNew": "Show new announcements",
  "announcements.inbox.today": "Today",
  "announcements.inbox.yesterday": "Yesterday",
  "announcements.inbox.unreadOnly": "Unread only",
  "announcements.inbox.sourceStateUnavailable": "Official source status is unavailable",
  "announcements.inbox.sourceStateUnavailableDescription": "The last successful facet snapshot is retained (data as of {{time}}); results are never silently cleared or pruned.",
  "announcements.inbox.staleTitle": "Showing the last successful snapshot",
  "announcements.inbox.staleForbiddenTitle": "News access has been revoked",
  "announcements.inbox.staleForbiddenDescription": "The last snapshot from before access was revoked remains visible. It will not update, and retrying will not restore it.",
  "announcements.inbox.forbiddenTitle": "You do not have access to news",
  "announcements.inbox.forbiddenDescription": "This account cannot read news. Retrying will not change that — ask an administrator for access.",
  "announcements.inbox.loadError": "Announcements are temporarily unavailable. Please try again.",
  "announcements.inbox.loadMoreFailed": "More announcements could not be loaded. Previously loaded items remain available.",
  "announcements.inbox.resultCount": "Showing {{count}} news items",
  "announcements.inbox.snapshotAt": "Snapshot: {{time}}",
  "announcements.inbox.noSnapshot": "No authoritative snapshot yet",
  "announcements.inbox.sourceNotEffective": "Not running",
  "announcements.inbox.affectedOpportunities": "Affected pairs",
  "announcements.inbox.affectedOpportunityCount": "{{count}} affected pairs",
  "announcements.inbox.openAnnouncement": "Open announcement: {{title}}",
  "announcements.inbox.listAria": "News center results",
  "announcements.monitorRisk.bothLegs": "Both sides",
  "announcements.monitorRisk.longLeg": "Long side",
  "announcements.monitorRisk.shortLeg": "Short side",
  "announcements.monitorRisk.delistingBadge": "{{leg}} delisting · {{time}}",
  "announcements.monitorRisk.title": "{{venue}} · {{product}} · final delisting {{time}}; {{count}} related delistings",
  "announcements.monitorRisk.titleWithInstrument": "{{venue}} · {{instrument}} · {{product}} · final delisting {{time}}; {{count}} related delistings",
  "announcements.notifications.open": "Alert settings",
  "announcements.notifications.title": "Delisting alerts",
  "announcements.notifications.description": "Changes save automatically. Alerts cover official delistings with an exact pair, product, and final time.",
  "announcements.notifications.loading": "Loading delisting alerts for this account…",
  "announcements.notifications.loadFailedTitle": "Delisting alert settings unavailable",
  "announcements.notifications.loadFailedMessage": "Delisting alert settings have not been loaded for this account.",
  "announcements.notifications.saveFailed": "Could not save alert settings. Please try again.",
  "announcements.notifications.inAppToast": "In-app delisting alerts",
  "announcements.notifications.duration": "Display duration",
  "announcements.notifications.seconds": "sec",
  "announcements.notifications.maxVisible": "Visible at once",
  "announcements.notifications.position": "Notification position",
  "announcements.notifications.positions.topRight": "Top right",
  "announcements.notifications.positions.topLeft": "Top left",
  "announcements.notifications.positions.bottomRight": "Bottom right",
  "announcements.notifications.positions.bottomLeft": "Bottom left",
  "announcements.notifications.feishuTitle": "Feishu delisting alerts",
  "announcements.notifications.feishuChannel": "Feishu delisting channel",
  "announcements.notifications.currentChannel": "Current channel: {{channel}}",
  "announcements.notifications.selectChannelHint": "Select a channel before enabling Feishu delisting alerts.",
  "announcements.notifications.channelUpdated": "Delisting alert channel updated",
  "announcements.notifications.feishuDisabled": "Feishu delisting alerts disabled",
  "announcements.notifications.noChannelSelected": "No delisting alert channel selected",
  "announcements.notifications.openChannelSettings": "Open account Feishu channel settings",
  "announcements.notifications.channelRequired": "Select a Feishu delisting channel for this account first.",
  "announcements.notifications.verifiedOnly": "Only official delistings with an exact pair, product, and final time are sent.",
  "announcements.notifications.quietHours": "Quiet hours",
  "announcements.notifications.quietTimeZone": "Quiet hours follow your device's current time. The last confirmed setting applies while offline.",
  "announcements.notifications.start": "Start",
  "announcements.notifications.end": "End",
  "announcements.notifications.history.title": "Recent alerts",
  "announcements.notifications.history.emptyTitle": "No alerts yet",
  "announcements.notifications.history.emptyDescription": "Matching delisting alerts will appear here after an alert is created.",
  "announcements.notifications.history.deletedChannel": "Deleted channel",
  "announcements.notifications.history.combination": "Combination alert",
  "announcements.notifications.history.tab": "Opportunity tab {{tab}}",
  "announcements.notifications.history.deletedTab": "Deleted tab",
  "announcements.notifications.history.toast": "In-app alert",
  "announcements.notifications.history.feishu": "Feishu alert",
  "announcements.notifications.history.notification": "Alert",
  "announcements.notifications.history.status.sent": "Sent",
  "announcements.notifications.history.status.pending": "Pending",
  "announcements.notifications.history.status.failed": "Failed",
  "announcements.notifications.history.status.unknown": "Unknown status",
  "announcements.retry": "Retry",
  "announcements.loading": "Loading unread announcements…",
  "announcements.unreadLabel": "Unread announcements",
  "announcements.markAllRead": "Mark all as read",
  "announcements.reader.readingMode": "Reading view",
  "announcements.reader.compareView": "Compare",
  "announcements.reader.contentUpdated": "An updated version is available. Your current reading position is preserved.",
  "announcements.reader.applyUpdate": "Show updated version",
  "announcements.reader.table": "Table",
  "announcements.reader.sourceDetails": "Source details",
  "announcements.reader.sourceLanguage": "Original language",
  "announcements.reader.machineTranslation": "Machine translation",
  "announcements.reader.jumpTranslation": "Translation",
  "announcements.reader.jumpOriginal": "Original",
  "announcements.reader.moreActions": "More reading actions",
  "announcements.reader.copyLink": "Copy source link",
  "announcements.reader.copyOriginal": "Copy original text",
  "announcements.reader.copyTranslation": "Copy translation",
  "announcements.reader.copied": "Copied",
  "announcements.reader.copyFailed": "Copy failed. Check clipboard permission and try again.",
  "announcements.reader.bodyRegion": "Announcement content",
  "announcements.reader.publishedTime": "Published time",
  "announcements.reader.readSyncPending": "The announcement is open. Read state will sync when the connection recovers.",
  "announcements.reader.verifyOnOfficialSite": "Use the original link to verify the announcement on the exchange website.",
  "announcements.reader.officialContent": "Original exchange text",
  "announcements.reader.summary": "Announcement summary",
  "announcements.reader.noReadableContent": "No readable official content is currently available.",
  "announcements.reader.forbidden": "You do not have permission to view this announcement.",
  "announcements.reader.detailUnavailable": "Announcement details are temporarily unavailable.",
  "announcements.reader.focusAnchor": "Announcement details",
  "announcements.reader.loadingDescription": "Loading the announcement for reading.",
  "announcements.reader.loadingRegion": "Announcement loading status",
  "announcements.reader.unavailableTitle": "Announcement unavailable",
  "announcements.reader.opening": "Loading announcement…",
  "announcements.reader.unavailableFooter": "Announcement content unavailable",
  "announcements.reader.preparingFooter": "Loading announcement content",
  "announcements.reader.fullContentFailed": "The full announcement could not be refreshed. Available content remains visible.",
  "announcements.reader.relatedOpportunities": "Related trading opportunities",
  "announcements.reader.openingSpread": "$t(zml:zml.metric.bbo_executable_open_spread_pct)",
  "announcements.reader.openOriginal": "Open original on the exchange website",
  "announcements.toast.summary": "{{venue}} · {{instrument}} · {{product}} · {{time}}{{impact}}",
  "announcements.toast.impactSuffix": " · {{count}} affected",
  "announcements.toast.region": "Delisting alerts",
  "announcements.toast.closeAria": "Dismiss delisting alert: {{title}}",
  "announcements.toast.batchTitle": "Delisting alert: {{title}}",
  "announcements.toast.batchSeparator": "; ",
  "google.errors.cancelled": "Google authorization was cancelled.",
  "google.errors.emailTaken": "This email already has an account. Sign in with your password, then link Google in Settings → General → Sign-in methods.",
  "google.errors.registrationClosed": "Self-service sign-up is closed. Contact an administrator for an account.",
  "google.errors.stateMismatch": "Authorization verification failed. Start Google sign-in again.",
  "google.errors.temporarilyBusy": "Google sign-in is busy. Try again shortly.",
  "google.errors.sessionUnavailable": "A sign-in session could not be created. Try again shortly.",
  "google.errors.accountUnavailable": "This account is disabled. Contact an administrator.",
  "google.errors.authorizationFailed": "Google authorization could not be completed. Try again shortly.",
  "google.errors.callbackIncomplete": "Google sign-in did not finish. Please try again.",
  "google.errors.handoffUsed": "This Google authorization has already been used. Start again.",
  "google.errors.handoffExpired": "The Google authorization handoff has expired. Start again.",
  "google.errors.signupContextExpired": "The Google sign-up authorization has expired. Start again.",
  "google.errors.signupContextUnavailable": "Google sign-up details could not be loaded. Try again shortly.",
  "google.errors.signupContextIncomplete": "Google sign-up details are incomplete. Start again.",
  "google.errors.resultMismatch": "This Google sign-in result does not match the current page. Start again.",
  "google.errors.linkResultMismatch": "This Google link result does not match the current account. Start again.",
  "google.errors.currentPasswordIncorrect": "The current password is incorrect.",
  "google.errors.networkBlocked": "Sign-in is not allowed from this network. Contact an administrator.",
  "google.errors.deviceUnavailable": "This sign-in device could not be identified.",
  "google.errors.notConfigured": "Google sign-in is not configured for this site.",
  "google.errors.originNotConfigured": "This site does not have a usable Google OAuth client.",
  "google.errors.linkStartFailed": "Google linking could not be started. Try again shortly.",
  "google.errors.ticketInvalid": "Google authorization has expired. Authorize again.",
  "google.errors.linkFailed": "Linking failed. This Google account may already be linked elsewhere.",
  "google.errors.unlinkFailed": "Google could not be unlinked. Try again shortly.",
  "google.errors.signupBusy": "Sign-up is busy. Try again shortly.",
  "google.errors.signupUnavailable": "Sign-up is temporarily unavailable. Try again shortly.",
  "google.errors.signupIncomplete": "Your account was created. Return to sign in.",
  "google.errors.signupFailed": "Sign-up failed. Try again shortly.",
  "google.errors.usernameTaken": "This username is already taken.",
  "google.errors.usernameReserved": "This username is reserved. Choose another one.",
  "google.errors.usernameTooShort": "The username must be at least 3 characters.",
  "google.errors.usernameTooLong": "The username cannot exceed 32 characters.",
  "google.errors.usernameCharset": "Use only lowercase letters, numbers, and underscores, and do not begin with an underscore.",
  "google.errors.googleAlreadyLinked": "This Google account is already linked elsewhere.",
  "google.errors.passwordTooShort": "The password must be at least 8 characters.",
  "google.errors.passwordTooLong": "The password cannot exceed 256 characters.",
  "google.errors.passwordInvalid": "The password does not meet the requirements.",
  "google.errors.statusUnavailable": "Google sign-in status is temporarily unavailable. Try again shortly.",
  "google.errors.requestFailed": "The request could not be completed. Try again shortly.",
  "google.errors.unsupportedLocale": "This language is not supported. Choose another language.",
  "login.documentTitle": "Sign in · ZML Monitor",
  "login.ariaLabel": "Sign in",
  "login.subtitle": "",
  "login.loadingAriaLabel": "Loading sign-in",
  "login.loadingPage": "Loading sign-in…",
  "login.identifierLabel": "Account or email",
  "login.passwordLabel": "Password",
  "login.passwordPlaceholder": "Enter your password",
  "login.showPassword": "Show password",
  "login.hidePassword": "Hide password",
  "login.submit": "Log in",
  "login.submitting": "Signing in…",
  "login.errorEmptyIdentifier": "Please enter your account or email",
  "login.errorEmptyPassword": "Please enter your password",
  "login.errorGeneric": "Sign-in failed. Try again shortly.",
  "login.errors.invalidCredentials": "The account or password is incorrect.",
  "login.errors.ipBlocked": "Sign-in is not allowed from this network. Contact an administrator.",
  "login.errors.tooManyAttempts": "Too many attempts. Wait and try again.",
  "login.errors.busy": "Sign-in is busy. Try again shortly.",
  "login.errors.unavailable": "Sign-in is temporarily unavailable. Try again shortly.",
  "login.logout.passwordChanged": "Your password changed. Sign in again.",
  "login.logout.invalidated": "This session was signed out on another device.",
  "login.logout.deviceEvicted": "This device was signed out because the account reached its signed-in device limit. Sign in again or manage the other sessions under Signed-in devices.",
  "login.logout.accountDisabled": "This account is disabled. Contact an administrator.",
  "login.logout.invalidAuth": "The sign-in credential is invalid. Sign in again.",
  "login.logout.expired": "Your sign-in expired. Sign in again.",
  "login.logout.network": "The connection was lost. Sign in again.",
  "login.logout.unknown": "Your session ended. Sign in again.",
  "login.signedOutDevices": "This sign-in automatically signed out {{count}} other device(s) to enforce the device limit. Review the sessions under Settings → Signed-in devices.",
  "login.locked": "Locked",
  "login.lockedAria": "Access is locked. Please wait and try again.",
  "login.retryAfter": "Retry in {{countdown}}",
  "login.failureCount": "{{count}}/{{max}} consecutive failures, {{remaining}} attempts left",
  "login.lockedFailureCount": "{{count}}/{{max}} consecutive failures so far",
  "login.submitDisabledLoading": "Sign-in in progress, please wait.",
  "login.submitDisabledLocked": "Access is locked. Wait for the countdown to finish.",
  "login.google.divider": "or",
  "login.google.continue": "Continue with Google",
  "login.google.checking": "Connecting to Google…",
  "login.google.completing": "Completing Google sign-in…",
  "login.google.unavailable": "Google sign-in status is temporarily unavailable.",
  "login.google.retry": "Retry",
  "login.google.signupHint": "New users choose a username and password after verification. Existing users sign in with their password first, then link Google in Settings.",
  "register.documentTitle": "Create account · ZML Monitor",
  "register.ariaLabel": "Create account",
  "register.subtitle": "Finish creating your ZML Monitor account",
  "register.receiving": "Receiving Google authorization…",
  "register.backToLogin": "Back to sign in",
  "register.handoffExpired": "Google authorization has expired. Please start again.",
  "register.startFromLogin": "Start from the sign-in page and choose “Continue with Google”.",
  "register.retryContext": "Retry sign-up details",
  "register.retryingContext": "Retrying sign-up details…",
  "register.googleVerified": "Google email verified",
  "register.existingAccountHint": "Already have an account? Do not create another one. Sign in first, then link Google in Settings → General → Sign-in methods.",
  "register.bindExistingAccount": "Sign in to existing account",
  "register.usernameLabel": "Username",
  "register.usernamePlaceholder": "3–32 lowercase letters, numbers, or underscores",
  "register.usernameHint": "Your username cannot be changed after sign-up. Contact an administrator if it must be updated.",
  "register.usernameRequired": "Enter a username",
  "register.usernameLowercase": "Use lowercase letters only",
  "register.usernameLeadingUnderscore": "Cannot begin with an underscore",
  "register.usernameInvalid": "Use 3–32 lowercase letters, numbers, or underscores",
  "register.passwordLabel": "Password",
  "register.passwordRequired": "Enter a password",
  "register.passwordPlaceholder": "At least {{min}} characters",
  "register.passwordHint": "Use {{min}}–{{max}} characters. You can also use this password for regular sign-in.",
  "register.confirmPasswordLabel": "Confirm password",
  "register.confirmPasswordRequired": "Enter the password again",
  "register.passwordMismatch": "The passwords do not match",
  "register.createAccount": "Create account",
  "register.creating": "Creating account…",
  "register.failed": "Sign-up failed. Please try again later.",
  "fundingHistoryAdmin.limitations.gateUsdc.label": "Gate USDC public history is limited",
  "fundingHistoryAdmin.limitations.gateUsdc.description": "Gate USDC public history needs extra authentication. Uncovered contracts are not shown as supported.",
  "fundingHistoryAdmin.quality.healthy": "Healthy",
  "fundingHistoryAdmin.quality.partial": "Partial coverage",
  "fundingHistoryAdmin.quality.newListing": "Short history",
  "fundingHistoryAdmin.quality.stale": "Stale",
  "fundingHistoryAdmin.quality.warmingUp": "Warming up",
  "fundingHistoryAdmin.quality.missing": "Missing",
  "fundingHistoryAdmin.availability.active": "Active",
  "fundingHistoryAdmin.availability.officialUnavailable": "Official source unavailable",
  "fundingHistoryAdmin.availability.paused": "Paused",
  "fundingHistoryAdmin.availability.retired": "Retired",
  "fundingHistoryAdmin.availability.unsupported": "Unsupported",
  "fundingHistoryAdmin.phase.idle": "Idle",
  "fundingHistoryAdmin.phase.warmup": "Warming up",
  "fundingHistoryAdmin.phase.running": "Running",
  "fundingHistoryAdmin.phase.paused": "Paused",
  "fundingHistoryAdmin.phase.degraded": "Degraded",
  "fundingHistoryAdmin.phase.error": "Error",
  "fundingHistoryAdmin.phase.unknown": "Unknown",
  "fundingHistoryAdmin.syncStatus.idle": "Idle",
  "fundingHistoryAdmin.syncStatus.pending": "Queued",
  "fundingHistoryAdmin.syncStatus.running": "Syncing",
  "fundingHistoryAdmin.syncStatus.ready": "Ready",
  "fundingHistoryAdmin.syncStatus.degraded": "Degraded",
  "fundingHistoryAdmin.syncStatus.paused": "Paused",
  "fundingHistoryAdmin.syncStatus.unknown": "Unknown",
  "fundingHistoryAdmin.activityLevel.info": "Info",
  "fundingHistoryAdmin.activityLevel.warn": "Warning",
  "fundingHistoryAdmin.activityLevel.error": "Error",
  "fundingHistoryAdmin.activityLevel.unknown": "Unclassified",
  "fundingHistoryAdmin.freshness.fresh": "Converged",
  "fundingHistoryAdmin.freshness.stale": "Stale",
  "fundingHistoryAdmin.freshness.unknown": "Unknown",
  "fundingHistoryAdmin.reason.startupSidecarSeed": "Startup summary seed",
  "fundingHistoryAdmin.reason.startupCachedProjection": "Startup cached projection",
  "fundingHistoryAdmin.reason.startupPrioritySeed": "Startup priority seed",
  "fundingHistoryAdmin.reason.startupWarmup": "Startup warmup",
  "fundingHistoryAdmin.reason.startupProjectionRefresh": "Startup projection refresh",
  "fundingHistoryAdmin.reason.startupFollowupRepair": "Post-startup repair",
  "fundingHistoryAdmin.reason.scheduledRefresh": "Scheduled cache refresh",
  "fundingHistoryAdmin.reason.scheduledRepair": "Scheduled gap repair",
  "fundingHistoryAdmin.reason.settlementOfficialRefresh": "Post-settlement official refresh",
  "fundingHistoryAdmin.reason.captureWindowStarted": "Settlement capture window opened",
  "fundingHistoryAdmin.reason.captureWaitingConfirmation": "Waiting for settlement confirmation",
  "fundingHistoryAdmin.reason.capturedSettlementConfirmed": "Live settlement capture confirmed",
  "fundingHistoryAdmin.reason.captureTimeout": "Settlement capture timed out",
  "fundingHistoryAdmin.reason.sidecarPublish": "Summary publish",
  "fundingHistoryAdmin.reason.sidecarNoop": "Summary unchanged",
  "fundingHistoryAdmin.reason.manualWarmup": "Manual full warmup",
  "fundingHistoryAdmin.reason.manualRepair": "Manual gap repair",
  "fundingHistoryAdmin.reason.manualRefreshActive": "Recompute and publish days 1–5",
  "fundingHistoryAdmin.reason.manualResetCounters": "Manual counter reset",
  "fundingHistoryAdmin.reason.pause": "Manual pause",
  "fundingHistoryAdmin.reason.resume": "Manual resume",
  "fundingHistoryAdmin.reason.officialCircuitOpened": "Official API rate-limit protection",
  "fundingHistoryAdmin.reason.officialCircuitRecovered": "Official API rate-limit recovery",
  "fundingHistoryAdmin.reason.startupUniverseWaitFailed": "Startup universe stabilization failed",
  "fundingHistoryAdmin.reason.startupPrioritySeedFailed": "Startup priority seed failed",
  "fundingHistoryAdmin.reason.startupWarmupFailed": "Startup warmup failed",
  "fundingHistoryAdmin.reason.startupProjectionRefreshFailed": "Startup projection refresh failed",
  "fundingHistoryAdmin.reason.startupCachedProjectionFailed": "Startup cached projection failed",
  "fundingHistoryAdmin.reason.startupFollowupRepairFailed": "Post-startup repair failed",
  "fundingHistoryAdmin.reason.scheduledRefreshFailed": "Scheduled cache refresh failed",
  "fundingHistoryAdmin.reason.scheduledRepairFailed": "Scheduled gap repair failed",
  "fundingHistoryAdmin.reason.settlementRefreshFailed": "Post-settlement official refresh failed",
  "fundingHistoryAdmin.reason.startupWarmupVenue": "Startup warmup · {{venue}}",
  "fundingHistoryAdmin.reason.prioritySeedVenue": "Startup priority seed · {{venue}}",
  "fundingHistoryAdmin.reason.manualRefreshVenue": "Exchange refresh · {{venue}}",
  "fundingHistoryAdmin.reason.universeReady": "{{reason}} · universe stabilized",
  "fundingHistoryAdmin.reason.universeTimeout": "{{reason}} · universe wait timed out",
  "fundingHistoryAdmin.reason.noop": "{{reason}} · unchanged",
  "fundingHistoryAdmin.reason.failed": "{{reason}} failed",
  "fundingHistoryAdmin.message.officialRefreshed": "Official history refreshed: {{completed}}/{{total}} contracts, {{rows}} rows written",
  "fundingHistoryAdmin.message.universeStable": "The perpetual universe stabilized at {{count}} contracts",
  "fundingHistoryAdmin.message.universeProceeding": "The perpetual universe did not stabilize before warmup; proceeding with {{count}} contracts",
  "fundingHistoryAdmin.message.settlementCaptured": "Funding settlement captured: {{value}}",
  "fundingHistoryAdmin.message.captureWindowEntered": "Entered the settlement capture window at {{value}}",
  "fundingHistoryAdmin.message.waitingConfirmation": "Waiting to confirm settlement after {{value}}",
  "fundingHistoryAdmin.message.settlementConfirmed": "Live settlement capture confirmed at {{value}}",
  "fundingHistoryAdmin.message.captureWindowsExpired": "{{count}} settlement capture windows expired before confirmation",
  "fundingHistoryAdmin.message.noRefreshCandidates": "No official-history candidates need refreshing",
  "fundingHistoryAdmin.message.projectionsRefreshed": "Refreshed {{count}} cached projections",
  "fundingHistoryAdmin.message.sidecarUnchanged": "{{reason}}: no affected shards; summary cache unchanged",
  "fundingHistoryAdmin.message.sidecarChanged": "{{reason}}: {{changed}} contracts changed, {{removed}} removed, {{shards}} shards and {{rows}} rows affected, committed in {{duration}} ms{{overrun}}",
  "fundingHistoryAdmin.message.overrun": ", over budget",
  "fundingHistoryAdmin.actions.warmup.title": "Full warmup",
  "fundingHistoryAdmin.actions.warmup.description": "Backfill the latest five days of official history for every perpetual contract after major repairs or restarts.",
  "fundingHistoryAdmin.actions.warmup.success": "Full warmup started. The system will backfill the latest five days exchange by exchange.",
  "fundingHistoryAdmin.actions.repair.title": "Repair gaps",
  "fundingHistoryAdmin.actions.repair.description": "Repair incomplete tail contracts only.",
  "fundingHistoryAdmin.actions.repair.success": "Gap repair started for incomplete tail contracts only.",
  "fundingHistoryAdmin.actions.refreshActive.title": "Recompute and publish days 1–5",
  "fundingHistoryAdmin.actions.refreshActive.description": "Trigger an immediate history sync for all perpetual contracts and publish the latest day 1–5 columns to the main table.",
  "fundingHistoryAdmin.actions.refreshActive.success": "Full recompute and day 1–5 publish started; the main table will use the latest published cache.",
  "fundingHistoryAdmin.actions.pause.title": "Pause",
  "fundingHistoryAdmin.actions.pause.description": "Pause background funding-history jobs without affecting the currently published main-table result.",
  "fundingHistoryAdmin.actions.pause.success": "Funding-history background jobs paused.",
  "fundingHistoryAdmin.actions.resume.title": "Resume",
  "fundingHistoryAdmin.actions.resume.description": "Resume background jobs using the current sync and publish configuration.",
  "fundingHistoryAdmin.actions.resume.success": "Funding-history background jobs resumed.",
  "fundingHistoryAdmin.actions.resetCounters.title": "Reset counters",
  "fundingHistoryAdmin.actions.resetCounters.description": "Clear runtime counters and activity statistics without deleting settlement history or main-table cache results.",
  "fundingHistoryAdmin.actions.resetCounters.success": "Runtime counters and activity statistics cleared.",
  "fundingHistoryAdmin.feedback.actionExecuted": "Action executed: {{action}}",
  "fundingHistoryAdmin.relative.secondsAfter": "in {{count}} seconds",
  "fundingHistoryAdmin.relative.secondsBefore": "{{count}} seconds ago",
  "fundingHistoryAdmin.relative.minutesAfter": "in {{count}} minutes",
  "fundingHistoryAdmin.relative.minutesBefore": "{{count}} minutes ago",
  "fundingHistoryAdmin.relative.hoursAfter": "in {{count}} hours",
  "fundingHistoryAdmin.relative.hoursBefore": "{{count}} hours ago",
  "fundingHistoryAdmin.coverage.full": "Full coverage",
  "fundingHistoryAdmin.coverage.medium": "Medium coverage",
  "fundingHistoryAdmin.coverage.low": "Low coverage",
  "fundingHistoryAdmin.coverage.none": "No coverage",
  "fundingHistoryAdmin.duration.milliseconds": "{{count}} ms",
  "fundingHistoryAdmin.duration.seconds": "{{count}}s",
  "fundingHistoryAdmin.duration.minutes": "{{count}} min",
  "fundingHistoryAdmin.page.readFailed": "The funding-history console could not be read. Check the backend and try again.",
  "fundingHistoryAdmin.page.metadataReadFailed": "Live funding metadata could not be read. Check the backend and try again.",
  "fundingHistoryAdmin.page.completed": "Completed",
  "fundingHistoryAdmin.page.started": "Started",
  "fundingHistoryAdmin.page.configSaved": "Funding-history parameters saved.",
  "fundingHistoryAdmin.page.configSavedTitle": "Configuration saved",
  "fundingHistoryAdmin.page.snapshotRefreshFailed": "The live funding-history status could not be refreshed; the last successful snapshot is retained.",
  "fundingHistoryAdmin.page.saveFailed": "Save failed.",
  "fundingHistoryAdmin.page.actionSubmitted": "Action submitted",
  "fundingHistoryAdmin.page.actionFailed": "Action failed.",
  "fundingHistoryAdmin.page.loading": "Loading the funding-history console…",
  "fundingHistoryAdmin.page.readFailedTitle": "Funding-history console could not be read",
  "fundingHistoryAdmin.page.unavailableTitle": "Funding history unavailable",
  "fundingHistoryAdmin.page.unavailableDescription": "There is no data to display yet.",
  "fundingHistoryAdmin.page.sidecarImpact": "{{shards}} shards / {{rows}} rows",
  "fundingHistoryAdmin.page.waitingFirstPublish": "Waiting for the first summary publish",
  "fundingHistoryAdmin.page.sidecarImpactHint": "{{changed}} contracts changed, {{removed}} removed, committed in {{duration}} ms{{overrun}}",
  "fundingHistoryAdmin.page.lastCommittedCache": "The main table still uses the most recently committed low-frequency summary cache.",
  "fundingHistoryAdmin.page.waitingPublish": "Waiting for summary publish",
  "fundingHistoryAdmin.page.noRecentNoop": "No recent unchanged publish",
  "fundingHistoryAdmin.page.archived": "Archived",
  "fundingHistoryAdmin.page.initializing": "Initializing",
  "fundingHistoryAdmin.page.metrics.coverage5d": "5-day coverage",
  "fundingHistoryAdmin.page.metrics.projectionPending": "The initial projection has not been generated",
  "fundingHistoryAdmin.page.metrics.coverageDescription": "Overall five-day cache coverage",
  "fundingHistoryAdmin.page.metrics.availableContracts": "Contracts with values",
  "fundingHistoryAdmin.page.metrics.waitingUniverse": "Waiting for the contract universe and cached projections",
  "fundingHistoryAdmin.page.metrics.availableDescription": "The main table has values for days 1–5",
  "fundingHistoryAdmin.page.metrics.tailRepair": "Incomplete contracts",
  "fundingHistoryAdmin.page.metrics.gapPending": "Gap evaluation has not started",
  "fundingHistoryAdmin.page.metrics.issueVenues": "{{count}} exchanges have contracts needing repair",
  "fundingHistoryAdmin.page.metrics.noTailGaps": "No tail gaps",
  "fundingHistoryAdmin.page.metrics.lastPublish": "Last publish",
  "fundingHistoryAdmin.page.runtime.backgroundTask": "Background task",
  "fundingHistoryAdmin.page.runtime.waitingSchedule": "Waiting for the next scheduled run",
  "fundingHistoryAdmin.page.runtime.lastSummaryPublish": "Latest summary publish",
  "fundingHistoryAdmin.page.runtime.publishScope": "Publish scope",
  "fundingHistoryAdmin.page.runtime.lastNoop": "Latest unchanged publish",
  "fundingHistoryAdmin.page.config.enabled": "Enabled",
  "fundingHistoryAdmin.page.config.startupWarmup": "Startup warmup",
  "fundingHistoryAdmin.page.config.retentionDays": "Fact retention days",
  "fundingHistoryAdmin.page.config.numberError": "Enter a valid nonnegative whole number that meets this parameter's minimum.",
  "fundingHistoryAdmin.page.config.discard": "Discard changes",
  "fundingHistoryAdmin.page.config.unchanged": "The current parameters have no unsaved changes.",
  "fundingHistoryAdmin.page.config.retentionHint": "Retain at least five days so the fixed day 1–5 projections have complete facts.",
  "fundingHistoryAdmin.page.config.historyDays": "Official backfill lookback (projection fixed at 5 days)",
  "fundingHistoryAdmin.page.config.historyDaysHint": "Controls only the official backfill range; day 1–5 accumulation, coverage, and quality always use a fixed five-day definition.",
  "fundingHistoryAdmin.page.config.refreshInterval": "Full refresh interval (seconds)",
  "fundingHistoryAdmin.page.config.sweepInterval": "Sweep interval (seconds)",
  "fundingHistoryAdmin.page.config.settlementDelay": "Settlement delay (seconds)",
  "fundingHistoryAdmin.page.config.globalConcurrency": "Global concurrency",
  "fundingHistoryAdmin.page.config.perVenueConcurrency": "Per-exchange concurrency",
  "fundingHistoryAdmin.page.config.requestTimeout": "Request timeout (seconds)",
  "fundingHistoryAdmin.page.config.retryLimit": "Retry count",
  "fundingHistoryAdmin.page.config.captureWindowBefore": "Pre-settlement capture window (seconds)",
  "fundingHistoryAdmin.page.config.capturePostGuard": "Post-settlement guard (seconds)",
  "fundingHistoryAdmin.page.config.captureConfirm": "Confirmation window (seconds)",
  "fundingHistoryAdmin.page.config.captureDeadline": "Final deadline (seconds)",
  "fundingHistoryAdmin.page.config.minPostSamples": "Minimum post-settlement samples",
  "fundingHistoryAdmin.page.source.title": "Source: Feishu alert card",
  "fundingHistoryAdmin.page.source.focusedOpportunity": "Focused opportunity:",
  "fundingHistoryAdmin.page.source.viewHistory": "View this opportunity's funding history",
  "fundingHistoryAdmin.page.enabledStatus": "Enabled",
  "fundingHistoryAdmin.page.pausedStatus": "Paused",
  "fundingHistoryAdmin.page.lastRefresh": "Last refresh",
  "fundingHistoryAdmin.page.nextScheduled": "Next scheduled",
  "fundingHistoryAdmin.page.backgroundTaskPrefix": "Background task:",
  "fundingHistoryAdmin.page.startedAt": "started at",
  "fundingHistoryAdmin.page.initialProjection": "The initial projection is being prepared while the perpetual universe stabilizes.",
  "fundingHistoryAdmin.page.noBackgroundTask": "No background sync is running; the main table continues to use the latest published cache.",
  "fundingHistoryAdmin.page.overview.coverageTitle": "Overall coverage progress",
  "fundingHistoryAdmin.page.overview.coverageMeta": "{{available}}/{{total}} contracts have day 1–5 cache values",
  "fundingHistoryAdmin.page.capture.title": "Capture statistics",
  "fundingHistoryAdmin.page.capture.activeWindows": "Active observation windows",
  "fundingHistoryAdmin.page.capture.officialSettlements": "Official funding settlement records written",
  "fundingHistoryAdmin.page.capture.liveSettlements": "Live-captured settlements",
  "fundingHistoryAdmin.page.capture.fallbackFinalized": "Fallback finalizations",
  "fundingHistoryAdmin.page.capture.rejectedFirstTick": "Rejected first ticks",
  "fundingHistoryAdmin.page.capture.invalidTransitions": "Rejected invalid transitions",
  "fundingHistoryAdmin.page.capture.timeouts": "Capture timeouts",
  "fundingHistoryAdmin.page.tail.title": "Tail gaps still need repair",
  "fundingHistoryAdmin.page.tail.withVenues": "{{count}} contracts have not reached full five-day coverage, concentrated in {{venues}}.",
  "fundingHistoryAdmin.page.tail.waiting": "{{count}} contracts have not reached full five-day coverage and are waiting for the next repair or exchange refresh.",
  "fundingHistoryAdmin.page.metadata.title": "Funding intervals and limits",
  "fundingHistoryAdmin.page.metadata.description": "Convergence of the interval and cap SSOT used consistently by the main table, filters, and settlement capture.",
  "fundingHistoryAdmin.page.metadata.converged60s": "Converged within 60s",
  "fundingHistoryAdmin.page.metadata.activePerpetuals": "{{fresh}}/{{total}} active perpetuals",
  "fundingHistoryAdmin.page.metadata.unknownCap": "Unknown cap",
  "fundingHistoryAdmin.page.metadata.unknownCapDescription": "Treated as unknown when no official field exists",
  "fundingHistoryAdmin.page.metadata.stale": "Stale",
  "fundingHistoryAdmin.page.metadata.staleDescription": "Past the authoritative freshness threshold",
  "fundingHistoryAdmin.page.metadata.lastRefresh": "Last refresh",
  "fundingHistoryAdmin.page.metadata.next": "Next",
  "fundingHistoryAdmin.page.metadata.venueStatus": "Exchange convergence",
  "fundingHistoryAdmin.page.metadata.allFresh": "All fresh",
  "fundingHistoryAdmin.page.metadata.staleCount": "{{count}} stale",
  "fundingHistoryAdmin.page.metadata.emptyVenuesTitle": "No exchange convergence data",
  "fundingHistoryAdmin.page.metadata.emptyVenuesDescription": "The metadata summary is ready, but no exchange details are available.",
  "fundingHistoryAdmin.page.metadata.tableAria": "Funding-history metadata exchange convergence",
  "fundingHistoryAdmin.page.metadata.lastRefreshError": "Latest refresh error",
  "fundingHistoryAdmin.page.table.venue": "Exchange",
  "fundingHistoryAdmin.page.table.active": "Active",
  "fundingHistoryAdmin.page.table.converged": "Converged",
  "fundingHistoryAdmin.page.table.stale": "Stale",
  "fundingHistoryAdmin.page.table.unknownCap": "Unknown cap",
  "fundingHistoryAdmin.page.table.duration": "Duration",
  "fundingHistoryAdmin.page.table.activeTarget": "Active / target",
  "fundingHistoryAdmin.page.table.qualitySummary": "Healthy / new / stale / missing / archived",
  "fundingHistoryAdmin.page.table.lastCompleted": "Last completed",
  "fundingHistoryAdmin.page.table.actions": "Actions",
  "fundingHistoryAdmin.page.mismatch.title": "Recent mismatch samples",
  "fundingHistoryAdmin.page.mismatch.emptyTitle": "No mismatch samples",
  "fundingHistoryAdmin.page.mismatch.emptyDescription": "System and official values agree in the latest samples.",
  "fundingHistoryAdmin.page.mismatch.interval": "Interval",
  "fundingHistoryAdmin.page.mismatch.cap": "Cap",
  "fundingHistoryAdmin.page.mismatch.official": "Official",
  "fundingHistoryAdmin.page.mismatch.system": "System",
  "fundingHistoryAdmin.page.mismatch.verifiedAt": "Verified at",
  "fundingHistoryAdmin.page.venues.title": "Exchange status",
  "fundingHistoryAdmin.page.venues.description": "Review collection status, coverage, incomplete contracts and latest completion by exchange.",
  "fundingHistoryAdmin.page.venues.emptyTitle": "No exchange coverage data",
  "fundingHistoryAdmin.page.venues.emptyDescription": "The funding-history summary is ready, but no exchange status is available.",
  "fundingHistoryAdmin.page.venues.tableAria": "Funding-history exchange status and coverage",
  "fundingHistoryAdmin.page.venues.coverageAria": "Day {{day}} coverage {{ratio}}, {{quality}}",
  "fundingHistoryAdmin.page.actions.busy": "Another funding-history action is running. Wait for it to finish.",
  "fundingHistoryAdmin.page.actions.syncBusy": "Funding-history sync is running. Wait for the current sync to finish.",
  "fundingHistoryAdmin.page.actions.venueRefreshStarted": "Exchange refresh started for {{venue}}.",
  "fundingHistoryAdmin.page.actions.refreshingVenue": "Refreshing…",
  "fundingHistoryAdmin.page.actions.refreshVenue": "Refresh exchange",
  "fundingHistoryAdmin.page.actions.title": "Common actions",
  "fundingHistoryAdmin.page.actions.description": "Each button maps directly to a backend action; progress and the latest publish result appear here.",
  "fundingHistoryAdmin.page.actions.currentlyRunning": "Currently running",
  "fundingHistoryAdmin.page.actions.latestResult": "Latest result",
  "fundingHistoryAdmin.page.actions.currentStatus": "Current status",
  "fundingHistoryAdmin.page.actions.lastCompleted": "Last completed: {{action}}",
  "fundingHistoryAdmin.page.actions.noManualRun": "No manual run has been recorded; the system continues on its configured schedule.",
  "fundingHistoryAdmin.page.actions.running": "Running",
  "fundingHistoryAdmin.page.actions.runningEllipsis": "Running…",
  "fundingHistoryAdmin.page.actions.venueProgress": "Exchange progress {{completed}}/{{total}}",
  "fundingHistoryAdmin.page.actions.contractProgress": "Contract progress {{completed}}/{{total}}",
  "fundingHistoryAdmin.page.actions.lastPublish": "Latest publish",
  "fundingHistoryAdmin.page.actions.lastImpact": "Latest impact",
  "fundingHistoryAdmin.page.actions.noopPublish": "This publish was unchanged",
  "fundingHistoryAdmin.page.actions.latestSummary": "Latest summary result",
  "fundingHistoryAdmin.page.gaps.title": "Priority gaps",
  "fundingHistoryAdmin.page.gaps.sampleCount": "{{loaded}}/{{total}} samples",
  "fundingHistoryAdmin.page.gaps.emptyTitle": "No significant coverage gaps",
  "fundingHistoryAdmin.page.gaps.emptyDescription": "The loaded samples contain no coverage gaps that need priority treatment.",
  "fundingHistoryAdmin.page.gaps.coverage5d": "5-day coverage",
  "fundingHistoryAdmin.page.gaps.hiddenCount": "{{count}} more gaps are not expanded in this sample.",
  "fundingHistoryAdmin.page.gaps.distribution": "Gap distribution",
  "fundingHistoryAdmin.page.gaps.lowestCoverage": "Lowest coverage",
  "fundingHistoryAdmin.page.heatmap.title": "Heatmap guide",
  "fundingHistoryAdmin.page.heatmap.weak": "Low",
  "fundingHistoryAdmin.page.heatmap.strong": "High",
  "fundingHistoryAdmin.page.heatmap.aria": "Coverage colors from none, low, and medium to full coverage",
  "fundingHistoryAdmin.page.heatmap.description": "D1–D5 directly show each exchange's coverage across one- to five-day windows.",
  "fundingHistoryAdmin.page.limitationsPrefix": "Public API boundary:",
  "fundingHistoryAdmin.page.controls.title": "Parameters and actions",
  "fundingHistoryAdmin.page.controls.configTitle": "Configuration",
  "fundingHistoryAdmin.page.controls.advanced": "Advanced parameters",
  "fundingHistoryAdmin.page.controls.itemCount": "{{count}} items",
  "fundingHistoryAdmin.page.controls.savingReason": "Funding-history parameters are being saved.",
  "fundingHistoryAdmin.page.controls.save": "Save parameters",
  "fundingHistoryAdmin.page.activity.title": "Activity",
  "fundingHistoryAdmin.page.activity.emptyTitle": "No activity",
  "fundingHistoryAdmin.page.activity.emptyDescription": "Funding-history refresh activity will appear here.",
  "fundingHistoryAdmin.page.activity.aria": "Funding-history activity",
  "fundingHistoryAdmin.page.activity.venue": "Exchange:",
  "fundingHistoryAdmin.page.activity.contract": "Contract:",
  "fundingHistoryAdmin.page.frame.title": "Funding history",
  "fundingHistoryAdmin.page.frame.description": "Manage historical funding collection, operation and coverage.",
  "fundingHistoryAdmin.page.frame.overviewTitle": "Overview",
  "fundingHistoryAdmin.page.frame.overviewDescription": "Review historical funding operation, data coverage and latest completion.",
  "fundingHistoryAdmin.page.frame.runtimeTitle": "Collection runtime",
  "historyCurve.intervals.1m": "1 minute",
  "historyCurve.intervals.5m": "5 minutes",
  "historyCurve.intervals.15m": "15 minutes",
  "historyCurve.intervals.30m": "30 minutes",
  "historyCurve.intervals.1h": "1 hour",
  "historyCurve.intervals.4h": "4 hours",
  "historyCurve.intervals.1d": "1 day",
  "historyCurve.intervalsShort.1m": "1m",
  "historyCurve.intervalsShort.5m": "5m",
  "historyCurve.intervalsShort.15m": "15m",
  "historyCurve.intervalsShort.30m": "30m",
  "historyCurve.intervalsShort.1h": "1h",
  "historyCurve.intervalsShort.4h": "4h",
  "historyCurve.intervalsShort.1d": "1d",
  "historyCurve.ranges.1h": "Past hour",
  "historyCurve.ranges.6h": "Past 6 hours",
  "historyCurve.ranges.24h": "Past 24 hours",
  "historyCurve.ranges.7d": "Past 7 days",
  "historyCurve.ranges.14d": "Past 14 days",
  "historyCurve.ranges.30d": "Past 30 days",
  "historyCurve.fundingMetric": "8H-equivalent net funding",
  "historyCurve.fundingMetricShort": "$t(zml:zml.metric.net_funding_8h_pct.short)",
  "historyCurve.window.daysHours": "{{days}}d {{hours}}h",
  "historyCurve.window.days": "{{count}}d",
  "historyCurve.window.hoursMinutes": "{{hours}}h {{minutes}}m",
  "historyCurve.window.hours": "{{count}}h",
  "historyCurve.window.minutes": "{{count}}m",
  "historyCurve.window.seconds": "{{count}}s",
  "historyCurve.search.failed": "History combinations could not be searched.",
  "historyCurve.search.noUpdatedAt": "No recent update",
  "historyCurve.search.searching": "Searching history combinations…",
  "historyCurve.search.matchCount": "{{count}} matching combinations",
  "historyCurve.search.matchCountTruncated": "Showing the first {{count}} matching combinations",
  "historyCurve.search.hint": "Search by asset, exchange, or contract.",
  "historyCurve.search.loadingSelection": "Loading selected combination…",
  "historyCurve.search.aria": "Search history combinations",
  "historyCurve.search.placeholder": "Asset, exchange, or contract",
  "historyCurve.search.disabledLoading": "A search is already in progress.",
  "historyCurve.search.disabledEmpty": "Enter a keyword first.",
  "historyCurve.search.searchingAria": "Searching history combinations",
  "historyCurve.search.submitAria": "Search history combinations",
  "historyCurve.search.sortLabel": "Sort",
  "historyCurve.search.sortAria": "History search sort order",
  "historyCurve.search.empty": "No saved history matches “{{keyword}}”.",
  "historyCurve.search.resultsAria": "History search results",
  "historyCurve.search.latest": "Latest {{time}}",
  "historyCurve.search.points": "{{count}} points",
  "historyCurve.search.sort.balanced": "Best match",
  "historyCurve.search.sort.recent": "Most recent",
  "historyCurve.search.sort.history": "Most history",
  "historyCurve.controls.intervalAria": "History granularity",
  "historyCurve.controls.intervalLabel": "Interval",
  "historyCurve.controls.rangeAria": "History time range",
  "historyCurve.controls.rangeLabel": "Range",
  "historyCurve.errors.pointLimit": "{{interval}} would return {{count}} points, above the current query limit. Choose a shorter range or coarser interval.",
  "historyCurve.errors.batchLimit": "This range needs more than {{count}} requests. Choose a shorter range or coarser interval.",
  "historyCurve.errors.capabilitiesInvalid": "History-chart settings are temporarily unavailable. Reload and try again.",
  "historyCurve.errors.overviewFailed": "History coverage could not be loaded.",
  "historyCurve.errors.timeseriesFailed": "History points could not be loaded.",
  "historyCurve.recording.unknown": "Unknown",
  "historyCurve.recording.active": "Recording",
  "historyCurve.recording.stopped": "Recording stopped",
  "historyCurve.actions.refreshDisabled": "Select a combination before refreshing.",
  "historyCurve.actions.auto": "Auto",
  "historyCurve.actions.refreshAria": "Refresh history",
  "historyCurve.actions.retrying": "Retrying…",
  "historyCurve.actions.retryOverview": "Retry overview",
  "historyCurve.alerts.recordingStoppedTitle": "New history is not being recorded",
  "historyCurve.alerts.recordingStoppedDescription": "Saved history remains available, but no new points or higher-interval rollups are being written.",
  "historyCurve.alerts.overviewFailedTitle": "History coverage is unavailable",
  "historyCurve.alerts.refreshFailedTitle": "History refresh failed",
  "historyCurve.alerts.rangeOutsideTitle": "Part of this range is outside saved history",
  "historyCurve.alerts.rangeOutsideDescription": "Available coverage: {{coverage}}. The chart shows only the overlapping portion.",
  "historyCurve.states.loading": "Loading history curve…",
  "historyCurve.states.loadFailed": "History curve unavailable",
  "historyCurve.states.selectCombination": "Select a combination",
  "historyCurve.states.noCombination": "No history combination selected",
  "historyCurve.states.selectCombinationDescription": "Search for an asset or contract to inspect its saved spread and funding history.",
  "historyCurve.states.noCombinationDescription": "Choose a combination from the monitor before opening its history curve.",
  "historyCurve.states.empty": "No history points in this view",
  "historyCurve.states.rangeMissesCoverage": "This range does not overlap saved history. Available coverage: {{coverage}}.",
  "historyCurve.states.intervalNotReady": "{{interval}} rollups are not available for this combination yet. Try a finer interval.",
  "historyCurve.states.emptyDescription": "No saved points match the selected combination, interval, and range.",
  "historyCurve.details.more": "Curve details",
  "historyCurve.details.targetTitle": "Combination",
  "historyCurve.details.baseAsset": "Base asset",
  "historyCurve.details.combination": "Route",
  "historyCurve.details.firstBucket": "First saved bucket",
  "historyCurve.details.lastBucket": "Latest saved bucket",
  "historyCurve.details.requestedRange": "Requested range",
  "historyCurve.details.actualRange": "Rendered range",
  "historyCurve.details.pointLimit": "Query point limit",
  "historyCurve.details.openRange": "Visible open-spread range",
  "historyCurve.details.recordingStatus": "Recording status",
  "historyCurve.details.dataModel": "Data model",
  "historyCurve.details.dataModelValue": "1m source buckets with derived higher-interval rollups",
  "historyCurve.admin.title": "Historical charts",
  "historyCurve.admin.description": "Inspect saved curves and runtime health, manage retention, and preview maintenance before changing data.",
  "historyCurve.admin.intervalCatalog.loading": "Loading system history intervals…",
  "historyCurve.admin.intervalCatalog.empty": "The system returned no manageable history intervals.",
  "historyCurve.admin.intervalCatalog.invalid": "The system history-interval configuration is invalid.",
  "historyCurve.admin.intervalCatalog.loadFailed": "System history intervals could not be loaded.",
  "historyCurve.admin.intervalCatalog.loadFailedWithStatus": "System history intervals could not be loaded (HTTP {{status}}).",
  "historyCurve.admin.viewerLoading": "Loading the history workspace…",
  "historyCurve.admin.viewerErrorTitle": "History workspace unavailable",
  "historyCurve.admin.configLoading": "Loading history configuration…",
  "historyCurve.admin.configLoadFailed": "History configuration unavailable",
  "historyCurve.admin.common.yes": "Yes",
  "historyCurve.admin.common.no": "No",
  "historyCurve.admin.status.recording": "Recording",
  "historyCurve.admin.status.recordingStopped": "Recording stopped",
  "historyCurve.admin.status.recoveringRollups": "Repairing rollups",
  "historyCurve.admin.status.degraded": "Degraded",
  "historyCurve.admin.status.unavailable": "Unavailable",
  "historyCurve.admin.status.unknown": "Unknown",
  "historyCurve.admin.status.notLoaded": "History status has not loaded yet.",
  "historyCurve.admin.status.readable": "Readable",
  "historyCurve.admin.status.notReadable": "Not readable",
  "historyCurve.admin.status.storeUnknown": "History-store status unknown",
  "historyCurve.admin.status.storeOnline": "History store online",
  "historyCurve.admin.status.storeUnavailable": "History store unavailable",
  "historyCurve.admin.status.repairing": "Repairing",
  "historyCurve.admin.status.idle": "Idle",
  "historyCurve.admin.status.enabled": "Enabled",
  "historyCurve.admin.status.disabled": "Disabled",
  "historyCurve.admin.reason.recordingStopped": "New history is stopped; saved data remains readable.",
  "historyCurve.admin.reason.startupRollupRepair": "Higher intervals are being rebuilt from 1-minute data after startup.",
  "historyCurve.admin.reason.clickhouseUnavailable": "The history store is currently unavailable.",
  "historyCurve.admin.reason.spread1mMissing": "The 1-minute source is missing, so a complete history curve cannot be formed.",
  "historyCurve.admin.reason.spread5mMissing": "The 5-minute rollup is warming up or has a gap.",
  "historyCurve.admin.reason.spread15mMissing": "The 15-minute rollup is warming up or has a gap.",
  "historyCurve.admin.reason.spread30mMissing": "The 30-minute rollup is warming up or has a gap.",
  "historyCurve.admin.reason.spread1hMissing": "The 1-hour rollup is warming up or has a gap.",
  "historyCurve.admin.reason.spread1dMissing": "The 1-day rollup is warming up or has a gap.",
  "historyCurve.admin.reason.recording": "New history points are being recorded continuously.",
  "historyCurve.admin.reason.degraded": "The history pipeline is degraded. Check the latest write and rollup status.",
  "historyCurve.admin.reason.unavailable": "History curves are not currently readable.",
  "historyCurve.admin.reason.unknown": "The history pipeline reported an unrecognized status. Check that the frontend and backend versions match.",
  "historyCurve.admin.errors.loadConfig": "History configuration could not be loaded.",
  "historyCurve.admin.errors.toggleRecording": "The recording state could not be changed.",
  "historyCurve.admin.errors.saveConfig": "History configuration could not be saved.",
  "historyCurve.admin.errors.invalidConfig": "Use whole-number retention days from {{minRetention}} to {{maxRetention}}, and a whole-number query limit from {{minPoints}} to {{maxPoints}}.",
  "historyCurve.admin.errors.previewMaintenance": "The maintenance preview could not be generated.",
  "historyCurve.admin.errors.maintenance": "The history maintenance action failed.",
  "historyCurve.admin.errors.selectInterval": "Select at least one interval to clean.",
  "historyCurve.admin.errors.ambiguousTime": "This time is invalid, missing or repeated in the selected time zone. Choose a different time.",
  "historyCurve.admin.errors.previewCleanup": "The cleanup preview could not be generated.",
  "historyCurve.admin.errors.cleanup": "History cleanup failed.",
  "historyCurve.admin.feedback.recordingUpdatedTitle": "Recording state updated",
  "historyCurve.admin.feedback.recordingEnabled": "History recording is enabled and new writes and rollups have resumed.",
  "historyCurve.admin.feedback.recordingDisabled": "History recording is disabled. New writes and rollups stop, while saved history remains readable.",
  "historyCurve.admin.feedback.recordingFailedTitle": "Recording state update failed",
  "historyCurve.admin.feedback.recordingConflict": "Another user updated the configuration. The authoritative baseline is refreshed; review the current selection and save again.",
  "historyCurve.admin.feedback.configSavedTitle": "Configuration synchronized",
  "historyCurve.admin.feedback.configSaved": "History configuration is saved and active.",
  "historyCurve.admin.feedback.configFailedTitle": "Configuration save failed",
  "historyCurve.admin.feedback.configConflict": "Another user updated the configuration. The authoritative baseline is refreshed and your local draft is retained; review it and save again.",
  "historyCurve.admin.feedback.previewFailedTitle": "Preview failed",
  "historyCurve.admin.feedback.maintenanceDoneTitle": "Maintenance complete",
  "historyCurve.admin.feedback.maintenanceDone": "The maintenance action completed successfully.",
  "historyCurve.admin.feedback.maintenanceFailedTitle": "Maintenance failed",
  "historyCurve.admin.feedback.cleanupPreviewTitle": "Preview updated",
  "historyCurve.admin.feedback.cleanupPreviewUpdated": "The history cleanup preview is up to date.",
  "historyCurve.admin.feedback.cleanupPreviewFailedTitle": "Cleanup preview failed",
  "historyCurve.admin.feedback.cleanupDoneTitle": "Range cleanup complete",
  "historyCurve.admin.feedback.cleanupDone": "History cleanup completed; approximately {{count}} rows were deleted.",
  "historyCurve.admin.feedback.cleanupFailedTitle": "Range cleanup failed",
  "historyCurve.admin.alerts.refreshFailed": "History status refresh failed",
  "historyCurve.admin.alerts.prefsFailed": "Curve preferences could not be saved",
  "historyCurve.admin.metrics.metadata": "Metadata",
  "historyCurve.admin.disabledReasons.updatingRecording": "The recording state is being updated. Editing will resume when it finishes.",
  "historyCurve.admin.disabledReasons.saving": "History settings are being saved. Editing will resume when it finishes.",
  "historyCurve.admin.disabledReasons.refreshing": "History settings are being refreshed. Editing will resume when it finishes.",
  "historyCurve.admin.disabledReasons.maintenanceRunning": "A history maintenance action is running. Editing will resume when it finishes.",
  "historyCurve.admin.disabledReasons.unsaved": "Save or reset the unsaved history parameters first.",
  "historyCurve.admin.disabledReasons.toggleNotLoaded": "History parameters have not loaded, so recording cannot be changed yet.",
  "historyCurve.admin.disabledReasons.noChanges": "There are no unsaved changes.",
  "historyCurve.admin.disabledReasons.nothingToReset": "There are no unsaved changes to reset.",
  "historyCurve.admin.disabledReasons.savingMaintenance": "History settings are being saved; maintenance is temporarily unavailable.",
  "historyCurve.admin.disabledReasons.refreshingMaintenance": "History settings are being refreshed; maintenance is temporarily unavailable.",
  "historyCurve.admin.disabledReasons.maintenanceBusy": "A maintenance action is already running.",
  "historyCurve.admin.disabledReasons.searchBusy": "A cleanup-target search is already running.",
  "historyCurve.admin.disabledReasons.previewFirst": "Preview the cleanup impact before executing it.",
  "historyCurve.admin.configStatus.updating": "Updating",
  "historyCurve.admin.configStatus.saving": "Saving",
  "historyCurve.admin.configStatus.refreshing": "Refreshing",
  "historyCurve.admin.configStatus.failed": "Failed",
  "historyCurve.admin.configStatus.unsaved": "Unsaved",
  "historyCurve.admin.configStatus.synced": "Synced",
  "historyCurve.admin.dataStatus.title": "Data health",
  "historyCurve.admin.dataStatus.description": "Review recording, query availability, coverage and the latest write.",
  "historyCurve.admin.dataStatus.runtime": "Runtime",
  "historyCurve.admin.dataStatus.currentRecording": "Recording",
  "historyCurve.admin.dataStatus.currentReadable": "Read access",
  "historyCurve.admin.dataStatus.startupRepair": "Startup repair",
  "historyCurve.admin.dataStatus.coverage": "Coverage",
  "historyCurve.admin.dataStatus.queryLimit": "Query point limit",
  "historyCurve.admin.dataStatus.storage": "Storage",
  "historyCurve.admin.dataStatus.totalRows": "Total rows",
  "historyCurve.admin.dataStatus.totalSpace": "Total size",
  "historyCurve.admin.dataStatus.active1mBuckets": "Active 1m buckets",
  "historyCurve.admin.dataStatus.latestWrite": "Latest write",
  "historyCurve.admin.dataStatus.latestMinuteFlush": "Latest minute flush",
  "historyCurve.admin.dataStatus.latestRollup": "Latest rollup",
  "historyCurve.admin.dataStatus.intervalCoverage": "Interval coverage",
  "historyCurve.admin.config.title": "Configuration",
  "historyCurve.admin.config.persisted": "Persisted: {{status}}",
  "historyCurve.admin.config.noteDescription": "Stopping recording does not delete or hide saved history. It only stops new writes and higher-interval rollup input.",
  "historyCurve.admin.config.updating": "Updating…",
  "historyCurve.admin.config.stopRecording": "Stop new history",
  "historyCurve.admin.config.resumeRecording": "Resume history recording",
  "historyCurve.admin.config.days": "days",
  "historyCurve.admin.config.points": "points",
  "historyCurve.admin.config.reset": "Reset",
  "historyCurve.admin.config.refreshing": "Refreshing…",
  "historyCurve.admin.config.refresh": "Refresh",
  "historyCurve.admin.config.fields.retention": "{{interval}} retention",
  "historyCurve.admin.config.fields.retentionHint": "How long to keep {{interval}} curves.",
  "historyCurve.admin.config.fields.queryLimit": "Maximum points per query",
  "historyCurve.admin.config.fields.queryLimitHint": "Limits how many history points one view can load.",
  "historyCurve.admin.maintenance.title": "Cleanup and rebuild",
  "historyCurve.admin.maintenance.rebuild": "Rebuild 5m / 15m / 30m / 1h / 4h / 1d",
  "historyCurve.admin.maintenance.clearAll": "Clear all saved history",
  "historyCurve.admin.maintenance.description": "Preview and run whole-store cleanup, multi-interval rollup rebuilds, or targeted cleanup by combination, time range, and interval.",
  "historyCurve.admin.maintenance.previewRows": "Rows affected in preview",
  "historyCurve.admin.maintenance.previewSpace": "Space released in preview",
  "historyCurve.admin.maintenance.sourceRows": "1m source rows",
  "historyCurve.admin.cleanup.title": "Targeted cleanup",
  "historyCurve.admin.cleanup.description": "Preview a combination, time range, and interval selection before deleting any saved history.",
  "historyCurve.admin.cleanup.searchAria": "Search combinations with saved history",
  "historyCurve.admin.cleanup.searchPlaceholder": "Asset or contract keyword",
  "historyCurve.admin.cleanup.searching": "Searching…",
  "historyCurve.admin.cleanup.search": "Search cleanup targets",
  "historyCurve.admin.cleanup.results": "Found {{count}} cleanup targets.",
  "historyCurve.admin.cleanup.resultsTruncated": "Found matching targets; showing the first {{count}} results.",
  "historyCurve.admin.cleanup.noResults": "No saved-history combination matches “{{keyword}}”.",
  "historyCurve.admin.cleanup.searchHint": "To clean one combination, search and select it. Keep “All combinations” for a global cleanup.",
  "historyCurve.admin.cleanup.target": "Target combination",
  "historyCurve.admin.cleanup.targetAria": "Cleanup target combination",
  "historyCurve.admin.cleanup.allCombinations": "All combinations",
  "historyCurve.admin.cleanup.targetPlaceholder": "Search, then optionally select a combination",
  "historyCurve.admin.cleanup.startTime": "Start time",
  "historyCurve.admin.cleanup.startTimeAria": "Cleanup start time",
  "historyCurve.admin.cleanup.endTime": "End time",
  "historyCurve.admin.cleanup.endTimeAria": "Cleanup end time",
  "historyCurve.admin.cleanup.intervals": "Intervals to clean",
  "historyCurve.admin.cleanup.noStartLimit": "No start-time limit",
  "historyCurve.admin.cleanup.noEndLimit": "No end-time limit",
  "historyCurve.admin.cleanup.preview": "Preview cleanup impact",
  "historyCurve.admin.cleanup.execute": "Execute targeted cleanup",
  "historyCurve.admin.cleanup.estimatedRows": "Estimated rows deleted",
  "historyCurve.admin.cleanup.estimatedSpace": "Estimated space released",
  "historyCurve.admin.cleanup.rebuildMetadata": "Rebuild metadata",
  "historyCurve.admin.cleanup.rebuildRollups": "Rebuild higher intervals",
  "historyCurve.admin.cleanup.previewTableAria": "History cleanup preview",
  "historyCurve.admin.cleanup.interval": "Interval",
  "historyCurve.admin.confirm.clearTitle": "Clear all saved history?",
  "historyCurve.admin.confirm.cleanupTitle": "Execute targeted cleanup?",
  "historyCurve.admin.confirm.rebuildTitle": "Rebuild history rollups?",
  "historyCurve.admin.confirm.clearDescription": "This permanently deletes combination metadata and every interval table. Saved history cannot be recovered.",
  "historyCurve.admin.confirm.cleanupDescription": "This permanently deletes the selected combination, range, and intervals. Including 1m automatically rebuilds metadata and higher intervals.",
  "historyCurve.admin.confirm.rebuildDescription": "This rebuilds all higher-interval rollups without deleting metadata or authoritative 1m data.",
  "historyCurve.admin.confirm.scopeTitle": "Cleanup scope",
  "historyCurve.admin.confirm.timeRange": "Time range",
  "historyCurve.admin.confirm.noneSelected": "None selected",
  "historyCurve.admin.confirm.affectedRows": "Estimated rows affected",
  "historyCurve.admin.confirm.previewDeleteRows": "Rows deleted in preview",
  "historyCurve.admin.confirm.rebuildableRows": "Current rebuildable rows",
  "historyCurve.admin.confirm.estimatedSpace": "Estimated space released",
  "historyCurve.admin.confirm.previewSpace": "Space released in preview",
  "historyCurve.admin.confirm.sourceRows": "Authoritative 1m rows",
  "historyCurve.admin.confirm.clear": "Clear history",
  "historyCurve.admin.confirm.execute": "Execute cleanup",
  "historyCurve.admin.confirm.rebuild": "Rebuild rollups",
  "historyCurve.chart.title": "History curve",
  "historyCurve.chart.description": "Open spread · {{funding}} · Close spread",
  "historyCurve.chart.summaryEmpty": "No history points are currently rendered.",
  "historyCurve.chart.summary": "<count>{{count}}</count> points from <start>{{start}}</start> to <end>{{end}}</end>. Latest: open <open>{{open}}</open>, {{fundingLabel}} <funding>{{funding}}</funding>, close <close>{{close}}</close>.",
  "historyCurve.chart.toolbarAria": "History curve window controls",
  "historyCurve.chart.switching": "Switching…",
  "historyCurve.chart.refreshing": "Refreshing…",
  "historyCurve.chart.legendAria": "History curve legend and latest values",
  "historyCurve.chart.open": "$t(zml:zml.metric.bbo_executable_open_spread_pct)",
  "historyCurve.chart.close": "$t(zml:zml.metric.bbo_executable_close_spread_pct)",
  "historyCurve.chart.chartAria": "History spread and funding line chart",
  "historyCurve.chart.renderFailedTitle": "History curve could not be drawn",
  "historyCurve.chart.renderFailed": "The chart is temporarily unavailable.",
  "historyCurve.chart.dataTable.label": "History curve data",
  "historyCurve.chart.dataTable.time": "Time",
  "historyCurve.chart.dataTable.openSpread": "Open spread",
  "historyCurve.chart.dataTable.closeSpread": "Close spread",
  "historyCurve.chart.dataTable.longFunding": "Long-leg funding rate",
  "historyCurve.chart.dataTable.longCap": "Long-leg funding rate cap",
  "historyCurve.chart.dataTable.longInterval": "Long-leg funding interval",
  "historyCurve.chart.dataTable.shortFunding": "Short-leg funding rate",
  "historyCurve.chart.dataTable.shortCap": "Short-leg funding rate cap",
  "historyCurve.chart.dataTable.shortInterval": "Short-leg funding interval",
  "historyCurve.chart.peak.highestOpen": "Highest open spread",
  "historyCurve.chart.peak.lowestClose": "Lowest close spread",
  "historyCurve.chart.zoom.unavailable": "Load history data before zooming the chart.",
  "historyCurve.chart.zoom.resetUnavailable": "Load history data before resetting the chart window.",
  "historyCurve.chart.zoom.in": "Zoom in on the history curve",
  "historyCurve.chart.zoom.out": "Zoom out of the history curve",
  "historyCurve.chart.zoom.reset": "Reset the history curve window",
  "historyCurve.chart.tooltip.long": "Long",
  "historyCurve.chart.tooltip.short": "Short",
  "historyCurve.chart.tooltip.cap": "Cap",
  "historyCurve.chart.tooltip.interval": "Interval",
  "management.documentTitle": "Admin · ZML Monitor",
  "management.state.unavailable": "Temporarily unavailable",
  "management.state.unavailableMessage": "The “{{title}}” module could not be loaded or rendered. Try again.",
  "management.state.retry": "Retry",
  "management.state.loading": "Loading “{{title}}”…",
  "management.state.loadingModule": "Loading administration module…",
  "management.state.permissionTitle": "Management access unavailable",
  "management.state.permissionMessage": "This account cannot access the management center. Return to Monitor to continue with authorized features.",
  "management.nav.ariaLabel": "Admin navigation",
  "management.nav.fallback": "Admin",
  "management.nav.groups.users": "User management",
  "management.nav.groups.billing": "Commerce & billing",
  "management.nav.groups.settings": "Core settings",
  "management.nav.groups.system": "System operations",
  "management.nav.groups.metrics": "Funding linkage",
  "management.nav.groups.coin": "Asset services",
  "management.nav.groups.news": "News services",
  "management.nav.groups.security": "Security",
  "management.nav.items.pricing": "Pricing & payments",
  "management.nav.items.orders": "Orders & receipts",
  "management.nav.items.signin": "Sign-in methods",
  "management.nav.items.audit": "Audit log",
  "management.nav.items.pairs": "Trading pairs",
  "management.nav.items.exchanges": "Exchanges",
  "management.nav.items.fundingHistory": "Funding history",
  "management.nav.items.historyCurves": "Historical charts",
  "management.nav.items.credentials": "API credentials",
  "management.nav.items.overview": "System overview",
  "management.nav.items.egress": "Network egress",
  "management.nav.items.ingest": "Market data ingestion",
  "management.nav.items.compute": "Real-time compute",
  "management.nav.items.publish": "Query publishing",
  "management.nav.items.linkage": "Funding linkage",
  "management.nav.items.catalog": "Asset catalog",
  "management.nav.items.datasource": "CMC data source",
  "management.nav.items.collection": "Collection",
  "management.nav.items.sourceHealth": "Source health",
  "management.nav.items.translation": "Translation",
  "management.nav.items.announcementPolicy": "Delisting alerts",
  "management.nav.items.history": "Sign-in history",
  "management.nav.items.ip": "IP controls",
  "management.nav.items.session": "Session policy",
  "management.policyApplication.status.applied": "Applied",
  "management.policyApplication.status.pending": "Pending",
  "management.policyApplication.status.failed": "Failed",
  "management.policyApplication.effect.immediate": "Effective immediately",
  "management.policyApplication.effect.next-session": "Effective for the next session",
  "management.policyApplication.effect.controlled-reconnect": "Effective after controlled reconnect",
  "management.policyApplication.effect.restart-required": "Effective after restart",
  "management.policyApplication.revisions": "Persisted r{{persisted}} · runtime r{{applied}}",
  "management.policyApplication.restartRequired": "Restart required",
  "management.security.description": "Manage system-wide sign-in, sessions, network access, and security audit controls.",
  "management.security.descriptions.signin": "Configure system-wide sign-in methods, self-service sign-up, and Google OAuth.",
  "management.security.descriptions.session": "Set session lifetime and failed sign-in lockout policy for every account.",
  "management.security.descriptions.ip": "Manage system-wide IP allow and deny rules for sign-in, APIs, and realtime connections.",
  "management.security.descriptions.history": "Inspect sign-in results, source IPs, device context, and failure reasons across all accounts.",
  "management.security.descriptions.audit": "Trace administrator changes to accounts, commerce, and system security policies.",
  "management.audit.loading": "Loading administrator audit events…",
  "management.audit.loadFailed": "Administrator audit events could not be loaded.",
  "management.audit.unavailable": "Administrator audit unavailable",
  "management.audit.empty": "No audit events",
  "management.audit.emptyHint": "Administrator changes to accounts, commerce, and system security policies appear here.",
  "management.audit.stale": "{{error}} (showing the last successfully loaded result)",
  "management.audit.moreChanges": "…{{count}} more changes",
  "management.audit.notePrefix": "Note: {{note}}",
  "management.audit.pagination.aria": "Administrator audit pagination",
  "management.audit.pagination.status": "Page {{page}}/{{pageCount}} · {{start}}–{{end}}/{{total}}",
  "management.audit.pagination.emptyPage": "This page no longer has records. Returning to the last valid page; you can also use the pagination below to go back.",
  "management.audit.table.aria": "Administrator audit",
  "management.audit.table.time": "Time",
  "management.audit.table.action": "Action",
  "management.audit.table.target": "Target",
  "management.audit.table.changes": "Changes",
  "management.audit.table.actor": "Actor",
  "management.audit.actions.userCreate": "Create account",
  "management.audit.actions.userUpdate": "Update account",
  "management.audit.actions.userDelete": "Delete account",
  "management.audit.actions.userResetPassword": "Reset account password",
  "management.audit.actions.userDeviceRevoke": "Revoke account device",
  "management.audit.actions.userSessionsInvalidateAll": "Invalidate account sessions",
  "management.audit.actions.accountGoogleLink": "Link Google account",
  "management.audit.actions.accountGoogleUnlink": "Unlink Google account",
  "management.audit.actions.billingConfig": "Update pricing",
  "management.audit.actions.billingReceiving": "Update receiving",
  "management.audit.actions.billingSettle": "Manual settlement",
  "management.audit.actions.sessionPolicyUpdate": "Update session policy",
  "management.audit.actions.ipPolicyUpdate": "Update IP policy",
  "management.audit.actions.ipRuleCreate": "Create IP rule",
  "management.audit.actions.ipRuleDelete": "Delete IP rule",
  "management.audit.actions.sessionsInvalidateAll": "Invalidate all system sessions",
  "management.audit.actions.registrationPolicy": "Update sign-up policy",
  "management.audit.actions.googleConfigUpdate": "Update Google sign-in",
  "management.audit.fields.username": "Account ID",
  "management.audit.fields.email": "Email",
  "management.audit.fields.role": "Role",
  "management.audit.fields.status": "Account status",
  "management.audit.fields.plan": "Commercial plan",
  "management.audit.fields.planExpiresAt": "Plan expiry",
  "management.audit.fields.locale": "Interface language",
  "management.audit.fields.tierId": "Subscription tier",
  "management.audit.fields.createdAt": "Created at",
  "management.audit.fields.registrationSource": "Registration source",
  "management.audit.fields.googleLinkedAt": "Google linked at",
  "management.audit.fields.googleLinked": "Google link status",
  "management.audit.fields.sessionRevision": "Session revision",
  "management.audit.fields.activeDevices": "Active devices",
  "management.audit.fields.affectedAccounts": "Affected accounts",
  "management.audit.fields.deviceId": "Device ID",
  "management.audit.fields.tokenTtlDays": "Sign-in lifetime (days)",
  "management.audit.fields.maxFailedAttempts": "Maximum consecutive failures",
  "management.audit.fields.lockoutDurationMinutes": "Sign-in lockout (minutes)",
  "management.audit.fields.ipWhitelistEnabled": "IP allowlist",
  "management.audit.fields.ipBlacklistEnabled": "IP denylist",
  "management.audit.fields.ipRuleKind": "IP rule type",
  "management.audit.fields.ipPattern": "IP / CIDR",
  "management.audit.fields.note": "Note",
  "management.audit.fields.config": "Google configuration",
  "management.audit.fields.clientSecretRotated": "Client Secret rotated",
  "management.audit.fields.enabled": "Enabled state",
  "management.audit.fields.clientId": "Client ID",
  "management.audit.fields.redirectUri": "Redirect URI",
  "management.audit.fields.hasClientSecret": "Client Secret stored",
  "management.audit.fields.usable": "Configuration usable",
  "management.audit.fields.openRegistration": "Self-service sign-up",
  "management.audit.fields.monthlyPriceUsdt": "Monthly price (USDT)",
  "management.audit.fields.orderTtlMinutes": "Order lifetime (minutes)",
  "management.audit.fields.salesEnabled": "Sales open",
  "management.audit.fields.enforceEntitlement": "Entitlement enforcement",
  "management.audit.fields.maxDevices": "Maximum devices",
  "management.audit.fields.tiers": "Subscription tiers",
  "management.audit.fields.trc20Address": "TRC20 receiving address",
  "management.audit.fields.usdtContract": "USDT contract address",
  "management.audit.fields.pollIntervalSecs": "Receipt polling interval (seconds)",
  "management.audit.fields.userId": "Account UUID",
  "management.audit.fields.months": "Subscription months",
  "management.audit.fields.baseAmountUsdt": "Base amount (USDT)",
  "management.audit.fields.amountUsdt": "Paid amount (USDT)",
  "management.audit.fields.amountMicro": "Exact amount (micro USDT)",
  "management.audit.fields.amountSuffix": "Order identification suffix",
  "management.audit.fields.receivingAddress": "Receiving address",
  "management.audit.fields.expiresAt": "Expires at",
  "management.audit.fields.settledAt": "Settled at",
  "management.audit.values.admin": "Administrator",
  "management.audit.values.member": "Member",
  "management.audit.values.active": "Active",
  "management.audit.values.accountDisabled": "Disabled",
  "management.audit.values.free": "Free",
  "management.audit.values.paid": "Subscription",
  "management.audit.values.orderPaid": "Paid",
  "management.audit.values.lifetime": "Lifetime access",
  "management.audit.values.allow": "Allow",
  "management.audit.values.deny": "Deny",
  "management.audit.values.google": "Google self-service sign-up",
  "management.audit.values.adminCreated": "Administrator-created",
  "management.audit.values.bootstrap": "Bootstrap account",
  "management.audit.values.pending": "Pending",
  "management.audit.values.expired": "Expired",
  "management.audit.values.cancelled": "Cancelled",
  "management.audit.values.zhCN": "Chinese",
  "management.audit.values.en": "English",
  "management.audit.values.enabled": "Enabled",
  "management.audit.values.notEnabled": "Not enabled",
  "management.audit.values.linked": "Linked",
  "management.audit.values.unlinked": "Not linked",
  "management.audit.values.itemCount": "{{count}} items",
  "management.audit.notes.accountDeleted": "Account and its owned data were deleted",
  "management.audit.notes.passwordReset": "An administrator reset the account password",
  "management.audit.notes.sessionsInvalidated": "An administrator invalidated every account session",
  "management.audit.notes.deviceRevoked": "An administrator revoked this device session",
  "management.audit.notes.registrationPolicy": "Google is the only self-service sign-up entry point",
  "management.audit.notes.secretExcluded": "Secret plaintext is intentionally excluded from the audit record",
  "management.audit.notes.passwordReauthenticated": "The current password was reauthenticated before this action",
  "management.audit.notes.appliesImmediately": "Applies to every account immediately without a restart",
  "management.audit.notes.globalAccessRule": "System-wide network access rule",
  "management.audit.notes.apiKeyExcluded": "API Key plaintext is intentionally excluded from the audit record",
  "management.audit.notes.manualReconciliation": "Administrator manual reconciliation",
  "management.session.loading": "Loading session policy…",
  "management.session.loadFailedTitle": "Session policy unavailable",
  "management.session.toolbarAria": "Session policy draft",
  "management.session.save": "Save policy",
  "management.session.reset": "Reset",
  "management.session.units.days": "days",
  "management.session.units.times": "attempts",
  "management.session.units.minutes": "minutes",
  "management.session.ttl.title": "Sign-in lifetime",
  "management.session.ttl.description": "Controls how many days every account can remain signed in from session issuance. The default is 7 days.",
  "management.session.ttl.daysLabel": "Valid for",
  "management.session.ttl.inputAria": "Sign-in lifetime in days",
  "management.session.ttl.rangeLabel": "Range: {{min}}–{{max}} days",
  "management.session.ttl.sliderAria": "Adjust the sign-in lifetime",
  "management.session.ttl.realtimeHint": "Applies to existing and new sessions when saved. Existing expiry times will not be extended.",
  "management.session.devices.title": "Concurrent devices",
  "management.session.devices.allowanceLabel": "Concurrent device allowance",
  "management.session.devices.allowanceHint": "Set by the account's plan, not by security policy — each tier carries its own allowance, so the number is not duplicated here.",
  "management.session.devices.allowanceAction": "Open pricing",
  "management.session.protection.title": "Brute-force protection",
  "management.session.protection.maxFailures": "Maximum consecutive failures",
  "management.session.protection.maxFailuresAria": "Maximum consecutive sign-in failures",
  "management.session.protection.lockout": "Lockout duration",
  "management.session.protection.lockoutAria": "Lockout duration in minutes",
  "management.session.protection.loginEventRetention": "Login activity retention",
  "management.session.protection.loginEventRetentionHint": "How far back login activity can be reviewed; expired rows are cleaned in batches.",
  "management.session.protection.loginEventRetentionAria": "Login activity retention in days",
  "management.session.protection.inMemoryNotice": "Failure counts are held in memory per source and reset when the process restarts; the sign-in successes and failures themselves remain in login activity.",
  "management.session.invalidate.action": "Invalidate all user sessions",
  "management.session.invalidate.globalTitle": "Global session response",
  "management.session.invalidate.globalHint": "Use for credential exposure or a major security incident. Handle routine account-specific actions from User management.",
  "management.session.invalidate.title": "Invalidate every session in the system",
  "management.session.invalidate.description": "This immediately revokes the signed-in state of every account, including this administrator. Everyone must sign in again.",
  "management.session.invalidate.scopeWarning": "Scope: every account, every device, and the current administrator session. This cannot be undone.",
  "management.session.invalidate.confirmationLabel": "Enter {{phrase}} to confirm",
  "management.session.invalidate.success": "Revoked sessions for {{affectedAccounts}} accounts and {{affectedDevices}} devices. Returning to sign-in.",
  "management.session.invalidate.pending": "Signing out…",
  "management.session.invalidate.confirm": "Confirm global sign-out",
  "management.session.status.saving": "Saving",
  "management.session.status.unsaved": "Unsaved",
  "management.session.status.synced": "Synced",
  "management.session.busy.invalidating": "Every device is being signed out. Wait for it to finish.",
  "management.session.busy.saving": "The session policy is being saved. Wait for it to finish.",
  "management.session.busy.noChanges": "The session policy has no changes to save.",
  "management.session.busy.nothingToReset": "The session policy has no unsaved changes.",
  "management.session.feedback.conflict": "Another administrator updated this policy. The current value has been reloaded; review it before saving again.",
  "management.session.errors.load": "The session policy could not be loaded.",
  "management.session.errors.missing": "The session policy is missing.",
  "management.session.errors.save": "The session policy could not be saved.",
  "management.session.errors.invalidate": "The devices could not be signed out.",
  "management.session.errors.invalidDraft": "Correct the invalid session policy values before saving.",
  "management.session.errors.tokenTtlDays": "The sign-in lifetime must be an integer from {{min}} to {{max}}.",
  "management.session.errors.maxFailedAttempts": "The maximum consecutive failures must be an integer from {{min}} to {{max}}.",
  "management.session.errors.lockoutDurationMinutes": "The lockout duration must be an integer from {{min}} to {{max}} minutes.",
  "management.session.errors.loginEventRetentionDays": "Login activity retention must be an integer from {{min}} to {{max}} days.",
  "management.billing.descriptions.pricing": "Configure subscription pricing, ordering, and the USDT receiving address. Private keys never reach the server.",
  "management.billing.descriptions.orders": "Track orders and on-chain receipts, and reconcile unmatched payments.",
  "management.users.description": "Manage accounts, subscription access, and sign-in security.",
  "management.users.searchAria": "Search accounts",
  "management.users.searchPlaceholder": "Account ID or email",
  "management.users.results": "{{total}} matching accounts",
  "management.users.create": "Create account",
  "management.users.pagination.aria": "Account list pagination",
  "management.users.pagination.status": "Page {{page}}/{{pageCount}} · {{start}}–{{end}}/{{total}}",
  "management.users.feedback.updated": "Updated account {{username}}",
  "management.users.feedback.updatedFields": "Updated {{username}}: {{fields}}",
  "management.users.feedback.passwordReset": "Password reset for {{username}}",
  "management.users.feedback.created": "Created account {{username}}",
  "management.users.feedback.deleted": "Deleted account {{username}}",
  "management.users.errors.listLoad": "The account list could not be loaded.",
  "management.users.errors.delete": "The account could not be deleted.",
  "management.users.errors.save": "Changes could not be saved.",
  "management.users.state.unavailable": "Account list unavailable",
  "management.users.state.loading": "Loading accounts…",
  "management.users.state.empty": "No matching accounts",
  "management.users.state.emptyHint": "Try a different search.",
  "management.users.state.stale": "{{error}} (showing the last successfully loaded result)",
  "management.users.table.aria": "Account list",
  "management.users.table.account": "Account",
  "management.users.table.email": "Email",
  "management.users.table.role": "Role",
  "management.users.table.plan": "Plan",
  "management.users.table.expiry": "Expires",
  "management.users.table.status": "Status",
  "management.users.table.createdAt": "Created",
  "management.users.table.actions": "Actions",
  "management.users.roles.admin": "Admin",
  "management.users.roles.member": "Member",
  "management.users.plans.free": "Free",
  "management.users.plans.paid": "Subscription",
  "management.users.plans.lifetime": "Lifetime access",
  "management.users.status.active": "Active",
  "management.users.status.disabled": "Disabled",
  "management.users.expiry.lifetime": "Never expires",
  "management.users.expiry.free": "Not subscribed",
  "management.users.expiry.missing": "No expiry date",
  "management.users.expiry.remaining": "{{date}} ({{count}} days left)",
  "management.users.expiry.expired": "{{date}} (expired {{count}} days ago)",
  "management.users.expiry.expiredPlan": "Expired",
  "management.users.actions.more": "More actions",
  "management.users.actions.delete": "Delete",
  "management.users.detail.loading": "Loading account details…",
  "management.users.detail.unavailable": "Account details unavailable",
  "management.users.detail.loadFailed": "Account details could not be loaded.",
  "management.users.detail.stale": "{{error}} (showing the last successfully loaded account details)",
  "management.users.detail.edit": "Edit",
  "management.users.detail.locationAria": "Account location",
  "management.users.detail.propertiesAria": "Account properties",
  "management.users.detail.openAccount": "Open account",
  "management.users.detail.sectionsAria": "Account detail sections",
  "management.users.detail.sections.account": "Account",
  "management.users.detail.sections.entitlements": "Entitlements",
  "management.users.detail.sections.security": "Security",
  "management.users.detail.sections.activity": "Activity",
  "management.users.detail.sections.audit": "Admin audit",
  "management.users.detail.account.title": "Account profile",
  "management.users.detail.account.source": "Registration source",
  "management.users.detail.sources.admin": "Created by an administrator",
  "management.users.detail.sources.google": "Google self-service sign-up",
  "management.users.detail.sources.bootstrap": "Bootstrap account",
  "management.users.detail.entitlements.title": "Account entitlements",
  "management.users.detail.entitlements.effective": "Current entitlement",
  "management.users.detail.entitlements.entitled": "Active access",
  "management.users.detail.entitlements.notEntitled": "Not entitled",
  "management.users.detail.entitlements.tier": "Subscription tier ID",
  "management.users.detail.security.passwordTitle": "Password and sign-in methods",
  "management.users.detail.security.passwordDescription": "Set a new password for this account.",
  "management.users.detail.security.selfPasswordDescription": "Open personal Sign-in & security to verify and change your current password.",
  "management.users.detail.security.resetPassword": "Reset password",
  "management.users.detail.security.openPersonalSecurity": "Open personal sign-in & security",
  "management.users.detail.security.devicesTitle": "Signed-in devices and sessions",
  "management.users.detail.security.devicesDescription": "Review and revoke the target account's devices, or invalidate every session for this account.",
  "management.users.detail.security.invalidateAll": "Invalidate all sessions",
  "management.users.detail.security.invalidateTitle": "Invalidate every session for the target account",
  "management.users.detail.security.invalidateDescription": "This action affects only the account identified below. After it completes, that account must sign in again on every device.",
  "management.users.detail.security.targetUsername": "Account ID: {{username}}",
  "management.users.detail.security.impactScope": "Impact: every current device and session for this account; all other accounts are unaffected.",
  "management.users.detail.security.invalidateConfirm": "Invalidate all sessions",
  "management.users.detail.security.invalidateSuccess": "All sessions for the target account were invalidated.",
  "management.users.detail.security.invalidateSuccessWithCount": "All sessions for the target account were invalidated (the server reported {{count}} devices).",
  "management.users.detail.security.invalidateFailed": "The target account's sessions could not be invalidated.",
  "management.users.detail.activity.title": "Sign-in activity",
  "management.users.detail.activity.description": "Shows successful and failed sign-in events for {{username}} only.",
  "management.users.detail.audit.title": "Target-account administrator audit",
  "management.users.detail.audit.description": "Shows only administrator changes and security actions targeting {{username}}.",
  "management.users.detail.audit.emptyHint": "No administrator audit events target this account yet.",
  "management.users.editor.createTitle": "Create account",
  "management.users.editor.editTitle": "Manage account · {{username}}",
  "management.users.editor.createDescription": "The account can sign in immediately. Its plan and expiry determine access.",
  "management.users.editor.editDescription": "Changes take effect immediately across all active sessions for this account.",
  "management.users.editor.usernameLabel": "Account ID",
  "management.users.editor.usernameHint": "Renaming the account does not sign it out or affect historical orders.",
  "management.users.editor.usernamePlaceholder": "Lowercase letters, numbers, or underscores",
  "management.users.editor.emailLabel": "Email",
  "management.users.editor.emailPlaceholder": "Leave blank for no email",
  "management.users.editor.initialPassword": "Initial password",
  "management.users.editor.resetPassword": "Reset password",
  "management.users.editor.confirmInitialPassword": "Confirm initial password",
  "management.users.editor.confirmResetPassword": "Confirm reset password",
  "management.users.editor.passwordMinimum": "At least {{count}} characters",
  "management.users.editor.passwordKeep": "Leave blank to keep the password",
  "management.users.editor.initialPasswordAgain": "Enter the initial password again",
  "management.users.editor.resetPasswordAgain": "Enter the new password again",
  "management.users.editor.passwordMismatch": "The passwords do not match",
  "management.users.editor.selfPasswordHint": "For your own account, open Avatar menu → Settings → Sign-in & security and verify your current password first.",
  "management.users.editor.accessTitle": "Permissions and access",
  "management.users.editor.roleLabel": "Role",
  "management.users.editor.statusLabel": "Account status",
  "management.users.editor.statusSelfDisabled": "You cannot disable the administrator account currently performing this action.",
  "management.users.editor.statusDisabledImpact": "Disabling immediately blocks access but retains sessions. Valid sessions may resume when re-enabled; invalidate all sessions for a complete sign-out.",
  "management.users.editor.statusEnabledImpact": "Valid, unrevoked sessions may resume when re-enabled. Confirm that the devices are still trusted.",
  "management.users.editor.saveAndDisable": "Save and disable account",
  "management.users.editor.planLabel": "Plan",
  "management.users.editor.expiryLabel": "Expiry",
  "management.users.editor.validation.expiryRequired": "A subscription plan requires an expiry date.",
  "management.users.editor.validation.usernameRequired": "Account ID is required.",
  "management.users.editor.validation.passwordTooShort": "Use at least {{count}} characters.",
  "management.users.editor.validation.passwordTooLong": "Use no more than {{count}} characters.",
  "management.users.editor.validation.passwordMismatch": "The passwords do not match.",
  "management.users.editor.validation.splitChanges": "Save profile changes and a password reset separately.",
  "management.users.editor.validation.noChanges": "There are no changes to save.",
  "management.users.deleteDialog.title": "Delete account",
  "management.users.deleteDialog.description": "This permanently deletes the account and cannot be undone.",
  "management.users.deleteDialog.deletedData": "Also deleted: this account's tabs, favorites, blacklist, notification settings, and signed-in devices.",
  "management.users.deleteDialog.retainedData": "Payment orders and audit records remain available for reconciliation, refunds, and investigation.",
  "management.users.deleteDialog.confirmLabel": "Enter the Account ID “{{username}}” to confirm",
  "management.users.deleteDialog.deleting": "Deleting…",
  "management.users.deleteDialog.permanentDelete": "Delete permanently",
  "management.signIn.loading": "Loading sign-in configuration…",
  "management.signIn.loadFailed": "Configuration could not be loaded. Try again.",
  "management.signIn.retryLoad": "Reload",
  "management.signIn.saveFailed": "Changes could not be saved. Try again.",
  "management.signIn.revisionConflict": "Another administrator updated this configuration. The current value has been reloaded; review it before saving again.",
  "management.signIn.registrationUpdateFailed": "The sign-up policy could not be updated. Try again.",
  "management.signIn.registrationTitle": "Self-service sign-up",
  "management.signIn.registrationDescription": "Google is the only public sign-up path. After Google verification, new users still choose their own account ID and password.",
  "management.signIn.registrationOpen": "Registration open",
  "management.signIn.registrationClosed": "Closed",
  "management.signIn.registrationHint": "New accounts start on the free plan. Existing accounts linked to Google are unaffected by this switch.",
  "management.signIn.registrationAria": "Allow self-service sign-up",
  "management.signIn.registrationOpenedFeedback": "Self-service sign-up is open. New Google users choose an account ID and password before the free account is created.",
  "management.signIn.registrationClosedFeedback": "Self-service sign-up is closed. Existing accounts linked to Google can still sign in.",
  "management.signIn.googleTitle": "Google sign-in",
  "management.signIn.googleDescription": "The only self-service sign-up path. Create an OAuth client in Google Cloud before enabling it.",
  "management.signIn.enabled": "Enabled",
  "management.signIn.disabled": "Disabled",
  "management.signIn.enabledHint": "The sign-in page shows “Continue with Google”.",
  "management.signIn.disabledHint": "Add all credentials and enable the switch before it becomes available.",
  "management.signIn.originMismatchHint": "This instance needs its own OAuth client and redirect URI: {{redirectUri}}",
  "management.signIn.enableAria": "Enable Google sign-in",
  "management.signIn.savedUsable": "Saved. The sign-in page now shows “Continue with Google”.",
  "management.signIn.savedIncomplete": "Saved. The entry appears after all credentials are present and Google sign-in is enabled.",
  "management.signIn.secretStoredHint": "Saved and write-only for security. Leave blank to keep the current secret.",
  "management.signIn.secretMissingHint": "Not set.",
  "management.signIn.clientIdLabel": "Client ID",
  "management.signIn.clientIdPlaceholder": "xxxxxxxx.apps.googleusercontent.com",
  "management.signIn.clientSecretLabel": "Client Secret",
  "management.signIn.secretKeepPlaceholder": "Leave blank to keep unchanged",
  "management.signIn.secretPastePlaceholder": "Paste Client Secret",
  "management.signIn.showSecret": "Show Client Secret",
  "management.signIn.hideSecret": "Hide Client Secret",
  "management.signIn.redirectUriLabel": "Redirect URI",
  "management.signIn.redirectUriHint": "This must match the value registered in Google Cloud exactly, or Google will reject the request.",
  "management.signIn.save": "Save",
  "management.signIn.checking": "Checking…",
  "management.signIn.checkClient": "Check client",
  "management.signIn.reload": "Reload",
  "management.signIn.unsaved": "Unsaved",
  "management.signIn.discard": "Discard changes",
  "management.signIn.validation.clientIdRequired": "Enter the Client ID.",
  "management.signIn.validation.clientIdInvalid": "The Client ID must end in .apps.googleusercontent.com and contain no spaces.",
  "management.signIn.validation.clientSecretRequired": "Enter the Client Secret.",
  "management.signIn.validation.clientSecretInvalid": "The Client Secret cannot contain spaces or exceed 256 characters.",
  "management.signIn.validation.redirectUriRequired": "Enter the redirect URI.",
  "management.signIn.validation.redirectUriCurrentOrigin": "Use the redirect URI for this site: {{redirectUri}}",
  "management.signIn.disabledReasons.registrationSaving": "The sign-up policy is being updated. Wait for it to finish.",
  "management.signIn.disabledReasons.configSaving": "The Google configuration is being saved. Wait for it to finish.",
  "management.signIn.disabledReasons.registrationNeedsGoogle": "Save complete credentials and enable Google sign-in before opening self-service sign-up.",
  "management.signIn.disabledReasons.saveBeforeToggle": "Save the current field changes before changing Google sign-in status.",
  "management.signIn.disabledReasons.closeRegistrationFirst": "Close self-service sign-up before disabling its only public entry point.",
  "management.signIn.disabledReasons.completeConfigFirst": "Save complete OAuth credentials for this site first.",
  "management.signIn.disabledReasons.noChanges": "There are no changes to save.",
  "management.signIn.disabledReasons.nothingToDiscard": "There are no unsaved sign-in configuration changes.",
  "management.signIn.disabledReasons.dirtyReload": "Save or discard the unsaved sign-in configuration before reloading.",
  "management.signIn.disabledReasons.checking": "The Google client is being checked. Wait for it to finish.",
  "management.signIn.disabledReasons.saveBeforeCheck": "Save the current changes before checking the saved client.",
  "management.signIn.check.requestFailed": "The client check could not be completed. Try again shortly.",
  "management.signIn.check.incomplete": "Client ID, Client Secret, and Redirect URI are all required.",
  "management.signIn.check.invalidConfig": "The OAuth configuration is invalid. Review the fields and try again.",
  "management.signIn.check.clientError": "The server could not start the check. Try again shortly.",
  "management.signIn.check.unreachable": "The server cannot reach Google. Check outbound connectivity.",
  "management.signIn.check.ok": "Google recognizes this client. Complete one real Google sign-in to confirm consent and callback delivery.",
  "management.signIn.check.invalidClient": "The Client ID or Client Secret is incorrect. Verify both in Google Cloud.",
  "management.signIn.check.redirectMismatch": "The Redirect URI does not match Google Cloud. The values must be identical.",
  "management.signIn.check.originMismatch": "The Redirect URI must belong to this site. Development and production need separate OAuth clients.",
  "management.signIn.check.unexpected": "Google returned an unexpected response ({{code}}). Try again shortly.",
  "management.signIn.cloudTitle": "Google Cloud setup",
  "management.signIn.cloudDescription": "Paste the Client Secret only into the write-only field above. The server never returns it to this page.",
  "management.signIn.cloudSteps.project": "Open the existing ZML Monitor Google Cloud project; create it only for the first setup. Development and production share the project, but not an OAuth client.",
  "management.signIn.cloudSteps.audience": "Open APIs & Services → OAuth consent screen, choose External, and add the app name and support email.",
  "management.signIn.cloudSteps.scopes": "Request only openid and email. Do not add profile or any other scope.",
  "management.signIn.cloudSteps.production": "Under Audience, change Publishing status to In production. Testing only permits listed test users.",
  "management.signIn.cloudSteps.client": "In the same project, create a separate Web application client for this site; use ZML Monitor Test for development and ZML Monitor Production for production.",
  "management.signIn.cloudSteps.redirect": "Set the authorized redirect URI to:",
  "management.signIn.cloudSteps.verify": "Save, check the client, then complete one real Google authorization, callback, and sign-in. A successful client check is not an end-to-end test.",
  "demo.intro": "You are viewing the live demo: real-time BTC, ETH and SOL across every venue. Everything is open to explore, and nothing you change is saved.",
  "demo.readOnly": "The demo does not save changes. Create an account to keep your own filters, views and alerts across every asset.",
  "demo.createAccount": "Create account",
  "demo.dismiss": "Got it",
  "demo.pausedTitle": "The demo is open in another tab",
  "demo.pausedDescription": "The live demo runs in one window at a time. Continue here to move it to this tab.",
  "demo.continueHere": "Continue here",
  "monitorWorkspace.tabPanel.toggle": "Tab panel",
  "monitorWorkspace.tabPanel.close": "Close panel",
  "monitorWorkspace.tabPanel.resize": "Resize panel",
  "monitorWorkspace.tabPanel.sections.overview": "Overview",
  "monitorWorkspace.tabPanel.deferred.loading": "Opening the editing sections…",
  "monitorWorkspace.tabPanel.deferred.unavailableTitle": "The editing sections are temporarily unavailable",
  "monitorWorkspace.tabPanel.trade.enabled": "On",
  "monitorWorkspace.tabPanel.trade.disabled": "Off",
  "monitorWorkspace.settingsSheet.footer.noChanges": "There are no unsaved changes.",
  "monitorWorkspace.tabs.defaultName": "New tab",
  "monitorWorkspace.tabs.createFromCurrent": "Save current view as a new tab",
  "monitorWorkspace.tabs.createBlank": "New blank tab",
  "monitorWorkspace.tabs.deleteLastReason": "Keep at least one combination tab",
  "monitorWorkspace.tabs.deletedFeedback": "Deleted “{{name}}”",
  "monitorWorkspace.tabs.undo": "Undo",
  "monitorWorkspace.tabs.duplicatedFeedback": "Copied. Feishu and ZML Trade delivery are off on the copy; its match conditions are live, so the web alert applies right away.",
  "monitorWorkspace.tabs.openSettings": "Open settings",
  "monitorWorkspace.tabs.renameField": "Rename {{name}}",
  "monitorWorkspace.tabs.nameIssue.taken": "A combination tab with this name already exists",
  "monitorWorkspace.tabs.nameIssue.tooLong": "Names are at most 80 characters",
  "monitorWorkspace.tabs.nameIssue.empty": "Enter a name",
  "monitorWorkspace.workspaceErrors.nameConflict": "A combination tab with this name already exists. Choose another name.",
  "fundingPage.viewPanel.toggle": "View panel",
  "fundingPage.viewPanel.close": "Close panel",
  "fundingPage.viewPanel.resize": "Resize panel",
  "fundingPage.viewPanel.sectionsAria": "Funding-rate view panel sections",
  "fundingPage.viewPanel.sections.overview": "Overview",
  "fundingPage.viewPanel.sections.scope": "Monitoring scope",
  "fundingPage.views.defaultName": "New view",
  "fundingPage.views.createFromCurrent": "Save current view as a new view",
  "fundingPage.views.createBlank": "New blank view",
  "fundingPage.views.deletedFeedback": "Deleted “{{name}}”",
  "fundingPage.views.undo": "Undo",
  "fundingPage.views.duplicatedFeedback": "Duplicated as “{{name}}”",
  "fundingPage.views.renameField": "Rename {{name}}",
  "fundingPage.views.nameIssue.taken": "A view with this name already exists",
  "fundingPage.views.nameIssue.tooLong": "Names are at most 80 characters",
  "fundingPage.views.nameIssue.empty": "Enter a name",
  "monitorWorkspace.settingsSheet.summary.conditionCount_one": "{{count}} condition",
  "monitorWorkspace.settingsSheet.summary.conditionCount_other": "{{count}} conditions",
  "monitorWorkspace.settingsSheet.summary.noConditions": "No conditions",
  "standalone.notificationSettings.context.accountSound.status.otherTab": "Played by another tab",
  "monitorWorkspace.settingsSheet.summary.feishuIdle": "Feishu on but no condition, so nothing is sent",
  "account.notificationSettings.sound.intervalHint": "5–60 seconds, whole numbers",
  "account.notificationSettings.sound.intervalRange": "Enter a whole number between 5 and 60 seconds",
  "account.notificationSettings.deliveryHealth.title": "Feishu channel congested",
  "account.notificationSettings.deliveryHealth.description": "Since this start: {{skipped}} repeat notifications yielded to the channel budget and {{rejected}} were rejected by Feishu rate limiting. First notifications are never yielded; shorten the interval only if the channel has headroom."
}
