summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-unbound
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-app-unbound')
-rw-r--r--applications/luci-app-unbound/luasrc/controller/unbound.lua238
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua551
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua15
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua15
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua15
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua37
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua95
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua232
-rw-r--r--applications/luci-app-unbound/po/templates/unbound.pot737
-rw-r--r--applications/luci-app-unbound/po/zh-cn/unbound.po740
-rw-r--r--applications/luci-app-unbound/po/zh-tw/unbound.po740
11 files changed, 3048 insertions, 367 deletions
diff --git a/applications/luci-app-unbound/luasrc/controller/unbound.lua b/applications/luci-app-unbound/luasrc/controller/unbound.lua
index 730ca724a4..32879cb9f2 100644
--- a/applications/luci-app-unbound/luasrc/controller/unbound.lua
+++ b/applications/luci-app-unbound/luasrc/controller/unbound.lua
@@ -1,151 +1,229 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
--- Copyright 2017 Eric Luehrsen <ericluehrsen@hotmail.com>
+-- Copyright 2017 Eric Luehrsen <ericluehrsen@gmail.com>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.unbound", package.seeall)
function index()
- local ucl = luci.model.uci.cursor()
- local valexp = ucl:get_first("unbound", "unbound", "extended_luci")
- local valman = ucl:get_first("unbound", "unbound", "manual_conf")
+ local fs = require "nixio.fs"
+ local ucl = luci.model.uci.cursor()
+ local valman = ucl:get_first("unbound", "unbound", "manual_conf")
- if not nixio.fs.access("/etc/config/unbound") then
- return
- end
+ if not fs.access("/etc/config/unbound") then
+ return
+ end
- if valexp == "1" then
-- Expanded View
- entry({"admin", "services", "unbound"}, firstchild(), _("Recursive DNS")).dependent = false
+ entry({"admin", "services", "unbound"},
+ firstchild(), _("Recursive DNS")).dependent = false
-- UCI Tab(s)
- entry({"admin", "services", "unbound", "configure"}, cbi("unbound/configure"), _("Settings"), 10)
+ entry({"admin", "services", "unbound", "configure"},
+ cbi("unbound/configure"), _("Unbound"), 10)
+
+
+ if (valman == "0") then
+ entry({"admin", "services", "unbound", "zones"},
+ arcombine(cbi("unbound/zones"), cbi("unbound/zone-details")),
+ _("Zones"), 15).leaf = true
+ end
+
-- Status Tab(s)
- entry({"admin", "services", "unbound", "status"}, firstchild(), _("Status"), 20)
- entry({"admin", "services", "unbound", "status", "syslog"}, call("QuerySysLog"), _("Log"), 50).leaf = true
+ entry({"admin", "services", "unbound", "status"},
+ firstchild(), _("Status"), 20)
+ entry({"admin", "services", "unbound", "status", "syslog"},
+ call("QuerySysLog"), _("Log"), 50).leaf = true
- if nixio.fs.access("/usr/sbin/unbound-control") then
- -- Require unbound-control to execute
- entry({"admin", "services", "unbound", "status", "statistics"}, call("QueryStatistics"), _("Statistics"), 10).leaf = true
- entry({"admin", "services", "unbound", "status", "localdata"}, call("QueryLocalData"), _("Local Data"), 20).leaf = true
- entry({"admin", "services", "unbound", "status", "localzone"}, call("QueryLocalZone"), _("Local Zones"), 30).leaf = true
+ if fs.access("/usr/sbin/unbound-control") then
+ -- Require unbound-control to execute
+ entry({"admin", "services", "unbound", "status", "statistics"},
+ call("QueryStatistics"), _("Statistics"), 10).leaf = true
+
+ entry({"admin", "services", "unbound", "status", "localdata"},
+ call("QueryLocalData"), _("Local Data"), 20).leaf = true
+
+ entry({"admin", "services", "unbound", "status", "localzone"},
+ call("QueryLocalZone"), _("Local Zones"), 30).leaf = true
+
+ entry({"admin", "services", "unbound", "status", "dumpcache"},
+ call("QueryDumpCache"), _("DNS Cache"), 40).leaf = true
else
- entry({"admin", "services", "unbound", "status", "statistics"}, call("ShowEmpty"), _("Statistics"), 10).leaf = true
+ entry({"admin", "services", "unbound", "status", "statistics"},
+ call("ShowEmpty"), _("Statistics"), 10).leaf = true
end
-- Raw File Tab(s)
- entry({"admin", "services", "unbound", "files"}, firstchild(), _("Files"), 30)
+ entry({"admin", "services", "unbound", "files"},
+ firstchild(), _("Files"), 30)
+
+
+ if (valman == "0") then
+ entry({"admin", "services", "unbound", "files", "uci"},
+ form("unbound/uciedit"), _("Edit: UCI"), 5).leaf = true
+ entry({"admin", "services", "unbound", "files", "base"},
+ call("ShowUnboundConf"), _("Show: Unbound"), 10).leaf = true
- if valman ~= "1" then
- entry({"admin", "services", "unbound", "files", "base"}, call("ShowUnboundConf"), _("UCI: Unbound"), 10).leaf = true
else
- entry({"admin", "services", "unbound", "files", "base"}, form("unbound/manual"), _("Edit: Unbound"), 10).leaf = true
+ entry({"admin", "services", "unbound", "files", "base"},
+ form("unbound/manual"), _("Edit: Unbound"), 10).leaf = true
end
- entry({"admin", "services", "unbound", "files", "server"}, form("unbound/server"), _("Edit: Server"), 20).leaf = true
- entry({"admin", "services", "unbound", "files", "extended"}, form("unbound/extended"), _("Edit: Extended"), 30).leaf = true
+ entry({"admin", "services", "unbound", "files", "server"},
+ form("unbound/server"), _("Edit: Server"), 20).leaf = true
+ entry({"admin", "services", "unbound", "files", "extended"},
+ form("unbound/extended"), _("Edit: Extended"), 30).leaf = true
- if nixio.fs.access("/var/lib/unbound/unbound_dhcp.conf") then
- entry({"admin", "services", "unbound", "files", "dhcp"}, call("ShowDHCPConf"), _("Include: DHCP"), 40).leaf = true
+
+ if fs.access("/var/lib/unbound/dhcp.conf") then
+ entry({"admin", "services", "unbound", "files", "dhcp"},
+ call("ShowDHCPConf"), _("Show: DHCP"), 40).leaf = true
end
- if nixio.fs.access("/var/lib/unbound/adb_list.overall") then
- entry({"admin", "services", "unbound", "files", "adblock"}, call("ShowAdblock"), _("Include: Adblock"), 50).leaf = true
+ if fs.access("/var/lib/unbound/adb_list.overall") then
+ entry({"admin", "services", "unbound", "files", "adblock"},
+ call("ShowAdblock"), _("Show: Adblock"), 50).leaf = true
end
-
- else
- -- Simple View to UCI only
- entry({"admin", "services", "unbound"}, cbi("unbound/configure"), _("Recursive DNS")).dependent = false
- end
end
function ShowEmpty()
- local lclhead = "Unbound Control"
- local lcldesc = luci.i18n.translate("This could display more statistics with the unbound-control package.")
- luci.template.render("unbound/show-empty", {heading = lclhead, description = lcldesc})
+ local lclhead = "Unbound Control"
+ local lcldesc = luci.i18n.translate(
+ "This could display more statistics with the unbound-control package.")
+
+ luci.template.render("unbound/show-empty",
+ {heading = lclhead, description = lcldesc})
end
function QuerySysLog()
- local lclhead = "System Log"
- local lcldata = luci.util.exec("logread | grep -i unbound")
- local lcldesc = luci.i18n.translate("This shows syslog filtered for events involving Unbound.")
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
+ local lcldata = luci.util.exec("logread -e 'unbound'")
+ local lcldesc = luci.i18n.translate(
+ "This shows syslog filtered for events involving Unbound.")
+
+ luci.template.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
end
function QueryStatistics()
- local lclhead = "Unbound Control Stats"
- local lcldata = luci.util.exec("unbound-control -c /var/lib/unbound/unbound.conf stats_noreset")
- local lcldesc = luci.i18n.translate("This shows some performance statistics tracked by Unbound.")
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
+ local lcldata = luci.util.exec(
+ "unbound-control -c /var/lib/unbound/unbound.conf stats_noreset")
+
+ local lcldesc = luci.i18n.translate(
+ "This shows Unbound self reported performance statistics.")
+
+ luci.template.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
end
function QueryLocalData()
- local lclhead = "Unbound Control Local Data"
- local lcldata = luci.util.exec("unbound-control -c /var/lib/unbound/unbound.conf list_local_data")
- local lcldesc = luci.i18n.translate("This shows local host records that shortcut recursion.")
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
+ local lcldata = luci.util.exec(
+ "unbound-control -c /var/lib/unbound/unbound.conf list_local_data")
+
+ local lcldesc = luci.i18n.translate(
+ "This shows Unbound 'local-data:' entries from default, .conf, or control.")
+
+ luci.template.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
end
function QueryLocalZone()
- local lclhead = "Unbound Control Local Zones"
- local lcldata = luci.util.exec("unbound-control -c /var/lib/unbound/unbound.conf list_local_zones")
- local lcldesc = luci.i18n.translate("This shows local zone definitions that affect recursion routing or processing. ")
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
+ local lcldata = luci.util.exec(
+ "unbound-control -c /var/lib/unbound/unbound.conf list_local_zones")
+
+ local lcldesc = luci.i18n.translate(
+ "This shows Unbound 'local-zone:' entries from default, .conf, or control.")
+
+ luci.template.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
+end
+
+
+function QueryDumpCache()
+ local tp = require "luci.template"
+ local tr = require "luci.i18n"
+ local lcldesc
+ local lcldata = luci.util.exec(
+ "unbound-control -c /var/lib/unbound/unbound.conf dump_cache")
+
+
+ if #lcldata > 262144 then
+ lcldesc = tr.translate(
+ "Unbound cache is too large to display in LuCI.")
+
+ tp.render("unbound/show-empty",
+ {heading = "", description = lcldesc})
+
+ else
+ lcldesc = tr.translate(
+ "This shows 'ubound-control dump_cache' for auditing records including DNSSEC.")
+
+ tp.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
+ end
+
end
function ShowUnboundConf()
- local unboundfile = "/var/lib/unbound/unbound.conf"
- local lclhead = "Unbound Conf"
- local lcldata = nixio.fs.readfile(unboundfile)
- local lcldesc = luci.i18n.translate("This shows configuration generated by UCI:")
- lcldesc = lcldesc .. " (" .. unboundfile .. ")"
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
+ local unboundfile = "/var/lib/unbound/unbound.conf"
+ local lcldata = nixio.fs.readfile(unboundfile)
+ local lcldesc = luci.i18n.translate(
+ "This shows '" .. unboundfile .. "' generated from UCI configuration.")
+
+ luci.template.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
end
function ShowDHCPConf()
- local dhcpfile = "/var/lib/unbound/unbound_dhcp.conf"
- local lclhead = "DHCP Conf"
- local lcldata = nixio.fs.readfile(dhcpfile)
- local lcldesc = luci.i18n.translate("This shows LAN hosts added by DHCP hook scripts:")
- lcldesc = lcldesc .. " (" .. dhcpfile .. ")"
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
+ local dhcpfile = "/var/lib/unbound/dhcp.conf"
+ local lcldata = nixio.fs.readfile(dhcpfile)
+ local lcldesc = luci.i18n.translate(
+ "This shows '" .. dhcpfile .. "' list of hosts from DHCP hook scripts.")
+
+ luci.template.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
end
function ShowAdblock()
- local adblockfile = "/var/lib/unbound/adb_list.overall"
- local lclhead = "Adblock Conf"
- local lcldata, lcldesc
-
-
- if nixio.fs.stat(adblockfile).size > 262144 then
- lcldesc = luci.i18n.translate("Adblock domain list is too large for LuCI:")
- lcldesc = lcldesc .. " (" .. adblockfile .. ")"
- luci.template.render("unbound/show-empty", {heading = lclhead, description = lcldesc})
-
- else
- lcldata = nixio.fs.readfile(adblockfile)
- lcldesc = luci.i18n.translate("This shows blocked domains provided by Adblock scripts:")
- lcldesc = lcldesc .. " (" .. adblockfile .. ")"
- luci.template.render("unbound/show-textbox", {heading = lclhead, description = lcldesc, content = lcldata})
- end
+ local fs = require "nixio.fs"
+ local tp = require "luci.template"
+ local tr = require "luci.i18n"
+ local adblockfile = "/var/lib/unbound/adb_list.overall"
+ local lcldata, lcldesc
+
+
+ if fs.stat(adblockfile).size > 262144 then
+ lcldesc = tr.translate(
+ "Adblock domain list is too large to display in LuCI.")
+
+ tp.render("unbound/show-empty",
+ {heading = "", description = lcldesc})
+
+ else
+ lcldata = fs.readfile(adblockfile)
+ lcldesc = tr.translate(
+ "This shows '" .. adblockfile .. "' list of adblock domains." )
+
+ tp.render("unbound/show-textbox",
+ {heading = "", description = lcldesc, content = lcldata})
+ end
end
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua
index 256bbb8392..60d0477d53 100644
--- a/applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua
@@ -1,5 +1,5 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2016 Eric Luehrsen <ericluehrsen@hotmail.com>
+-- Copyright 2016 Eric Luehrsen <ericluehrsen@gmail.com>
-- Copyright 2016 Dan Luedtke <mail@danrl.com>
-- Licensed to the public under the Apache License 2.0.
@@ -9,307 +9,320 @@ local rlh, rpv, vld, nvd, eds, prt, tlm
local ctl, dlk, dom, dty, lfq, wfq, exa
local dp6, d64, pfx, qry, qrs
local pro, tgr, rsc, rsn, ag2, stt
-local rpn, din, dfw, ath
+local rpn, din, ath
+
+local ut = require "luci.util"
+local sy = require "luci.sys"
+local ht = require "luci.http"
+local ds = require "luci.dispatcher"
local ucl = luci.model.uci.cursor()
local valman = ucl:get_first("unbound", "unbound", "manual_conf")
m1 = Map("unbound")
+s1 = m1:section(TypedSection, "unbound", translate("Recursive DNS"),
+ translatef("Unbound <a href=\"%s\" target=\"_blank\">(NLnet Labs)</a>"
+ .. " is a validating, recursive, and caching DNS resolver"
+ .. " <a href=\"%s\" target=\"_blank\">(help)</a>.",
+ "https://www.unbound.net/",
+ "https://github.com/openwrt/packages/blob/master/net/unbound/files/README.md"))
-s1 = m1:section(TypedSection, "unbound")
s1.addremove = false
s1.anonymous = true
--LuCI, Unbound, or Not
-s1:tab("basic", translate("Basic"),
- translatef("<h3>Unbound Basic Settings</h3>\n"
- .. "<a href=\"%s\" target=\"_blank\">Unbound (link)</a>"
- .. " is a validating, recursive, and caching DNS resolver. "
- .. "UCI documentation can be found on "
- .. "<a href=\"%s\" target=\"_blank\">github (link)</a>.",
- "https://www.unbound.net/",
- "https://github.com/openwrt/packages/blob/master/net/unbound/files/README.md"))
-
-
-if valman ~= "1" then
- -- Not in manual configuration mode; show UCI
- s1:tab("advanced", translate("Advanced"),
- translatef("<h3>Unbound Advanced Settings</h3>\n"
- .. "Domain manipulation, lookup protection, and workarounds for "
- .. "<a href=\"%s\" target=\"_blank\">Unbound </a>"
- .. " DNS resolver.", "https://www.unbound.net/"))
-
- s1:tab("DHCP", translate("DHCP"),
- translatef("<h3>Unbound DHCP Settings</h3>\n"
- .. "Link your DHCP server to "
- .. "<a href=\"%s\" target=\"_blank\">Unbound </a>"
- .. " DNS resolver.", "https://www.unbound.net/ "))
-
- s1:tab("resource", translate("Resource"),
- translatef("<h3>Unbound Resource Settings</h3>\n"
- .. "Memory and protocol setttings for "
- .. "<a href=\"%s\" target=\"_blank\">Unbound </a>"
- .. " DNS resolver.", "https://www.unbound.net/"))
-end
+s1:tab("basic", translate("Basic"))
-s1:tab("trigger", translate("Trigger"),
- translatef("<h3>Unbound Event Trigger Settings</h3>\n"
- .. "Start, reload, and save RFC5011 DNSKEY records for "
- .. "<a href=\"%s\" target=\"_blank\">Unbound </a>"
- .. " DNS resolver.", "https://www.unbound.net/"))
+if (valman == "0") then
+ -- Not in manual configuration mode; show UCI
+ s1:tab("advanced", translate("Advanced"))
+ s1:tab("DHCP", translate("DHCP"))
+ s1:tab("resource", translate("Resource"))
+end
--Basic Tab, unconditional pieces
-ena = s1:taboption("basic", Flag, "enabled", translate("Enable Unbound:"),
- translate("Enable the initialization scripts for Unbound"))
+ena = s1:taboption("basic", Flag, "enabled", translate("Enable Unbound"),
+ translate("Enable the initialization scripts for Unbound"))
ena.rmempty = false
-mcf = s1:taboption("basic", Flag, "manual_conf", translate("Manual Conf:"),
- translate("Skip UCI and use /etc/unbound/unbound.conf"))
+mcf = s1:taboption("basic", Flag, "manual_conf", translate("Manual Conf"),
+ translate("Skip UCI and use /etc/unbound/unbound.conf"))
mcf.rmempty = false
-lci = s1:taboption("basic", Flag, "extended_luci", translate("Extended Tabs:"),
- translate("See detailed tabs for statistics, debug, and manual configuration"))
-lci.rmempty = false
-
-
-if valman ~= "1" then
- -- Not in manual configuration mode; show UCI
- --Basic Tab
- lsv = s1:taboption("basic", Flag, "localservice", translate("Local Service:"),
- translate("Accept queries only from local subnets"))
- lsv.rmempty = false
-
- vld = s1:taboption("basic", Flag, "validator", translate("Enable DNSSEC:"),
- translate("Enable the DNSSEC validator module"))
- vld.rmempty = false
-
- nvd = s1:taboption("basic", Flag, "validator_ntp", translate("DNSSEC NTP Fix:"),
- translate("Break the loop where DNSSEC needs NTP and NTP needs DNS"))
- nvd.rmempty = false
- nvd:depends({ validator = true })
-
- d64 = s1:taboption("basic", Flag, "dns64", translate("Enable DNS64:"),
- translate("Enable the DNS64 module"))
- d64.rmempty = false
-
- pfx = s1:taboption("basic", Value, "dns64_prefix", translate("DNS64 Prefix:"),
- translate("Prefix for generated DNS64 addresses"))
- pfx.datatype = "ip6addr"
- pfx.placeholder = "64:ff9b::/96"
- pfx.optional = true
- pfx:depends({ dns64 = true })
-
- prt = s1:taboption("basic", Value, "listen_port", translate("Listening Port:"),
- translate("Choose Unbounds listening port"))
- prt.datatype = "port"
- prt.rmempty = false
-
- --Avanced Tab
- din = s1:taboption("advanced", DynamicList, "domain_insecure",
- translate("Domain Insecure:"),
- translate("List domains to bypass checks of DNSSEC"))
- din:depends({ validator = true })
-
- dfw = s1:taboption("advanced", DynamicList, "domain_forward",
- translate("Domain Forward:"),
- translate("List domains to simply forward to stub resolvers in /tmp/resolve.auto"))
-
- rlh = s1:taboption("advanced", Flag, "rebind_localhost", translate("Filter Localhost Rebind:"),
- translate("Protect against upstream response of 127.0.0.0/8"))
- rlh.rmempty = false
-
- rpv = s1:taboption("advanced", ListValue, "rebind_protection", translate("Filter Private Rebind:"),
- translate("Protect against upstream responses within local subnets"))
- rpv:value("0", translate("No Filter"))
- rpv:value("1", translate("Filter RFC1918/4193"))
- rpv:value("2", translate("Filter Entire Subnet"))
- rpv.rmempty = false
-
- rpn = s1:taboption("advanced", Value, "rebind_interface", translate("Rebind Network Filter:"),
- translate("Network subnets to filter from upstream responses"))
- rpn.template = "cbi/network_netlist"
- rpn.widget = "checkbox"
- rpn.rmempty = true
- rpn.cast = "string"
- rpn.nocreate = true
- rpn:depends({ rebind_protection = 2 })
- rpn:depends({ rebind_protection = 3 })
-
- --DHCP Tab
- dlk = s1:taboption("DHCP", ListValue, "dhcp_link", translate("DHCP Link:"),
- translate("Link to supported programs to load DHCP into DNS"))
- dlk:value("none", translate("No Link"))
- dlk:value("dnsmasq", "dnsmasq")
- dlk:value("odhcpd", "odhcpd")
- dlk.rmempty = false
-
- dp6 = s1:taboption("DHCP", Flag, "dhcp4_slaac6", translate("DHCPv4 to SLAAC:"),
- translate("Use DHCPv4 MAC to discover IP6 hosts SLAAC (EUI64)"))
- dp6.rmempty = false
- dp6:depends({ dhcp_link = "odhcpd" })
-
- dom = s1:taboption("DHCP", Value, "domain", translate("Local Domain:"),
- translate("Domain suffix for this router and DHCP clients"))
- dom.placeholder = "lan"
- dom:depends({ dhcp_link = "none" })
- dom:depends({ dhcp_link = "odhcpd" })
-
- dty = s1:taboption("DHCP", ListValue, "domain_type", translate("Local Domain Type:"),
- translate("How to treat queries of this local domain"))
- dty:value("deny", translate("Ignored"))
- dty:value("refuse", translate("Refused"))
- dty:value("static", translate("Only Local"))
- dty:value("transparent", translate("Also Forwarded"))
- dty:depends({ dhcp_link = "none" })
- dty:depends({ dhcp_link = "odhcpd" })
-
- lfq = s1:taboption("DHCP", ListValue, "add_local_fqdn", translate("LAN DNS:"),
- translate("How to enter the LAN or local network router in DNS"))
- lfq:value("0", translate("No Entry"))
- lfq:value("1", translate("Hostname, Primary Address"))
- lfq:value("2", translate("Hostname, All Addresses"))
- lfq:value("3", translate("Host FQDN, All Addresses"))
- lfq:value("4", translate("Interface FQDN, All Addresses"))
- lfq:depends({ dhcp_link = "none" })
- lfq:depends({ dhcp_link = "odhcpd" })
-
- wfq = s1:taboption("DHCP", ListValue, "add_wan_fqdn", translate("WAN DNS:"),
- translate("Override the WAN side router entry in DNS"))
- wfq:value("0", translate("Use Upstream"))
- wfq:value("1", translate("Hostname, Primary Address"))
- wfq:value("2", translate("Hostname, All Addresses"))
- wfq:value("3", translate("Host FQDN, All Addresses"))
- wfq:value("4", translate("Interface FQDN, All Addresses"))
- wfq:depends({ dhcp_link = "none" })
- wfq:depends({ dhcp_link = "odhcpd" })
-
- exa = s1:taboption("DHCP", ListValue, "add_extra_dns", translate("Extra DNS:"),
- translate("Use extra DNS entries found in /etc/config/dhcp"))
- exa:value("0", translate("Ignore"))
- exa:value("1", translate("Include Network/Hostnames"))
- exa:value("2", translate("Advanced MX/SRV RR"))
- exa:value("3", translate("Advanced CNAME RR"))
- exa:depends({ dhcp_link = "none" })
- exa:depends({ dhcp_link = "odhcpd" })
-
- --TODO: dnsmasq needs to not reference resolve-file and get off port 53.
-
- --Resource Tuning Tab
- ctl = s1:taboption("resource", ListValue, "unbound_control", translate("Unbound Control App:"),
- translate("Enable access for unbound-control"))
- ctl.rmempty = false
- ctl:value("0", translate("No Remote Control"))
- ctl:value("1", translate("Local Host, No Encryption"))
- ctl:value("2", translate("Local Host, Encrypted"))
- ctl:value("3", translate("Local Subnet, Encrypted"))
- ctl:value("4", translate("Local Subnet, Static Encryption"))
-
- pro = s1:taboption("resource", ListValue, "protocol", translate("Recursion Protocol:"),
- translate("Chose the protocol recursion queries leave on"))
- pro:value("default", translate("Default"))
- pro:value("ip4_only", translate("IP4 Only"))
- pro:value("ip6_only", translate("IP6 Only"))
- pro:value("ip6_prefer", translate("IP6 Preferred"))
- pro:value("mixed", translate("IP4 and IP6"))
- pro.rmempty = false
-
- rsc = s1:taboption("resource", ListValue, "resource", translate("Memory Resource:"),
- translate("Use menu System/Processes to observe any memory growth"))
- rsc:value("default", translate("Default"))
- rsc:value("tiny", translate("Tiny"))
- rsc:value("small", translate("Small"))
- rsc:value("medium", translate("Medium"))
- rsc:value("large", translate("Large"))
- rsc.rmempty = false
-
- rsn = s1:taboption("resource", ListValue, "recursion", translate("Recursion Strength:"),
- translate("Recursion activity affects memory growth and CPU load"))
- rsn:value("default", translate("Default"))
- rsn:value("passive", translate("Passive"))
- rsn:value("aggressive", translate("Aggressive"))
- rsn.rmempty = false
-
- qry = s1:taboption("resource", Flag, "query_minimize", translate("Query Minimize:"),
- translate("Break down query components for limited added privacy"))
- qry.rmempty = false
- qry:depends({ recursion = "passive" })
- qry:depends({ recursion = "aggressive" })
-
- qrs = s1:taboption("resource", Flag, "query_min_strict", translate("Strict Minimize:"),
- translate("Strict version of 'query minimize' but it can break DNS"))
- qrs.rmempty = false
- qrs:depends({ query_minimize = true })
-
- ath = s1:taboption("resource", Flag, "prefetch_root", translate("Prefetch Root:"),
- translate("Obtain complete root zone files and install in auth-zone: clause"))
- ath.rmempty = false
-
- eds = s1:taboption("resource", Value, "edns_size", translate("EDNS Size:"),
- translate("Limit extended DNS packet size"))
- eds.datatype = "and(uinteger,min(512),max(4096))"
- eds.rmempty = false
-
- tlm = s1:taboption("resource", Value, "ttl_min", translate("TTL Minimum:"),
- translate("Prevent excessively short cache periods"))
- tlm.datatype = "and(uinteger,min(0),max(600))"
- tlm.rmempty = false
-
- stt = s1:taboption("resource", Flag, "extended_stats", translate("Extended Statistics:"),
- translate("Extended statistics are printed from unbound-control"))
- stt.rmempty = false
-end
-
-
---Trigger Tab, always unconditional
-ag2 = s1:taboption("trigger", Value, "root_age", translate("Root DSKEY Age:"),
- translate("Limit days between RFC5011 copies to reduce flash writes"))
-ag2.datatype = "and(uinteger,min(1),max(99))"
-ag2:value("3", "3")
-ag2:value("9", "9 ("..translate("default")..")")
-ag2:value("12", "12")
-ag2:value("24", "24")
-ag2:value("99", "99 ("..translate("never")..")")
-tgr = s1:taboption("trigger", Value, "trigger_interface", translate("Trigger Networks:"),
- translate("Networks that may trigger Unbound to reload (avoid wan6)"))
-tgr.template = "cbi/network_netlist"
-tgr.widget = "checkbox"
-tgr.rmempty = true
-tgr.cast = "string"
-tgr.nocreate = true
+if (valman == "0") then
+ -- Not in manual configuration mode; show UCI
+ --Basic Tab
+ lsv = s1:taboption("basic", Flag, "localservice",
+ translate("Local Service"),
+ translate("Accept queries only from local subnets"))
+ lsv.rmempty = false
+
+ vld = s1:taboption("basic", Flag, "validator",
+ translate("Enable DNSSEC"),
+ translate("Enable the DNSSEC validator module"))
+ vld.rmempty = false
+
+ nvd = s1:taboption("basic", Flag, "validator_ntp",
+ translate("DNSSEC NTP Fix"),
+ translate("Break the loop where DNSSEC needs NTP and NTP needs DNS"))
+ nvd.optional = true
+ nvd:depends("validator", true)
+
+ prt = s1:taboption("basic", Value, "listen_port",
+ translate("Listening Port"),
+ translate("Choose Unbounds listening port"))
+ prt.datatype = "port"
+ prt.placeholder = "53"
+
+ --Avanced Tab
+ rlh = s1:taboption("advanced", Flag, "rebind_localhost",
+ translate("Filter Localhost Rebind"),
+ translate("Protect against upstream response of 127.0.0.0/8"))
+ rlh.rmempty = false
+
+ rpv = s1:taboption("advanced", ListValue, "rebind_protection",
+ translate("Filter Private Rebind"),
+ translate("Protect against upstream responses within local subnets"))
+ rpv:value("0", translate("No Filter"))
+ rpv:value("1", translate("Filter Private Address"))
+ rpv:value("2", translate("Filter Entire Subnet"))
+ rpv.rmempty = false
+
+ d64 = s1:taboption("advanced", Flag, "dns64", translate("Enable DNS64"),
+ translate("Enable the DNS64 module"))
+ d64.rmempty = false
+
+ pfx = s1:taboption("advanced", Value, "dns64_prefix",
+ translate("DNS64 Prefix"),
+ translate("Prefix for generated DNS64 addresses"))
+ pfx.datatype = "ip6addr"
+ pfx.placeholder = "64:ff9b::/96"
+ pfx.optional = true
+ pfx:depends("dns64", true)
+
+ din = s1:taboption("advanced", DynamicList, "domain_insecure",
+ translate("Domain Insecure"),
+ translate("List domains to bypass checks of DNSSEC"))
+ din:depends("validator", true)
+
+ ag2 = s1:taboption("advanced", Value, "root_age",
+ translate("Root DSKEY Age"),
+ translate("Limit days between RFC5011 copies to reduce flash writes"))
+ ag2.datatype = "and(uinteger,min(1),max(99))"
+ ag2:value("3", "3")
+ ag2:value("9", "9 ("..translate("default")..")")
+ ag2:value("12", "12")
+ ag2:value("24", "24")
+ ag2:value("99", "99 ("..translate("never")..")")
+
+ tgr = s1:taboption("advanced", Value, "trigger_interface",
+ translate("Trigger Networks"),
+ translate("Networks that may trigger Unbound to reload (avoid wan6)"))
+ tgr.template = "cbi/network_netlist"
+ tgr.widget = "checkbox"
+ tgr.rmempty = true
+ tgr.cast = "string"
+ tgr.nocreate = true
+
+ --DHCP Tab
+ dlk = s1:taboption("DHCP", ListValue, "dhcp_link",
+ translate("DHCP Link"),
+ translate("Link to supported programs to load DHCP into DNS"))
+ dlk:value("none", translate("No Link"))
+ dlk:value("dnsmasq", "dnsmasq")
+ dlk:value("odhcpd", "odhcpd")
+ dlk.rmempty = false
+
+ dp6 = s1:taboption("DHCP", Flag, "dhcp4_slaac6",
+ translate("DHCPv4 to SLAAC"),
+ translate("Use DHCPv4 MAC to discover IP6 hosts SLAAC (EUI64)"))
+ dp6.optional = true
+ dp6:depends("dhcp_link", "odhcpd")
+
+ dom = s1:taboption("DHCP", Value, "domain",
+ translate("Local Domain"),
+ translate("Domain suffix for this router and DHCP clients"))
+ dom.placeholder = "lan"
+ dom.optional = true
+ dom:depends("dhcp_link", "none")
+ dom:depends("dhcp_link", "odhcpd")
+
+ dty = s1:taboption("DHCP", ListValue, "domain_type",
+ translate("Local Domain Type"),
+ translate("How to treat queries of this local domain"))
+ dty.optional = true
+ dty:value("deny", translate("Denied (nxdomain)"))
+ dty:value("refuse", translate("Refused"))
+ dty:value("static", translate("Static (local only)"))
+ dty:value("transparent", translate("Transparent (local/global)"))
+ dty:depends("dhcp_link", "none")
+ dty:depends("dhcp_link", "odhcpd")
+
+ lfq = s1:taboption("DHCP", ListValue, "add_local_fqdn",
+ translate("LAN DNS"),
+ translate("How to enter the LAN or local network router in DNS"))
+ lfq.optional = true
+ lfq:value("0", translate("No Entry"))
+ lfq:value("1", translate("Hostname, Primary Address"))
+ lfq:value("2", translate("Hostname, All Addresses"))
+ lfq:value("3", translate("Host FQDN, All Addresses"))
+ lfq:value("4", translate("Interface FQDN, All Addresses"))
+ lfq:depends("dhcp_link", "none")
+ lfq:depends("dhcp_link", "odhcpd")
+
+ wfq = s1:taboption("DHCP", ListValue, "add_wan_fqdn",
+ translate("WAN DNS"),
+ translate("Override the WAN side router entry in DNS"))
+ wfq.optional = true
+ wfq:value("0", translate("Use Upstream"))
+ wfq:value("1", translate("Hostname, Primary Address"))
+ wfq:value("2", translate("Hostname, All Addresses"))
+ wfq:value("3", translate("Host FQDN, All Addresses"))
+ wfq:value("4", translate("Interface FQDN, All Addresses"))
+ wfq:depends("dhcp_link", "none")
+ wfq:depends("dhcp_link", "odhcpd")
+
+ exa = s1:taboption("DHCP", ListValue, "add_extra_dns",
+ translate("Extra DNS"),
+ translate("Use extra DNS entries found in /etc/config/dhcp"))
+ exa.optional = true
+ exa:value("0", translate("Ignore"))
+ exa:value("1", translate("Host Records"))
+ exa:value("2", translate("Host/MX/SRV RR"))
+ exa:value("3", translate("Host/MX/SRV/CNAME RR"))
+ exa:depends("dhcp_link", "none")
+ exa:depends("dhcp_link", "odhcpd")
+
+ --TODO: dnsmasq needs to not reference resolve-file and get off port 53.
+
+ --Resource Tuning Tab
+ ctl = s1:taboption("resource", ListValue, "unbound_control",
+ translate("Unbound Control App"),
+ translate("Enable access for unbound-control"))
+ ctl.rmempty = false
+ ctl:value("0", translate("No Remote Control"))
+ ctl:value("1", translate("Local Host, No Encryption"))
+ ctl:value("2", translate("Local Host, Encrypted"))
+ ctl:value("3", translate("Local Subnet, Encrypted"))
+ ctl:value("4", translate("Local Subnet, Static Encryption"))
+
+ pro = s1:taboption("resource", ListValue, "protocol",
+ translate("Recursion Protocol"),
+ translate("Chose the IP versions used upstream and downstream"))
+ pro:value("default", translate("Default"))
+ pro:value("ip4_only", translate("IP4 Only"))
+ pro:value("ip6_local", translate("IP4 All and IP6 Local"))
+ pro:value("ip6_only", translate("IP6 Only*"))
+ pro:value("ip6_prefer", translate("IP6 Preferred"))
+ pro:value("mixed", translate("IP4 and IP6"))
+ pro.rmempty = false
+
+ rsc = s1:taboption("resource", ListValue, "resource",
+ translate("Memory Resource"),
+ translate("Use menu System/Processes to observe any memory growth"))
+ rsc:value("default", translate("Default"))
+ rsc:value("tiny", translate("Tiny"))
+ rsc:value("small", translate("Small"))
+ rsc:value("medium", translate("Medium"))
+ rsc:value("large", translate("Large"))
+ rsc.rmempty = false
+
+ rsn = s1:taboption("resource", ListValue, "recursion",
+ translate("Recursion Strength"),
+ translate("Recursion activity affects memory growth and CPU load"))
+ rsn:value("default", translate("Default"))
+ rsn:value("passive", translate("Passive"))
+ rsn:value("aggressive", translate("Aggressive"))
+ rsn.rmempty = false
+
+ qry = s1:taboption("resource", Flag, "query_minimize",
+ translate("Query Minimize"),
+ translate("Break down query components for limited added privacy"))
+ qry.optional = true
+ qry:depends("recursion", "passive")
+ qry:depends("recursion", "aggressive")
+
+ qrs = s1:taboption("resource", Flag, "query_min_strict",
+ translate("Strict Minimize"),
+ translate("Strict version of 'query minimize' but it can break DNS"))
+ qrs.optional = true
+ qrs:depends("query_minimize", true)
+
+ eds = s1:taboption("resource", Value, "edns_size",
+ translate("EDNS Size"),
+ translate("Limit extended DNS packet size"))
+ eds.datatype = "and(uinteger,min(512),max(4096))"
+ eds.placeholder = "1280"
+
+ tlm = s1:taboption("resource", Value, "ttl_min",
+ translate("TTL Minimum"),
+ translate("Prevent excessively short cache periods"))
+ tlm.datatype = "and(uinteger,min(0),max(1200))"
+ tlm.placeholder = "120"
+
+ stt = s1:taboption("resource", Flag, "extended_stats",
+ translate("Extended Statistics"),
+ translate("Extended statistics are printed from unbound-control"))
+ stt.rmempty = false
+
+else
+ ag2 = s1:taboption("basic", Value, "root_age",
+ translate("Root DSKEY Age"),
+ translate("Limit days between RFC5011 copies to reduce flash writes"))
+ ag2.datatype = "and(uinteger,min(1),max(99))"
+ ag2:value("3", "3")
+ ag2:value("9", "9 ("..translate("default")..")")
+ ag2:value("12", "12")
+ ag2:value("24", "24")
+ ag2:value("99", "99 ("..translate("never")..")")
+
+ tgr = s1:taboption("basic", Value, "trigger_interface",
+ translate("Trigger Networks"),
+ translate("Networks that may trigger Unbound to reload (avoid wan6)"))
+ tgr.template = "cbi/network_netlist"
+ tgr.widget = "checkbox"
+ tgr.rmempty = true
+ tgr.cast = "string"
+ tgr.nocreate = true
+end
function ena.cfgvalue(self, section)
- return luci.sys.init.enabled("unbound") and self.enabled or self.disabled
+ return sy.init.enabled("unbound") and self.enabled or self.disabled
end
function ena.write(self, section, value)
- if value == "1" then
- luci.sys.init.enable("unbound")
- luci.sys.call("/etc/init.d/unbound start >/dev/null")
- else
- luci.sys.call("/etc/init.d/unbound stop >/dev/null")
- luci.sys.init.disable("unbound")
- end
-
- return Flag.write(self, section, value)
+ if (value == "1") then
+ sy.init.enable("unbound")
+ sy.call("/etc/init.d/unbound start >/dev/null 2>&1")
+
+ else
+ sy.call("/etc/init.d/unbound stop >/dev/null 2>&1")
+ sy.init.disable("unbound")
+ end
+
+
+ return Flag.write(self, section, value)
end
-function m1.on_apply(self)
- function ena.validate(self, value)
- if value ~= "0" then
- luci.sys.call("/etc/init.d/unbound restart >/dev/null 2>&1")
+function m1.on_commit(self)
+ if sy.init.enabled("unbound") then
+ -- Restart Unbound with configuration
+ sy.call("/etc/init.d/unbound restart >/dev/null 2>&1")
+
else
- luci.sys.call("/etc/init.d/unbound stop >/dev/null 2>&1")
+ sy.call("/etc/init.d/unbound stop >/dev/null 2>&1")
end
- end
+end
- -- Restart Unbound with configuration and reload the page (some options hide)
- luci.http.redirect(luci.dispatcher.build_url("admin", "services", "unbound"))
+function m1.on_apply(self)
+ -- reload the page because some options hide
+ ht.redirect(ds.build_url("admin", "services", "unbound", "configure"))
end
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua
index 67d2ec6c6b..6c5e8c23ef 100644
--- a/applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua
@@ -1,28 +1,31 @@
--- Copyright 2016 Eric Luehrsen <ericluehrsen@hotmail.com>
+-- Copyright 2016 Eric Luehrsen <ericluehrsen@gmail.com>
-- Licensed to the public under the Apache License 2.0.
local m4, s4, frm
local filename = "/etc/unbound/unbound_ext.conf"
-local description = translatef("Here you may edit 'forward:' and 'remote-control:' in an extended 'include:'")
-description = description .. " (" .. filename .. ")"
+local fs = require "nixio.fs"
+local ut = require "luci.util"
m4 = SimpleForm("editing", nil)
m4:append(Template("unbound/css-editing"))
m4.submit = translate("Save")
m4.reset = false
-s4 = m4:section(SimpleSection, "Unbound Extended Conf", description)
+s4 = m4:section(SimpleSection, "",
+ translatef(
+ "Edit clauses such as 'forward-zone:' for 'include: " .. filename .. "'"))
+
frm = s4:option(TextValue, "data")
frm.datatype = "string"
frm.rows = 20
function frm.cfgvalue()
- return nixio.fs.readfile(filename) or ""
+ return fs.readfile(filename) or ""
end
function frm.write(self, section, data)
- return nixio.fs.writefile(filename, luci.util.trim(data:gsub("\r\n", "\n")))
+ return fs.writefile(filename, ut.trim(data:gsub("\r\n", "\n")))
end
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua
index 5cfb9c32c1..317c23fda0 100644
--- a/applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua
@@ -1,28 +1,31 @@
--- Copyright 2016 Eric Luehrsen <ericluehrsen@hotmail.com>
+-- Copyright 2016 Eric Luehrsen <ericluehrsen@gmail.com>
-- Licensed to the public under the Apache License 2.0.
local m2, s2, frm
local filename = "/etc/unbound/unbound.conf"
-local description = translatef("Here you may edit raw 'unbound.conf' when you don't use UCI:")
-description = description .. " (" .. filename .. ")"
+local fs = require "nixio.fs"
+local ut = require "luci.util"
m2 = SimpleForm("editing", nil)
m2:append(Template("unbound/css-editing"))
m2.submit = translate("Save")
m2.reset = false
-s2 = m2:section(SimpleSection, "Unbound Conf", description)
+s2 = m2:section(SimpleSection, "",
+ translatef(
+ "Edit '" .. filename .. "' when you do not use UCI."))
+
frm = s2:option(TextValue, "data")
frm.datatype = "string"
frm.rows = 20
function frm.cfgvalue()
- return nixio.fs.readfile(filename) or ""
+ return fs.readfile(filename) or ""
end
function frm.write(self, section, data)
- return nixio.fs.writefile(filename, luci.util.trim(data:gsub("\r\n", "\n")))
+ return fs.writefile(filename, ut.trim(data:gsub("\r\n", "\n")))
end
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua
index d0ac407847..5cef2a67b0 100644
--- a/applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua
@@ -1,28 +1,31 @@
--- Copyright 2016 Eric Luehrsen <ericluehrsen@hotmail.com>
+-- Copyright 2016 Eric Luehrsen <ericluehrsen@gmail.com>
-- Licensed to the public under the Apache License 2.0.
local m3, s3, frm
local filename = "/etc/unbound/unbound_srv.conf"
-local description = translatef("Here you may edit the 'server:' clause in an internal 'include:'")
-description = description .. " (" .. filename .. ")"
+local fs = require "nixio.fs"
+local ut = require "luci.util"
m3 = SimpleForm("editing", nil)
m3:append(Template("unbound/css-editing"))
m3.submit = translate("Save")
m3.reset = false
-s3 = m3:section(SimpleSection, "Unbound Server Conf", description)
+s3 = m3:section(SimpleSection, "",
+ translatef(
+ "Edit 'server:' clause options for 'include: " .. filename .. "'"))
+
frm = s3:option(TextValue, "data")
frm.datatype = "string"
frm.rows = 20
function frm.cfgvalue()
- return nixio.fs.readfile(filename) or ""
+ return fs.readfile(filename) or ""
end
function frm.write(self, section, data)
- return nixio.fs.writefile(filename, luci.util.trim(data:gsub("\r\n", "\n")))
+ return fs.writefile(filename, ut.trim(data:gsub("\r\n", "\n")))
end
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua
new file mode 100644
index 0000000000..f1e1d842a1
--- /dev/null
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua
@@ -0,0 +1,37 @@
+-- Copyright 2016 Eric Luehrsen <ericluehrsen@gmail.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local m6, s6, frm
+local filename = "/etc/config/unbound"
+local fs = require "nixio.fs"
+local ut = require "luci.util"
+
+m6 = SimpleForm("editing", nil)
+m6:append(Template("unbound/css-editing"))
+m6.submit = translate("Save")
+m6.reset = false
+s6 = m6:section(SimpleSection, "",
+ translatef("Edit '" .. filename .. "' "
+ .. "and recipes can be found in OpenWrt "
+ .. "<a href=\"%s\" target=\"_blank\">Guides</a> "
+ .. "and <a href=\"%s\" target=\"_blank\">Github</a>.",
+ "https://openwrt.org/docs/guide-user/services/dns/unbound",
+ "https://github.com/openwrt/packages/blob/master/net/unbound/files/README.md"))
+
+frm = s6:option(TextValue, "data")
+frm.datatype = "string"
+frm.rows = 20
+
+
+function frm.cfgvalue()
+ return fs.readfile(filename) or ""
+end
+
+
+function frm.write(self, section, data)
+ return fs.writefile(filename, ut.trim(data:gsub("\r\n", "\n")))
+end
+
+
+return m6
+
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua
new file mode 100644
index 0000000000..dcaa877fd0
--- /dev/null
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua
@@ -0,0 +1,95 @@
+-- Copyright 2018 Eric Luehrsen <ericluehrsen@gmail.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local sy = require "luci.sys"
+local ds = require "luci.dispatcher"
+local hp = require "luci.http"
+local m7, s7
+local ena, flb, zty, znm, srv, rlv, tlu
+local prt, tlp, tli, url
+
+arg[1] = arg[1] or ""
+m7 = Map("unbound")
+m7.redirect = ds.build_url("admin/services/unbound/zones")
+
+
+if (arg[1] == "") then
+ hp.redirect(m7.redirect)
+ return
+
+else
+ s7 = m7:section(NamedSection, arg[1], "zone",
+ translatef("Directed Zone"),
+ translatef("Edit a forward, stub, or zone-file-cache zone "
+ .. "for Unbound to use instead of recursion."))
+
+ s7.anonymous = true
+ s7.addremove = false
+
+ ena = s7:option(Flag, "enabled", translate("Enabled"),
+ translate("Enable this directed zone"))
+ ena.rmempty = false
+
+ flb = s7:option(Flag, "fallback", translate("Fall Back"),
+ translate("Allow open recursion when record not in zone"))
+ flb.rmempty = false
+
+ zty = s7:option(ListValue, "zone_type", translate("Zone Type"))
+ zty:value("auth_zone", translate("Authoritative (zone file)"))
+ zty:value("stub_zone", translate("Stub (forced recursion)"))
+ zty:value("forward_zone", translate("Forward (simple handoff)"))
+ zty.rmempty = false
+
+ znm = s7:option(DynamicList, "zone_name", translate("Zone Names"),
+ translate("Zone (Domain) names included in this zone combination"))
+ znm.placeholder="new.example.net."
+
+ srv = s7:option(DynamicList, "server", translate("Servers"),
+ translate("Servers for this zone; see README.md for optional form"))
+ srv.placeholder="192.0.2.53"
+
+ rlv = s7:option(Flag, "resolv_conf", translate("Use 'resolv.conf.auto'"),
+ translate("Forward to upstream nameservers (ISP)"))
+ rlv:depends("zone_type", "forward_zone")
+
+ tlu = s7:option(Flag, "tls_upstream", translate("DNS over TLS"),
+ translate("Connect to servers using TLS"))
+ tlu:depends("zone_type", "forward_zone")
+
+ prt = s7:option(Value, "port", translate("Server Port"),
+ translate("Port servers will receive queries on"))
+ prt:depends("tls_upstream", false)
+ prt.datatype = "port"
+ prt.placeholder="53"
+
+ tlp = s7:option(Value, "tls_port", translate("Server TLS Port"),
+ translate("Port servers will receive queries on"))
+ tlp:depends("tls_upstream", true)
+ tlp.datatype = "port"
+ tlp.placeholder="853"
+
+ tli = s7:option(Value, "tls_index", translate("TLS Name Index"),
+ translate("Domain name to verify TLS certificate"))
+ tli:depends("tls_upstream", true)
+ tli.placeholder="dns.example.net"
+
+ url = s7:option(Value, "url_dir", translate("Zone Download URL"),
+ translate("Directory only part of URL"))
+ url:depends("zone_type", "auth_zone")
+ url.placeholder="https://www.example.net/dl/zones/"
+end
+
+
+function m7.on_commit(self)
+ if sy.init.enabled("unbound") then
+ -- Restart Unbound with configuration
+ sy.call("/etc/init.d/unbound restart >/dev/null 2>&1")
+
+ else
+ sy.call("/etc/init.d/unbound stop >/dev/null 2>&1")
+ end
+end
+
+
+return m7
+
diff --git a/applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua b/applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua
new file mode 100644
index 0000000000..3a13c23df9
--- /dev/null
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua
@@ -0,0 +1,232 @@
+-- Copyright 2018 Eric Luehrsen <ericluehrsen@gmail.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local m5, s5
+local ztype, zones, servers, fallback, enabled
+
+local fs = require "nixio.fs"
+local ut = require "luci.util"
+local sy = require "luci.sys"
+local ds = require "luci.dispatcher"
+local resolvfile = "/tmp/resolv.conf.auto"
+local logerr = ut.exec("logread -e 'unbound.*error.*ssl library'")
+
+m5 = Map("unbound")
+s5 = m5:section(TypedSection, "zone", "Zones",
+ translatef("Organize directed forward, stub, and authoritative zones"
+ .. " <a href=\"%s\" target=\"_blank\">(help)</a>.",
+ "https://www.unbound.net/",
+ "https://github.com/openwrt/packages/blob/master/net/unbound/files/README.md"))
+
+s5.addremove = true
+s5.anonymous = true
+s5.sortable = true
+s5.template = "cbi/tblsection"
+s5.extedit = ds.build_url("admin/services/unbound/zones/%s")
+
+ztype = s5:option(DummyValue, "DummyType", translate("Type"))
+ztype.rawhtml = true
+
+zones = s5:option(DummyValue, "DummyZones", translate("Zones"))
+zones.rawhtml = true
+
+servers = s5:option(DummyValue, "DummyServers", translate("Servers"))
+servers.rawhtml = true
+
+fallback = s5:option(Flag, "fallback", translate("Fallback"))
+fallback.rmempty = false
+
+enabled = s5:option(Flag, "enabled", translate("Enable"))
+enabled.rmempty = false
+
+
+if logerr and (#logerr > 0) then
+ logerr = logerr:sub((1 + #logerr - math.min(#logerr, 250)), #logerr)
+ m5.message = translatef( "Note: SSL/TLS library is missing an API. "
+ .. "Please review syslog. >> logread ... " .. logerr )
+end
+
+
+function s5.create(self, section)
+ created = TypedSection.create(self, section)
+end
+
+
+function s5.parse(self, ...)
+ TypedSection.parse(self, ...)
+end
+
+
+function ztype.cfgvalue(self, s)
+ -- Format a meaningful tile for the Zone Type column
+ local itxt = self.map:get(s, "zone_type")
+ local itls = self.map:get(s, "tls_upstream")
+
+
+ if itxt and itxt:match("forward") then
+ if itls and (itls == "1") then
+ return translate("Forward TLS")
+
+ else
+ return translate("Forward")
+ end
+
+ elseif itxt and itxt:match("stub") then
+ return translate("Recurse")
+
+ elseif itxt and itxt:match("auth") then
+ return translate("AXFR")
+
+ else
+ return translate("Undefined")
+ end
+end
+
+
+function zones.cfgvalue(self, s)
+ -- Format a meaningful sentence for the Zones viewed column
+ local xtxt, otxt
+ local itxt = self.map:get(s, "zone_name")
+ local itype = self.map:get(s, "zone_type")
+
+
+ for xtxt in ut.imatch(itxt) do
+ if (xtxt == ".") then
+ -- zone_name lists
+ xtxt = translate("(root)")
+ end
+
+
+ if otxt and (#otxt > 0) then
+ otxt = otxt .. ", <var>%s</var>" % xtxt
+
+ else
+ otxt = "<var>%s</var>" % xtxt
+ end
+ end
+
+
+ if otxt and (#otxt > 0) then
+ if itype and itype:match("forward") then
+ -- from zone_type create a readable hint for the action
+ otxt = translate("accept upstream results for ") .. otxt
+
+ elseif itype and itype:match("stub") then
+ otxt = translate("select recursion for ") .. otxt
+
+ elseif itype and itype:match("auth") then
+ otxt = translate("prefetch zone files for ") .. otxt
+
+ else
+ otxt = translate("unknown action for ") .. otxt
+ end
+
+
+ return otxt
+
+ else
+ return "(empty)"
+ end
+end
+
+
+function servers.cfgvalue(self, s)
+ -- Format a meaningful sentence for the Servers (and URL) column
+ local xtxt, otxt, rtxt, found
+ local itxt = self.map:get(s, "server")
+ local iurl = self.map:get(s, "url_dir")
+ local itype = self.map:get(s, "zone_type")
+ local itls = self.map:get(s, "tls_upstream")
+ local iidx = self.map:get(s, "tls_index")
+ local irslv = self.map:get(s, "resolv_conf")
+
+
+ for xtxt in ut.imatch(itxt) do
+ if otxt and (#otxt > 0) then
+ -- bundle and make pretty the server list
+ otxt = otxt .. ", <var>%s</var>" % xtxt
+
+ else
+ otxt = "<var>%s</var>" % xtxt
+ end
+ end
+
+
+ if otxt and (#otxt > 0) then
+ otxt = translate("use nameservers ") .. otxt
+ end
+
+
+ if otxt and (#otxt > 0)
+ and itls and (itls == "1")
+ and iidx and (#iidx > 0) then
+ -- show TLS certificate name index if provided
+ otxt = otxt .. translatef(
+ " with default certificate for <var>%s</var>", iidx)
+ end
+
+
+ if iurl and (#iurl > 0) and itype and itype:match("auth") then
+ if otxt and (#otxt > 0) then
+ -- include optional URL filed for auth-zone: type
+ otxt = otxt .. translatef(", and try <var>%s</var>", iurl)
+
+ else
+ otxt = translatef("download from <var>%s</var>", iurl)
+ end
+ end
+
+
+ if irslv and (irslv == "1") and itype and itype:match("forward") then
+ for xtxt in ut.imatch(fs.readfile(resolvfile)) do
+ if xtxt:match("nameserver") then
+ found = true
+
+ elseif (found == true) then
+ if rtxt and (#rtxt > 0) then
+ -- fetch name servers from resolv.conf
+ rtxt = rtxt .. ", <var>%s</var>" % xtxt
+
+ else
+ rtxt = "<var>%s</var>" % xtxt
+ end
+
+
+ found = false
+ end
+ end
+
+
+ if otxt and (#otxt > 0) and rtxt and (#rtxt > 0) then
+ otxt = otxt .. translatef(
+ ", and <var>%s</var> entries ", resolvfile) .. rtxt
+
+ elseif rtxt and (#rtxt > 0) then
+ otxt = translatef(
+ "use <var>%s</var> nameservers ", resolvfile) .. rtxt
+ end
+ end
+
+
+ if otxt and (#otxt > 0) then
+ return otxt
+
+ else
+ return "(empty)"
+ end
+end
+
+
+function m5.on_commit(self)
+ if sy.init.enabled("unbound") then
+ -- Restart Unbound with configuration
+ sy.call("/etc/init.d/unbound restart >/dev/null 2>&1")
+
+ else
+ sy.call("/etc/init.d/unbound stop >/dev/null 2>&1")
+ end
+end
+
+
+return m5
+
diff --git a/applications/luci-app-unbound/po/templates/unbound.pot b/applications/luci-app-unbound/po/templates/unbound.pot
new file mode 100644
index 0000000000..661ecc6996
--- /dev/null
+++ b/applications/luci-app-unbound/po/templates/unbound.pot
@@ -0,0 +1,737 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:96
+msgid "(root)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:201
+msgid ", and <var>%s</var> entries"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:172
+msgid ", and try <var>%s</var>"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:78
+msgid "AXFR"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:59
+msgid "Accept queries only from local subnets"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:198
+msgid "Adblock domain list '"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:38
+msgid "Advanced"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:237
+msgid "Aggressive"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:34
+msgid "Allow open recursion when record not in zone"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:38
+msgid "Authoritative (zone file)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:33
+msgid "Basic"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:242
+msgid "Break down query components for limited added privacy"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:69
+msgid "Break the loop where DNSSEC needs NTP and NTP needs DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:56
+msgid "Cache Dump"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:75
+msgid "Choose Unbounds listening port"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:213
+msgid "Chose the IP versions used upstream and downstream"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:56
+msgid "Connect to servers using TLS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:39
+msgid "DHCP"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:131
+msgid "DHCP Link"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:139
+msgid "DHCPv4 to SLAAC"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:55
+msgid "DNS over TLS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:98
+msgid "DNS64 Prefix"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:68
+msgid "DNSSEC NTP Fix"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:214
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:225
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:235
+msgid "Default"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:156
+msgid "Denied (nxdomain)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:22
+msgid "Directed Zone"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:77
+msgid "Directory only part of URL"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:106
+msgid "Domain Insecure"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:72
+msgid "Domain name to verify TLS certificate"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:146
+msgid "Domain suffix for this router and DHCP clients"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:254
+msgid "EDNS Size"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua:14
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua:14
+msgid "Edit '"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua:14
+msgid "Edit 'server:' clause options for 'include:"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:23
+msgid ""
+"Edit a forward, stub, or zone-file-cache zone for Unbound to use instead of "
+"recursion."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua:14
+msgid "Edit clauses such as 'forward-zone:' for 'include:"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:85
+msgid "Edit: Extended"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:82
+msgid "Edit: Server"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:70
+msgid "Edit: UCI"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:77
+msgid "Edit: Unbound"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:39
+msgid "Enable"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:93
+msgid "Enable DNS64"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:63
+msgid "Enable DNSSEC"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:45
+msgid "Enable Unbound"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:203
+msgid "Enable access for unbound-control"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:94
+msgid "Enable the DNS64 module"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:64
+msgid "Enable the DNSSEC validator module"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:46
+msgid "Enable the initialization scripts for Unbound"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:30
+msgid "Enable this directed zone"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:29
+msgid "Enabled"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:266
+msgid "Extended Statistics"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:267
+msgid "Extended statistics are printed from unbound-control"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:188
+msgid "Extra DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:33
+msgid "Fall Back"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:36
+msgid "Fallback"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:65
+msgid "Files"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:90
+msgid "Filter Entire Subnet"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:81
+msgid "Filter Localhost Rebind"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:89
+msgid "Filter Private Address"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:86
+msgid "Filter Private Rebind"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:71
+msgid "Forward"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:40
+msgid "Forward (simple handoff)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:68
+msgid "Forward TLS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:52
+msgid "Forward to upstream nameservers (ISP)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:170
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:182
+msgid "Host FQDN, All Addresses"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:192
+msgid "Host Records"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:193
+msgid "Host/MX/SRV RR"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:194
+msgid "Host/MX/SRV/CNAME RR"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:169
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:181
+msgid "Hostname, All Addresses"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:168
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:180
+msgid "Hostname, Primary Address"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:165
+msgid "How to enter the LAN or local network router in DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:154
+msgid "How to treat queries of this local domain"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:216
+msgid "IP4 All and IP6 Local"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:215
+msgid "IP4 Only"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:219
+msgid "IP4 and IP6"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:217
+msgid "IP6 Only*"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:218
+msgid "IP6 Preferred"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:191
+msgid "Ignore"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:171
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:183
+msgid "Interface FQDN, All Addresses"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:164
+msgid "LAN DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:229
+msgid "Large"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:112
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:273
+msgid "Limit days between RFC5011 copies to reduce flash writes"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:255
+msgid "Limit extended DNS packet size"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:132
+msgid "Link to supported programs to load DHCP into DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:107
+msgid "List domains to bypass checks of DNSSEC"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:74
+msgid "Listening Port"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:50
+msgid "Local Data"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:145
+msgid "Local Domain"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:153
+msgid "Local Domain Type"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:207
+msgid "Local Host, Encrypted"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:206
+msgid "Local Host, No Encryption"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:58
+msgid "Local Service"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:208
+msgid "Local Subnet, Encrypted"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:209
+msgid "Local Subnet, Static Encryption"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:53
+msgid "Local Zones"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:41
+msgid "Log"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:49
+msgid "Manual Conf"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:228
+msgid "Medium"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:223
+msgid "Memory Resource"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:122
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:283
+msgid "Networks that may trigger Unbound to reload (avoid wan6)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:167
+msgid "No Entry"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:88
+msgid "No Filter"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:133
+msgid "No Link"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:205
+msgid "No Remote Control"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:45
+msgid ""
+"Note: SSL/TLS library is missing an API. Please review syslog. >> logread ..."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:16
+msgid ""
+"Organize directed forward, stub, and authoritative zones <a href=\"%s\" "
+"target=\"_blank\">(help)</a>."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:177
+msgid "Override the WAN side router entry in DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:236
+msgid "Passive"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:60
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:66
+msgid "Port servers will receive queries on"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:99
+msgid "Prefix for generated DNS64 addresses"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:261
+msgid "Prevent excessively short cache periods"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:82
+msgid "Protect against upstream response of 127.0.0.0/8"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:87
+msgid "Protect against upstream responses within local subnets"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:241
+msgid "Query Minimize"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:75
+msgid "Recurse"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:212
+msgid "Recursion Protocol"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:233
+msgid "Recursion Strength"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:234
+msgid "Recursion activity affects memory growth and CPU load"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:22
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:22
+msgid "Recursive DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:157
+msgid "Refused"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:40
+msgid "Resource"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:111
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:272
+msgid "Root DSKEY Age"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua:11
+msgid "Save"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:59
+msgid "Server Port"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:65
+msgid "Server TLS Port"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:47
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:33
+msgid "Servers"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:48
+msgid "Servers for this zone; see README.md for optional form"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:96
+msgid "Show: Adblock"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:90
+msgid "Show: DHCP"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:73
+msgid "Show: Unbound"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:50
+msgid "Skip UCI and use /etc/unbound/unbound.conf"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:227
+msgid "Small"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:158
+msgid "Static (local only)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:47
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:59
+msgid "Statistics"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:38
+msgid "Status"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:248
+msgid "Strict Minimize"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:249
+msgid "Strict version of 'query minimize' but it can break DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:39
+msgid "Stub (forced recursion)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:71
+msgid "TLS Name Index"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:260
+msgid "TTL Minimum"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:103
+msgid "This could display more statistics with the unbound-control package."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:170
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:181
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:206
+msgid "This shows '"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:160
+msgid ""
+"This shows Unbound 'cache_dump'. Useful to check if unbound is actually "
+"caching dns entities."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:137
+msgid ""
+"This shows Unbound 'local-data:' entries from default, .conf, or control."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:149
+msgid ""
+"This shows Unbound 'local-zone:' entries from default, .conf, or control."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:125
+msgid "This shows Unbound self reported performance statistics."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:113
+msgid "This shows syslog filtered for events involving Unbound."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:226
+msgid "Tiny"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:159
+msgid "Transparent (local/global)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:121
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:282
+msgid "Trigger Networks"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:27
+msgid "Type"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:26
+msgid "Unbound"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:23
+msgid ""
+"Unbound <a href=\"%s\" target=\"_blank\">(NLnet Labs)</a> is a validating, "
+"recursive, and caching DNS resolver <a href=\"%s\" target=\"_blank\">(help)</"
+"a>."
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:202
+msgid "Unbound Control App"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:81
+msgid "Undefined"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:51
+msgid "Use 'resolv.conf.auto'"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:140
+msgid "Use DHCPv4 MAC to discover IP6 hosts SLAAC (EUI64)"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:179
+msgid "Use Upstream"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:189
+msgid "Use extra DNS entries found in /etc/config/dhcp"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:224
+msgid "Use menu System/Processes to observe any memory growth"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:176
+msgid "WAN DNS"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:44
+msgid "Zone (Domain) names included in this zone combination"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:76
+msgid "Zone Download URL"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:43
+msgid "Zone Names"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:37
+msgid "Zone Type"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:32
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:30
+msgid "Zones"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:112
+msgid "accept upstream results for"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:115
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:276
+msgid "default"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:175
+msgid "download from <var>%s</var>"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:118
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:279
+msgid "never"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:118
+msgid "prefetch zone files for"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:115
+msgid "select recursion for"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:121
+msgid "unknown action for"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:205
+msgid "use <var>%s</var> nameservers"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:156
+msgid "use nameservers"
+msgstr ""
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:164
+msgid "with default certificate for <var>%s</var>"
+msgstr ""
diff --git a/applications/luci-app-unbound/po/zh-cn/unbound.po b/applications/luci-app-unbound/po/zh-cn/unbound.po
new file mode 100644
index 0000000000..a87b74ca78
--- /dev/null
+++ b/applications/luci-app-unbound/po/zh-cn/unbound.po
@@ -0,0 +1,740 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:96
+msgid "(root)"
+msgstr "(根)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:201
+msgid ", and <var>%s</var> entries"
+msgstr ",及 <var>%s</var> 条目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:172
+msgid ", and try <var>%s</var>"
+msgstr ",并尝试 <var>%s</var> "
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:78
+msgid "AXFR"
+msgstr "AXFR"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:59
+msgid "Accept queries only from local subnets"
+msgstr "仅接受来自本地子网的查询"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:198
+msgid "Adblock domain list '"
+msgstr "Adblock 域名列表'"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:38
+msgid "Advanced"
+msgstr "高级"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:237
+msgid "Aggressive"
+msgstr "激进"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:34
+msgid "Allow open recursion when record not in zone"
+msgstr "记录不在区域中时允许递归查询"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:38
+msgid "Authoritative (zone file)"
+msgstr "权威(区域文件)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:33
+msgid "Basic"
+msgstr "基本"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:242
+msgid "Break down query components for limited added privacy"
+msgstr "细分查询组件以增加有限的隐私"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:69
+msgid "Break the loop where DNSSEC needs NTP and NTP needs DNS"
+msgstr "打破 DNSSEC 需要 NTP,NTP 又需要 DNS 的循环"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:56
+msgid "Cache Dump"
+msgstr "缓存转储"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:75
+msgid "Choose Unbounds listening port"
+msgstr "选择 Unbounds 监听端口"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:213
+msgid "Chose the IP versions used upstream and downstream"
+msgstr "选择上游和下游使用的 IP 版本"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:56
+msgid "Connect to servers using TLS"
+msgstr "使用 TLS 连接到服务器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:39
+msgid "DHCP"
+msgstr "DHCP"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:131
+msgid "DHCP Link"
+msgstr "DHCP 链接"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:139
+msgid "DHCPv4 to SLAAC"
+msgstr "DHCPv4 到 SLAAC"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:55
+msgid "DNS over TLS"
+msgstr "DNS over TLS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:98
+msgid "DNS64 Prefix"
+msgstr "DNS64 前缀"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:68
+msgid "DNSSEC NTP Fix"
+msgstr "DNSSEC NTP 修复"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:214
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:225
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:235
+msgid "Default"
+msgstr "默认"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:156
+msgid "Denied (nxdomain)"
+msgstr "否认(nxdomain)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:22
+msgid "Directed Zone"
+msgstr "转移区域"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:77
+msgid "Directory only part of URL"
+msgstr "目录只是 URL 的一部分"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:106
+msgid "Domain Insecure"
+msgstr "域不安全"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:72
+msgid "Domain name to verify TLS certificate"
+msgstr "用于验证 TLS 证书的域名"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:146
+msgid "Domain suffix for this router and DHCP clients"
+msgstr "此路由器和 DHCP 客户端的域名后缀"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:254
+msgid "EDNS Size"
+msgstr "EDNS 大小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua:14
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua:14
+msgid "Edit '"
+msgstr "编辑'"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua:14
+msgid "Edit 'server:' clause options for 'include:"
+msgstr "编辑“server:”子选项,位于'include:"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:23
+msgid ""
+"Edit a forward, stub, or zone-file-cache zone for Unbound to use instead of "
+"recursion."
+msgstr "编辑 Unbound 使用的转发、存根或区域文件缓存区域,而不进行递归查询。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua:14
+msgid "Edit clauses such as 'forward-zone:' for 'include:"
+msgstr "编辑子选项,例如“forward-zone:”,位于'include:"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:85
+msgid "Edit: Extended"
+msgstr "编辑:扩展"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:82
+msgid "Edit: Server"
+msgstr "编辑:服务器"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:70
+msgid "Edit: UCI"
+msgstr "编辑:UCI"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:77
+msgid "Edit: Unbound"
+msgstr "编辑:Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:39
+msgid "Enable"
+msgstr "启用"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:93
+msgid "Enable DNS64"
+msgstr "启用 DNS64"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:63
+msgid "Enable DNSSEC"
+msgstr "启用 DNSSEC"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:45
+msgid "Enable Unbound"
+msgstr "启用 Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:203
+msgid "Enable access for unbound-control"
+msgstr "启用 unbound-control 访问"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:94
+msgid "Enable the DNS64 module"
+msgstr "启用 DNS64 模块"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:64
+msgid "Enable the DNSSEC validator module"
+msgstr "启用 DNSSEC 验证模块"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:46
+msgid "Enable the initialization scripts for Unbound"
+msgstr "启用 Unbound 的初始化脚本"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:30
+msgid "Enable this directed zone"
+msgstr "启用此转移区域"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:29
+msgid "Enabled"
+msgstr "启用"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:266
+msgid "Extended Statistics"
+msgstr "扩展统计"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:267
+msgid "Extended statistics are printed from unbound-control"
+msgstr "扩展统计信息从 unbound-control 打印"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:188
+msgid "Extra DNS"
+msgstr "额外的 DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:33
+msgid "Fall Back"
+msgstr "回退"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:36
+msgid "Fallback"
+msgstr "回退"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:65
+msgid "Files"
+msgstr "文件"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:90
+msgid "Filter Entire Subnet"
+msgstr "过滤整个子网"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:81
+msgid "Filter Localhost Rebind"
+msgstr "过滤本地主机重绑定"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:89
+msgid "Filter Private Address"
+msgstr "过滤私有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:86
+msgid "Filter Private Rebind"
+msgstr "过滤私有地址重绑定"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:71
+msgid "Forward"
+msgstr "转发"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:40
+msgid "Forward (simple handoff)"
+msgstr "转发(简单切换)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:68
+msgid "Forward TLS"
+msgstr "转发 TLS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:52
+msgid "Forward to upstream nameservers (ISP)"
+msgstr "转发到上游名称服务器(ISP)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:170
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:182
+msgid "Host FQDN, All Addresses"
+msgstr "主机 FQDN,所有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:192
+msgid "Host Records"
+msgstr "主机记录"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:193
+msgid "Host/MX/SRV RR"
+msgstr "主机/MX/SRV RR"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:194
+msgid "Host/MX/SRV/CNAME RR"
+msgstr "主机/MX/SRV/CNAME RR"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:169
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:181
+msgid "Hostname, All Addresses"
+msgstr "主机名,所有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:168
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:180
+msgid "Hostname, Primary Address"
+msgstr "主机名,主要地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:165
+msgid "How to enter the LAN or local network router in DNS"
+msgstr "如何在 DNS 中进入 LAN 或本地网络路由器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:154
+msgid "How to treat queries of this local domain"
+msgstr "如何处理此本地域的查询"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:216
+msgid "IP4 All and IP6 Local"
+msgstr "所有 IP4 及本地 IP6"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:215
+msgid "IP4 Only"
+msgstr "仅 IP4"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:219
+msgid "IP4 and IP6"
+msgstr "IP4 及 IP6"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:217
+msgid "IP6 Only*"
+msgstr "仅 IP6*"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:218
+msgid "IP6 Preferred"
+msgstr "首选 IP6"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:191
+msgid "Ignore"
+msgstr "忽视"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:171
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:183
+msgid "Interface FQDN, All Addresses"
+msgstr "接口 FQDN,所有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:164
+msgid "LAN DNS"
+msgstr "局域网 DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:229
+msgid "Large"
+msgstr "大"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:112
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:273
+msgid "Limit days between RFC5011 copies to reduce flash writes"
+msgstr "限制 RFC5011 副本之间的天数,以减少闪存写入"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:255
+msgid "Limit extended DNS packet size"
+msgstr "限制扩展 DNS 数据包大小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:132
+msgid "Link to supported programs to load DHCP into DNS"
+msgstr "链接到支持的程序,以将 DHCP 加载到 DNS 中"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:107
+msgid "List domains to bypass checks of DNSSEC"
+msgstr "列出要绕过 DNSSEC 检查的域名"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:74
+msgid "Listening Port"
+msgstr "监听端口"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:50
+msgid "Local Data"
+msgstr "本地数据"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:145
+msgid "Local Domain"
+msgstr "本地域名"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:153
+msgid "Local Domain Type"
+msgstr "本地域名类型"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:207
+msgid "Local Host, Encrypted"
+msgstr "本地主机,加密"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:206
+msgid "Local Host, No Encryption"
+msgstr "本地主机,无加密"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:58
+msgid "Local Service"
+msgstr "本地服务"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:208
+msgid "Local Subnet, Encrypted"
+msgstr "本地子网,加密"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:209
+msgid "Local Subnet, Static Encryption"
+msgstr "本地子网,静态加密"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:53
+msgid "Local Zones"
+msgstr "本地区域"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:41
+msgid "Log"
+msgstr "日志"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:49
+msgid "Manual Conf"
+msgstr "手动配置"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:228
+msgid "Medium"
+msgstr "介质"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:223
+msgid "Memory Resource"
+msgstr "内存资源"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:122
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:283
+msgid "Networks that may trigger Unbound to reload (avoid wan6)"
+msgstr "可触发 Unbound 重新加载的网络(避免 wan6)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:167
+msgid "No Entry"
+msgstr "无条目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:88
+msgid "No Filter"
+msgstr "无过滤器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:133
+msgid "No Link"
+msgstr "无链接"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:205
+msgid "No Remote Control"
+msgstr "无远程控制"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:45
+msgid ""
+"Note: SSL/TLS library is missing an API. Please review syslog. >> logread ..."
+msgstr "注意:SSL/TLS库缺少 API。请查看 syslog。 >> logread ..."
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:16
+msgid ""
+"Organize directed forward, stub, and authoritative zones <a href=\"%s\" "
+"target=\"_blank\">(help)</a>."
+msgstr ""
+"组织转移转发、存根和权威区域<a href=\"%s\" target=\"_blank\">(帮助)</a>。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:177
+msgid "Override the WAN side router entry in DNS"
+msgstr "覆盖路由器中的 WAN 端 DNS 条目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:236
+msgid "Passive"
+msgstr "被动"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:60
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:66
+msgid "Port servers will receive queries on"
+msgstr "服务器将接收查询的端口"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:99
+msgid "Prefix for generated DNS64 addresses"
+msgstr "生成 DNS64 地址的前缀"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:261
+msgid "Prevent excessively short cache periods"
+msgstr "防止缓存期过短"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:82
+msgid "Protect against upstream response of 127.0.0.0/8"
+msgstr "防止 127.0.0.0/8 的上游响应"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:87
+msgid "Protect against upstream responses within local subnets"
+msgstr "防止本地子网内的上游响应"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:241
+msgid "Query Minimize"
+msgstr "最小化查询"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:75
+msgid "Recurse"
+msgstr "递归"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:212
+msgid "Recursion Protocol"
+msgstr "递归协议"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:233
+msgid "Recursion Strength"
+msgstr "递归强度"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:234
+msgid "Recursion activity affects memory growth and CPU load"
+msgstr "递归活动会增大内存使用和 CPU 负载"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:22
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:22
+msgid "Recursive DNS"
+msgstr "递归 DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:157
+msgid "Refused"
+msgstr "拒绝"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:40
+msgid "Resource"
+msgstr "资源"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:111
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:272
+msgid "Root DSKEY Age"
+msgstr "Root DSKEY 年龄"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua:11
+msgid "Save"
+msgstr "保存"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:59
+msgid "Server Port"
+msgstr "服务器端口"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:65
+msgid "Server TLS Port"
+msgstr "服务器 TLS 端口"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:47
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:33
+msgid "Servers"
+msgstr "服务器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:48
+msgid "Servers for this zone; see README.md for optional form"
+msgstr "该区域的服务器;有关选项格式,请参阅 README.md"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:96
+msgid "Show: Adblock"
+msgstr "显示:Adblock"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:90
+msgid "Show: DHCP"
+msgstr "显示:DHCP"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:73
+msgid "Show: Unbound"
+msgstr "显示:Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:50
+msgid "Skip UCI and use /etc/unbound/unbound.conf"
+msgstr "跳过 UCI 并使用 /etc/unbound/unbound.conf"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:227
+msgid "Small"
+msgstr "小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:158
+msgid "Static (local only)"
+msgstr "静态(仅限本地)"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:47
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:59
+msgid "Statistics"
+msgstr "统计"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:38
+msgid "Status"
+msgstr "状态"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:248
+msgid "Strict Minimize"
+msgstr "严格最小化"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:249
+msgid "Strict version of 'query minimize' but it can break DNS"
+msgstr "严格版本的“最小化查询”,但会破坏 DNS 标准"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:39
+msgid "Stub (forced recursion)"
+msgstr "存根(强制递归)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:71
+msgid "TLS Name Index"
+msgstr "TLS 名称索引"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:260
+msgid "TTL Minimum"
+msgstr "最小 TTL"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:103
+msgid "This could display more statistics with the unbound-control package."
+msgstr "可以使用 unbound-control 包显示更多统计信息。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:170
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:181
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:206
+msgid "This shows '"
+msgstr "显示'"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:160
+msgid ""
+"This shows Unbound 'cache_dump'. Useful to check if unbound is actually "
+"caching dns entities."
+msgstr "显示 Unbound的“cache_dump”。用于检查 unbound 是否实际缓存 dns 实体。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:137
+msgid ""
+"This shows Unbound 'local-data:' entries from default, .conf, or control."
+msgstr "显示来自默认、.conf 或 control 的 Unbound “local-data:”条目。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:149
+msgid ""
+"This shows Unbound 'local-zone:' entries from default, .conf, or control."
+msgstr "显示来自默认、.conf 或 control 的 Unbound “local-zone:”条目。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:125
+msgid "This shows Unbound self reported performance statistics."
+msgstr "显示 Unbound 自我报告的性能统计信息。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:113
+msgid "This shows syslog filtered for events involving Unbound."
+msgstr "显示筛选出的涉及 Unbound 事件的 syslog。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:226
+msgid "Tiny"
+msgstr "小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:159
+msgid "Transparent (local/global)"
+msgstr "透明(本地/全球)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:121
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:282
+msgid "Trigger Networks"
+msgstr "触发网络"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:27
+msgid "Type"
+msgstr "类型"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:26
+msgid "Unbound"
+msgstr "Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:23
+msgid ""
+"Unbound <a href=\"%s\" target=\"_blank\">(NLnet Labs)</a> is a validating, "
+"recursive, and caching DNS resolver <a href=\"%s\" target=\"_blank\">(help)</"
+"a>."
+msgstr ""
+"Unbound <a href=\"%s\" target=\"_blank\">(NLnet Labs)</a>是一个验证、递归和缓"
+"存 DNS 解析器<a href=\"%s\" target=\"_blank\">(帮助)</a>。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:202
+msgid "Unbound Control App"
+msgstr "Unbound 控制应用程序"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:81
+msgid "Undefined"
+msgstr "未定义"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:51
+msgid "Use 'resolv.conf.auto'"
+msgstr "使用“resolv.conf.auto”"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:140
+msgid "Use DHCPv4 MAC to discover IP6 hosts SLAAC (EUI64)"
+msgstr "使用 DHCPv4 MAC 发现 IP6 主机 SLAAC(EUI64)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:179
+msgid "Use Upstream"
+msgstr "使用上游"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:189
+msgid "Use extra DNS entries found in /etc/config/dhcp"
+msgstr "使用 /etc/config/dhcp 中的额外 DNS 条目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:224
+msgid "Use menu System/Processes to observe any memory growth"
+msgstr "使用 系统/进程 菜单观察内存增长"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:176
+msgid "WAN DNS"
+msgstr "WAN DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:44
+msgid "Zone (Domain) names included in this zone combination"
+msgstr "包含在此区域组合中的区域(域)名称"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:76
+msgid "Zone Download URL"
+msgstr "区域下载 URL"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:43
+msgid "Zone Names"
+msgstr "区域名称"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:37
+msgid "Zone Type"
+msgstr "区域类型"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:32
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:30
+msgid "Zones"
+msgstr "区域"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:112
+msgid "accept upstream results for"
+msgstr "接受上游结果"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:115
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:276
+msgid "default"
+msgstr "默认"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:175
+msgid "download from <var>%s</var>"
+msgstr "从 <var>%s</var> 下载"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:118
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:279
+msgid "never"
+msgstr "从不"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:118
+msgid "prefetch zone files for"
+msgstr "预取区域文件,为"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:115
+msgid "select recursion for"
+msgstr "进行递归,为"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:121
+msgid "unknown action for"
+msgstr "未知行为,为"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:205
+msgid "use <var>%s</var> nameservers"
+msgstr "使用 <var>%s</var> 名称服务器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:156
+msgid "use nameservers"
+msgstr "使用名称服务器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:164
+msgid "with default certificate for <var>%s</var>"
+msgstr "使用 <var>%s</var> 的默认证书"
diff --git a/applications/luci-app-unbound/po/zh-tw/unbound.po b/applications/luci-app-unbound/po/zh-tw/unbound.po
new file mode 100644
index 0000000000..b51ad0a800
--- /dev/null
+++ b/applications/luci-app-unbound/po/zh-tw/unbound.po
@@ -0,0 +1,740 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:96
+msgid "(root)"
+msgstr "(根)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:201
+msgid ", and <var>%s</var> entries"
+msgstr ",及 <var>%s</var> 條目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:172
+msgid ", and try <var>%s</var>"
+msgstr ",並嘗試 <var>%s</var> "
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:78
+msgid "AXFR"
+msgstr "AXFR"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:59
+msgid "Accept queries only from local subnets"
+msgstr "僅接受來自本地子網的查詢"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:198
+msgid "Adblock domain list '"
+msgstr "Adblock 域名列表'"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:38
+msgid "Advanced"
+msgstr "高階"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:237
+msgid "Aggressive"
+msgstr "激進"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:34
+msgid "Allow open recursion when record not in zone"
+msgstr "記錄不在區域中時允許遞迴查詢"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:38
+msgid "Authoritative (zone file)"
+msgstr "權威(區域檔案)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:33
+msgid "Basic"
+msgstr "基本"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:242
+msgid "Break down query components for limited added privacy"
+msgstr "細分查詢元件以增加有限的隱私"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:69
+msgid "Break the loop where DNSSEC needs NTP and NTP needs DNS"
+msgstr "打破 DNSSEC 需要 NTP,NTP 又需要 DNS 的迴圈"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:56
+msgid "Cache Dump"
+msgstr "快取轉儲"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:75
+msgid "Choose Unbounds listening port"
+msgstr "選擇 Unbounds 監聽埠"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:213
+msgid "Chose the IP versions used upstream and downstream"
+msgstr "選擇上游和下游使用的 IP 版本"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:56
+msgid "Connect to servers using TLS"
+msgstr "使用 TLS 連線到伺服器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:39
+msgid "DHCP"
+msgstr "DHCP"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:131
+msgid "DHCP Link"
+msgstr "DHCP 連結"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:139
+msgid "DHCPv4 to SLAAC"
+msgstr "DHCPv4 到 SLAAC"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:55
+msgid "DNS over TLS"
+msgstr "DNS over TLS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:98
+msgid "DNS64 Prefix"
+msgstr "DNS64 字首"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:68
+msgid "DNSSEC NTP Fix"
+msgstr "DNSSEC NTP 修復"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:214
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:225
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:235
+msgid "Default"
+msgstr "預設"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:156
+msgid "Denied (nxdomain)"
+msgstr "否認(nxdomain)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:22
+msgid "Directed Zone"
+msgstr "轉移區域"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:77
+msgid "Directory only part of URL"
+msgstr "目錄只是 URL 的一部分"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:106
+msgid "Domain Insecure"
+msgstr "域不安全"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:72
+msgid "Domain name to verify TLS certificate"
+msgstr "用於驗證 TLS 證書的域名"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:146
+msgid "Domain suffix for this router and DHCP clients"
+msgstr "此路由器和 DHCP 客戶端的域名字尾"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:254
+msgid "EDNS Size"
+msgstr "EDNS 大小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua:14
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua:14
+msgid "Edit '"
+msgstr "編輯'"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua:14
+msgid "Edit 'server:' clause options for 'include:"
+msgstr "編輯“server:”子選項,位於'include:"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:23
+msgid ""
+"Edit a forward, stub, or zone-file-cache zone for Unbound to use instead of "
+"recursion."
+msgstr "編輯 Unbound 使用的轉發、存根或區域檔案快取區域,而不進行遞迴查詢。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua:14
+msgid "Edit clauses such as 'forward-zone:' for 'include:"
+msgstr "編輯子選項,例如“forward-zone:”,位於'include:"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:85
+msgid "Edit: Extended"
+msgstr "編輯:擴充套件"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:82
+msgid "Edit: Server"
+msgstr "編輯:伺服器"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:70
+msgid "Edit: UCI"
+msgstr "編輯:UCI"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:77
+msgid "Edit: Unbound"
+msgstr "編輯:Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:39
+msgid "Enable"
+msgstr "啟用"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:93
+msgid "Enable DNS64"
+msgstr "啟用 DNS64"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:63
+msgid "Enable DNSSEC"
+msgstr "啟用 DNSSEC"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:45
+msgid "Enable Unbound"
+msgstr "啟用 Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:203
+msgid "Enable access for unbound-control"
+msgstr "啟用 unbound-control 訪問"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:94
+msgid "Enable the DNS64 module"
+msgstr "啟用 DNS64 模組"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:64
+msgid "Enable the DNSSEC validator module"
+msgstr "啟用 DNSSEC 驗證模組"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:46
+msgid "Enable the initialization scripts for Unbound"
+msgstr "啟用 Unbound 的初始化指令碼"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:30
+msgid "Enable this directed zone"
+msgstr "啟用此轉移區域"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:29
+msgid "Enabled"
+msgstr "啟用"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:266
+msgid "Extended Statistics"
+msgstr "擴充套件統計"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:267
+msgid "Extended statistics are printed from unbound-control"
+msgstr "擴充套件統計資訊從 unbound-control 列印"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:188
+msgid "Extra DNS"
+msgstr "額外的 DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:33
+msgid "Fall Back"
+msgstr "回退"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:36
+msgid "Fallback"
+msgstr "回退"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:65
+msgid "Files"
+msgstr "檔案"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:90
+msgid "Filter Entire Subnet"
+msgstr "過濾整個子網"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:81
+msgid "Filter Localhost Rebind"
+msgstr "過濾本地主機重繫結"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:89
+msgid "Filter Private Address"
+msgstr "過濾私有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:86
+msgid "Filter Private Rebind"
+msgstr "過濾私有地址重繫結"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:71
+msgid "Forward"
+msgstr "轉發"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:40
+msgid "Forward (simple handoff)"
+msgstr "轉發(簡單切換)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:68
+msgid "Forward TLS"
+msgstr "轉發 TLS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:52
+msgid "Forward to upstream nameservers (ISP)"
+msgstr "轉發到上游名稱伺服器(ISP)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:170
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:182
+msgid "Host FQDN, All Addresses"
+msgstr "主機 FQDN,所有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:192
+msgid "Host Records"
+msgstr "主機記錄"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:193
+msgid "Host/MX/SRV RR"
+msgstr "主機/MX/SRV RR"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:194
+msgid "Host/MX/SRV/CNAME RR"
+msgstr "主機/MX/SRV/CNAME RR"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:169
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:181
+msgid "Hostname, All Addresses"
+msgstr "主機名,所有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:168
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:180
+msgid "Hostname, Primary Address"
+msgstr "主機名,主要地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:165
+msgid "How to enter the LAN or local network router in DNS"
+msgstr "如何在 DNS 中進入 LAN 或本地網路路由器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:154
+msgid "How to treat queries of this local domain"
+msgstr "如何處理此本地域的查詢"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:216
+msgid "IP4 All and IP6 Local"
+msgstr "所有 IP4 及本地 IP6"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:215
+msgid "IP4 Only"
+msgstr "僅 IP4"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:219
+msgid "IP4 and IP6"
+msgstr "IP4 及 IP6"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:217
+msgid "IP6 Only*"
+msgstr "僅 IP6*"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:218
+msgid "IP6 Preferred"
+msgstr "首選 IP6"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:191
+msgid "Ignore"
+msgstr "忽視"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:171
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:183
+msgid "Interface FQDN, All Addresses"
+msgstr "介面 FQDN,所有地址"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:164
+msgid "LAN DNS"
+msgstr "區域網 DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:229
+msgid "Large"
+msgstr "大"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:112
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:273
+msgid "Limit days between RFC5011 copies to reduce flash writes"
+msgstr "限制 RFC5011 副本之間的天數,以減少快閃記憶體寫入"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:255
+msgid "Limit extended DNS packet size"
+msgstr "限制擴充套件 DNS 資料包大小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:132
+msgid "Link to supported programs to load DHCP into DNS"
+msgstr "連結到支援的程式,以將 DHCP 載入到 DNS 中"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:107
+msgid "List domains to bypass checks of DNSSEC"
+msgstr "列出要繞過 DNSSEC 檢查的域名"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:74
+msgid "Listening Port"
+msgstr "監聽埠"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:50
+msgid "Local Data"
+msgstr "本地資料"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:145
+msgid "Local Domain"
+msgstr "本地域名"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:153
+msgid "Local Domain Type"
+msgstr "本地域名型別"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:207
+msgid "Local Host, Encrypted"
+msgstr "本地主機,加密"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:206
+msgid "Local Host, No Encryption"
+msgstr "本地主機,無加密"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:58
+msgid "Local Service"
+msgstr "本地服務"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:208
+msgid "Local Subnet, Encrypted"
+msgstr "本地子網,加密"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:209
+msgid "Local Subnet, Static Encryption"
+msgstr "本地子網,靜態加密"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:53
+msgid "Local Zones"
+msgstr "本地區域"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:41
+msgid "Log"
+msgstr "日誌"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:49
+msgid "Manual Conf"
+msgstr "手動配置"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:228
+msgid "Medium"
+msgstr "介質"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:223
+msgid "Memory Resource"
+msgstr "記憶體資源"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:122
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:283
+msgid "Networks that may trigger Unbound to reload (avoid wan6)"
+msgstr "可觸發 Unbound 重新載入的網路(避免 wan6)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:167
+msgid "No Entry"
+msgstr "無條目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:88
+msgid "No Filter"
+msgstr "無過濾器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:133
+msgid "No Link"
+msgstr "無連結"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:205
+msgid "No Remote Control"
+msgstr "無遠端控制"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:45
+msgid ""
+"Note: SSL/TLS library is missing an API. Please review syslog. >> logread ..."
+msgstr "注意:SSL/TLS庫缺少 API。請檢視 syslog。 >> logread ..."
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:16
+msgid ""
+"Organize directed forward, stub, and authoritative zones <a href=\"%s\" "
+"target=\"_blank\">(help)</a>."
+msgstr ""
+"組織轉移轉發、存根和權威區域<a href=\"%s\" target=\"_blank\">(幫助)</a>。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:177
+msgid "Override the WAN side router entry in DNS"
+msgstr "覆蓋路由器中的 WAN 端 DNS 條目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:236
+msgid "Passive"
+msgstr "被動"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:60
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:66
+msgid "Port servers will receive queries on"
+msgstr "伺服器將接收查詢的埠"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:99
+msgid "Prefix for generated DNS64 addresses"
+msgstr "生成 DNS64 地址的字首"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:261
+msgid "Prevent excessively short cache periods"
+msgstr "防止快取期過短"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:82
+msgid "Protect against upstream response of 127.0.0.0/8"
+msgstr "防止 127.0.0.0/8 的上游響應"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:87
+msgid "Protect against upstream responses within local subnets"
+msgstr "防止本地子網內的上游響應"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:241
+msgid "Query Minimize"
+msgstr "最小化查詢"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:75
+msgid "Recurse"
+msgstr "遞迴"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:212
+msgid "Recursion Protocol"
+msgstr "遞迴協議"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:233
+msgid "Recursion Strength"
+msgstr "遞迴強度"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:234
+msgid "Recursion activity affects memory growth and CPU load"
+msgstr "遞迴活動會增大記憶體使用和 CPU 負載"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:22
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:22
+msgid "Recursive DNS"
+msgstr "遞迴 DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:157
+msgid "Refused"
+msgstr "拒絕"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:40
+msgid "Resource"
+msgstr "資源"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:111
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:272
+msgid "Root DSKEY Age"
+msgstr "Root DSKEY 年齡"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/extended.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/manual.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/server.lua:11
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/uciedit.lua:11
+msgid "Save"
+msgstr "儲存"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:59
+msgid "Server Port"
+msgstr "伺服器埠"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:65
+msgid "Server TLS Port"
+msgstr "伺服器 TLS 埠"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:47
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:33
+msgid "Servers"
+msgstr "伺服器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:48
+msgid "Servers for this zone; see README.md for optional form"
+msgstr "該區域的伺服器;有關選項格式,請參閱 README.md"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:96
+msgid "Show: Adblock"
+msgstr "顯示:Adblock"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:90
+msgid "Show: DHCP"
+msgstr "顯示:DHCP"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:73
+msgid "Show: Unbound"
+msgstr "顯示:Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:50
+msgid "Skip UCI and use /etc/unbound/unbound.conf"
+msgstr "跳過 UCI 並使用 /etc/unbound/unbound.conf"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:227
+msgid "Small"
+msgstr "小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:158
+msgid "Static (local only)"
+msgstr "靜態(僅限本地)"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:47
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:59
+msgid "Statistics"
+msgstr "統計"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:38
+msgid "Status"
+msgstr "狀態"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:248
+msgid "Strict Minimize"
+msgstr "嚴格最小化"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:249
+msgid "Strict version of 'query minimize' but it can break DNS"
+msgstr "嚴格版本的“最小化查詢”,但會破壞 DNS 標準"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:39
+msgid "Stub (forced recursion)"
+msgstr "存根(強制遞迴)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:71
+msgid "TLS Name Index"
+msgstr "TLS 名稱索引"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:260
+msgid "TTL Minimum"
+msgstr "最小 TTL"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:103
+msgid "This could display more statistics with the unbound-control package."
+msgstr "可以使用 unbound-control 包顯示更多統計資訊。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:170
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:181
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:206
+msgid "This shows '"
+msgstr "顯示'"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:160
+msgid ""
+"This shows Unbound 'cache_dump'. Useful to check if unbound is actually "
+"caching dns entities."
+msgstr "顯示 Unbound的“cache_dump”。用於檢查 unbound 是否實際快取 dns 實體。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:137
+msgid ""
+"This shows Unbound 'local-data:' entries from default, .conf, or control."
+msgstr "顯示來自預設、.conf 或 control 的 Unbound “local-data:”條目。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:149
+msgid ""
+"This shows Unbound 'local-zone:' entries from default, .conf, or control."
+msgstr "顯示來自預設、.conf 或 control 的 Unbound “local-zone:”條目。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:125
+msgid "This shows Unbound self reported performance statistics."
+msgstr "顯示 Unbound 自我報告的效能統計資訊。"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:113
+msgid "This shows syslog filtered for events involving Unbound."
+msgstr "顯示篩選出的涉及 Unbound 事件的 syslog。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:226
+msgid "Tiny"
+msgstr "小"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:159
+msgid "Transparent (local/global)"
+msgstr "透明(本地/全球)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:121
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:282
+msgid "Trigger Networks"
+msgstr "觸發網路"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:27
+msgid "Type"
+msgstr "型別"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:26
+msgid "Unbound"
+msgstr "Unbound"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:23
+msgid ""
+"Unbound <a href=\"%s\" target=\"_blank\">(NLnet Labs)</a> is a validating, "
+"recursive, and caching DNS resolver <a href=\"%s\" target=\"_blank\">(help)</"
+"a>."
+msgstr ""
+"Unbound <a href=\"%s\" target=\"_blank\">(NLnet Labs)</a>是一個驗證、遞迴和緩"
+"存 DNS 解析器<a href=\"%s\" target=\"_blank\">(幫助)</a>。"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:202
+msgid "Unbound Control App"
+msgstr "Unbound 控制應用程式"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:81
+msgid "Undefined"
+msgstr "未定義"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:51
+msgid "Use 'resolv.conf.auto'"
+msgstr "使用“resolv.conf.auto”"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:140
+msgid "Use DHCPv4 MAC to discover IP6 hosts SLAAC (EUI64)"
+msgstr "使用 DHCPv4 MAC 發現 IP6 主機 SLAAC(EUI64)"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:179
+msgid "Use Upstream"
+msgstr "使用上游"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:189
+msgid "Use extra DNS entries found in /etc/config/dhcp"
+msgstr "使用 /etc/config/dhcp 中的額外 DNS 條目"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:224
+msgid "Use menu System/Processes to observe any memory growth"
+msgstr "使用 系統/程序 選單觀察記憶體增長"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:176
+msgid "WAN DNS"
+msgstr "WAN DNS"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:44
+msgid "Zone (Domain) names included in this zone combination"
+msgstr "包含在此區域組合中的區域(域)名稱"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:76
+msgid "Zone Download URL"
+msgstr "區域下載 URL"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:43
+msgid "Zone Names"
+msgstr "區域名稱"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zone-details.lua:37
+msgid "Zone Type"
+msgstr "區域型別"
+
+#: applications/luci-app-unbound/luasrc/controller/unbound.lua:32
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:30
+msgid "Zones"
+msgstr "區域"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:112
+msgid "accept upstream results for"
+msgstr "接受上游結果"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:115
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:276
+msgid "default"
+msgstr "預設"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:175
+msgid "download from <var>%s</var>"
+msgstr "從 <var>%s</var> 下載"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:118
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua:279
+msgid "never"
+msgstr "從不"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:118
+msgid "prefetch zone files for"
+msgstr "預取區域檔案,為"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:115
+msgid "select recursion for"
+msgstr "進行遞迴,為"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:121
+msgid "unknown action for"
+msgstr "未知行為,為"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:205
+msgid "use <var>%s</var> nameservers"
+msgstr "使用 <var>%s</var> 名稱伺服器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:156
+msgid "use nameservers"
+msgstr "使用名稱伺服器"
+
+#: applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua:164
+msgid "with default certificate for <var>%s</var>"
+msgstr "使用 <var>%s</var> 的預設證書"