summaryrefslogtreecommitdiffhomepage
path: root/modules/luci-base
diff options
context:
space:
mode:
Diffstat (limited to 'modules/luci-base')
-rw-r--r--modules/luci-base/Makefile3
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/xhr.js19
-rw-r--r--modules/luci-base/luasrc/dispatcher.lua15
-rw-r--r--modules/luci-base/luasrc/model/uci.lua92
-rw-r--r--modules/luci-base/luasrc/util.lua16
-rw-r--r--modules/luci-base/luasrc/view/cbi/apply_widget.htm10
-rw-r--r--modules/luci-base/luasrc/view/cbi/map.htm15
-rw-r--r--modules/luci-base/luasrc/view/footer.htm25
-rw-r--r--modules/luci-base/po/zh-cn/base.po168
9 files changed, 216 insertions, 147 deletions
diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile
index 5c38d99c58..06ee7985eb 100644
--- a/modules/luci-base/Makefile
+++ b/modules/luci-base/Makefile
@@ -37,13 +37,14 @@ endef
define Host/Compile
$(MAKE) -C src/ clean po2lmo
- $(MAKE) -C $(HOST_BUILD_DIR) bin/luasrcdiet
endef
define Host/Install
$(INSTALL_DIR) $(1)/bin
+ $(INSTALL_DIR) $(1)/lib/lua/5.1
$(INSTALL_BIN) src/po2lmo $(1)/bin/po2lmo
$(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/luasrcdiet $(1)/bin/luasrcdiet
+ $(CP) $(HOST_BUILD_DIR)/luasrcdiet $(1)/lib/lua/5.1/
endef
$(eval $(call HostBuild))
diff --git a/modules/luci-base/htdocs/luci-static/resources/xhr.js b/modules/luci-base/htdocs/luci-static/resources/xhr.js
index 62b525ebb0..25a90e7254 100644
--- a/modules/luci-base/htdocs/luci-static/resources/xhr.js
+++ b/modules/luci-base/htdocs/luci-static/resources/xhr.js
@@ -65,12 +65,8 @@ XHR = function()
if (xhr.readyState == 4) {
var json = null;
if (xhr.getResponseHeader("Content-Type") == "application/json") {
- try {
- json = JSON.parse(xhr.responseText);
- }
- catch(e) {
- json = null;
- }
+ try { json = JSON.parse(xhr.responseText); }
+ catch(e) { json = null; }
}
callback(xhr, json, Date.now() - ts);
@@ -90,8 +86,15 @@ XHR = function()
xhr.onreadystatechange = function()
{
- if (xhr.readyState == 4)
- callback(xhr, null, Date.now() - ts);
+ if (xhr.readyState == 4) {
+ var json = null;
+ if (xhr.getResponseHeader("Content-Type") == "application/json") {
+ try { json = JSON.parse(xhr.responseText); }
+ catch(e) { json = null; }
+ }
+
+ callback(xhr, json, Date.now() - ts);
+ }
}
xhr.open('POST', url, true);
diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua
index 6d5a8f4d3d..6cf2712eb4 100644
--- a/modules/luci-base/luasrc/dispatcher.lua
+++ b/modules/luci-base/luasrc/dispatcher.lua
@@ -893,8 +893,6 @@ local function _cbi(self, ...)
local pageaction = true
local parsechain = { }
- local is_rollback, time_remaining = uci:rollback_pending()
-
for i, res in ipairs(maps) do
if res.apply_needed and res.parsechain then
local c
@@ -921,8 +919,6 @@ local function _cbi(self, ...)
for i, res in ipairs(maps) do
res:render({
firstmap = (i == 1),
- applymap = applymap,
- confirmmap = (is_rollback and time_remaining or nil),
redirect = redirect,
messages = messages,
pageaction = pageaction,
@@ -932,11 +928,12 @@ local function _cbi(self, ...)
if not config.nofooter then
tpl.render("cbi/footer", {
- flow = config,
- pageaction = pageaction,
- redirect = redirect,
- state = state,
- autoapply = config.autoapply
+ flow = config,
+ pageaction = pageaction,
+ redirect = redirect,
+ state = state,
+ autoapply = config.autoapply,
+ trigger_apply = applymap
})
end
end
diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua
index 92c0d8f699..b2c1e463bf 100644
--- a/modules/luci-base/luasrc/model/uci.lua
+++ b/modules/luci-base/luasrc/model/uci.lua
@@ -147,19 +147,31 @@ function apply(self, rollback)
local _, err
if rollback then
+ local sys = require "luci.sys"
local conf = require "luci.config"
- local timeout = tonumber(conf and conf.apply and conf.apply.rollback or "") or 0
+ local timeout = tonumber(conf and conf.apply and conf.apply.rollback or 30) or 0
_, err = call("apply", {
- timeout = (timeout > 30) and timeout or 30,
+ timeout = (timeout > 30) and timeout or 30,
rollback = true
})
if not err then
+ local now = os.time()
+ local token = sys.uniqueid(16)
+
util.ubus("session", "set", {
- ubus_rpc_session = session_id,
- values = { rollback = os.time() + timeout }
+ ubus_rpc_session = "00000000000000000000000000000000",
+ values = {
+ rollback = {
+ token = token,
+ session = session_id,
+ timeout = now + timeout
+ }
+ }
})
+
+ return token
end
else
_, err = call("changes", {})
@@ -184,40 +196,72 @@ function apply(self, rollback)
return (err == nil), ERRSTR[err]
end
-function confirm(self)
- local _, err = call("confirm", {})
- if not err then
- util.ubus("session", "set", {
- ubus_rpc_session = session_id,
- values = { rollback = 0 }
+function confirm(self, token)
+ local is_pending, time_remaining, rollback_sid, rollback_token = self:rollback_pending()
+
+ if is_pending then
+ if token ~= rollback_token then
+ return false, "Permission denied"
+ end
+
+ local _, err = util.ubus("uci", "confirm", {
+ ubus_rpc_session = rollback_sid
})
+
+ if not err then
+ util.ubus("session", "set", {
+ ubus_rpc_session = "00000000000000000000000000000000",
+ values = { rollback = {} }
+ })
+ end
+
+ return (err == nil), ERRSTR[err]
end
- return (err == nil), ERRSTR[err]
+
+ return false, "No data"
end
function rollback(self)
- local _, err = call("rollback", {})
- if not err then
- util.ubus("session", "set", {
- ubus_rpc_session = session_id,
- values = { rollback = 0 }
+ local is_pending, time_remaining, rollback_sid = self:rollback_pending()
+
+ if is_pending then
+ local _, err = util.ubus("uci", "rollback", {
+ ubus_rpc_session = rollback_sid
})
+
+ if not err then
+ util.ubus("session", "set", {
+ ubus_rpc_session = "00000000000000000000000000000000",
+ values = { rollback = {} }
+ })
+ end
+
+ return (err == nil), ERRSTR[err]
end
- return (err == nil), ERRSTR[err]
+
+ return false, "No data"
end
function rollback_pending(self)
- local deadline, err = util.ubus("session", "get", {
- ubus_rpc_session = session_id,
+ local rv, err = util.ubus("session", "get", {
+ ubus_rpc_session = "00000000000000000000000000000000",
keys = { "rollback" }
})
- if type(deadline) == "table" and
- type(deadline.values) == "table" and
- type(deadline.values.rollback) == "number" and
- deadline.values.rollback > os.time()
+ local now = os.time()
+
+ if type(rv) == "table" and
+ type(rv.values) == "table" and
+ type(rv.values.rollback) == "table" and
+ type(rv.values.rollback.token) == "string" and
+ type(rv.values.rollback.session) == "string" and
+ type(rv.values.rollback.timeout) == "number" and
+ rv.values.rollback.timeout > now
then
- return true, deadline.values.rollback - os.time()
+ return true,
+ rv.values.rollback.timeout - now,
+ rv.values.rollback.session,
+ rv.values.rollback.token
end
return false, ERRSTR[err]
diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua
index 10428b0b35..f16b3afb2e 100644
--- a/modules/luci-base/luasrc/util.lua
+++ b/modules/luci-base/luasrc/util.lua
@@ -16,7 +16,7 @@ local _ubus = require "ubus"
local _ubus_connection = nil
local getmetatable, setmetatable = getmetatable, setmetatable
-local rawget, rawset, unpack = rawget, rawset, unpack
+local rawget, rawset, unpack, select = rawget, rawset, unpack, select
local tostring, type, assert, error = tostring, type, assert, error
local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring
local require, pcall, xpcall = require, pcall, xpcall
@@ -647,6 +647,17 @@ local ubus_codes = {
"CONNECTION_FAILED"
}
+local function ubus_return(...)
+ if select('#', ...) == 2 then
+ local rv, err = select(1, ...), select(2, ...)
+ if rv == nil and type(err) == "number" then
+ return nil, err, ubus_codes[err]
+ end
+ end
+
+ return ...
+end
+
function ubus(object, method, data)
if not _ubus_connection then
_ubus_connection = _ubus.connect()
@@ -657,8 +668,7 @@ function ubus(object, method, data)
if type(data) ~= "table" then
data = { }
end
- local rv, err = _ubus_connection:call(object, method, data)
- return rv, err, ubus_codes[err]
+ return ubus_return(_ubus_connection:call(object, method, data))
elseif object then
return _ubus_connection:signatures(object)
else
diff --git a/modules/luci-base/luasrc/view/cbi/apply_widget.htm b/modules/luci-base/luasrc/view/cbi/apply_widget.htm
index f76846ee87..4d7e9c56ea 100644
--- a/modules/luci-base/luasrc/view/cbi/apply_widget.htm
+++ b/modules/luci-base/luasrc/view/cbi/apply_widget.htm
@@ -1,4 +1,4 @@
-<% export("cbi_apply_widget", function(redirect_ok) -%>
+<% export("cbi_apply_widget", function(redirect_ok, rollback_token) -%>
<style type="text/css">
#cbi_apply_overlay {
position: absolute;
@@ -51,6 +51,7 @@
uci_apply_holdoff = <%=math.max(luci.config and luci.config.apply and luci.config.apply.holdoff or 4, 1)%>,
uci_apply_timeout = <%=math.max(luci.config and luci.config.apply and luci.config.apply.timeout or 5, 1)%>,
uci_apply_display = <%=math.max(luci.config and luci.config.apply and luci.config.apply.display or 1.5, 1)%>,
+ uci_confirm_auth = <% if rollback_token then %>{ token: '<%=rollback_token%>' }<% else %>null<% end %>,
was_xhr_poll_running = false;
function uci_status_message(type, content) {
@@ -148,7 +149,7 @@
var delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
window.setTimeout(function() {
- xhr.post('<%=url("admin/uci/confirm")%>', uci_apply_auth, call, uci_apply_timeout * 1000);
+ xhr.post('<%=url("admin/uci/confirm")%>', uci_confirm_auth, call, uci_apply_timeout * 1000);
}, delay);
};
@@ -177,8 +178,11 @@
'<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
'<%:Starting configuration apply…%>');
- xhr.post('<%=url("admin/uci")%>/' + (checked ? 'apply_rollback' : 'apply_unchecked'), uci_apply_auth, function(r) {
+ xhr.post('<%=url("admin/uci")%>/' + (checked ? 'apply_rollback' : 'apply_unchecked'), uci_apply_auth, function(r, tok) {
if (r.status === (checked ? 200 : 204)) {
+ if (checked && tok !== null && typeof(tok) === 'object' && typeof(tok.token) === 'string')
+ uci_confirm_auth = tok;
+
uci_confirm(checked, Date.now() + uci_apply_rollback * 1000);
}
else if (checked && r.status === 204) {
diff --git a/modules/luci-base/luasrc/view/cbi/map.htm b/modules/luci-base/luasrc/view/cbi/map.htm
index 83c3cb2170..d65a161673 100644
--- a/modules/luci-base/luasrc/view/cbi/map.htm
+++ b/modules/luci-base/luasrc/view/cbi/map.htm
@@ -5,21 +5,6 @@
<div class="cbi-map" id="cbi-<%=self.config%>">
<% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
<% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
- <%- if firstmap and (applymap or confirmmap) then -%>
- <%+cbi/apply_widget%>
- <% cbi_apply_widget(redirect) %>
- <div class="alert-message" id="cbi_apply_status" style="display:none"></div>
- <script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
- <% if confirmmap then -%>
- uci_confirm(true, Date.now() + <%=confirmmap%> * 1000);
- <%- else -%>
- uci_apply(true);
- <%- end %>
- });
- </script>
- <%- end -%>
-
<% if self.tabbed then %>
<ul class="cbi-tabmenu map">
<%- self.selected_tab = luci.http.formvalue("tab.m-" .. self.config) %>
diff --git a/modules/luci-base/luasrc/view/footer.htm b/modules/luci-base/luasrc/view/footer.htm
index f3574b6b10..1667d3aa9a 100644
--- a/modules/luci-base/luasrc/view/footer.htm
+++ b/modules/luci-base/luasrc/view/footer.htm
@@ -4,4 +4,27 @@
Licensed to the public under the Apache License 2.0.
-%>
-<% include("themes/" .. theme .. "/footer") %> \ No newline at end of file
+<%
+ local is_rollback_pending, rollback_time_remaining, rollback_session, rollback_token = luci.model.uci:rollback_pending()
+
+ if is_rollback_pending or trigger_apply or trigger_revert then
+ include("cbi/apply_widget")
+ cbi_apply_widget(redirect, rollback_token)
+%>
+ <div class="alert-message" id="cbi_apply_status" style="display:none"></div>
+ <script type="text/javascript">
+ document.addEventListener("DOMContentLoaded", function() {
+ <% if trigger_apply then -%>
+ uci_apply(true);
+ <%- elseif trigger_revert then -%>
+ uci_revert();
+ <%- else -%>
+ uci_confirm(true, Date.now() + <%=rollback_time_remaining%> * 1000);
+ <%- end %>
+ });
+ </script>
+<%
+ end
+
+ include("themes/" .. theme .. "/footer")
+%>
diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po
index d142390e1a..888ceca934 100644
--- a/modules/luci-base/po/zh-cn/base.po
+++ b/modules/luci-base/po/zh-cn/base.po
@@ -4,7 +4,7 @@ msgstr ""
"Last-Translator: Hsing-Wang Liao <kuoruan@gmail.com>\n"
msgid "%.1f dB"
-msgstr ""
+msgstr "%.1f dB"
msgid "%s is untagged in multiple VLANs!"
msgstr "%s 在多个 VLAN 中均未标记!"
@@ -40,7 +40,7 @@ msgid "-- match by uuid --"
msgstr "-- 根据 UUID 匹配 --"
msgid "-- please select --"
-msgstr ""
+msgstr "-- 请选择 --"
msgid "1 Minute Load:"
msgstr "1 分钟负载:"
@@ -258,13 +258,13 @@ msgid "Alert"
msgstr "警戒"
msgid "Alias Interface"
-msgstr ""
+msgstr "接口别名"
msgid "Alias of \"%s\""
-msgstr ""
+msgstr "\"%s\" 的别名"
msgid "All Servers"
-msgstr ""
+msgstr "所有服务器"
msgid ""
"Allocate IP addresses sequentially, starting from the lowest available "
@@ -278,7 +278,7 @@ msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
msgstr "允许 <abbr title=\"Secure Shell\">SSH</abbr> 密码验证"
msgid "Allow AP mode to disconnect STAs based on low ACK condition"
-msgstr ""
+msgstr "允许 AP 模式时在 low ACK 的情况下断开无线终端"
msgid "Allow all except listed"
msgstr "仅允许列表外"
@@ -315,6 +315,7 @@ msgid ""
"Always use 40MHz channels even if the secondary channel overlaps. Using this "
"option does not comply with IEEE 802.11n-2009!"
msgstr ""
+"即使辅助信道重叠,也始终使用 40MHz 信道。使用此选项不符合IEEE 802.11n-2009!"
msgid "Annex"
msgstr "Annex"
@@ -395,7 +396,7 @@ msgid "Apply request failed with status <code>%h</code>"
msgstr "应用请求失败,状态 <code>%h</code>"
msgid "Apply unchecked"
-msgstr "应用未选中"
+msgstr "强制应用"
msgid "Architecture"
msgstr "架构"
@@ -508,7 +509,7 @@ msgid "Band"
msgstr "频宽"
msgid "Beacon Interval"
-msgstr ""
+msgstr "Beacon 间隔"
msgid ""
"Below is the determined list of files to backup. It consists of changed "
@@ -566,7 +567,7 @@ msgid "CPU usage (%)"
msgstr "CPU 使用率(%)"
msgid "Call failed"
-msgstr ""
+msgstr "调用失败"
msgid "Cancel"
msgstr "取消"
@@ -578,16 +579,16 @@ msgid "Chain"
msgstr "链"
msgid "Changes"
-msgstr "修改数"
+msgstr "更改数"
msgid "Changes applied."
msgstr "更改已应用。"
msgid "Changes have been reverted."
-msgstr "更改已取消。"
+msgstr "更改已恢复。"
msgid "Changes the administrator password for accessing the device"
-msgstr "修改访问设备的管理员密码"
+msgstr "更改访问设备的管理员密码"
msgid "Channel"
msgstr "信道"
@@ -671,7 +672,7 @@ msgid "Configuration"
msgstr "配置"
msgid "Configuration failed"
-msgstr ""
+msgstr "配置失败"
msgid "Configuration files will be kept."
msgstr "配置文件将被保留。"
@@ -695,7 +696,7 @@ msgid "Connection Limit"
msgstr "连接数限制"
msgid "Connection attempt failed"
-msgstr ""
+msgstr "尝试连接失败"
msgid "Connections"
msgstr "连接"
@@ -705,7 +706,7 @@ msgid ""
"changes. You might need to reconnect if you modified network related "
"settings such as the IP address or wireless security credentials."
msgstr ""
-"应用配置更改后,无法重新获得对设备的访问权限。如果您修改了网络相关设置如 IP "
+"应用配置更改后,无法重新获得对设备的访问权限。如果您更改了网络相关设置如 IP "
"地址或无线安全证书,则可能需要重新连接。"
msgid "Country"
@@ -812,7 +813,7 @@ msgid "DSL line mode"
msgstr "DSL 线路模式"
msgid "DTIM Interval"
-msgstr ""
+msgstr "DTIM 间隔"
msgid "DUID"
msgstr "DUID"
@@ -853,7 +854,7 @@ msgid "Delete this network"
msgstr "删除此网络"
msgid "Delivery Traffic Indication Message Interval"
-msgstr ""
+msgstr "发送流量指示消息间隔"
msgid "Description"
msgstr "描述"
@@ -877,7 +878,7 @@ msgid "Device unreachable!"
msgstr "无法连接到设备"
msgid "Device unreachable! Still waiting for device..."
-msgstr ""
+msgstr "无法连接到设备!仍旧等待设备..."
msgid "Diagnostics"
msgstr "网络诊断"
@@ -911,16 +912,16 @@ msgid "Disabled"
msgstr "已禁用"
msgid "Disabled (default)"
-msgstr "禁用(默认)"
+msgstr "已禁用(默认)"
msgid "Disassociate On Low Acknowledgement"
-msgstr ""
+msgstr "在 Low Acknowledgement 时断开连接"
msgid "Discard upstream RFC1918 responses"
msgstr "丢弃 RFC1918 上行响应数据"
msgid "Disconnection attempt failed"
-msgstr ""
+msgstr "尝试断开连接失败"
msgid "Dismiss"
msgstr "解除"
@@ -975,7 +976,7 @@ msgstr ""
"不转发没有 <abbr title=\"Domain Name System\">DNS</abbr> 名称的解析请求"
msgid "Down"
-msgstr ""
+msgstr "向下"
msgid "Download and install package"
msgstr "下载并安装软件包"
@@ -1018,7 +1019,7 @@ msgid "EAP-Method"
msgstr "EAP 类型"
msgid "Edit"
-msgstr "修改"
+msgstr "编辑"
msgid ""
"Edit the raw configuration data above to fix any error and hit \"Save\" to "
@@ -1026,10 +1027,10 @@ msgid ""
msgstr "编辑上方的原始配置数据来修复错误,点击“保存”按钮以重新载入此页面。"
msgid "Edit this interface"
-msgstr "修改此接口"
+msgstr "编辑此接口"
msgid "Edit this network"
-msgstr "修改此网络"
+msgstr "编辑此网络"
msgid "Emergency"
msgstr "紧急"
@@ -1092,7 +1093,7 @@ msgid "Enable this mount"
msgstr "启用此挂载点"
msgid "Enable this network"
-msgstr ""
+msgstr "启用此网络"
msgid "Enable this swap"
msgstr "启用此 swap 分区"
@@ -1127,10 +1128,10 @@ msgid "Endpoint Port"
msgstr "端点端口"
msgid "Enter custom value"
-msgstr ""
+msgstr "输入自定义值"
msgid "Enter custom values"
-msgstr ""
+msgstr "输入自定义值"
msgid "Erasing..."
msgstr "擦除中..."
@@ -1182,10 +1183,10 @@ msgid "Extra SSH command options"
msgstr "额外的 SSH 命令选项"
msgid "FT over DS"
-msgstr ""
+msgstr "FT over DS"
msgid "FT over the Air"
-msgstr ""
+msgstr "FT over the Air"
msgid "FT protocol"
msgstr "FT 协议"
@@ -1212,7 +1213,7 @@ msgid "Filter useless"
msgstr "过滤无用包"
msgid "Finalizing failed"
-msgstr ""
+msgstr "最终确认失败"
msgid ""
"Find all currently attached filesystems and swap and replace configuration "
@@ -1268,7 +1269,7 @@ msgid "Force"
msgstr "强制"
msgid "Force 40MHz mode"
-msgstr ""
+msgstr "强制 40MHz 模式"
msgid "Force CCMP (AES)"
msgstr "强制 CCMP(AES)"
@@ -1335,7 +1336,7 @@ msgid "Gateway"
msgstr "网关"
msgid "Gateway address is invalid"
-msgstr ""
+msgstr "网关地址无效"
msgid "Gateway ports"
msgstr "网关端口"
@@ -1423,7 +1424,7 @@ msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
msgstr "主机 <abbr title=\"Internet Protocol Address\">IP</abbr> 或网络"
msgid "Host-Uniq tag content"
-msgstr ""
+msgstr "Host-Uniq 标签内容"
msgid "Hostname"
msgstr "主机名"
@@ -1447,10 +1448,10 @@ msgid "IP address"
msgstr "IP 地址"
msgid "IP address in invalid"
-msgstr ""
+msgstr "IP 地址无效"
msgid "IP address is missing"
-msgstr ""
+msgstr "IP 地址缺失"
msgid "IPv4"
msgstr "IPv4"
@@ -1622,7 +1623,7 @@ msgid "Info"
msgstr "信息"
msgid "Initialization failure"
-msgstr ""
+msgstr "初始化失败"
msgid "Initscript"
msgstr "启动脚本"
@@ -1860,7 +1861,7 @@ msgid "Loading"
msgstr "加载中"
msgid "Local IP address is invalid"
-msgstr ""
+msgstr "本地 IP 地址无效"
msgid "Local IP address to assign"
msgstr "要分配的本地 IP 地址"
@@ -1927,7 +1928,7 @@ msgid "Lowest leased address as offset from the network address."
msgstr "网络地址的起始分配基址。"
msgid "MAC"
-msgstr ""
+msgstr "MAC"
msgid "MAC-Address"
msgstr "MAC 地址"
@@ -1945,7 +1946,7 @@ msgid "MAP / LW4over6"
msgstr "MAP / LW4over6"
msgid "MAP rule is invalid"
-msgstr ""
+msgstr "MAP 规则无效"
msgid "MB/s"
msgstr "MB/s"
@@ -2029,7 +2030,7 @@ msgid "Modem device"
msgstr "调制解调器节点"
msgid "Modem information query failed"
-msgstr ""
+msgstr "调制解调器信息查询失败"
msgid "Modem init timeout"
msgstr "调制解调器初始化超时"
@@ -2127,7 +2128,7 @@ msgid "Network boot image"
msgstr "网络启动镜像"
msgid "Network device is not present"
-msgstr ""
+msgstr "网络设备不存在"
msgid "Network without interfaces."
msgstr "无接口的网络。"
@@ -2151,7 +2152,7 @@ msgid "No information available"
msgstr "无可用信息"
msgid "No matching prefix delegation"
-msgstr ""
+msgstr "无匹配的前缀委托"
msgid "No negative cache"
msgstr "禁用无效信息缓存"
@@ -2172,7 +2173,7 @@ msgid "No rules in this chain"
msgstr "本链没有规则"
msgid "No scan results available yet..."
-msgstr ""
+msgstr "还没有可用的扫描结果..."
msgid "No zone assigned"
msgstr "未指定区域"
@@ -2278,10 +2279,10 @@ msgid "Operating frequency"
msgstr "工作频率"
msgid "Option changed"
-msgstr "修改的选项"
+msgstr "选项已更改"
msgid "Option removed"
-msgstr "移除的选项"
+msgstr "选项已移除"
msgid "Optional"
msgstr "可选"
@@ -2311,7 +2312,7 @@ msgid "Optional. Create routes for Allowed IPs for this peer."
msgstr "可选,为此 Peer 创建允许 IP 的路由。"
msgid "Optional. Description of peer."
-msgstr ""
+msgstr "可选,Peer 的描述。"
msgid ""
"Optional. Host of peer. Names are resolved prior to bringing up the "
@@ -2394,7 +2395,7 @@ msgid "PIN"
msgstr "PIN"
msgid "PIN code rejected"
-msgstr ""
+msgstr "PIN 码被拒绝"
msgid "PMK R1 Push"
msgstr "R1 推送 PMK"
@@ -2454,7 +2455,7 @@ msgid "Password of inner Private Key"
msgstr "内部私钥的密码"
msgid "Password successfully changed!"
-msgstr "密码修改成功!"
+msgstr "密码更改成功!"
msgid "Password2"
msgstr "密码 2"
@@ -2484,7 +2485,7 @@ msgid "Peer IP address to assign"
msgstr "要分配的 Peer IP 地址"
msgid "Peer address is missing"
-msgstr ""
+msgstr "Peer 地址缺失"
msgid "Peers"
msgstr "Peers"
@@ -2605,7 +2606,7 @@ msgstr "质量"
msgid ""
"Query all available upstream <abbr title=\"Domain Name System\">DNS</abbr> "
"servers"
-msgstr ""
+msgstr "查询所有可用的上游 <abbr title=\"Domain Name System\">DNS</abbr> 服务器"
msgid "R0 Key Lifetime"
msgstr "R0 密钥生存期"
@@ -2644,7 +2645,7 @@ msgid "Radius-Authentication-Server"
msgstr "Radius 认证服务器"
msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this"
-msgstr ""
+msgstr "原始 16 进制编码的字节。除非您的 ISP 要求,否则请留空"
msgid ""
"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
@@ -2657,13 +2658,14 @@ msgid ""
"Really delete this interface? The deletion cannot be undone! You might lose "
"access to this device if you are connected via this interface"
msgstr ""
+"确定要删除此接口?删除操作无法撤消!若您删除此接口,可能导致无法再访问此设备"
msgid ""
"Really delete this wireless network? The deletion cannot be undone! You "
"might lose access to this device if you are connected via this network."
msgstr ""
-"确定要删除此无线网络?删除操作无法撤销!\\n删除此无线网络,可能导致无法再访问"
-"路由器!"
+"确定要删除此无线网络?删除操作无法撤销!若您删除此无线网络,可能导致无法再访问"
+"此设备。"
msgid "Really reset all changes?"
msgstr "确定要放弃所有更改?"
@@ -2806,7 +2808,7 @@ msgid "Restart Firewall"
msgstr "重启防火墙"
msgid "Restart radio interface"
-msgstr ""
+msgstr "重启无线接口"
msgid "Restore"
msgstr "恢复"
@@ -2898,7 +2900,7 @@ msgid "Scan"
msgstr "扫描"
msgid "Scan request failed"
-msgstr ""
+msgstr "扫描请求失败"
msgid "Scheduled Tasks"
msgstr "计划任务"
@@ -2943,10 +2945,10 @@ msgid "Set up Time Synchronization"
msgstr "设置时间同步"
msgid "Setting PLMN failed"
-msgstr ""
+msgstr "设置 PLMN 失败"
msgid "Setting operation mode failed"
-msgstr ""
+msgstr "设置操作模式失败"
msgid "Setup DHCP Server"
msgstr "配置 DHCP 服务器"
@@ -2958,7 +2960,7 @@ msgid "Short GI"
msgstr "Short GI"
msgid "Short Preamble"
-msgstr ""
+msgstr "Short Preamble"
msgid "Show current backup file list"
msgstr "显示当前备份文件列表"
@@ -3064,7 +3066,7 @@ msgid "Starting configuration apply…"
msgstr "开始应用配置..."
msgid "Starting wireless scan..."
-msgstr ""
+msgstr "正在启动无线扫描..."
msgid "Startup"
msgstr "启动项"
@@ -3220,7 +3222,7 @@ msgstr ""
"code>"
msgid "The backup archive does not appear to be a valid gzip file."
-msgstr ""
+msgstr "备份存档似乎不是有效的 gzip 文件。"
msgid "The configuration file could not be loaded due to the following error:"
msgstr "由于以下错误,配置文件无法被加载:"
@@ -3234,9 +3236,9 @@ msgid ""
"or revert all pending changes to keep the currently working configuration "
"state."
msgstr ""
-"在应用挂起的更改后 %d 秒内无法到达该设备,出于安全原因导致配置回滚。如果您认"
-"为配置更改仍然正确,请执行未选中的配置应用。或者您可以在尝试再次应用之前解除"
-"此警告并编辑更改,或者还原所有未完成的更改以保持当前正在工作的配置状态。"
+"在应用挂起的更改后 %d 秒内无法连接到此设备,出于安全原因导致配置回滚。如果您认"
+"为配置的更改是正确的,请执行强制应用。或者您可以在再次尝试应用之前解除"
+"此警告并编辑配置,或者恢复所有挂起的更改以保持当前正在工作的配置状态。"
msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
@@ -3260,7 +3262,7 @@ msgstr ""
"过程中切勿断电!"
msgid "The following changes have been reverted"
-msgstr "以下更改已放弃"
+msgstr "以下更改已恢复"
msgid "The following rules are currently active on this system."
msgstr "以下规则当前在系统中处于活动状态。"
@@ -3326,13 +3328,13 @@ msgid "There are no active leases."
msgstr "没有已分配的租约。"
msgid "There are no changes to apply."
-msgstr "没有待生效的更改。"
+msgstr "没有待应用的更改。"
msgid "There are no pending changes to revert!"
-msgstr "没有可放弃的更改!"
+msgstr "没有挂起的更改可恢复!"
msgid "There are no pending changes!"
-msgstr "没有待生效的更改!"
+msgstr "没有挂起的更改!"
msgid ""
"There is no device assigned yet, please attach a network device in the "
@@ -3360,7 +3362,7 @@ msgid ""
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgstr ""
-"系统升级时要保存的配置文件和目录的清单。目录 /etc/config/ 内修改过的文件以及"
+"系统升级时要保存的配置文件和目录的清单。目录 /etc/config/ 内更改过的文件以及"
"部分其他配置会被自动保存。"
msgid ""
@@ -3494,25 +3496,25 @@ msgid "UUID"
msgstr "UUID"
msgid "Unable to determine device name"
-msgstr ""
+msgstr "无法确认设备名称"
msgid "Unable to determine external IP address"
-msgstr ""
+msgstr "无法确认外部 IP 地址"
msgid "Unable to determine upstream interface"
-msgstr ""
+msgstr "无法确认上游接口"
msgid "Unable to dispatch"
msgstr "无法调度"
msgid "Unable to obtain client ID"
-msgstr ""
+msgstr "无法获取客户端 ID"
msgid "Unable to resolve AFTR host name"
-msgstr ""
+msgstr "无法解析 AFTR 主机名"
msgid "Unable to resolve peer host name"
-msgstr ""
+msgstr "无法解析 Pear 主机名"
msgid "Unavailable Seconds (UAS)"
msgstr "不可用秒数(UAS)"
@@ -3524,7 +3526,7 @@ msgid "Unknown Error, password not changed!"
msgstr "未知错误,密码未更改!"
msgid "Unknown error (%s)"
-msgstr ""
+msgstr "未知错误(%s)"
msgid "Unmanaged"
msgstr "不配置协议"
@@ -3536,16 +3538,16 @@ msgid "Unsaved Changes"
msgstr "未保存的配置"
msgid "Unsupported MAP type"
-msgstr ""
+msgstr "不支持的 MAP 类型"
msgid "Unsupported modem"
-msgstr ""
+msgstr "不支持的调制解调器"
msgid "Unsupported protocol type."
msgstr "不支持的协议类型"
msgid "Up"
-msgstr ""
+msgstr "向上"
msgid "Update lists"
msgstr "刷新列表"
@@ -3685,7 +3687,7 @@ msgid "Version"
msgstr "版本"
msgid "Virtual dynamic interface"
-msgstr ""
+msgstr "虚拟动态接口"
msgid "WDS"
msgstr "WDS"
@@ -3810,7 +3812,7 @@ msgid "bridged"
msgstr "桥接的"
msgid "create"
-msgstr ""
+msgstr "创建"
msgid "create:"
msgstr "创建:"
@@ -3877,7 +3879,7 @@ msgid "minutes"
msgstr "分钟"
msgid "mixed WPA/WPA2"
-msgstr ""
+msgstr "mixed WPA/WPA2"
msgid "no"
msgstr "否"
@@ -3901,7 +3903,7 @@ msgid "open"
msgstr "开放式"
msgid "output"
-msgstr ""
+msgstr "输出"
msgid "overlay"
msgstr "覆盖"