{
  "fromProjectOk": "CDN site created from project — apply edges / DNS",
  "fromProjectUpdated": "Updated project-bound CDN site",
  "fromProjectFailed": "from-project failed",
  "nodeUpdated": "Node updated",
  "nodeCreated": "Node created",
  "saveFailed": "Save failed",
  "geoMapInvalid": "Invalid geoMap JSON, e.g. {\"hkg\":[\"node-id\"]}",
  "siteUpdated": "Site updated",
  "siteCreated": "Site created",
  "probeOnline": "Probe OK (online)",
  "probeOffline": "Probe failed (offline)",
  "probeFailed": "Probe failed",
  "batchProbeOk": "All nodes probed",
  "batchProbePartial": "Some/all nodes unhealthy",
  "batchProbeFailed": "Batch probe failed",
  "drainingSet": "Set to draining",
  "drainCleared": "Drain cleared",
  "confirmDeleteNode": "Delete this CDN node?",
  "nodeDeleted": "Node deleted",
  "deleteFailed": "Delete failed",
  "confirmDeleteSite": "Delete this CDN site?",
  "siteDeleted": "Site deleted",
  "blocked": "Blocked (needs system-change permission)",
  "previewRender": "Preview render ({{status}}) hash={{hash}}",
  "fanoutDone": "Fan-out done ({{status}})",
  "purgeDone": "Purge done ({{status}})",
  "dnsSyncDone": "DNS sync done ({{status}})",
  "sslDone": "SSL done ({{status}})",
  "confWritten": "Conf written ({{status}})",
  "partialFail": "Not fully successful ({{status}}) — see notes",
  "statNodes": "Nodes",
  "hitNoStats": "No edge stats yet",
  "loopbackOriginBlocked": "Will not apply loopback origin {{url}} to a remote edge. Set a reachable origin first.",
  "applyFailedHint": "Apply failed",
  "applyFailedNoNote": "No stored reason. Re-apply to capture the error.",
  "applyStatus": {
    "draft": "Draft",
    "planned": "Planned",
    "applying": "Applying",
    "applied": "Applied",
    "failed": "Failed",
    "partial": "Partial"
  },
  "statSites": "Sites",
  "statSitesCount": "{{n}} sites",
  "cacheMethod": {
    "none": "No estimate",
    "access_log": "Access log",
    "cache_dir": "Cache directory",
    "log_format": "Need log format"
  },
  "geoMapLabel": "Geo map (JSON)",
  "statApplyFailed": "Apply failed",
  "pillNodesSites": "{{n}} nodes · {{s}} sites",
  "statOnline": "Online",
  "statHit": "Hit rate",
  "hitUnknown": "Unknown",
  "lastHealthHint": "Last probe {{at}} · {{ok}}",
  "lastHealthNever": "Not probed yet — run Probe",
  "lastHealthFail": "probe failed",
  "healthLoopNeedSites": "Add a site first",
  "nodeStatus": {
    "online": "online",
    "offline": "offline",
    "draining": "draining",
    "unknown": "unknown"
  },
  "recentNotes": "Recent notes",
  "previewOnlyNote": "Preview only — nothing was written to the edges.",
  "statByRegion": "Region: ",
  "statByApply": "Apply status: ",
  "col": {
    "origin": "Origin",
    "edges": "Edges",
    "apply": "Apply",
    "dns": "DNS",
    "edgesOnline": "Edges online / applied",
    "dnsRr": "CDN DNS records"
  },
  "mode": {
    "origin_pull": "Origin pull",
    "reverse_proxy": "Reverse proxy",
    "static_edge": "Static edge"
  },
  "dnsStrategy": {
    "multi_a": "Multiple A records",
    "cname": "CNAME",
    "geo": "Geo"
  },
  "edgesOnlineApplied": "{{online}}/{{total}} online · {{applied}} applied",
  "hitMiss": "Hits {{hits}} / misses {{misses}}",
  "cacheBytes": "Cache ≈ {{n}} B",
  "hitRateUnknown": "No access log with cache status and no cache directory, so hit rate cannot be estimated.",
  "edgeConfPreview": "Nginx edge conf preview",
  "tabs": {
    "nodes": "Nodes",
    "sites": "Sites",
    "dashboard": "Dashboard",
    "about": "About"
  },
  "nodesTitle": "CDN nodes ({{count}})",
  "nodesDesc": "Register control-plane, origin, edge, and DNS nodes. Probe refreshes status.",
  "offlineHint": "Offline — probe failed. Remove the node if it is leftover.",
  "colName": "Name",
  "colRole": "Role",
  "colStatus": "Status",
  "clearDrain": "Clear drain",
  "drain": "Drain",
  "drainTitle": "Stop sending new CDN traffic to this edge",
  "drainDesc": "Drain “{{name}}”? Existing connections stay until they finish.",
  "drainLastTitle": "This is the last edge — drain will leave every site without an edge",
  "drainLastDesc": "“{{name}}” is the only edge. Drain it and all sites have no edge.",
  "clearDrainTitle": "Accept new traffic on this edge again",
  "clearDrainDesc": "Clear drain on “{{name}}”?",
  "deleteNodeTitle": "Delete this CDN edge",
  "deleteLastNodeTitle": "Delete the last edge — all sites will have no edge",
  "purge": "Purge",
  "previewTitle": "Preview nginx config (no write)",
  "writeConfTitle": "Write edge nginx config files",
  "applyEdgesTitle": "Apply this site to edges (writes nginx)",
  "purgeTitle": "Purge cache on edges",
  "dnsSyncTitle": "Write CDN DNS records",
  "probeDnsTitle": "Probe edges and DNS (read-only)",
  "distSslTitle": "Copy TLS materials to edges",
  "leIssueTitle": "Issue a Let’s Encrypt certificate and distribute it",
  "deleteSiteTitle": "Delete this CDN site",
  "siteOpConfirmGeneric": "Run this action on “{{name}}”?",
  "siteOpConfirmDesc": "Site “{{name}}” · {{action}}. This can change nginx, DNS, or certificates.",
  "siteOpConfirm": {
    "apply": "Apply this site to edges?",
    "render": "Write nginx config for this site?",
    "purge": "Purge cache for this site?",
    "dns-sync": "Sync DNS for this site?",
    "dist": "Distribute TLS to edges?",
    "issue": "Issue Let’s Encrypt and distribute?"
  },
  "emptyNodesTitle": "No CDN nodes yet",
  "emptyNodesDesc": "Use “+ Add node” to register an edge, then create sites.",
  "sitesTitle": "CDN sites ({{count}})",
  "sitesDesc": "Domain + origin + edges + cache + multi-A DNS. Apply edges / DNS sync / purge.",
  "healthLoopOk": "Health loop finished for all sites",
  "healthLoopPartial": "Health loop partially failed",
  "healthLoopFailed": "health-loop failed",
  "colDomain": "Domain",
  "colMode": "Mode",
  "emptySitesTitle": "No CDN sites yet",
  "emptySitesDesc": "Use “+ Add site” in the table toolbar.",
  "emptySitesNoEdge": "No edges yet: register nodes on the Nodes tab first, then create a site.",
  "dashboardTitle": "CDN dashboard",
  "updatedAt": "Updated {{at}}",
  "dashboardEmpty": "Dashboard not loaded",
  "siteStatus": "Site status",
  "cacheHitEstimate": "Cache hit rate (estimate)",
  "dashboardNotes": "Dashboard notes",
  "editNode": "Edit CDN node",
  "addNode": "Add CDN node",
  "nodeAddrHint": "Fill at least one of IPv4 / IPv6 / healthUrl / baseUrl",
  "sshHostHint": "Empty = use IPv4; 127.0.0.1 = local apply",
  "sshHostPlaceholder": "Leave empty for public IPv4",
  "sshUser": "SSH user",
  "fleetHint": "Fleet only (no SSH): fan-out queues for agent;",
  "fleetPlaceholder": "Agents page session UUID",
  "editSite": "Edit CDN site",
  "addSite": "Add CDN site",
  "originHint": "Origin as URL for now; project binding later",
  "commaSeparated": "Comma-separated",
  "originUrl": "Edge origin URL",
  "edgeNodes": "Edge nodes",
  "cache": "Cache",
  "dnsPolicy": "DNS policy",
  "dnsPolicyHint": "multi_a = multi IP; failover = healthiest only",
  "zoneOptional": "Empty = auto-match zone by domain",
  "sslMode": "SSL mode",
  "sslModeHint": "upload = cert on SSL page; le_http01 = edge ACME",
  "leEmailOptional": "LE email (optional)",
  "leEmailHint": "Prefill for issuance",
  "shieldHint": "Non-shield edges origin via this node",
  "geoMapHint": "For strategy=geo, e.g. {\"hkg\":[\"id1\"],\"nrt\":[\"id2\"]}",
  "geoSubdomain": "Geo subdomain",
  "addNodeBtn": "+ Add node",
  "addSiteBtn": "+ Add site",
  "probeAll": "Probe all",
  "healthLoop": "Health loop",
  "setDraining": "Set draining",
  "fromProjectUpdatedAlt": "Updated project-bound CDN site",
  "refresh": "Refresh",
  "closePreview": "Close preview",
  "probe": "Probe",
  "preview": "Preview",
  "writeConf": "Write conf",
  "applyEdges": "Apply edges",
  "dnsSync": "DNS sync",
  "probeDns": "Probe+DNS",
  "distSsl": "Distribute SSL",
  "leIssue": "LE issue",
  "reaggregate": "Refresh aggregate",
  "createEdgeFirst": "Create an edge node first",
  "enableProxyCache": "Enable proxy_cache",
  "autoMatch": "(auto match)",
  "none": "(none)",
  "writeRegionDns": "Write region subdomain A/AAAA (e.g. hkg)",
  "workflowHint": "Flow: write conf → apply edges → probe+DNS → SSL",
  "healthLoopAll": "Health loop all sites",
  "deleteNodeDesc": "Deletes CDN node \"{{name}}\".",
  "deleteSiteDesc": "Deletes CDN site \"{{name}}\".",
  "deleteSiteC1": "Site policy and edge associations",
  "deleteSiteC2": "Applied nginx configs may need separate cleanup or re-apply",
  "statOnline": "Online",
  "statOnlineOf": "Online {{n}}/{{total}}",
  "colRegion": "Region",
  "statDraining": "Draining {{n}}",
  "statOffline": "Offline {{n}}",
  "pillNodesSites": "{{n}} nodes · {{s}} sites",
  "statHit": "Hit rate",
  "localTest": "local / test",
  "hitUnknown": "Unknown",
  "lastHealthHint": "Last probe {{at}} · {{ok}}",
  "lastHealthNever": "Not probed yet — run Probe",
  "lastHealthFail": "probe failed",
  "healthLoopNeedSites": "Add a site first",
  "nodeStatus": {
    "online": "online",
    "offline": "offline",
    "draining": "draining",
    "unknown": "unknown"
  },
  "statHitRate": "Hit rate {{v}}"
}
