{
  "templates": {
    "minimal": "Minimal — apex A only",
    "web": "Web — apex + www",
    "mail": "Mail — apex + mail + MX + SPF",
    "full": "Full — web + mail + ftp + SPF",
    "cdn": "CDN — apex + www + cdn (multi-edge ready)"
  },
  "dnssecOk": "DNSSEC keys generated (written — zone not signed / not on registrar)",
  "dnssecNotOk": "DNSSEC keys not generated (notes only or tools unavailable — no false success)",
  "dnssecFailed": "DNSSEC failed",
  "blocked": "Blocked (needs system-change permission)",
  "clusterDone": "Done ({{status}})",
  "clusterPartial": "Not fully successful ({{status}}) — see details below",
  "clusterFailed": "Cluster operation failed",
  "validateFailed": "Record validation failed",
  "validateRequestFailed": "Validation request failed",
  "lookupFailed": "Lookup failed",
  "statRecords": "Records",
  "statSelected": "Selected",
  "notInstalled": "Required DNS software is not installed",
  "dsForRegistrar": "DS (for registrar; not auto-published):",
  "tabs": {
    "zones": "Zones",
    "records": "Records",
    "cluster": "Cluster",
    "dnssec": "DNSSEC",
    "tools": "Tools",
    "ddns": "DDNS",
    "about": "About"
  },
  "recentWrite": "Recent write result",
  "zonesTitle": "Zones ({{count}})",
  "zonesDesc": "After create, write/apply the zone",
  "createZone": "+ Create zone",
  "mailZonesMissing": "Email domains have no DNS zone here: {{domains}}.",
  "createMailZone": "Create mail zone",
  "colZoneName": "Zone name",
  "colServerIp": "Server IP",
  "colTemplate": "Template",
  "colStatus": "Status",
  "emptyZonesTitle": "No DNS zones yet",
  "emptyZonesDesc": "Use “Create zone” in the list toolbar",
  "applyZoneTitle": "Write zone file and register into PowerDNS named.conf + rediscover (write ≠ dig answers)",
  "applyZone": "Write / apply",
  "recordsFor": "Records — {{zone}}",
  "recordsNeedSelect": "Records (select a zone first)",
  "statusLabel": "Status",
  "addRecord": "+ Add record",
  "writeZoneFile": "Write & load zone",
  "healthLoaded": "Loaded",
  "stateLoaded": "Loaded",
  "healthPublicNs": "Public NS",
  "statePublicNs": "Public NS",
  "publicNsHere": "→ this host",
  "requestLeTitle": "Request Let’s Encrypt for {{zone}}",
  "requestZoneSsl": "Request SSL for zone",
  "soaTitle": "SOA / default TTL",
  "soaDesc": "SOA nameserver and $TTL when writing the zone file;",
  "soaBlockNs": "Nameservers",
  "soaBlockTiming": "TTL & timers",
  "recordsListTitle": "DNS records ({{count}})",
  "recordsListDesc": "After edits, use “Write zone file” above so named’s on-disk file updates.",
  "soaNsLabel": "SOA nameserver",
  "soaNsHint": "Leave empty → default ns1.zone.",
  "defaultTtl": "Default TTL (seconds)",
  "min1": "1 min",
  "min5": "5 min",
  "min10": "10 min",
  "hour1": "1 hour",
  "day1": "1 day",
  "customSeconds": "Custom seconds",
  "soaSaved": "SOA saved (control plane) — “Write zone file” to apply",
  "soaSaveFailed": "Failed to save SOA",
  "soaSavedAndWritten": "Saved and wrote zone file",
  "soaWriteFailed": "SOA write failed",
  "failed": "Failed",
  "colType": "Type",
  "colName": "Name",
  "colValue": "Value",
  "emptyRecords": "No records",
  "noZoneSelectedTitle": "No zone selected",
  "noZoneSelectedDesc": "Pick a zone on the Zones tab",
  "clusterTitle": "DNS cluster",
  "clusterDesc": "After SCP of zone files, remote reload (rndc / named / bind9 / pdns)",
  "peerHost": "Peer host",
  "peerHostHint": "Secondary NS hostname or IP (SSH key login)",
  "sshUser": "SSH user",
  "sshUserHint": "Needs write to target path and reload permission",
  "labelOptional": "Label (optional)",
  "labelPlaceholder": "e.g. ns2 / hkg-edge-dns",
  "opPerPeer": "This operation (per peer)",
  "registeredPeers": "Registered peers ({{count}})",
  "lastProbeHint": "lastProbe updates after probe or push",
  "noPeers": "No peers registered yet",
  "zoneDirMissing": "· zone directory missing",
  "generateKeys": "Generate keys; does not go live automatically",
  "selectZoneFirst": "Select a zone first",
  "lookupTitle": "DNS lookup (dig)",
  "lookupDesc": "Query public resolvers; verify multi-A / CDN. Does not invent answers.",
  "lookupNamePlaceholder": "e.g. example.com or www.example.com",
  "lookupType": "Query type",
  "lookupResults": "Results ({{count}})",
  "lookupNoAnswerFail": "No answers / failed",
  "digNotInstalled": "dig is not installed",
  "digNotInstalledHint": "This tab needs the dig binary (bind9-dnsutils). That is not NXDOMAIN. Install bind9-dnsutils from the host package manager; this page does not auto-install it.",
  "method": "Method: {{method}}",
  "noAnswers": "No answers",
  "noAnswersDesc": "NXDOMAIN, empty RRset, or resolve failure",
  "lookupOkHint": "Live query results",
  "lookupFailHint": "Lookup failed or empty. Check name, type, and upstream resolvers.",
  "validateTitle": "Record validation",
  "validateDesc": "Create/edit auto-validates (CNAME clashes, A/AAAA format, etc.).",
  "createZoneTitle": "Create DNS zone",
  "createZoneDesc": "Generate records from a template",
  "createZoneNeedValid": "Enter a valid zone name and IPv4 address",
  "zoneNameHint": "e.g. example.com (no trailing dot)",
  "invalidZone": "Invalid zone name. Use a real domain (e.g. example.com).",
  "invalidIpv4": "Invalid IPv4. Each octet must be 0–255.",
  "serverIpv4": "Server IPv4",
  "serverIpv4Hint": "Address used for template A records",
  "thisHostIpv4": "This host public IPv4",
  "serverIpv6Optional": "Server IPv6 (optional)",
  "serverIpv6Hint": "Writes AAAA when public v6 exists; can leave empty",
  "thisHostIpv6": "This host public IPv6 (optional)",
  "soaNsCreateHint": "Leave empty for ns1.zone-name",
  "defaultTtlLabel": "Default TTL",
  "defaultTtlHint": "Default for SOA and new records",
  "recordTemplate": "Record template",
  "editRecord": "Edit record",
  "addRecordTitle": "Add record",
  "recordModalDesc": "Zone {{zone}} · write zone file after save",
  "recordType": "DNS record type",
  "nameHint": "@ = apex; www = subdomain",
  "mxPlaceholder": "e.g. 10 mail.example.com.",
  "spfPlaceholder": "e.g. v=spf1 a mx ip4:… ip6:… ~all",
  "needIpv6": "Enter an IPv6 address",
  "needIpv4": "Enter an IPv4 address",
  "valueHint": "IP, hostname, or record content",
  "ipv6Address": "IPv6 address",
  "ipv4Address": "IPv4 address",
  "cacheTime": "Cache time",
  "deleteZoneTitle": "Delete zone?",
  "deleteZoneDesc": "Also removes its DNS record registrations.",
  "deleteRecordTitle": "Delete record?",
  "deleteRecordDesc": "Write the zone file after removal",
  "addPeer": "Add peer",
  "probe": "Probe",
  "pushZones": "Push zones",
  "reloadRemote": "Remote reload",
  "generateDnssec": "Generate DNSSEC keys",
  "lookup": "Lookup",
  "saveSoa": "Save SOA",
  "saveSoaAndWrite": "Save and write zone file",
  "saveSoaSettings": "Save SOA settings",
  "saveSoaAndWriteBtn": "Save and write zone file",
  "goToZones": "Go to zones",
  "refresh": "Refresh",
  "pushReload": "Push + reload",
  "pushOnly": "Push only (no reload)",
  "reloadOnly": "Remote reload only",
  "probePeers": "Probe peers",
  "clusterDefaultHint": "Default: push then reload DNS on peers; needs system-change rights.",
  "notProbed": "Not probed yet",
  "probeHealthy": "Probe: {{status}}",
  "pushReloadShort": "Push+reload",
  "dnssecCardDesc": "Generate keys/DS;",
  "currentZone": "Current zone:",
  "generateAndSign": "Generate keys and try signing zone",
  "lookupName": "Name",
  "fillCurrentZone": "Fill current zone",
  "lookupToolHint": "Prefers host dig;",
  "validateExtra": "Errors block save; warns (e.g. apex CNAME) only notify.",
  "createAfterHint": "After create, review on Records tab and write the zone file to disk.",
  "valueLabel": "Value",
  "ttlHint": "Cache time",
  "soaSavedControl": "SOA saved (control plane) — write zone file to apply",
  "soaNs2Label": "Secondary NS (optional)",
  "soaNs2Hint": "Second nameserver FQDN, e.g. ns2.example.com.",
  "soaHostmaster": "SOA hostmaster (RNAME)",
  "soaHostmasterHint": "Use dots instead of @, e.g. hostmaster.example.com.",
  "soaRefresh": "Refresh (seconds)",
  "soaRetry": "Retry (seconds)",
  "soaExpire": "Expire (seconds)",
  "soaMinimum": "Minimum / negative cache TTL (seconds)",
  "soaTimingHint": "SOA timing parameters in seconds.",
  "healthTitle": "DNS service health",
  "healthDesc": "Host truth: unit / port 53 / written zone files / local dig answers (written ≠ reloaded ≠",
  "healthPillOk": "DNS OK",
  "healthPillBad": "DNS issues",
  "healthService": "Service",
  "healthServiceDown": "down",
  "healthListen": "Port 53",
  "healthWritten": "Zone files",
  "healthAnswering": "Local answer",
  "healthAnsweringYes": "yes",
  "healthAnsweringNo": "no/refused",
  "healthRefresh": "Re-probe",
  "healthProbeLocal": "Probe health again",
  "healthOpen53": "Open firewall 53 (TCP+UDP)",
  "healthOpened53": "Requested open 53 TCP+UDP",
  "healthOpen53Failed": "Failed to open 53",
  "healthPortClosed": "not listening",
  "healthPortOpenAlready": "53 appears open",
  "healthHint": "If dig is refused, fix PowerDNS, open port 53, then write zones.",
  "stateService": "Service",
  "stateListen": "Listen",
  "stateWritten": "Written",
  "stateAnswering": "Local answering",
  "lookupServer": "Server (@)",
  "lookupServerHint": "127.0.0.1 = local auth; public IP tests external; empty = system resolver",
  "healthHealPdns": "Heal PowerDNS bind",
  "healNeedInstall": "PowerDNS is not installed — install it on the Software tab first",
  "applyNeedService": "DNS service is not running — start or install it before apply",
  "goStartService": "Start DNS service",
  "startBindHint": "If start returns to stopped, port 53 is often held by systemd-resolved. Use Heal bind below, then start again.",
  "deleteZoneNeedName": "Delete this zone — you will type the zone name to confirm",
  "healthHealPdnsHint": "Set local-address to public IP to avoid clashing with systemd-resolved on 0",
  "healthHealPdnsOk": "PowerDNS bound to {{ip}} and start attempted",
  "healthHealPdnsFailed": "PowerDNS heal failed",
  "startProbeFailed": "Could not re-check DNS health after start",
  "startNotListening": "PowerDNS start returned, but the unit is not answering on port 53",
  "aboutTitle": "DNS essentials",
  "aboutSub": "Zones first; records, cluster, and DNSSEC need a selected domain.",
  "aboutZonesTitle": "Zones and scope",
  "aboutZonesBody": "Pick a zone under Zones, then manage records, cluster, and DNSSEC for that domain.",
  "aboutHealthTitle": "Service health",
  "aboutHealthBody": "Use Tools to probe PowerDNS, heal bind, and open port 53.",
  "aboutStackTitle": "Software",
  "aboutStackBody": "Check/update the PowerDNS package under Software.",
  "aboutDdnsTitle": "DDNS",
  "aboutDdnsBody": "The DDNS tab updates named A/AAAA records when this host’s WAN address changes. It does not replace zone CRUD. Written is not the same as public resolver truth.",
  "ddns": {
    "honesty": "A successful write is not public DNS yet. Resolver caches and registrar NS still apply. Empty or private IPs are never published.",
    "needExecute": "Provider updates need root and YSK_EXECUTE=1. Detection still runs.",
    "lastRun": "Last run",
    "nextRun": "Next run",
    "wanRemembered": "Remembered WAN IPv4",
    "updateNow": "Update now",
    "updateTitle": "Publish detected WAN addresses?",
    "updateDesc": "Calls Cloudflare, nsupdate, or the local zone for each enabled record, even if the address is unchanged. Type UPDATE to confirm.",
    "updated": "DDNS update finished",
    "updateFailed": "DDNS update failed",
    "probe": "Probe WAN",
    "probed": "WAN probe finished",
    "probeFailedUi": "WAN probe failed",
    "forceHint": "Update now republishes even when the address is unchanged. Probe never calls a provider.",
    "saved": "Saved",
    "saveFailed": "Could not save",
    "deleted": "Record removed",
    "emptyTitle": "No DDNS records",
    "emptyDesc": "Add a hostname below. Cloudflare, RFC 2136, or this host’s PowerDNS zone (managedBy=ddns).",
    "colFqdn": "Hostname",
    "colProvider": "Provider",
    "colPublished": "Published",
    "colEnabled": "State",
    "colFrom": "From",
    "colTo": "To",
    "colWhen": "When",
    "colNote": "Note",
    "pauseRecord": "Pause",
    "resumeRecord": "Resume",
    "statusCard": "WAN status",
    "recordsCard": "Hostnames",
    "addCard": "Add hostname",
    "settingsCard": "Settings",
    "historyTitle": "Recent updates",
    "historyEmpty": "No DDNS history yet",
    "paused": "Scheduler paused",
    "pausedHint": "Scheduled updates are off. Probe and Update now still run.",
    "schedulerOn": "Scheduled updates",
    "schedulerOnHint": "In-process scheduler. Not crontab. Off means no automatic upsert.",
    "zone": "Zone",
    "zoneHint": "Leave empty to use the last two labels of the hostname. Local provider should pick a zone that already exists.",
    "zoneSelectHint": "Local zones on this host. Cloudflare and RFC 2136 can use any zone name.",
    "noLocalZones": "No local zones yet. Create one on the Zones tab first if you use Local PowerDNS.",
    "providerLocal": "Local PowerDNS",
    "proxied": "Cloudflare proxied",
    "proxiedHint": "Orange cloud. Leave off for VPN / WireGuard hostnames.",
    "proxiedWarnTitle": "Cloudflare orange cloud?",
    "proxiedWarnDesc": "A proxied record hides the origin IP. VPN and WireGuard hostnames should stay DNS only. Type PROXY to confirm.",
    "addRecord": "Add hostname",
    "interval": "Interval (seconds)",
    "intervalHint": "60–86400. In-process scheduler; not crontab.",
    "cfToken": "Cloudflare API token",
    "cfTokenHint": "Write-only. Env CF_API_TOKEN is used if set. Never shown again.",
    "tokenConfigured": "A Cloudflare token is stored. Leave blank to keep it.",
    "tokenMissing": "No Cloudflare token stored (env CF_API_TOKEN still applies).",
    "rfcServer": "RFC 2136 server",
    "rfcServerHint": "Remote servers need a TSIG key file under the data directory. Loopback may be unsigned. The secret is never passed on argv.",
    "rfcKeyFile": "TSIG key file",
    "rfcKeyFileHint": "Relative to the DDNS data directory, or an absolute path under the data directory.",
    "rfcKeyConfigured": "A key file path is stored. Leave blank to keep it.",
    "primaryFqdn": "Primary hostname",
    "primaryFqdnHint": "Used as a VPN endpoint hint. Does not rewrite existing peers.",
    "updateIdentity": "Remember WAN IPv4",
    "updateIdentityHint": "Store last public IPv4 in DDNS status for this host",
    "vpnHint": "VPN Endpoint can use a DDNS hostname (not rewritten automatically).",
    "sslHint": "Let’s Encrypt HTTP-01 needs the hostname to resolve here. Certificates are not reissued on IP change.",
    "deleteTitle": "Remove DDNS hostname?",
    "deleteDesc": "Type {{fqdn}} to confirm. Local managedBy=ddns rows are not deleted from the zone editor.",
    "err": {
      "requiresExecute": "Needs root and YSK_EXECUTE=1 to publish.",
      "missingToken": "Cloudflare API token is missing.",
      "rfc2136NeedKey": "Remote RFC 2136 needs a TSIG key file under the data directory.",
      "rfc2136KeyMissing": "TSIG key file is missing or outside the data directory.",
      "noPublicIpv4": "No public IPv4 detected.",
      "noPublicIpv6": "No public IPv6 detected.",
      "notPublicIpv4": "Detected IPv4 is not public.",
      "notPublicIpv6": "Detected IPv6 is not public.",
      "probeFailed": "Public IP probe failed.",
      "localNoZone": "No local DNS zone for this hostname.",
      "localNeedsDb": "Local provider needs the control-plane database.",
      "managedByClash": "That name is owned by another feature (not DDNS).",
      "unknownProvider": "Unknown DDNS provider.",
      "nsupdateFailed": "nsupdate failed.",
      "updateFailed": "Provider update failed.",
      "invalidFqdn": "Invalid hostname.",
      "invalidType": "Type must be A or AAAA.",
      "invalidProvider": "Unknown provider.",
      "notFound": "Record not found.",
      "confirmMismatch": "Confirm must match the hostname.",
      "schedulerDisabled": "Scheduled DDNS is paused.",
      "provider": "Provider returned an error."
    }
  },
  "createMailZoneNow": "Created mail zone {{domain}}",
  "toolsFirewallTitle": "Firewall (UFW)",
  "toolsFirewallHint": "Allow or deny port 53. This does not start or stop PowerDNS.",
  "toolsUnitTitle": "PowerDNS unit",
  "toolsUnitHint": "systemd unit pdns — start, stop, restart, reload.",
  "installConfirmTitle": "Install PowerDNS?",
  "installConfirmDesc": "Installs pdns-server and writes the managed authoritative config. Needs root and YSK_EXECUTE=1.",
  "installConfirmConsequence": "After install and start, PowerDNS will bind port 53.",
  "installPort53Busy": "Something already listens on port 53. PowerDNS may fail to bind until that listener is stopped or healed.",
  "installPort53BusyConsequence": "Heal bind or stop the other listener before expecting answers on port 53."
}
