summaryrefslogtreecommitdiffhomepage
path: root/modules/luci-base
diff options
context:
space:
mode:
Diffstat (limited to 'modules/luci-base')
-rw-r--r--modules/luci-base/luasrc/controller/admin/index.lua122
-rw-r--r--modules/luci-base/luasrc/controller/admin/uci.lua109
-rw-r--r--modules/luci-base/luasrc/dispatcher.lua92
-rw-r--r--modules/luci-base/luasrc/model/network.lua37
-rw-r--r--modules/luci-base/luasrc/view/admin_uci/changelog.htm66
-rw-r--r--modules/luci-base/luasrc/view/admin_uci/changes.htm45
-rw-r--r--modules/luci-base/luasrc/view/admin_uci/revert.htm33
-rw-r--r--modules/luci-base/luasrc/view/cbi/wireless_modefreq.htm168
-rw-r--r--modules/luci-base/luasrc/view/empty_node_placeholder.htm11
-rw-r--r--modules/luci-base/luasrc/view/lease_status.htm95
-rw-r--r--modules/luci-base/luasrc/view/wifi_assoclist.htm82
-rw-r--r--modules/luci-base/po/ca/base.po17
-rw-r--r--modules/luci-base/po/cs/base.po17
-rw-r--r--modules/luci-base/po/de/base.po17
-rw-r--r--modules/luci-base/po/el/base.po17
-rw-r--r--modules/luci-base/po/en/base.po17
-rw-r--r--modules/luci-base/po/es/base.po17
-rw-r--r--modules/luci-base/po/fr/base.po17
-rw-r--r--modules/luci-base/po/he/base.po17
-rw-r--r--modules/luci-base/po/hu/base.po17
-rw-r--r--modules/luci-base/po/it/base.po17
-rw-r--r--modules/luci-base/po/ja/base.po17
-rw-r--r--modules/luci-base/po/ko/base.po17
-rw-r--r--modules/luci-base/po/ms/base.po17
-rw-r--r--modules/luci-base/po/no/base.po17
-rw-r--r--modules/luci-base/po/pl/base.po17
-rw-r--r--modules/luci-base/po/pt-br/base.po17
-rw-r--r--modules/luci-base/po/pt/base.po17
-rw-r--r--modules/luci-base/po/ro/base.po17
-rw-r--r--modules/luci-base/po/ru/base.po17
-rw-r--r--modules/luci-base/po/sk/base.po17
-rw-r--r--modules/luci-base/po/sv/base.po17
-rw-r--r--modules/luci-base/po/templates/base.pot17
-rw-r--r--modules/luci-base/po/tr/base.po17
-rw-r--r--modules/luci-base/po/uk/base.po17
-rw-r--r--modules/luci-base/po/vi/base.po17
-rw-r--r--modules/luci-base/po/zh-cn/base.po17
-rw-r--r--modules/luci-base/po/zh-tw/base.po17
38 files changed, 1283 insertions, 36 deletions
diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua
new file mode 100644
index 0000000000..7e0a207437
--- /dev/null
+++ b/modules/luci-base/luasrc/controller/admin/index.lua
@@ -0,0 +1,122 @@
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.controller.admin.index", package.seeall)
+
+function index()
+ function toplevel_page(page, preflookup, preftarget)
+ if preflookup and preftarget then
+ if lookup(preflookup) then
+ page.target = preftarget
+ end
+ end
+
+ if not page.target then
+ page.target = firstchild()
+ end
+ end
+
+ local uci = require("luci.model.uci").cursor()
+
+ local root = node()
+ if not root.target then
+ root.target = alias("admin")
+ root.index = true
+ end
+
+ local page = node("admin")
+
+ page.title = _("Administration")
+ page.order = 10
+ page.sysauth = "root"
+ page.sysauth_authenticator = "htmlauth"
+ page.ucidata = true
+ page.index = true
+ page.target = firstnode()
+
+ -- Empty menu tree to be populated by addons and modules
+
+ page = node("admin", "status")
+ page.title = _("Status")
+ page.order = 10
+ page.index = true
+ -- overview is from mod-admin-full
+ toplevel_page(page, "admin/status/overview", alias("admin", "status", "overview"))
+
+ page = node("admin", "system")
+ page.title = _("System")
+ page.order = 20
+ page.index = true
+ -- system/system is from mod-admin-full
+ toplevel_page(page, "admin/system/system", alias("admin", "system", "system"))
+
+ -- Only used if applications add items
+ page = node("admin", "services")
+ page.title = _("Services")
+ page.order = 40
+ page.index = true
+ toplevel_page(page, false, false)
+
+ -- Even for mod-admin-full network just uses first submenu item as landing
+ page = node("admin", "network")
+ page.title = _("Network")
+ page.order = 50
+ page.index = true
+ toplevel_page(page, false, false)
+
+ if nixio.fs.access("/etc/config/dhcp") then
+ page = entry({"admin", "dhcplease_status"}, call("lease_status"), nil)
+ page.leaf = true
+ end
+
+ local has_wifi = false
+
+ uci:foreach("wireless", "wifi-device",
+ function(s)
+ has_wifi = true
+ return false
+ end)
+
+ if has_wifi then
+ page = entry({"admin", "wireless_assoclist"}, call("wifi_assoclist"), nil)
+ page.leaf = true
+ end
+
+ -- Logout is last
+ entry({"admin", "logout"}, call("action_logout"), _("Logout"), 999)
+end
+
+function action_logout()
+ local dsp = require "luci.dispatcher"
+ local utl = require "luci.util"
+ local sid = dsp.context.authsession
+
+ if sid then
+ utl.ubus("session", "destroy", { ubus_rpc_session = sid })
+
+ luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
+ sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
+ })
+ end
+
+ luci.http.redirect(dsp.build_url())
+end
+
+
+function lease_status()
+ local s = require "luci.tools.status"
+
+ luci.http.prepare_content("application/json")
+ luci.http.write('[')
+ luci.http.write_json(s.dhcp_leases())
+ luci.http.write(',')
+ luci.http.write_json(s.dhcp6_leases())
+ luci.http.write(']')
+end
+
+function wifi_assoclist()
+ local s = require "luci.tools.status"
+
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(s.wifi_assoclist())
+end
diff --git a/modules/luci-base/luasrc/controller/admin/uci.lua b/modules/luci-base/luasrc/controller/admin/uci.lua
new file mode 100644
index 0000000000..1d955dd982
--- /dev/null
+++ b/modules/luci-base/luasrc/controller/admin/uci.lua
@@ -0,0 +1,109 @@
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.controller.admin.uci", package.seeall)
+
+function index()
+ local redir = luci.http.formvalue("redir", true)
+ or table.concat(luci.dispatcher.context.request, "/")
+
+ entry({"admin", "uci"}, nil, _("Configuration"))
+ entry({"admin", "uci", "changes"}, post_on({ trigger_apply = true }, "action_changes"), _("Changes"), 40).query = {redir=redir}
+ entry({"admin", "uci", "revert"}, post("action_revert"), _("Revert"), 30).query = {redir=redir}
+
+ local node
+ local authen = function(checkpass, allowed_users)
+ return "root", luci.http.formvalue("sid")
+ end
+
+ node = entry({"admin", "uci", "apply_rollback"}, post("action_apply_rollback"), nil)
+ node.cors = true
+ node.sysauth_authenticator = authen
+
+ node = entry({"admin", "uci", "apply_unchecked"}, post("action_apply_unchecked"), nil)
+ node.cors = true
+ node.sysauth_authenticator = authen
+
+ node = entry({"admin", "uci", "confirm"}, call("action_confirm"), nil)
+ node.cors = true
+ node.sysauth = false
+end
+
+
+function action_changes()
+ local uci = require "luci.model.uci"
+ local changes = uci:changes()
+
+ luci.template.render("admin_uci/changes", {
+ changes = next(changes) and changes,
+ timeout = timeout,
+ trigger_apply = luci.http.formvalue("trigger_apply") and true or false
+ })
+end
+
+function action_revert()
+ local uci = require "luci.model.uci"
+ local changes = uci:changes()
+
+ -- Collect files to be reverted
+ local r, tbl
+ for r, tbl in pairs(changes) do
+ uci:revert(r)
+ end
+
+ luci.template.render("admin_uci/revert", {
+ changes = next(changes) and changes,
+ trigger_revert = true
+ })
+end
+
+
+local function ubus_state_to_http(errstr)
+ local map = {
+ ["Invalid command"] = 400,
+ ["Invalid argument"] = 400,
+ ["Method not found"] = 404,
+ ["Entry not found"] = 404,
+ ["No data"] = 204,
+ ["Permission denied"] = 403,
+ ["Timeout"] = 504,
+ ["Not supported"] = 500,
+ ["Unknown error"] = 500,
+ ["Connection failed"] = 503
+ }
+
+ local code = map[errstr] or 200
+ local msg = errstr or "OK"
+
+ luci.http.status(code, msg)
+
+ if code ~= 204 then
+ luci.http.prepare_content("text/plain")
+ luci.http.write(msg)
+ end
+end
+
+function action_apply_rollback()
+ local uci = require "luci.model.uci"
+ local token, errstr = uci:apply(true)
+ if token then
+ luci.http.prepare_content("application/json")
+ luci.http.write_json({ token = token })
+ else
+ ubus_state_to_http(errstr)
+ end
+end
+
+function action_apply_unchecked()
+ local uci = require "luci.model.uci"
+ local _, errstr = uci:apply(false)
+ ubus_state_to_http(errstr)
+end
+
+function action_confirm()
+ local uci = require "luci.model.uci"
+ local token = luci.http.formvalue("token")
+ local _, errstr = uci:confirm(token)
+ ubus_state_to_http(errstr)
+end
diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua
index 6cf2712eb4..8b9003d207 100644
--- a/modules/luci-base/luasrc/dispatcher.lua
+++ b/modules/luci-base/luasrc/dispatcher.lua
@@ -724,32 +724,82 @@ end
-- Subdispatchers --
-function _firstchild()
- local path = { unpack(context.path) }
- local name = table.concat(path, ".")
- local node = context.treecache[name]
-
- local lowest
- if node and node.nodes and next(node.nodes) then
- local k, v
- for k, v in pairs(node.nodes) do
- if not lowest or
- (v.order or 100) < (node.nodes[lowest].order or 100)
- then
- lowest = k
- end
- end
- end
+function _find_eligible_node(root, prefix, deep, types, descend)
+ local _, cur_name, cur_node
+ local childs = { }
+
+ for cur_name, cur_node in pairs(root.nodes) do
+ childs[#childs+1] = {
+ node = cur_node,
+ name = cur_name,
+ order = cur_node.order or 100
+ }
+ end
+
+ table.sort(childs, function(a, b)
+ if a.order == b.order then
+ return a.name < b.name
+ else
+ return a.order < b.order
+ end
+ end)
+
+ if not root.leaf and deep ~= nil then
+ local sub_path = { unpack(prefix) }
+
+ if deep == false then
+ deep = nil
+ end
+
+ for _, cur_node in ipairs(childs) do
+ sub_path[#prefix+1] = cur_node.name
+
+ local res_path = _find_eligible_node(cur_node.node, sub_path,
+ deep, types, true)
+
+ if res_path then
+ return res_path
+ end
+ end
+ end
- assert(lowest ~= nil,
- "The requested node contains no childs, unable to redispatch")
+ if descend and
+ (not types or
+ (type(root.target) == "table" and
+ util.contains(types, root.target.type)))
+ then
+ return prefix
+ end
+end
+
+function _find_node(recurse, types)
+ local path = { unpack(context.path) }
+ local name = table.concat(path, ".")
+ local node = context.treecache[name]
+
+ path = _find_eligible_node(node, path, recurse, types)
- path[#path+1] = lowest
- dispatch(path)
+ if path then
+ dispatch(path)
+ else
+ require "luci.template".render("empty_node_placeholder")
+ end
+end
+
+function _firstchild()
+ return _find_node(false, nil)
end
function firstchild()
- return { type = "firstchild", target = _firstchild }
+ return { type = "firstchild", target = _firstchild }
+end
+
+function _firstnode()
+ return _find_node(true, { "cbi", "form", "template", "arcombine" })
+end
+
+function firstnode()
+ return { type = "firstnode", target = _firstnode }
end
function alias(...)
diff --git a/modules/luci-base/luasrc/model/network.lua b/modules/luci-base/luasrc/model/network.lua
index cce559aab1..7f7397032f 100644
--- a/modules/luci-base/luasrc/model/network.lua
+++ b/modules/luci-base/luasrc/model/network.lua
@@ -813,6 +813,7 @@ function del_wifinet(self, net)
end
function get_status_by_route(self, addr, mask)
+ local route_statuses = { }
local _, object
for _, object in ipairs(utl.ubus()) do
local net = object:match("^network%.interface%.(.+)")
@@ -822,12 +823,14 @@ function get_status_by_route(self, addr, mask)
local rt
for _, rt in ipairs(s.route) do
if not rt.table and rt.target == addr and rt.mask == mask then
- return net, s
+ route_statuses[net] = s
end
end
end
end
end
+
+ return route_statuses
end
function get_status_by_address(self, addr)
@@ -856,24 +859,28 @@ function get_status_by_address(self, addr)
end
end
-function get_wannet(self)
- local net, stat = self:get_status_by_route("0.0.0.0", 0)
- return net and network(net, stat.proto)
-end
+function get_wan_networks(self)
+ local k, v
+ local wan_nets = { }
+ local route_statuses = self:get_status_by_route("0.0.0.0", 0)
-function get_wandev(self)
- local _, stat = self:get_status_by_route("0.0.0.0", 0)
- return stat and interface(stat.l3_device or stat.device)
-end
+ for k, v in pairs(route_statuses) do
+ wan_nets[#wan_nets+1] = network(k, v.proto)
+ end
-function get_wan6net(self)
- local net, stat = self:get_status_by_route("::", 0)
- return net and network(net, stat.proto)
+ return wan_nets
end
-function get_wan6dev(self)
- local _, stat = self:get_status_by_route("::", 0)
- return stat and interface(stat.l3_device or stat.device)
+function get_wan6_networks(self)
+ local k, v
+ local wan6_nets = { }
+ local route_statuses = self:get_status_by_route("::", 0)
+
+ for k, v in pairs(route_statuses) do
+ wan6_nets[#wan6_nets+1] = network(k, v.proto)
+ end
+
+ return wan6_nets
end
function get_switch_topologies(self)
diff --git a/modules/luci-base/luasrc/view/admin_uci/changelog.htm b/modules/luci-base/luasrc/view/admin_uci/changelog.htm
new file mode 100644
index 0000000000..8a162c88b6
--- /dev/null
+++ b/modules/luci-base/luasrc/view/admin_uci/changelog.htm
@@ -0,0 +1,66 @@
+<%#
+ Copyright 2010 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<% export("uci_changelog", function(changes) -%>
+<div class="cbi-section">
+ <strong><%:Legend:%></strong>
+ <div class="uci-change-legend">
+ <div class="uci-change-legend-label"><ins>&#160;</ins> <%:Section added%></div>
+ <div class="uci-change-legend-label"><del>&#160;</del> <%:Section removed%></div>
+ <div class="uci-change-legend-label"><var><ins>&#160;</ins></var> <%:Option changed%></div>
+ <div class="uci-change-legend-label"><var><del>&#160;</del></var> <%:Option removed%></div>
+ <br style="clear:both" />
+ </div>
+ <br />
+
+ <div class="uci-change-list"><%
+ local util = luci.util
+ local tpl = {
+ ["add-3"] = "<ins>uci add %0 <strong>%3</strong> # =%2</ins>",
+ ["set-3"] = "<ins>uci set %0.<strong>%2</strong></ins>=%3",
+ ["set-4"] = "<var><ins>uci set %0.%2.%3=<strong>%4</strong></ins></var>",
+ ["remove-2"] = "<del>uci del %0.<strong>%2</strong></del>",
+ ["remove-3"] = "<var><del>uci del %0.%2.<strong>%3</strong></del></var>",
+ ["order-3"] = "<var>uci reorder %0.%2=<strong>%3</strong></var>",
+ ["list-add-4"] = "<var><ins>uci add_list %0.%2.%3=<strong>%4</strong></ins></var>",
+ ["list-del-4"] = "<var><del>uci del_list %0.%2.%3=<strong>%4</strong></del></var>",
+ ["rename-3"] = "<var>uci rename %0.%2=<strong>%3</strong></var>",
+ ["rename-4"] = "<var>uci rename %0.%2.%3=<strong>%4</strong></var>"
+ }
+
+ local conf, deltas
+ for conf, deltas in util.kspairs(changes) do
+ write("<h3># /etc/config/%s</h3>" % conf)
+
+ local _, delta, added
+ for _, delta in pairs(deltas) do
+ local t = tpl["%s-%d" %{ delta[1], #delta }]
+
+ write(t:gsub("%%(%d)", function(n)
+ if n == "0" then
+ return conf
+ elseif n == "2" then
+ if added and delta[2] == added[1] then
+ return "@%s[-1]" % added[2]
+ else
+ return delta[2]
+ end
+ elseif n == "4" then
+ return util.shellquote(delta[4])
+ else
+ return delta[tonumber(n)]
+ end
+ end))
+
+ if delta[1] == "add" then
+ added = { delta[2], delta[3] }
+ end
+ end
+
+ write("<br />")
+ end
+ %></div>
+</div>
+<%- end) %>
diff --git a/modules/luci-base/luasrc/view/admin_uci/changes.htm b/modules/luci-base/luasrc/view/admin_uci/changes.htm
new file mode 100644
index 0000000000..43bd7c23fb
--- /dev/null
+++ b/modules/luci-base/luasrc/view/admin_uci/changes.htm
@@ -0,0 +1,45 @@
+<%#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<%-
+ local node, redir_url = luci.dispatcher.lookup(luci.http.formvalue("redir"))
+ export("redirect", redir_url or url("admin/uci/changes"))
+
+ include("admin_uci/changelog")
+-%>
+
+<h2 name="content"><%:Configuration%> / <%:Changes%></h2>
+
+<% if changes then %>
+ <%- uci_changelog(changes) -%>
+<% else %>
+ <p><strong><%:There are no pending changes!%></strong></p>
+<% end %>
+
+<div class="alert-message" id="cbi_apply_status" style="display:none"></div>
+
+<div class="cbi-page-actions">
+ <% if redir_url then %>
+ <form method="get" action="<%=luci.util.pcdata(redir_url)%>">
+ <input class="cbi-button cbi-button-link" type="submit" value="<%:Back%>" />
+ </form>
+ <% end %>
+
+ <form method="post" action="<%=url("admin/uci/changes")%>">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
+ <input class="cbi-button cbi-button-save" type="submit" name="trigger_apply" value="<%:Save & Apply%>" />
+ </form>
+ <form method="post" action="<%=url("admin/uci/revert")%>">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
+ <input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" />
+ </form>
+</div>
+
+<%+footer%>
diff --git a/modules/luci-base/luasrc/view/admin_uci/revert.htm b/modules/luci-base/luasrc/view/admin_uci/revert.htm
new file mode 100644
index 0000000000..d8fd3de01e
--- /dev/null
+++ b/modules/luci-base/luasrc/view/admin_uci/revert.htm
@@ -0,0 +1,33 @@
+<%#
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<%-
+ local node, redir_url = luci.dispatcher.lookup(luci.http.formvalue("redir"))
+ export("redirect", redir_url or url("admin/uci/changes"))
+
+ include("admin_uci/changelog")
+-%>
+
+<h2 name="content"><%:Configuration%> / <%:Revert%></h2>
+
+<% if changes then %>
+ <p><strong><%:The following changes have been reverted%>:</strong></p>
+ <%- uci_changelog(changes) -%>
+<% else %>
+ <p><strong><%:There are no pending changes to revert!%></strong></p>
+<% end %>
+
+<% if redir_url then %>
+ <div class="cbi-page-actions">
+ <form class="inline" method="get" action="<%=luci.util.pcdata(redir_url)%>">
+ <input class="cbi-button cbi-button-link" style="margin:0" type="submit" value="<%:Back%>" />
+ </form>
+ </div>
+<% end %>
+
+<%+footer%>
diff --git a/modules/luci-base/luasrc/view/cbi/wireless_modefreq.htm b/modules/luci-base/luasrc/view/cbi/wireless_modefreq.htm
new file mode 100644
index 0000000000..ebb02e489b
--- /dev/null
+++ b/modules/luci-base/luasrc/view/cbi/wireless_modefreq.htm
@@ -0,0 +1,168 @@
+<%+cbi/valueheader%>
+
+<script type="text/javascript">//<![CDATA[
+ var freqlist = <%= luci.http.write_json(self.iwinfo.freqlist) %>;
+ var hwmodes = <%= luci.http.write_json(self.iwinfo.hwmodelist or {}) %>;
+ var htmodes = <%= luci.http.write_json(self.iwinfo.htmodelist) %>;
+
+ var channels = {
+ '11g': [
+ 'auto', 'auto', true
+ ],
+ '11a': [
+ 'auto', 'auto', true
+ ]
+ };
+
+ for (var i = 0; i < freqlist.length; i++)
+ channels[(freqlist[i].mhz > 2484) ? '11a' : '11g'].push(
+ freqlist[i].channel,
+ '%d (%d MHz)'.format(freqlist[i].channel, freqlist[i].mhz),
+ !freqlist[i].restricted
+ );
+
+ var modes = [
+ '', 'Legacy', true,
+ 'n', 'N', hwmodes.n,
+ 'ac', 'AC', hwmodes.ac
+ ];
+
+ var htmodes = {
+ '': [
+ '', '-', true
+ ],
+ 'n': [
+ 'HT20', '20 MHz', htmodes.HT20,
+ 'HT40', '40 MHz', htmodes.HT40
+ ],
+ 'ac': [
+ 'VHT20', '20 MHz', htmodes.VHT20,
+ 'VHT40', '40 MHz', htmodes.VHT40,
+ 'VHT80', '80 MHz', htmodes.VHT80,
+ 'VHT160', '160 MHz', htmodes.VHT160
+ ]
+ };
+
+ var bands = {
+ '': [
+ '11g', '2.4 GHz', (channels['11g'].length > 3),
+ '11a', '5 GHz', (channels['11a'].length > 3)
+ ],
+ 'n': [
+ '11g', '2.4 GHz', (channels['11g'].length > 3),
+ '11a', '5 GHz', (channels['11a'].length > 3)
+ ],
+ 'ac': [
+ '11a', '5 GHz', true
+ ]
+ };
+
+ function cbi_set_values(sel, vals)
+ {
+ if (sel.vals)
+ sel.vals.selected = sel.selectedIndex;
+
+ while (sel.options[0])
+ sel.remove(0);
+
+ for (var i = 0; vals && i < vals.length; i += 3)
+ {
+ if (!vals[i+2])
+ continue;
+
+ var opt = document.createElement('option');
+ opt.value = vals[i+0];
+ opt.text = vals[i+1];
+
+ sel.add(opt);
+ }
+
+ if (!isNaN(vals.selected))
+ sel.selectedIndex = vals.selected;
+
+ sel.parentNode.style.display = (sel.options.length <= 1) ? 'none' : '';
+ sel.vals = vals;
+ }
+
+ function cbi_toggle_wifi_mode(id)
+ {
+ cbi_toggle_wifi_htmode(id);
+ cbi_toggle_wifi_band(id);
+ }
+
+ function cbi_toggle_wifi_htmode(id)
+ {
+ var mode = document.getElementById(id + '.mode');
+ var bwdt = document.getElementById(id + '.htmode');
+
+ cbi_set_values(bwdt, htmodes[mode.value]);
+ }
+
+ function cbi_toggle_wifi_band(id)
+ {
+ var mode = document.getElementById(id + '.mode');
+ var band = document.getElementById(id + '.band');
+
+ cbi_set_values(band, bands[mode.value]);
+ cbi_toggle_wifi_channel(id);
+ }
+
+ function cbi_toggle_wifi_channel(id)
+ {
+ var band = document.getElementById(id + '.band');
+ var chan = document.getElementById(id + '.channel');
+
+ cbi_set_values(chan, channels[band.value]);
+ }
+
+ function cbi_init_wifi(id)
+ {
+ var mode = document.getElementById(id + '.mode');
+ var band = document.getElementById(id + '.band');
+ var chan = document.getElementById(id + '.channel');
+ var bwdt = document.getElementById(id + '.htmode');
+
+ cbi_set_values(mode, modes);
+
+ if (/VHT20|VHT40|VHT80|VHT160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
+ mode.value = 'ac';
+ else if (/HT20|HT40/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
+ mode.value = 'n';
+ else
+ mode.value = '';
+
+ cbi_toggle_wifi_mode(id);
+
+ if (/a/.test(<%= luci.http.write_json(self.map:get(section, "hwmode")) %>))
+ band.value = '11a';
+ else
+ band.value = '11g';
+
+ cbi_toggle_wifi_band(id);
+
+ bwdt.value = <%= luci.http.write_json(self.map:get(section, "htmode")) %>;
+ chan.value = <%= luci.http.write_json(self.map:get(section, "channel")) %>;
+ }
+//]]></script>
+
+<label style="float:left; margin-right:3px">
+ <%:Mode%><br />
+ <select style="width:auto" id="<%= cbid %>.mode" name="<%= cbid %>.mode" onchange="cbi_toggle_wifi_mode('<%= cbid %>')"></select>
+</label>
+<label style="float:left; margin-right:3px">
+ <%:Band%><br />
+ <select style="width:auto" id="<%= cbid %>.band" name="<%= cbid %>.band" onchange="cbi_toggle_wifi_band('<%= cbid %>')"></select>
+</label>
+<label style="float:left; margin-right:3px">
+ <%:Channel%><br />
+ <select style="width:auto" id="<%= cbid %>.channel" name="<%= cbid %>.channel"></select>
+</label>
+<label style="float:left; margin-right:3px">
+ <%:Width%><br />
+ <select style="width:auto" id="<%= cbid %>.htmode" name="<%= cbid %>.htmode"></select>
+</label>
+<br style="clear:left" />
+
+<script type="text/javascript">cbi_init_wifi('<%= cbid %>');</script>
+
+<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/empty_node_placeholder.htm b/modules/luci-base/luasrc/view/empty_node_placeholder.htm
new file mode 100644
index 0000000000..b7e276b960
--- /dev/null
+++ b/modules/luci-base/luasrc/view/empty_node_placeholder.htm
@@ -0,0 +1,11 @@
+<%#
+ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2018 Daniel F. Dickinson <cshored@thecshore.com>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<p>Component not present.</p>
+
+<%+footer%>
diff --git a/modules/luci-base/luasrc/view/lease_status.htm b/modules/luci-base/luasrc/view/lease_status.htm
new file mode 100644
index 0000000000..15b6b6908e
--- /dev/null
+++ b/modules/luci-base/luasrc/view/lease_status.htm
@@ -0,0 +1,95 @@
+<script type="text/javascript">//<![CDATA[
+ XHR.poll(5, '<%=url('admin/dhcplease_status')%>', null,
+ function(x, st)
+ {
+ var tb = document.getElementById('lease_status_table');
+ if (st && st[0] && tb)
+ {
+ var rows = [];
+
+ for (var i = 0; i < st[0].length; i++)
+ {
+ var timestr;
+
+ if (st[0][i].expires === false)
+ timestr = '<em><%:unlimited%></em>';
+ else if (st[0][i].expires <= 0)
+ timestr = '<em><%:expired%></em>';
+ else
+ timestr = String.format('%t', st[0][i].expires);
+
+ rows.push([
+ st[0][i].hostname || '?',
+ st[0][i].ipaddr,
+ st[0][i].macaddr,
+ timestr
+ ]);
+ }
+
+ cbi_update_table(tb, rows, '<em><%:There are no active leases.%></em>');
+ }
+
+ var tb6 = document.getElementById('lease6_status_table');
+ if (st && st[1] && tb6)
+ {
+ tb6.parentNode.style.display = 'block';
+
+ var rows = [];
+
+ for (var i = 0; i < st[1].length; i++)
+ {
+ var timestr;
+
+ if (st[1][i].expires === false)
+ timestr = '<em><%:unlimited%></em>';
+ else if (st[1][i].expires <= 0)
+ timestr = '<em><%:expired%></em>';
+ else
+ timestr = String.format('%t', st[1][i].expires);
+
+ var name = st[1][i].hostname,
+ hint = st[1][i].host_hint;
+
+ rows.push([
+ hint ? '%h (%h)'.format(name || '?', hint) : (name || '?'),
+ st[1][i].ip6addr,
+ st[1][i].duid,
+ timestr
+ ]);
+ }
+
+ cbi_update_table(tb6, rows, '<em><%:There are no active leases.%></em>');
+ }
+ }
+ );
+//]]></script>
+
+<div class="cbi-section">
+ <h3><%:Active DHCP Leases%></h3>
+ <div class="table" id="lease_status_table">
+ <div class="tr table-titles">
+ <div class="th"><%:Hostname%></div>
+ <div class="th"><%:IPv4-Address%></div>
+ <div class="th"><%:MAC-Address%></div>
+ <div class="th"><%:Leasetime remaining%></div>
+ </div>
+ <div class="tr placeholder">
+ <div class="td"><em><%:Collecting data...%></em></div>
+ </div>
+ </div>
+</div>
+
+<div class="cbi-section" style="display:none">
+ <h3><%:Active DHCPv6 Leases%></h3>
+ <div class="table" id="lease6_status_table">
+ <div class="tr table-titles">
+ <div class="th"><%:Host%></div>
+ <div class="th"><%:IPv6-Address%></div>
+ <div class="th"><%:DUID%></div>
+ <div class="th"><%:Leasetime remaining%></div>
+ </div>
+ <div class="tr placeholder">
+ <div class="td"><em><%:Collecting data...%></em></div>
+ </div>
+ </div>
+</div>
diff --git a/modules/luci-base/luasrc/view/wifi_assoclist.htm b/modules/luci-base/luasrc/view/wifi_assoclist.htm
new file mode 100644
index 0000000000..700d998ad8
--- /dev/null
+++ b/modules/luci-base/luasrc/view/wifi_assoclist.htm
@@ -0,0 +1,82 @@
+<script type="text/javascript">//<![CDATA[
+ function wifirate(bss, rx) {
+ var p = rx ? 'rx_' : 'tx_',
+ s = '%.1f <%:Mbit/s%>, %d<%:MHz%>'
+ .format(bss[p+'rate'] / 1000, bss[p+'mhz']),
+ ht = bss[p+'ht'], vht = bss[p+'vht'],
+ mhz = bss[p+'mhz'], nss = bss[p+'nss'],
+ mcs = bss[p+'mcs'], sgi = bss[p+'short_gi'];
+
+ if (ht || vht) {
+ if (vht) s += ', VHT-MCS %d'.format(mcs);
+ if (nss) s += ', VHT-NSS %d'.format(nss);
+ if (ht) s += ', MCS %s'.format(mcs);
+ if (sgi) s += ', <%:Short GI%>';
+ }
+
+ return s;
+ }
+
+ XHR.poll(5, '<%=url('admin/wireless_assoclist')%>', null,
+ function(x, st)
+ {
+ var tb = document.getElementById('wifi_assoclist_table');
+ if (st && tb)
+ {
+ var rows = [];
+
+ st.forEach(function(bss) {
+ var icon;
+ var q = (-1 * (bss.noise - bss.signal)) / 5;
+ if (q < 1)
+ icon = "<%=resource%>/icons/signal-0.png";
+ else if (q < 2)
+ icon = "<%=resource%>/icons/signal-0-25.png";
+ else if (q < 3)
+ icon = "<%=resource%>/icons/signal-25-50.png";
+ else if (q < 4)
+ icon = "<%=resource%>/icons/signal-50-75.png";
+ else
+ icon = "<%=resource%>/icons/signal-75-100.png";
+
+ rows.push([
+ '<span class="ifacebadge" title="%q"><img src="<%=resource%>/icons/wifi.png" /> <a href="%s">%h</a><small>&#160;(%h)</small></span>'.format(
+ bss.radio,
+ bss.link,
+ bss.name,
+ bss.ifname),
+ bss.bssid,
+ bss.host_hint ? '%h (%h)'.format(bss.host_name || '?', bss.host_hint) : (bss.host_name || '?'),
+ '<span class="ifacebadge" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%> / <%:SNR%>: %d"><img src="%s" /> %d / %d <%:dBm%></span>'.format(
+ bss.signal,
+ bss.noise,
+ bss.signal - bss.noise,
+ icon,
+ bss.signal,
+ bss.noise),
+ E('span', {}, [
+ E('span', wifirate(bss, true)),
+ E('br'),
+ E('span', wifirate(bss, false))
+ ])
+ ]);
+ });
+
+ cbi_update_table(tb, rows, '<em><%:No information available%></em>');
+ }
+ }
+ );
+//]]></script>
+
+<div class="table" id="wifi_assoclist_table">
+ <div class="tr table-titles">
+ <div class="th nowrap"><%:Network%></div>
+ <div class="th hide-xs"><%:MAC-Address%></div>
+ <div class="th nowrap"><%:Host%></div>
+ <div class="th nowrap"><%:Signal%> / <%:Noise%></div>
+ <div class="th nowrap"><%:RX Rate%> / <%:TX Rate%></div>
+ </div>
+ <div class="tr placeholder">
+ <div class="td"><em><%:Collecting data...%></em></div>
+ </div>
+</div>
diff --git a/modules/luci-base/po/ca/base.po b/modules/luci-base/po/ca/base.po
index 603c77834f..a7c06d5e36 100644
--- a/modules/luci-base/po/ca/base.po
+++ b/modules/luci-base/po/ca/base.po
@@ -637,6 +637,9 @@ msgstr ""
msgid "Checksum"
msgstr "Suma de verificació"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -668,6 +671,11 @@ msgstr ""
"Fes clic a \"Genera l'arxiu\" per obtenir un fitxer .tar.gz amb els fitxers "
"de configuració actuals."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Client"
@@ -1013,6 +1021,9 @@ msgstr "Descarrega i instal·la el paquet"
msgid "Download backup"
msgstr "Descarrega còpia de seguretat"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2926,6 +2937,12 @@ msgstr "Desa"
msgid "Save & Apply"
msgstr "Desa i aplica"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Escaneja"
diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po
index b5947dbcf8..a9852f6c51 100644
--- a/modules/luci-base/po/cs/base.po
+++ b/modules/luci-base/po/cs/base.po
@@ -630,6 +630,9 @@ msgstr ""
msgid "Checksum"
msgstr "Kontrolní součet"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -660,6 +663,11 @@ msgid ""
msgstr ""
"Pro stažení archivu tar s aktuální konfigurací stiskněte \"Vytvořit archiv\"."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Klient"
@@ -1011,6 +1019,9 @@ msgstr "Stáhnout a nainstalovat balíček"
msgid "Download backup"
msgstr "Stáhnout zálohu"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2940,6 +2951,12 @@ msgstr "Uložit"
msgid "Save & Apply"
msgstr "Uložit & použít"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Skenovat"
diff --git a/modules/luci-base/po/de/base.po b/modules/luci-base/po/de/base.po
index e7f8826df8..795b50415d 100644
--- a/modules/luci-base/po/de/base.po
+++ b/modules/luci-base/po/de/base.po
@@ -653,6 +653,9 @@ msgstr ""
msgid "Checksum"
msgstr "Prüfsumme"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -684,6 +687,11 @@ msgstr ""
"Zum Herunterladen der aktuellen Konfigurationsdateien als gepacktes Archiv "
"\"Sicherung erstellen\" drücken."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Client"
@@ -1047,6 +1055,9 @@ msgstr "Paket herunterladen und installieren"
msgid "Download backup"
msgstr "Backup herunterladen"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr "Downstream SNR-Offset"
@@ -3054,6 +3065,12 @@ msgstr "Speichern"
msgid "Save & Apply"
msgstr "Speichern & Anwenden"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/el/base.po b/modules/luci-base/po/el/base.po
index 839e5ff83d..3028cf227e 100644
--- a/modules/luci-base/po/el/base.po
+++ b/modules/luci-base/po/el/base.po
@@ -639,6 +639,9 @@ msgstr ""
msgid "Checksum"
msgstr "Άθροισμα Ελέγχου"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -668,6 +671,11 @@ msgstr ""
"Κλικ στο \"Δημιουργία αρχείου\" για να κατεβάσετε ένα tar αρχείο με τα "
"τρέχοντα αρχεία παραμετροποίησης."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Πελάτης"
@@ -1022,6 +1030,9 @@ msgstr "Κατέβασμα και εγκατάσταση πακέτου"
msgid "Download backup"
msgstr "Κατέβασμα αντιγράφου ασφαλείας"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2944,6 +2955,12 @@ msgstr "Αποθήκευση"
msgid "Save & Apply"
msgstr "Αποθήκευση & Εφαρμογή"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Σάρωση"
diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po
index 603d39275d..ffbfe6f565 100644
--- a/modules/luci-base/po/en/base.po
+++ b/modules/luci-base/po/en/base.po
@@ -628,6 +628,9 @@ msgstr ""
msgid "Checksum"
msgstr "Checksum"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -657,6 +660,11 @@ msgstr ""
"Click \"Generate archive\" to download a tar archive of the current "
"configuration files."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Client"
@@ -1005,6 +1013,9 @@ msgstr "Download and install package"
msgid "Download backup"
msgstr ""
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2910,6 +2921,12 @@ msgstr "Save"
msgid "Save & Apply"
msgstr "Save & Apply"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po
index 67415460c7..0c21b8347e 100644
--- a/modules/luci-base/po/es/base.po
+++ b/modules/luci-base/po/es/base.po
@@ -635,6 +635,9 @@ msgstr ""
msgid "Checksum"
msgstr "Comprobación"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -666,6 +669,11 @@ msgstr ""
"Pulse \"generar archivo\" para descargar un fichero tar con los ficheros de "
"configuración actuales."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Cliente"
@@ -1018,6 +1026,9 @@ msgstr "Descargar e instalar paquete"
msgid "Download backup"
msgstr "Descargar copia de seguridad"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2955,6 +2966,12 @@ msgstr "Guardar"
msgid "Save & Apply"
msgstr "Guardar y aplicar"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Explorar"
diff --git a/modules/luci-base/po/fr/base.po b/modules/luci-base/po/fr/base.po
index 204c5e88c6..33eb7edf54 100644
--- a/modules/luci-base/po/fr/base.po
+++ b/modules/luci-base/po/fr/base.po
@@ -640,6 +640,9 @@ msgstr ""
msgid "Checksum"
msgstr "Somme de contrôle"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -672,6 +675,11 @@ msgstr ""
"Cliquer sur \"Construire l'archive\" pour télécharger une archive tar des "
"fichiers de la configuration actuelle."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Client"
@@ -1027,6 +1035,9 @@ msgstr "Télécharge et installe le paquet"
msgid "Download backup"
msgstr "Télécharger la sauvegarde"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2967,6 +2978,12 @@ msgstr "Sauvegarder"
msgid "Save & Apply"
msgstr "Sauvegarder et Appliquer"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/he/base.po b/modules/luci-base/po/he/base.po
index 73a4622814..97047328c6 100644
--- a/modules/luci-base/po/he/base.po
+++ b/modules/luci-base/po/he/base.po
@@ -630,6 +630,9 @@ msgstr ""
msgid "Checksum"
msgstr ""
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -653,6 +656,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr ""
@@ -992,6 +1000,9 @@ msgstr "הורד והתקן חבילות"
msgid "Download backup"
msgstr "הורד גיבוי"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2874,6 +2885,12 @@ msgstr ""
msgid "Save & Apply"
msgstr ""
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr ""
diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po
index 47a0197c94..94d9ad109d 100644
--- a/modules/luci-base/po/hu/base.po
+++ b/modules/luci-base/po/hu/base.po
@@ -635,6 +635,9 @@ msgstr ""
msgid "Checksum"
msgstr "Ellenőrző összeg"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -667,6 +670,11 @@ msgstr ""
"Kattintson az \"Archívum készítése\" gombra a jelenlegi konfiguráció tar "
"archívumként történő letöltéséhez."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Ügyfél"
@@ -1018,6 +1026,9 @@ msgstr "Csomag letöltése és telepítése"
msgid "Download backup"
msgstr "Biztonsági mentés letöltése"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2958,6 +2969,12 @@ msgstr "Mentés"
msgid "Save & Apply"
msgstr "Mentés & Alkalmazás"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Felderítés"
diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po
index 83fb6054b3..9ba9308e2c 100644
--- a/modules/luci-base/po/it/base.po
+++ b/modules/luci-base/po/it/base.po
@@ -642,6 +642,9 @@ msgstr "Marca questa opzione per cancellare le reti esistenti da questa radio."
msgid "Checksum"
msgstr "Checksum"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -673,6 +676,11 @@ msgstr ""
"Premi su \"Genera archivio\" per scaricare un archivio tar di backup dei "
"file di configurazione attuali."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Cliente"
@@ -1024,6 +1032,9 @@ msgstr "Scarica e installa pacchetto"
msgid "Download backup"
msgstr "Download backup"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2956,6 +2967,12 @@ msgstr "Salva"
msgid "Save & Apply"
msgstr "Salva & applica"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/ja/base.po b/modules/luci-base/po/ja/base.po
index b0d74f97ce..0fd6c31ad0 100644
--- a/modules/luci-base/po/ja/base.po
+++ b/modules/luci-base/po/ja/base.po
@@ -642,6 +642,9 @@ msgstr ""
msgid "Checksum"
msgstr "チェックサム"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -673,6 +676,11 @@ msgstr ""
"\"バックアップ アーカイブの作成\"をクリックすると、現在の設定ファイルをtar形"
"式のアーカイブファイルとしてダウンロードします。"
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "クライアント"
@@ -1034,6 +1042,9 @@ msgstr "パッケージのダウンロードとインストール"
msgid "Download backup"
msgstr "バックアップ アーカイブのダウンロード"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2998,6 +3009,12 @@ msgstr "保存"
msgid "Save & Apply"
msgstr "保存 & 適用"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "スキャン"
diff --git a/modules/luci-base/po/ko/base.po b/modules/luci-base/po/ko/base.po
index 92a36e67f2..30ab1f79c5 100644
--- a/modules/luci-base/po/ko/base.po
+++ b/modules/luci-base/po/ko/base.po
@@ -624,6 +624,9 @@ msgstr ""
msgid "Checksum"
msgstr ""
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -655,6 +658,11 @@ msgstr ""
"현재 설정 파일에 대한 tar 아카이브 다운로드를 원한다면 \"아카이브 생성\" 버튼"
"을 클릭하세요."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr ""
@@ -1002,6 +1010,9 @@ msgstr "패키지 다운로드 후 설치"
msgid "Download backup"
msgstr "백업 다운로드"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2903,6 +2914,12 @@ msgstr "저장"
msgid "Save & Apply"
msgstr "저장 & 적용"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan 하기"
diff --git a/modules/luci-base/po/ms/base.po b/modules/luci-base/po/ms/base.po
index b17c961bda..609af43c9a 100644
--- a/modules/luci-base/po/ms/base.po
+++ b/modules/luci-base/po/ms/base.po
@@ -614,6 +614,9 @@ msgstr ""
msgid "Checksum"
msgstr "Jumlah disemak "
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -637,6 +640,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
#, fuzzy
msgid "Client"
msgstr "Pelanggan"
@@ -978,6 +986,9 @@ msgstr "Turun dan memasang pakej"
msgid "Download backup"
msgstr ""
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2880,6 +2891,12 @@ msgstr "Simpan"
msgid "Save & Apply"
msgstr "Simpan & Melaksanakan"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/no/base.po b/modules/luci-base/po/no/base.po
index d7e128a8b9..d30f4075da 100644
--- a/modules/luci-base/po/no/base.po
+++ b/modules/luci-base/po/no/base.po
@@ -626,6 +626,9 @@ msgstr ""
msgid "Checksum"
msgstr "Kontrollsum"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -657,6 +660,11 @@ msgstr ""
"Klikk \"Opprett arkiv\" for å laste ned et tar arkiv av de gjeldende "
"konfigurasjons filer."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Klient"
@@ -1008,6 +1016,9 @@ msgstr "Last ned og installer pakken"
msgid "Download backup"
msgstr "Last ned sikkerhetskopi"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2932,6 +2943,12 @@ msgstr "Lagre"
msgid "Save & Apply"
msgstr "Lagre & Aktiver"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Skann"
diff --git a/modules/luci-base/po/pl/base.po b/modules/luci-base/po/pl/base.po
index 5295b3d90a..66c0c7c569 100644
--- a/modules/luci-base/po/pl/base.po
+++ b/modules/luci-base/po/pl/base.po
@@ -651,6 +651,9 @@ msgstr ""
msgid "Checksum"
msgstr "Suma kontrolna"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -682,6 +685,11 @@ msgstr ""
"Kliknij \"Twórz archiwum\" aby pobrać archiwum tar zawierające bieżące pliki "
"konfiguracyjne."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Klient"
@@ -1044,6 +1052,9 @@ msgstr "Pobierz i zainstaluj pakiet"
msgid "Download backup"
msgstr "Pobierz kopię zapasową"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -3005,6 +3016,12 @@ msgstr "Zapisz"
msgid "Save & Apply"
msgstr "Zapisz i zastosuj"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Skanuj"
diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po
index bf5ca103a6..b45234cc23 100644
--- a/modules/luci-base/po/pt-br/base.po
+++ b/modules/luci-base/po/pt-br/base.po
@@ -672,6 +672,9 @@ msgstr "Marque esta opção para remover as redes existentes neste rádio."
msgid "Checksum"
msgstr "Soma de verificação"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -703,6 +706,11 @@ msgstr ""
"Clique em \"Gerar arquivo\" para baixar um arquivo tar com os arquivos de "
"configuração atuais."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Cliente"
@@ -1062,6 +1070,9 @@ msgstr "Baixe e instale o pacote"
msgid "Download backup"
msgstr "Baixar a cópia de segurança"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -3077,6 +3088,12 @@ msgstr "Salvar"
msgid "Save & Apply"
msgstr "Salvar & Aplicar"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Procurar"
diff --git a/modules/luci-base/po/pt/base.po b/modules/luci-base/po/pt/base.po
index cf23162aaf..10c6846e47 100644
--- a/modules/luci-base/po/pt/base.po
+++ b/modules/luci-base/po/pt/base.po
@@ -639,6 +639,9 @@ msgstr ""
msgid "Checksum"
msgstr "Checksum"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -670,6 +673,11 @@ msgstr ""
"Clique em \"Gerar arquivo\" para descarregar o ficheiro tar com os actuais "
"ficheiros de configuração."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Cliente"
@@ -1023,6 +1031,9 @@ msgstr "Descarregar e instalar pacote"
msgid "Download backup"
msgstr "Descarregar backup"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2953,6 +2964,12 @@ msgstr "Salvar"
msgid "Save & Apply"
msgstr "Salvar & Aplicar"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Procurar"
diff --git a/modules/luci-base/po/ro/base.po b/modules/luci-base/po/ro/base.po
index bbd60abb69..3e8381d30b 100644
--- a/modules/luci-base/po/ro/base.po
+++ b/modules/luci-base/po/ro/base.po
@@ -622,6 +622,9 @@ msgstr ""
msgid "Checksum"
msgstr "Suma de verificare"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -648,6 +651,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr ""
@@ -985,6 +993,9 @@ msgstr "Descarca si instaleaza pachetul"
msgid "Download backup"
msgstr "Descarca backup"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2873,6 +2884,12 @@ msgstr "Salveaza"
msgid "Save & Apply"
msgstr "Salveaza si aplica"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po
index d84167a520..7b56612c5a 100644
--- a/modules/luci-base/po/ru/base.po
+++ b/modules/luci-base/po/ru/base.po
@@ -665,6 +665,9 @@ msgstr ""
msgid "Checksum"
msgstr "Контрольная сумма"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -697,6 +700,11 @@ msgstr ""
"Нажмите 'Создать архив', чтобы загрузить tar-архив текущих config файлов "
"прошивки устройства, таким образом вы сохраните его настройки."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Клиент"
@@ -1060,6 +1068,9 @@ msgstr "Загрузить и установить пакет"
msgid "Download backup"
msgstr "Загрузить резервную копию"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr "SNR offset внутренней сети"
@@ -3058,6 +3069,12 @@ msgstr "Сохранить"
msgid "Save & Apply"
msgstr "Сохранить и применить"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Поиск"
diff --git a/modules/luci-base/po/sk/base.po b/modules/luci-base/po/sk/base.po
index a22640b9ce..7a872fed3d 100644
--- a/modules/luci-base/po/sk/base.po
+++ b/modules/luci-base/po/sk/base.po
@@ -608,6 +608,9 @@ msgstr ""
msgid "Checksum"
msgstr ""
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -631,6 +634,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr ""
@@ -966,6 +974,9 @@ msgstr ""
msgid "Download backup"
msgstr ""
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2846,6 +2857,12 @@ msgstr ""
msgid "Save & Apply"
msgstr ""
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr ""
diff --git a/modules/luci-base/po/sv/base.po b/modules/luci-base/po/sv/base.po
index e892e04081..fb0aaaa9a8 100644
--- a/modules/luci-base/po/sv/base.po
+++ b/modules/luci-base/po/sv/base.po
@@ -622,6 +622,9 @@ msgstr ""
msgid "Checksum"
msgstr "Checksumma"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -645,6 +648,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Klient"
@@ -986,6 +994,9 @@ msgstr "Ladda ner och installera paket"
msgid "Download backup"
msgstr "Ladda ner säkerhetskopia"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2869,6 +2880,12 @@ msgstr "Spara"
msgid "Save & Apply"
msgstr "Spara och Verkställ"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Skanna"
diff --git a/modules/luci-base/po/templates/base.pot b/modules/luci-base/po/templates/base.pot
index d8621c02c5..cb1008a8e0 100644
--- a/modules/luci-base/po/templates/base.pot
+++ b/modules/luci-base/po/templates/base.pot
@@ -601,6 +601,9 @@ msgstr ""
msgid "Checksum"
msgstr ""
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -624,6 +627,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr ""
@@ -959,6 +967,9 @@ msgstr ""
msgid "Download backup"
msgstr ""
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2839,6 +2850,12 @@ msgstr ""
msgid "Save & Apply"
msgstr ""
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr ""
diff --git a/modules/luci-base/po/tr/base.po b/modules/luci-base/po/tr/base.po
index f8d89b4b17..cd3688ba56 100644
--- a/modules/luci-base/po/tr/base.po
+++ b/modules/luci-base/po/tr/base.po
@@ -622,6 +622,9 @@ msgstr ""
msgid "Checksum"
msgstr ""
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -647,6 +650,11 @@ msgstr ""
"Mevcut yapılandırma dosyalarının yeni bir arşivini indirmek için \"Arşiv "
"Oluştur\"'u tıklayın."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr ""
@@ -984,6 +992,9 @@ msgstr ""
msgid "Download backup"
msgstr ""
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2864,6 +2875,12 @@ msgstr "Kaydet"
msgid "Save & Apply"
msgstr "Kaydet & Uygula"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Tara"
diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po
index 950d894b1d..f74307888e 100644
--- a/modules/luci-base/po/uk/base.po
+++ b/modules/luci-base/po/uk/base.po
@@ -671,6 +671,9 @@ msgstr "Позначте цей параметр, щоб видалити існ
msgid "Checksum"
msgstr "Контрольна сума"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -702,6 +705,11 @@ msgstr ""
"Натисніть кнопку \"Створити архів\", щоб завантажити tar-архів поточних "
"файлів конфігурації."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Клієнт"
@@ -1072,6 +1080,9 @@ msgstr "Завантажити та інсталювати пакети"
msgid "Download backup"
msgstr "Завантажити резервну копію"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr "Низхідний зсув SNR"
@@ -3075,6 +3086,12 @@ msgstr "Зберегти"
msgid "Save & Apply"
msgstr "Зберегти і застосувати"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Сканувати"
diff --git a/modules/luci-base/po/vi/base.po b/modules/luci-base/po/vi/base.po
index cdf3d6be46..217ca98fbd 100644
--- a/modules/luci-base/po/vi/base.po
+++ b/modules/luci-base/po/vi/base.po
@@ -615,6 +615,9 @@ msgstr ""
msgid "Checksum"
msgstr "Checksum"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -638,6 +641,11 @@ msgid ""
"configuration files."
msgstr ""
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "Client"
@@ -981,6 +989,9 @@ msgstr "Tải và cài đặt gói"
msgid "Download backup"
msgstr ""
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2886,6 +2897,12 @@ msgstr "Lưu"
msgid "Save & Apply"
msgstr "Lưu & áp dụng "
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "Scan"
diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po
index 57e2b07ec7..2c7bdcc195 100644
--- a/modules/luci-base/po/zh-cn/base.po
+++ b/modules/luci-base/po/zh-cn/base.po
@@ -624,6 +624,9 @@ msgstr "选中此选项以从无线中删除现有网络。"
msgid "Checksum"
msgstr "校验值"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -649,6 +652,11 @@ msgid ""
"configuration files."
msgstr "点击“生成备份”下载当前配置文件的 tar 存档。"
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "客户端 Client"
@@ -998,6 +1006,9 @@ msgstr "下载并安装软件包"
msgid "Download backup"
msgstr "下载备份"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr "下游 SNR 偏移"
@@ -2920,6 +2931,12 @@ msgstr "保存"
msgid "Save & Apply"
msgstr "保存并应用"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "扫描"
diff --git a/modules/luci-base/po/zh-tw/base.po b/modules/luci-base/po/zh-tw/base.po
index 97e79922d0..f3354e1924 100644
--- a/modules/luci-base/po/zh-tw/base.po
+++ b/modules/luci-base/po/zh-tw/base.po
@@ -620,6 +620,9 @@ msgstr ""
msgid "Checksum"
msgstr "效驗碼"
+msgid "Choose mtdblock"
+msgstr ""
+
msgid ""
"Choose the firewall zone you want to assign to this interface. Select "
"<em>unspecified</em> to remove the interface from the associated zone or "
@@ -647,6 +650,11 @@ msgid ""
"configuration files."
msgstr "按下\"壓縮檔製作\"就能下載目前設定檔的tar格式的壓縮."
+msgid ""
+"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS "
+"FEATURE IS FOR PROFESSIONALS! )"
+msgstr ""
+
msgid "Client"
msgstr "用戶端"
@@ -992,6 +1000,9 @@ msgstr "下載並安裝軟體包"
msgid "Download backup"
msgstr "下載備份檔"
+msgid "Download mtdblock"
+msgstr ""
+
msgid "Downstream SNR offset"
msgstr ""
@@ -2889,6 +2900,12 @@ msgstr "保存"
msgid "Save & Apply"
msgstr "保存並啟用"
+msgid "Save mtdblock"
+msgstr ""
+
+msgid "Save mtdblock contents"
+msgstr ""
+
msgid "Scan"
msgstr "掃描"