summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua2
-rw-r--r--applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm48
-rw-r--r--applications/luci-app-adblock/luasrc/view/adblock/query.htm2
-rw-r--r--applications/luci-app-adblock/po/it/adblock.po61
-rw-r--r--applications/luci-app-adblock/po/ja/adblock.po63
-rw-r--r--applications/luci-app-adblock/po/pt-br/adblock.po51
-rw-r--r--applications/luci-app-adblock/po/ru/adblock.po89
-rw-r--r--applications/luci-app-adblock/po/sv/adblock.po55
-rw-r--r--applications/luci-app-adblock/po/templates/adblock.pot37
-rw-r--r--applications/luci-app-adblock/po/zh-cn/adblock.po101
-rw-r--r--applications/luci-app-adblock/po/zh-tw/adblock.po58
-rw-r--r--applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm56
-rw-r--r--applications/luci-app-ahcp/luasrc/view/ahcp_status.htm46
-rw-r--r--applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm60
-rw-r--r--applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm74
-rw-r--r--applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua16
-rw-r--r--applications/luci-app-ddns/Makefile5
-rwxr-xr-xapplications/luci-app-ddns/luasrc/controller/ddns.lua57
-rw-r--r--applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua96
-rw-r--r--applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua20
-rw-r--r--applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua17
-rwxr-xr-xapplications/luci-app-ddns/luasrc/tools/ddns.lua150
-rw-r--r--applications/luci-app-ddns/luasrc/view/ddns/system_status.htm101
-rw-r--r--applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua14
-rw-r--r--applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua11
-rw-r--r--applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua59
-rw-r--r--applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua46
-rw-r--r--applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua9
-rw-r--r--applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua28
-rw-r--r--applications/luci-app-firewall/luasrc/tools/firewall.lua14
-rw-r--r--applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm170
-rw-r--r--applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm197
-rw-r--r--applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm95
-rw-r--r--applications/luci-app-firewall/po/ca/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/cs/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/de/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/el/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/en/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/es/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/fr/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/he/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/hu/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/it/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/ja/firewall.po60
-rw-r--r--applications/luci-app-firewall/po/ko/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/ms/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/no/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/pl/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/pt-br/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/pt/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/ro/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/ru/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/sk/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/sv/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/templates/firewall.pot51
-rw-r--r--applications/luci-app-firewall/po/tr/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/uk/firewall.po195
-rw-r--r--applications/luci-app-firewall/po/vi/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/zh-cn/firewall.po51
-rw-r--r--applications/luci-app-firewall/po/zh-tw/firewall.po51
-rw-r--r--applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm33
-rw-r--r--applications/luci-app-mwan3/po/ja/mwan3.po378
-rw-r--r--applications/luci-app-mwan3/po/ru/mwan3.po15
-rw-r--r--applications/luci-app-mwan3/po/templates/mwan3.pot15
-rw-r--r--applications/luci-app-mwan3/po/zh-cn/mwan3.po78
-rw-r--r--applications/luci-app-mwan3/po/zh-tw/mwan3.po15
-rw-r--r--applications/luci-app-noddos/luasrc/view/noddos/clients.htm76
-rw-r--r--applications/luci-app-ocserv/luasrc/view/ocserv_status.htm83
-rw-r--r--applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm44
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm44
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm40
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm20
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm80
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm40
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm58
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm84
-rw-r--r--applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm36
-rw-r--r--applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua14
-rw-r--r--applications/luci-app-rp-pppoe-server/Makefile2
-rw-r--r--applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua4
-rw-r--r--applications/luci-app-shadowsocks-libev/luasrc/view/shadowsocks-libev/add_instance.htm33
-rw-r--r--applications/luci-app-splash/luasrc/view/admin_status/splash.htm74
-rw-r--r--applications/luci-app-transmission/root/etc/uci-defaults/40_luci-transmission2
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm4
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm48
-rw-r--r--applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm52
-rw-r--r--applications/luci-app-travelmate/po/ja/travelmate.po59
-rw-r--r--applications/luci-app-travelmate/po/pt-br/travelmate.po23
-rw-r--r--applications/luci-app-travelmate/po/ru/travelmate.po45
-rw-r--r--applications/luci-app-travelmate/po/templates/travelmate.pot23
-rw-r--r--applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua48
-rw-r--r--applications/luci-app-upnp/luasrc/view/upnp_status.htm75
-rw-r--r--applications/luci-app-upnp/po/uk/upnp.po27
-rw-r--r--applications/luci-app-wireguard/luasrc/view/wireguard.htm52
-rw-r--r--collections/luci-nginx/Makefile23
-rw-r--r--collections/luci-ssl-nginx/Makefile19
-rw-r--r--collections/luci-ssl-openssl-nginx/Makefile21
-rw-r--r--collections/luci/Makefile3
-rw-r--r--luci.mk4
-rw-r--r--modules/luci-base/Makefile15
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/cbi.js789
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/xhr.js3
-rw-r--r--modules/luci-base/luasrc/cbi.lua46
-rw-r--r--modules/luci-base/luasrc/dispatcher.lua11
-rw-r--r--modules/luci-base/luasrc/model/uci.lua10
-rw-r--r--modules/luci-base/luasrc/tools/status.lua86
-rw-r--r--modules/luci-base/luasrc/util.lua106
-rw-r--r--modules/luci-base/luasrc/view/cbi/apply_widget.htm146
-rw-r--r--modules/luci-base/luasrc/view/cbi/button.htm2
-rw-r--r--modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm2
-rw-r--r--modules/luci-base/luasrc/view/cbi/cell_valueheader.htm10
-rw-r--r--modules/luci-base/luasrc/view/cbi/dropdown.htm54
-rw-r--r--modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm79
-rw-r--r--modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm79
-rw-r--r--modules/luci-base/luasrc/view/cbi/footer.htm2
-rw-r--r--modules/luci-base/luasrc/view/cbi/full_valuefooter.htm1
-rw-r--r--modules/luci-base/luasrc/view/cbi/map.htm5
-rw-r--r--modules/luci-base/luasrc/view/cbi/network_ifacelist.htm102
-rw-r--r--modules/luci-base/luasrc/view/cbi/network_netlist.htm90
-rw-r--r--modules/luci-base/luasrc/view/cbi/nsection.htm9
-rw-r--r--modules/luci-base/luasrc/view/cbi/nullsection.htm5
-rw-r--r--modules/luci-base/luasrc/view/cbi/simpleform.htm15
-rw-r--r--modules/luci-base/luasrc/view/cbi/tblsection.htm212
-rw-r--r--modules/luci-base/luasrc/view/cbi/tsection.htm18
-rw-r--r--modules/luci-base/luasrc/view/cbi/upload.htm2
-rw-r--r--modules/luci-base/luasrc/view/sysauth.htm14
-rw-r--r--modules/luci-base/po/ca/base.po274
-rw-r--r--modules/luci-base/po/cs/base.po298
-rw-r--r--modules/luci-base/po/de/base.po380
-rw-r--r--modules/luci-base/po/el/base.po261
-rw-r--r--modules/luci-base/po/en/base.po247
-rw-r--r--modules/luci-base/po/es/base.po298
-rw-r--r--modules/luci-base/po/fr/base.po298
-rw-r--r--modules/luci-base/po/he/base.po264
-rw-r--r--modules/luci-base/po/hu/base.po298
-rw-r--r--modules/luci-base/po/it/base.po347
-rw-r--r--modules/luci-base/po/ja/base.po289
-rw-r--r--modules/luci-base/po/ko/base.po262
-rw-r--r--modules/luci-base/po/ms/base.po237
-rw-r--r--modules/luci-base/po/no/base.po298
-rw-r--r--modules/luci-base/po/pl/base.po498
-rw-r--r--modules/luci-base/po/pt-br/base.po389
-rw-r--r--modules/luci-base/po/pt/base.po296
-rw-r--r--modules/luci-base/po/ro/base.po265
-rw-r--r--modules/luci-base/po/ru/base.po297
-rw-r--r--modules/luci-base/po/sk/base.po224
-rw-r--r--modules/luci-base/po/sv/base.po248
-rw-r--r--modules/luci-base/po/templates/base.pot224
-rw-r--r--modules/luci-base/po/tr/base.po412
-rw-r--r--modules/luci-base/po/uk/base.po1267
-rw-r--r--modules/luci-base/po/vi/base.po234
-rw-r--r--modules/luci-base/po/zh-cn/base.po396
-rw-r--r--modules/luci-base/po/zh-tw/base.po294
-rw-r--r--modules/luci-mod-admin-full/luasrc/controller/admin/network.lua10
-rw-r--r--modules/luci-mod-admin-full/luasrc/controller/admin/system.lua2
-rw-r--r--modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua17
-rw-r--r--modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua4
-rw-r--r--modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua35
-rw-r--r--modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua11
-rw-r--r--modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua9
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm85
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm79
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm55
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm142
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm32
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_assoclist.htm82
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm58
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm248
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm18
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm53
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm114
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm707
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm118
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm66
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm137
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm60
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm136
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm160
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm3
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm10
-rw-r--r--modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm22
-rw-r--r--modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm30
-rw-r--r--modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm90
-rw-r--r--protocols/luci-proto-3g/luasrc/model/network/proto_3g.lua (renamed from protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua)16
-rw-r--r--protocols/luci-proto-ipv6/Makefile2
-rw-r--r--protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua136
-rw-r--r--protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua8
-rw-r--r--protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua2
-rw-r--r--themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css782
-rw-r--r--themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js3
-rw-r--r--themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm25
-rw-r--r--themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpgbin354 -> 0 bytes
-rw-r--r--themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css1223
-rw-r--r--themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css20
-rw-r--r--themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm1
-rwxr-xr-xthemes/luci-theme-material/htdocs/luci-static/material/css/style.css549
-rwxr-xr-xthemes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js8
-rw-r--r--themes/luci-theme-material/luasrc/view/themes/material/header.htm93
-rw-r--r--themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css1431
-rw-r--r--themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css77
-rw-r--r--themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css59
-rw-r--r--themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css12
-rw-r--r--themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm121
203 files changed, 13107 insertions, 10294 deletions
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
index 3f39622920..da783e3361 100644
--- a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
@@ -183,7 +183,7 @@ end
des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
-cat = bl:option(DynamicList, "adb_src_cat", translate("Categories"))
+cat = bl:option(DynamicList, "adb_src_cat", translate("Archive Categories"))
cat.datatype = "uciname"
cat.optional = true
diff --git a/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm b/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm
index b4b62db5f4..81622e9bc6 100644
--- a/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm
+++ b/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm
@@ -22,25 +22,35 @@ end
-%>
<style type="text/css">
-table.cbi-section-table th,
-table.cbi-section-table td,
+.table.cbi-section-table .th,
+.table.cbi-section-table .td,
.cbi-section-table-cell,
-.cbi-section-table-row,
-.cbi-input-text
+.cbi-section-table-row
{
text-align:left;
vertical-align:top;
margin-right:auto;
margin-left:0px;
+ padding-left:2px;
+ line-height:20px;
+ height:20px;
+}
+.table.cbi-section-table .th
+{
+ white-space:nowrap;
+}
+.table.cbi-section-table input
+{
+ width:7em;
}
.cbi-input-text
{
+ text-align:left;
+ padding-left:2px;
outline:none;
box-shadow:none;
background:transparent;
- padding-left:2px;
- line-height:25px;
- height:25px;
+ height:20px;
width:10em;
}
</style>
@@ -51,37 +61,37 @@ table.cbi-section-table td,
<%- end %>
<div class="cbi-section-descr"><%=self.description%></div>
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
<%- if self.sectionhead then -%>
- <th class="cbi-section-table-cell"><%=self.sectionhead%></th>
+ <div class="th cbi-section-table-cell"><%=self.sectionhead%></div>
<%- else -%>
- <th>&#160;</th>
+ <div class="th">&#160;</div>
<%- end -%>
<%- for i, k in pairs(self.children) do -%>
- <th class="cbi-section-table-cell"<%=width(k)%>>
+ <div class="th cbi-section-table-cell"<%=width(k)%>>
<%-=k.title-%>
- </th>
+ </div>
<%- end -%>
- </tr>
+ </div>
<%- local isempty = true
for i, k in ipairs(self:cfgsections()) do
section = k
isempty = false
scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
-%>
- <tr class="cbi-section-table-row" id="cbi-<%=self.config%>-<%=section%>">
- <th><%=k%></th>
+ <div class="tr cbi-section-table-row" id="cbi-<%=self.config%>-<%=section%>">
+ <div class="th"><%=k%></div>
<%-
for k, node in ipairs(self.children) do
node:render(section, scope or {})
end
if not scope.cbid:match("adb_src_cat") then
-%>
- <td class="cbi-value-field">&#160;</td>
+ <div class="td cbi-value-field">&#160;</div>
<%- end -%>
- </tr>
+ </div>
<%- end -%>
- </table>
+ </div>
</div>
</fieldset>
diff --git a/applications/luci-app-adblock/luasrc/view/adblock/query.htm b/applications/luci-app-adblock/luasrc/view/adblock/query.htm
index 8bbc92664d..8bbed3a53e 100644
--- a/applications/luci-app-adblock/luasrc/view/adblock/query.htm
+++ b/applications/luci-app-adblock/luasrc/view/adblock/query.htm
@@ -35,7 +35,7 @@ This is free software, licensed under the Apache License, Version 2.0
else
{
input.style.display = 'none';
- output.innerHTML = '<span class="error"><%:Invalid domain specified!%></span>';
+ output.innerHTML = '<span class="error"><%:Blocklist not found!%></span>';
}
}
);
diff --git a/applications/luci-app-adblock/po/it/adblock.po b/applications/luci-app-adblock/po/it/adblock.po
index 0a1b65ac36..c2db36effc 100644
--- a/applications/luci-app-adblock/po/it/adblock.po
+++ b/applications/luci-app-adblock/po/it/adblock.po
@@ -17,6 +17,11 @@ msgstr ""
msgid "-------"
msgstr ""
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
msgid "Adblock"
msgstr "Adblock"
@@ -35,8 +40,8 @@ msgstr "Tempo addizionale in secondi di attesa prima che adblock si avvii."
msgid "Advanced"
msgstr "Avanzato"
-msgid "Available blocklist sources."
-msgstr "Fonti lista di blocco disponibili."
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "Directory del Backup"
@@ -47,14 +52,12 @@ msgstr ""
msgid "Blocklist Sources"
msgstr "Fonti lista di Blocco"
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
msgstr ""
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
msgstr ""
msgid ""
@@ -100,12 +103,6 @@ msgstr ""
msgid "Download Utility (SSL Library)"
msgstr ""
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
msgid "Edit Blacklist"
msgstr "Modifica Lista Nera"
@@ -175,20 +172,10 @@ msgstr ""
msgid "Input file not found, please check your configuration."
msgstr "File di input non trovato, per favore controlla la tua configurazione."
-msgid "Invalid domain specified!"
-msgstr "Dominio invalido specificato!"
-
msgid "Last Run"
msgstr "Ultimo Avvio"
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-"Le selezioni degli URL delle liste e categorie Shallalist sono configurabili "
-"nella sezione 'Avanzato'.<br />"
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -239,9 +226,6 @@ msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
msgid "Query"
msgstr "Interrogazione"
@@ -296,10 +280,8 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "Directory per la lista di blocco generata 'adb_list.overall'."
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
-"La grandezza del file è troppo grande per modificarla online in LuCI (&gt; "
-"512 KB)."
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -336,9 +318,6 @@ msgstr ""
"Questo form mostra l'output del registro, prefiltrato per messaggi relativi "
"solo ad adblock."
-msgid "This section contains no values yet"
-msgstr ""
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -392,6 +371,24 @@ msgstr "in pausa"
msgid "running"
msgstr ""
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Dominio invalido specificato!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Fonti lista di blocco disponibili."
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr ""
+#~ "Le selezioni degli URL delle liste e categorie Shallalist sono "
+#~ "configurabili nella sezione 'Avanzato'.<br />"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "La grandezza del file è troppo grande per modificarla online in LuCI "
+#~ "(&gt; 512 KB)."
+
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or the wget 'built-in'."
diff --git a/applications/luci-app-adblock/po/ja/adblock.po b/applications/luci-app-adblock/po/ja/adblock.po
index dfd72cbf6c..cddedacd43 100644
--- a/applications/luci-app-adblock/po/ja/adblock.po
+++ b/applications/luci-app-adblock/po/ja/adblock.po
@@ -8,7 +8,7 @@ msgstr ""
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.0.7\n"
"Language: ja\n"
msgid "'Jail' Blocklist Creation"
@@ -17,6 +17,13 @@ msgstr "'Jail' ブロックリストã®ä½œæˆ"
msgid "-------"
msgstr "(利用ä¸å¯ï¼‰"
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+"<b>警告:</b> RAM ã®ç©ºã容é‡ãŒ 64MB ã«æº€ãŸãªã„メモリー容é‡ã®å°ã•ã„デãƒã‚¤ã‚¹ã§"
+"ã¯ã€ OutOfMemory (OOM) 例外を防ããŸã‚ã«å°‘æ•°ã®ã¿ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+
msgid "Adblock"
msgstr "Adblock"
@@ -35,8 +42,8 @@ msgstr "Adblock ã®å‡¦ç†ãŒé–‹å§‹ã•ã‚Œã‚‹ã¾ã§ã®ã€è¿½åŠ ã®é…延時間(ç
msgid "Advanced"
msgstr "詳細設定"
-msgid "Available blocklist sources."
-msgstr "利用å¯èƒ½ãªãƒ–ロックリストæ供元ã§ã™ã€‚"
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—å…ˆ ディレクトリ"
@@ -47,6 +54,9 @@ msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— モード"
msgid "Blocklist Sources"
msgstr "ブロックリストæ供元"
+msgid "Blocklist not found!"
+msgstr ""
+
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
@@ -55,14 +65,6 @@ msgstr ""
"'Jail' リスト (/tmp/adb_list.jail) を作æˆã—ã¾ã™ã€‚<br />"
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
-msgstr ""
-"警告: RAM ã®ç©ºã容é‡ãŒ 64MB ã«æº€ãŸãªã„メモリー容é‡ã®å°ã•ã„デãƒã‚¤ã‚¹ã§ã¯ã€ "
-"OutOfMemory (OOM) 例外を防ããŸã‚ã«ã€5個よりも多ãã®ãƒªã‚¹ãƒˆã‚’é¸æŠžã—ãªã„よã†ã«ã—"
-"ã¦ãã ã•ã„。"
-
-msgid ""
"Choose 'none' to disable automatic startups, 'timed' to use a classic "
"timeout (default 30 sec.) or select another trigger interface."
msgstr ""
@@ -109,15 +111,6 @@ msgstr "ダウンロード ユーティリティ"
msgid "Download Utility (SSL Library)"
msgstr "ダウンロード ユーティリティ(SSL ライブラリ)"
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-"opkg ã§ãƒ‘ッケージをインストールã™ã‚‹éš›ã« '--force-maintainer' オプションを使用"
-"ã—ã¦æ—¢å­˜ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’上書ãã™ã‚‹ã‹ã€ <a href=\"%s\" target=\"_blank\">ã“ã“"
-"</a> ã‹ã‚‰ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã—ã¦ãã ã•ã„。"
-
msgid "Edit Blacklist"
msgstr "ブラックリストã®ç·¨é›†"
@@ -195,20 +188,10 @@ msgstr "ホワイトリスト ファイルã¸ã®ãƒ•ãƒ«ãƒ‘スã§ã™ã€‚"
msgid "Input file not found, please check your configuration."
msgstr "入力ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。設定を確èªã—ã¦ãã ã•ã„。"
-msgid "Invalid domain specified!"
-msgstr "無効ãªãƒ‰ãƒ¡ã‚¤ãƒ³ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ï¼"
-
msgid "Last Run"
msgstr "最終実行"
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-"リスト㮠URL åŠã³ \"Shalla\" リストã®ã‚«ãƒ†ã‚´ãƒªãƒ¼è¨­å®šã¯ã€'詳細設定' セクション"
-"ã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<br />"
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -260,11 +243,6 @@ msgid ""
msgstr ""
"注æ„: ã“ã‚Œã«ã¯ã€è¿½åŠ ã§ 'msmtp' ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¨ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ãŒå¿…è¦ã§ã™ã€‚"
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-"ã“ã®ãƒ‘ッケージを使用ã™ã‚‹ã«ã¯ã€æ—¢å­˜ã® Adblock 設定ファイルを更新ã—ã¦ãã ã•ã„。"
-"<br />"
-
msgid "Query"
msgstr "検索"
@@ -326,10 +304,10 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "生æˆã•ã‚ŒãŸãƒ–ロックリスト 'adb_list.overall' ã®ä¿å­˜å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã™ã€‚"
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
-"ファイル サイズãŒå¤§ãã™ãŽã‚‹ï¼ˆ512 KB超)ãŸã‚〠LuCI 上ã§ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ç·¨é›†ã§ãã¾ã›"
-"ん。"
+"LuCI上ã§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ç·¨é›†ã‚’è¡Œã†ã«ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒå¤§ãã™ãŽã¾ã™ (&ge; 100 "
+"KB)。"
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -366,9 +344,6 @@ msgstr ""
"ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°å†…ã® Adblock ã«é–¢é€£ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ãŒè¡¨ç¤ºã•ã‚Œ"
"ã¾ã™ã€‚"
-msgid "This section contains no values yet"
-msgstr "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã¯ã€ã¾ã å€¤ãŒã‚ã‚Šã¾ã›ã‚“"
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -424,3 +399,9 @@ msgstr "一時åœæ­¢"
msgid "running"
msgstr "実行中"
+
+#~ msgid "Categories"
+#~ msgstr "カテゴリー"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "無効ãªãƒ‰ãƒ¡ã‚¤ãƒ³ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ï¼"
diff --git a/applications/luci-app-adblock/po/pt-br/adblock.po b/applications/luci-app-adblock/po/pt-br/adblock.po
index c0d9d816db..07d0f9a8d2 100644
--- a/applications/luci-app-adblock/po/pt-br/adblock.po
+++ b/applications/luci-app-adblock/po/pt-br/adblock.po
@@ -18,6 +18,11 @@ msgstr ""
msgid "-------"
msgstr ""
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
msgid "Adblock"
msgstr "Adblock"
@@ -38,8 +43,8 @@ msgstr ""
msgid "Advanced"
msgstr "Avançado"
-msgid "Available blocklist sources."
-msgstr "Fontes de listas de bloqueio disponíveis."
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "Diretório da cópia de segurança"
@@ -50,14 +55,12 @@ msgstr ""
msgid "Blocklist Sources"
msgstr "Fontes de listas de bloqueio"
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
msgstr ""
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
msgstr ""
msgid ""
@@ -101,12 +104,6 @@ msgstr ""
msgid "Download Utility (SSL Library)"
msgstr "Utilitário de Download (Biblioteca SSL)"
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
msgid "Edit Blacklist"
msgstr "Editar Lista de Bloqueio"
@@ -175,18 +172,10 @@ msgstr ""
msgid "Input file not found, please check your configuration."
msgstr "Arquivo de entrada não encontrado, por favor cheque sua configuração."
-msgid "Invalid domain specified!"
-msgstr "Domínio especificado inválido!"
-
msgid "Last Run"
msgstr ""
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -232,9 +221,6 @@ msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
msgid "Query"
msgstr "Consulta"
@@ -288,9 +274,8 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr ""
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
-"O tamanho do arquivo é muito grande para edição online no LuCI (&gt; 512 KB)."
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -327,9 +312,6 @@ msgstr ""
"Esse formulário mostra a saída do syslog, pré-filtrado para mensagens do "
"adblock apenas."
-msgid "This section contains no values yet"
-msgstr ""
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -381,6 +363,17 @@ msgstr ""
msgid "running"
msgstr ""
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Domínio especificado inválido!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Fontes de listas de bloqueio disponíveis."
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "O tamanho do arquivo é muito grande para edição online no LuCI (&gt; 512 "
+#~ "KB)."
+
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or the wget 'built-in'."
diff --git a/applications/luci-app-adblock/po/ru/adblock.po b/applications/luci-app-adblock/po/ru/adblock.po
index 17f39fdd87..c1193d38e1 100644
--- a/applications/luci-app-adblock/po/ru/adblock.po
+++ b/applications/luci-app-adblock/po/ru/adblock.po
@@ -21,6 +21,11 @@ msgstr "Создание Черного<br />ÑпиÑка 'Jail'"
msgid "-------"
msgstr "-------"
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
msgid "Adblock"
msgstr "AdBlock"
@@ -39,8 +44,8 @@ msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° в Ñекундах до Ð
msgid "Advanced"
msgstr "Дополнительно"
-msgid "Available blocklist sources."
-msgstr "ИÑточники ÑпиÑков блокировки. "
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "Папка Ð´Ð»Ñ Ð±Ñкапа"
@@ -51,6 +56,9 @@ msgstr "Режим ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð±ÐµÐºÐ°Ð¿Ð°"
msgid "Blocklist Sources"
msgstr "ИÑточники ÑпиÑков блокировки"
+msgid "Blocklist not found!"
+msgstr ""
+
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
@@ -60,14 +68,6 @@ msgstr ""
"Белого ÑпиÑка.<br />"
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
-msgstr ""
-"Ð’ÐИМÐÐИЕ: Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð³Ð¾ программного ÑÐ±Ð¾Ñ Ð¸ перезагрузки, на "
-"уÑтройÑтвах Ñ Ð¾Ð±ÑŠÐµÐ¼Ð¾Ð¼ оперативной памÑти менее 64MB, не выбирайте больше 5 "
-"ÑпиÑков."
-
-msgid ""
"Choose 'none' to disable automatic startups, 'timed' to use a classic "
"timeout (default 30 sec.) or select another trigger interface."
msgstr ""
@@ -113,15 +113,6 @@ msgstr "Скачать утилиту"
msgid "Download Utility (SSL Library)"
msgstr "Загрузить утилиту (библиотека SSL)"
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-"УÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð¿Ð°ÐºÐµÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ opkg, иÑпользуйте '--force-maintainer', чтобы "
-"перезапиÑать ÑущеÑтвующий config файл или загрузить новый дефолтный config "
-"файл <a href=\"%s\" target=\"_blank\">здеÑÑŒ</a>"
-
msgid "Edit Blacklist"
msgstr "Редактировать Черный ÑпиÑок"
@@ -198,20 +189,10 @@ msgstr "Полный путь к файлу Белого ÑпиÑка."
msgid "Input file not found, please check your configuration."
msgstr "Config файл не найден, наÑтройте config файл."
-msgid "Invalid domain specified!"
-msgstr "Задан недопуÑтимый домен!"
-
msgid "Last Run"
msgstr "ПоÑледнее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка"
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-"СпиÑок URL-адреÑов и наÑтройка ÑпиÑка иÑпользованиÑ, наÑтраиваютÑÑ Ð½Ð° "
-"Ñтранице 'Дополнительно'.<br />"
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -263,9 +244,6 @@ msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr "Внимание: Ñто потребует дополнительной уÑтановки пакета 'msmtp'."
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr "Обновите config файл Adblock, чтобы иÑпользовать Ñтот пакет.<br />"
-
msgid "Query"
msgstr "ЗапроÑ"
@@ -328,9 +306,8 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "Ðазначить папку Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑпиÑка блокировки 'adb_list.overall'."
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
-"Размер файла Ñлишком большой, Ð´Ð»Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² LuCI (&gt; 512 KB)."
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -363,9 +340,6 @@ msgid ""
"only."
msgstr "Страница ÑиÑтемного журнала. Только ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÑвÑзанные Ñ Adblock."
-msgid "This section contains no values yet"
-msgstr "ЗдеÑÑŒ не ÑодержатÑÑ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ðµ значениÑ"
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -422,3 +396,44 @@ msgstr "оÑтановлено"
msgid "running"
msgstr "работает"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Задан недопуÑтимый домен!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "ИÑточники ÑпиÑков блокировки. "
+
+#~ msgid ""
+#~ "Caution: To prevent OOM exceptions on low memory devices with less than "
+#~ "64 MB free RAM, please do not select more than five blocklist sources!"
+#~ msgstr ""
+#~ "Ð’ÐИМÐÐИЕ: Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð³Ð¾ программного ÑÐ±Ð¾Ñ Ð¸ перезагрузки, "
+#~ "на уÑтройÑтвах Ñ Ð¾Ð±ÑŠÐµÐ¼Ð¾Ð¼ оперативной памÑти менее 64MB, не выбирайте "
+#~ "больше 5 ÑпиÑков."
+
+#~ msgid ""
+#~ "During opkg package installation use the '--force-maintainer' option to "
+#~ "overwrite the pre-existing config file or download a fresh default config "
+#~ "from <a href=\"%s\" target=\"_blank\">here</a>"
+#~ msgstr ""
+#~ "УÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð¿Ð°ÐºÐµÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ opkg, иÑпользуйте '--force-maintainer', "
+#~ "чтобы перезапиÑать ÑущеÑтвующий config файл или загрузить новый дефолтный "
+#~ "config файл <a href=\"%s\" target=\"_blank\">здеÑÑŒ</a>"
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr ""
+#~ "СпиÑок URL-адреÑов и наÑтройка ÑпиÑка иÑпользованиÑ, наÑтраиваютÑÑ Ð½Ð° "
+#~ "Ñтранице 'Дополнительно'.<br />"
+
+#~ msgid "Please update your adblock config file to use this package.<br />"
+#~ msgstr "Обновите config файл Adblock, чтобы иÑпользовать Ñтот пакет.<br />"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "Размер файла Ñлишком большой, Ð´Ð»Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² LuCI (&gt; 512 "
+#~ "KB)."
+
+#~ msgid "This section contains no values yet"
+#~ msgstr "ЗдеÑÑŒ не ÑодержатÑÑ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ðµ значениÑ"
diff --git a/applications/luci-app-adblock/po/sv/adblock.po b/applications/luci-app-adblock/po/sv/adblock.po
index d875a69f96..4a7ca4b738 100644
--- a/applications/luci-app-adblock/po/sv/adblock.po
+++ b/applications/luci-app-adblock/po/sv/adblock.po
@@ -7,6 +7,11 @@ msgstr ""
msgid "-------"
msgstr "-------"
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
msgid "Adblock"
msgstr "Adblock"
@@ -25,8 +30,8 @@ msgstr ""
msgid "Advanced"
msgstr "Avancerat"
-msgid "Available blocklist sources."
-msgstr "Tillgängliga källor för blockeringslistor"
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "Säkerhetskopiera mapp"
@@ -37,14 +42,12 @@ msgstr ""
msgid "Blocklist Sources"
msgstr "Källor för blockeringslistor"
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
msgstr ""
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
msgstr ""
msgid ""
@@ -91,12 +94,6 @@ msgstr ""
msgid "Download Utility (SSL Library)"
msgstr "Nerladdningsprogram (SSL-bibliotek)"
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
msgid "Edit Blacklist"
msgstr "Redigera svartlista"
@@ -166,18 +163,10 @@ msgid "Input file not found, please check your configuration."
msgstr ""
"Inmatningsfilen kunde inte hittas, var vänlig kontrollera din konfiguration."
-msgid "Invalid domain specified!"
-msgstr "Ogiltig domän angiven!"
-
msgid "Last Run"
msgstr "Kördes senast"
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -221,9 +210,6 @@ msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
msgid "Query"
msgstr "Fråga"
@@ -256,8 +242,8 @@ msgid ""
msgstr ""
msgid ""
-"Size of the download queue to handle downloads &amp; list processing in parallel "
-"(default '4').<br />"
+"Size of the download queue to handle downloads &amp; list processing in "
+"parallel (default '4').<br />"
msgstr ""
msgid "Startup Trigger"
@@ -277,8 +263,8 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr ""
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
-msgstr "Filstorleken är för stor för online-redigering i LuCi (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
+msgstr ""
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -311,9 +297,6 @@ msgid ""
"only."
msgstr ""
-msgid "This section contains no values yet"
-msgstr ""
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -365,6 +348,16 @@ msgstr "pausad"
msgid "running"
msgstr ""
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Ogiltig domän angiven!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Tillgängliga källor för blockeringslistor"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "Filstorleken är för stor för online-redigering i LuCi (&gt; 512 KB)."
+
#~ msgid ""
#~ "Caution: Please don't select big lists or many lists at once on low "
#~ "memory devices to prevent OOM exceptions!"
diff --git a/applications/luci-app-adblock/po/templates/adblock.pot b/applications/luci-app-adblock/po/templates/adblock.pot
index 6fbaa652ae..a375d0edb6 100644
--- a/applications/luci-app-adblock/po/templates/adblock.pot
+++ b/applications/luci-app-adblock/po/templates/adblock.pot
@@ -7,6 +7,11 @@ msgstr ""
msgid "-------"
msgstr ""
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
msgid "Adblock"
msgstr ""
@@ -25,7 +30,7 @@ msgstr ""
msgid "Advanced"
msgstr ""
-msgid "Available blocklist sources."
+msgid "Archive Categories"
msgstr ""
msgid "Backup Directory"
@@ -37,14 +42,12 @@ msgstr ""
msgid "Blocklist Sources"
msgstr ""
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
msgstr ""
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
msgstr ""
msgid ""
@@ -84,12 +87,6 @@ msgstr ""
msgid "Download Utility (SSL Library)"
msgstr ""
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
msgid "Edit Blacklist"
msgstr ""
@@ -158,18 +155,10 @@ msgstr ""
msgid "Input file not found, please check your configuration."
msgstr ""
-msgid "Invalid domain specified!"
-msgstr ""
-
msgid "Last Run"
msgstr ""
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -213,9 +202,6 @@ msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
msgid "Query"
msgstr ""
@@ -269,7 +255,7 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr ""
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
msgid ""
@@ -297,9 +283,6 @@ msgid ""
"only."
msgstr ""
-msgid "This section contains no values yet"
-msgstr ""
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
diff --git a/applications/luci-app-adblock/po/zh-cn/adblock.po b/applications/luci-app-adblock/po/zh-cn/adblock.po
index e26c44c4da..408d04055c 100644
--- a/applications/luci-app-adblock/po/zh-cn/adblock.po
+++ b/applications/luci-app-adblock/po/zh-cn/adblock.po
@@ -16,11 +16,17 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "'Jail' Blocklist Creation"
-msgstr ""
+msgstr "“Jail†拦截åå•åˆ›å»º"
msgid "-------"
msgstr "-------"
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+"<b>注æ„:</b>为防止在å°äºŽ 64M 空闲内存的设备上出现内存ä¸è¶³å¼‚常,请åªé€‰æ‹©å…¶ä¸­çš„几个ï¼"
+
msgid "Adblock"
msgstr "Adblock"
@@ -39,26 +45,24 @@ msgstr "è§¦å‘ Adblock 开始处ç†å‰çš„é¢å¤–延迟(以秒为å•ä½ï¼‰ã€‚"
msgid "Advanced"
msgstr "高级"
-msgid "Available blocklist sources."
-msgstr "å¯ç”¨çš„ blocklist æ¥æºã€‚"
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "备份目录"
msgid "Backup Mode"
-msgstr ""
+msgstr "备份模å¼"
msgid "Blocklist Sources"
msgstr "拦截列表æ¥æº"
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
msgstr ""
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
msgstr ""
msgid ""
@@ -79,6 +83,7 @@ msgid ""
"Create compressed blocklist backups, they will be used in case of download "
"errors or during startup in backup mode."
msgstr ""
+"创建压缩的拦截列表备份,它们将在下载错误或备份模å¼å¯åŠ¨æœŸé—´ä½¿ç”¨ã€‚"
msgid "DNS Backend (DNS Directory)"
msgstr "DNS åŽç«¯ï¼ˆDNS 目录)"
@@ -95,17 +100,11 @@ msgid ""
msgstr "å¯åŠ¨æœŸé—´ä¸è¦è‡ªåŠ¨æ›´æ–° blocklists,改用 blocklists 的备份。"
msgid "Download Utility"
-msgstr ""
+msgstr "下载工具"
msgid "Download Utility (SSL Library)"
msgstr "下载实用程åºï¼ˆSSL 库)"
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
msgid "Edit Blacklist"
msgstr "编辑黑åå•"
@@ -116,10 +115,10 @@ msgid "Edit Whitelist"
msgstr "编辑白åå•"
msgid "Email Notification"
-msgstr ""
+msgstr "Email æ醒"
msgid "Email Notification Count"
-msgstr ""
+msgstr "Email æ醒计数"
msgid "Enable Adblock"
msgstr "å¯ç”¨ Adblock"
@@ -131,6 +130,7 @@ msgid ""
"Enable memory intense overall sort / duplicate removal on low memory devices "
"(&lt; 64 MB free RAM)"
msgstr ""
+"在低内存设备上å¯ç”¨ç§¯æžçš„内存整体排åº/é‡å¤ç§»é™¤(&lt; 64 MB 空闲内存)"
msgid "Enable verbose debug logging in case of any processing error."
msgstr "在出现任何处ç†é”™è¯¯çš„情况下å¯ç”¨è¯¦ç»†è°ƒè¯•æ—¥å¿—记录。"
@@ -142,25 +142,29 @@ msgid "Extra Options"
msgstr "é¢å¤–选项"
msgid "Flush DNS Cache"
-msgstr ""
+msgstr "清空 DNS 缓存"
msgid "Flush DNS Cache after adblock processing."
-msgstr ""
+msgstr "在 adblock 进程å¯åŠ¨åŽæ¸…空 DNS 缓存。"
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
+"å¯¹å— SSL ä¿æŠ¤çš„拦截列表æºï¼Œæ‚¨éœ€è¦ä¸€ä¸ªåˆé€‚çš„ SSL 库,如 “libustream-ssl†或 "
+"“built-inâ€ã€‚"
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
msgstr ""
+"进一步信æ¯<a href=\"%s\" target=\"_blank\">请访问在线文档"
msgid ""
"For further performance improvements you can raise this value, e.g. '8' or "
"'16' should be safe."
msgstr ""
+"为了进一步æ高性能,您å¯ä»¥æ高此值,例如:8 或 16 应该是安全的。"
msgid "Force Local DNS"
msgstr "强制本地 DNS"
@@ -169,26 +173,19 @@ msgid "Force Overall Sort"
msgstr "强制整体排åº"
msgid "Full path to the whitelist file."
-msgstr ""
+msgstr "白åå•æ–‡ä»¶çš„全路径。"
msgid "Input file not found, please check your configuration."
msgstr "输入文件未找到,请检查您的é…置。"
-msgid "Invalid domain specified!"
-msgstr "无效域åï¼"
-
msgid "Last Run"
msgstr "最åŽè¿è¡Œ"
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr "列表 URL å’Œ Shallalist 类别选择å¯åœ¨â€œé«˜çº§â€é€‰é¡¹å¡ä¸­é…置。<br />"
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
+"å¯ç”¨ç½‘络接å£åˆ—表。通常å¯åŠ¨å°†ç”± “wan†接å£è§¦å‘。<br />"
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
@@ -196,13 +193,13 @@ msgid ""
msgstr "支æŒçš„ DNS åŽç«¯åˆ—表åŠå…¶é»˜è®¤åˆ—表导出目录。<br />"
msgid "List of supported and fully pre-configured download utilities."
-msgstr ""
+msgstr "支æŒå’Œå®Œå…¨é¢„é…置的下载工具列表。"
msgid "Loading"
msgstr "加载中"
msgid "Max. Download Queue"
-msgstr ""
+msgstr "最大下载队列"
msgid "No"
msgstr "å¦"
@@ -212,7 +209,7 @@ msgid ""
msgstr "在默认设置并ä¸é€‚åˆæ‚¨æ—¶çš„é¢å¤–选项。"
msgid "Overall Domains"
-msgstr ""
+msgstr "域å总览"
msgid "Overview"
msgstr "总览"
@@ -230,9 +227,7 @@ msgstr "请在终端会è¯ä¸­ç›´æŽ¥ç¼–辑此文件。"
msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
-
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
+"请注æ„:这需è¦é¢å¤–çš„ “msmtp†软件包安装和设置。"
msgid "Query"
msgstr "查询"
@@ -244,6 +239,7 @@ msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
msgstr ""
+"如果总数å°äºŽæˆ–等于给定é™åˆ¶ï¼ˆé»˜è®¤ä¸º 0),请æ高最å°ç”µå­é‚®ä»¶é€šçŸ¥æ•°ï¼Œä»¥èŽ·å–电å­é‚®ä»¶ã€‚"
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgstr "将所有 DNS 查询从“lanâ€åŒºåŸŸé‡å®šå‘到本地解æžå™¨ã€‚"
@@ -264,11 +260,13 @@ msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
msgstr ""
+"如果å‘生错误或域计数 &le; 0,å‘é€é€šçŸ¥ç”µå­é‚®ä»¶ã€‚<br />"
msgid ""
-"Size of the download queue to handle downloads &amp; list processing in parallel "
-"(default '4').<br />"
+"Size of the download queue to handle downloads &amp; list processing in "
+"parallel (default '4').<br />"
msgstr ""
+"处ç†ä¸‹è½½é˜Ÿåˆ—çš„å¤§å° ï¼†amp; 并行处ç†åˆ—表(默认 “4â€ï¼‰ã€‚<br />"
msgid "Startup Trigger"
msgstr "å¯åŠ¨è§¦å‘器"
@@ -283,12 +281,14 @@ msgid ""
"Target directory for adblock backups. Please use only non-volatile disks, e."
"g. an external usb stick."
msgstr ""
+"adblock 备份的目标目录。 请仅使用éžæ˜“失性ç£ç›˜ï¼Œä¾‹å¦‚:一个外置 U 盘。"
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "生æˆçš„ blocklist 'adb_list.overall'的目标目录。"
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
-msgstr "文件大å°å¤ªå¤§ï¼Œæ— æ³•åœ¨ LuCI(&gt; 512 KB)中进行在线编辑。"
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
+msgstr ""
+"文件过大,无法使用 LuCI 的在线编辑(&ge; 100 KB)。"
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -315,9 +315,6 @@ msgid ""
"only."
msgstr "此表å•æ˜¾ç¤ºç³»ç»Ÿæ—¥å¿—输出,仅针对 adblock 相关的消æ¯è¿›è¡Œäº†é¢„筛选。"
-msgid "This section contains no values yet"
-msgstr ""
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -336,7 +333,7 @@ msgid "Waiting for command to complete..."
msgstr "正在执行命令..."
msgid "Whitelist File"
-msgstr ""
+msgstr "白åå•æ–‡ä»¶"
msgid "Yes"
msgstr "是"
@@ -345,6 +342,7 @@ msgid ""
"You can use this restrictive blocklist manually e.g. for guest wifi or "
"kidsafe configurations."
msgstr ""
+"您å¯ä»¥æ‰‹åŠ¨ä½¿ç”¨æ­¤é™åˆ¶æ€§æ‹¦æˆªåˆ—表,例如:为客人æä¾› wifi 或 kidsafe é…置。"
msgid "disabled"
msgstr "å·²ç¦ç”¨"
@@ -352,7 +350,7 @@ msgstr "å·²ç¦ç”¨"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
-msgstr ""
+msgstr "例如:è¦æŽ¥æ”¶æ¯ä¸ª adblock 更新的电å­é‚®ä»¶é€šçŸ¥æ—¶å°†æ­¤å€¼è®¾ç½®ä¸º150000。"
msgid "enabled"
msgstr "å·²å¯ç”¨"
@@ -367,5 +365,18 @@ msgid "paused"
msgstr "已暂åœ"
msgid "running"
-msgstr ""
+msgstr "è¿è¡Œä¸­"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "无效域åï¼"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "å¯ç”¨çš„ blocklist æ¥æºã€‚"
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr "列表 URL å’Œ Shallalist 类别选择å¯åœ¨â€œé«˜çº§â€é€‰é¡¹å¡ä¸­é…置。<br />"
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr "文件大å°å¤ªå¤§ï¼Œæ— æ³•åœ¨ LuCI(&gt; 512 KB)中进行在线编辑。"
diff --git a/applications/luci-app-adblock/po/zh-tw/adblock.po b/applications/luci-app-adblock/po/zh-tw/adblock.po
index 417fc6bcc3..45b19cdc80 100644
--- a/applications/luci-app-adblock/po/zh-tw/adblock.po
+++ b/applications/luci-app-adblock/po/zh-tw/adblock.po
@@ -21,6 +21,11 @@ msgstr ""
msgid "-------"
msgstr "-------"
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
msgid "Adblock"
msgstr "Adblock"
@@ -39,8 +44,8 @@ msgstr "觸發 Adblock 開始處ç†å‰çš„é¡å¤–延é²ï¼ˆä»¥ç§’為單ä½ï¼‰ã€‚"
msgid "Advanced"
msgstr "高階"
-msgid "Available blocklist sources."
-msgstr "å¯ç”¨çš„ blocklist 來æºã€‚"
+msgid "Archive Categories"
+msgstr ""
msgid "Backup Directory"
msgstr "備份目錄"
@@ -51,14 +56,12 @@ msgstr ""
msgid "Blocklist Sources"
msgstr "攔截列表來æº"
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
msgstr ""
msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
msgstr ""
msgid ""
@@ -100,12 +103,6 @@ msgstr ""
msgid "Download Utility (SSL Library)"
msgstr "下載實用程å¼ï¼ˆSSL 庫)"
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
msgid "Edit Blacklist"
msgstr "編輯黑åå–®"
@@ -174,18 +171,10 @@ msgstr ""
msgid "Input file not found, please check your configuration."
msgstr "輸入檔案未找到,請檢查您的é…置。"
-msgid "Invalid domain specified!"
-msgstr "無效域åï¼"
-
msgid "Last Run"
msgstr "最後執行"
msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr "列表 URL å’Œ Shallalist 類別é¸æ“‡å¯åœ¨â€œé«˜éšŽâ€é¸é …å¡ä¸­é…置。<br />"
-
-msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
@@ -231,9 +220,6 @@ msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
msgid "Query"
msgstr "查詢"
@@ -266,8 +252,8 @@ msgid ""
msgstr ""
msgid ""
-"Size of the download queue to handle downloads &amp; list processing in parallel "
-"(default '4').<br />"
+"Size of the download queue to handle downloads &amp; list processing in "
+"parallel (default '4').<br />"
msgstr ""
msgid "Startup Trigger"
@@ -287,8 +273,8 @@ msgstr ""
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "生æˆçš„ blocklist 'adb_list.overall'的目標目錄。"
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
-msgstr "檔案大å°å¤ªå¤§ï¼Œç„¡æ³•åœ¨ LuCI(&gt; 512 KB)中進行線上編輯。"
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
+msgstr ""
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -315,9 +301,6 @@ msgid ""
"only."
msgstr "此表單顯示系統日誌輸出,僅é‡å° adblock 相關的訊æ¯é€²è¡Œäº†é ç¯©é¸ã€‚"
-msgid "This section contains no values yet"
-msgstr ""
-
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@@ -369,3 +352,16 @@ msgstr "已暫åœ"
msgid "running"
msgstr ""
+#~ msgid "Invalid domain specified!"
+#~ msgstr "無效域åï¼"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "å¯ç”¨çš„ blocklist 來æºã€‚"
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr "列表 URL å’Œ Shallalist 類別é¸æ“‡å¯åœ¨â€œé«˜éšŽâ€é¸é …å¡ä¸­é…置。<br />"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr "檔案大å°å¤ªå¤§ï¼Œç„¡æ³•åœ¨ LuCI(&gt; 512 KB)中進行線上編輯。"
diff --git a/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm b/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm
index 0629c84b36..5f7429dfd1 100644
--- a/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm
+++ b/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm
@@ -21,24 +21,24 @@
<%- if device_name then -%>
<fieldset class="cbi-section">
<legend><%=device_name%><%: Partitions%></legend>
- <table class="cbi-section-table" id="partitions">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Partition%></th>
- <th class="cbi-section-table-cell"><%:Status%></th>
- <th class="cbi-section-table-cell"><%:Firmware/OS (Kernel)%></th>
- <th class="cbi-section-table-cell"><%:Action%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td>
+ <div class="table cbi-section-table" id="partitions">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Partition%></div>
+ <div class="th cbi-section-table-cell"><%:Status%></div>
+ <div class="th cbi-section-table-cell"><%:Firmware/OS (Kernel)%></div>
+ <div class="th cbi-section-table-cell"><%:Action%></div>
+ </div>
+ <div class="tr cbi-section-table-row">
+ <div class="td">
<%=string.format("%X", boot_envvar1_partition_one)%>
- </td>
- <td>
+ </div>
+ <div class="td">
<%- if boot_envvar1_partition_one == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
- </td>
- <td>
+ </div>
+ <div class="td">
<%=partition_one_os%>
- </td>
- <td>
+ </div>
+ <div class="td">
<%- if boot_envvar1_partition_one == current_partition then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
@@ -50,19 +50,19 @@
<input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
</form>
<%- end -%>
- </td>
- </tr>
- <tr class="cbi-section-table-row">
- <td>
+ </div>
+ </div>
+ <div class="tr cbi-section-table-row">
+ <div class="td">
<%=string.format("%X", boot_envvar1_partition_two)%>
- </td>
- <td>
+ </div>
+ <div class="td">
<%- if boot_envvar1_partition_two == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
- </td>
- <td>
+ </div>
+ <div class="td">
<%=partition_two_os%>
- </td>
- <td>
+ </div>
+ <div class="td">
<%- if boot_envvar1_partition_two == current_partition then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
@@ -74,9 +74,9 @@
<input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
</form>
<%- end -%>
- </td>
- </tr>
- </table>
+ </div>
+ </div>
+ </div>
</fieldset>
<%- else -%>
<p class="alert-message warning"><%:Warning: This system does not have two partitions!%></p>
diff --git a/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm b/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
index 946828953e..ab25f862b8 100644
--- a/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
+++ b/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
@@ -7,29 +7,21 @@
if (st && tb && tx)
{
/* clear all rows */
- while( tb.rows.length > 1 )
- tb.deleteRow(1);
+ while (tb.firstElementChild !== tb.lastElementChild)
+ tb.removeChild(tb.lastElementChild);
- for( var i = 0; i < st.leases.length; i++ )
+ for (var i = 0; i < st.leases.length; i++)
{
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
- tr.insertCell(-1).innerHTML = st.leases[i].addr;
- tr.insertCell(-1).innerHTML = String.format('%t', st.leases[i].age);
+ tb.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format((i % 2) + 1), [
+ E('<div class="td">', st.leases[i].addr),
+ E('<div class="td">', '%t'.format(st.leases[i].age))
+ ]));
}
- if( tb.rows.length == 1 )
- {
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 2;
- td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
- }
+ if (tb.firstElementChild === tb.lastElementChild)
+ tb.appendChild(E('<div class="tr cbi-section-table-row"><div class="td"><em><br /><%:There are no active leases.%></em></div></div>'));
- if( st.uid == '00:00:00:00:00:00:00:00' )
+ if (st.uid == '00:00:00:00:00:00:00:00')
tx.innerHTML = '<%:The AHCP Service is not running.%>';
else
tx.innerHTML = String.format('<%:The AHCP Service is running with ID %s.%>', st.uid);
@@ -41,13 +33,13 @@
<fieldset class="cbi-section">
<legend><%:Active AHCP Leases%></legend>
<p id="ahcpd_status_text"></p>
- <table class="cbi-section-table" id="ahcpd_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Address%></th>
- <th class="cbi-section-table-cell"><%:Age%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="5"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
+ <div class="table cbi-section-table" id="ahcpd_status_table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Address%></div>
+ <div class="th cbi-section-table-cell"><%:Age%></div>
+ </div>
+ <div class="tr cbi-section-table-row">
+ <div class="td" colspan="5"><em><br /><%:Collecting data...%></em></div>
+ </div>
+ </div>
</fieldset>
diff --git a/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm b/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
index 9f644ba074..fb40335f99 100644
--- a/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
+++ b/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
@@ -79,23 +79,23 @@
<% for i, plan in pairs(ast.dialplan.plans()) do %>
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div style="text-align: left; padding: 3px" class="th cbi-section-table-cell">
<big>Dialplan <em><%=plan.name%></em></big>
- </th>
- <td>
+ </div>
+ <div class="td">
<a href="<%=url('admin/asterisk/dialplans')%>?delplan=<%=plan.name%>">
<img style="border:none" alt="Remove this dialplan" title="Remove this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
- </td>
- </tr>
+ </div>
+ </div>
<!-- dialzones -->
<% local zones_used = { }; local row = 0 %>
<% for i, zone in ipairs(plan.zones) do zones_used[zone.name] = true %>
- <tr class="cbi-section-table-row <%=rowstyle(row)%>">
- <td style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+ <div class="tr cbi-section-table-row <%=rowstyle(row)%>">
+ <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
<strong>&#x2514; Dialzone <em><%=zone.name%></em></strong> (<%=zone.description%>)
<p style="padding-left: 1em; margin-bottom:0">
Lines:
@@ -107,24 +107,24 @@
Matches:
<%=format_matches(zone)%>
</p>
- </td>
- <td style="width:5%" class="cbi-value-field">
+ </div>
+ <div style="width:5%" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/dialplans/out', zone.name)%>">
<img style="border:none" alt="Edit dialzone" title="Edit dialzone" src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
- </td>
- </tr>
+ </div>
+ </div>
<% row = row + 1; end %>
<!-- /dialzones -->
<!-- voicemail -->
<% local boxes_used = { } %>
<% for ext, box in luci.util.kspairs(plan.voicemailboxes) do boxes_used[box.id] = true %>
- <tr class="cbi-section-table-row <%=rowstyle(row)%>">
- <td style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+ <div class="tr cbi-section-table-row <%=rowstyle(row)%>">
+ <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
<strong>&#x2514; Voicemailbox <em><%=box.id%></em></strong> (<%=box.name%>)
<p style="padding-left: 1em; margin-bottom:0">
Owner: <%=box.name%> |
@@ -132,44 +132,44 @@
Pager: <%=#box.page > 0 and box.page or 'n/a'%><br />
Matches: <%=format_matches(ext)%>
</p>
- </td>
- <td style="width:5%" class="cbi-value-field">
+ </div>
+ <div style="width:5%" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/voicemail/mailboxes')%>">
<img style="border:none" alt="Manage mailboxes ..." title="Manage mailboxes ..." src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
- </td>
- </tr>
+ </div>
+ </div>
<% row = row + 1; end %>
<!-- /voicemail -->
<!-- meetme -->
<% local rooms_used = { } %>
<% for ext, room in luci.util.kspairs(plan.meetmerooms) do rooms_used[room.room] = true %>
- <tr class="cbi-section-table-row <%=rowstyle(row)%>">
- <td style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+ <div class="tr cbi-section-table-row <%=rowstyle(row)%>">
+ <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
<strong>&#x2514; MeetMe Room <em><%=room.room%></em></strong>
<% if room.description and #room.description > 0 then %> (<%=room.description%>)<% end %>
<p style="padding-left: 1em; margin-bottom:0">
Matches: <%=format_matches(ext)%>
</p>
- </td>
- <td style="width:5%" class="cbi-value-field">
+ </div>
+ <div style="width:5%" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/meetme/rooms')%>">
<img style="border:none" alt="Manage conferences ..." title="Manage conferences ..." src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
- </td>
- </tr>
+ </div>
+ </div>
<% row = row + 1; end %>
<!-- /meetme -->
- <tr class="cbi-section-table-row">
- <td style="text-align: left; padding: 3px" class="cbi-section-table-cell" colspan="2">
+ <div class="tr cbi-section-table-row">
+ <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell" colspan="2">
<hr style="margin-bottom:0.5em; border-width:0 0 1px 0" />
Add Dialzone:<br />
@@ -213,10 +213,10 @@
<br /><br />
<input type="submit" class="cbi-button cbi-button-add" value="Add item &raquo;" title="Add item ..."/>
- </td>
- </tr>
+ </div>
+ </div>
- </table>
+ </div>
<div class="cbi-section-create cbi-tblsection-create"></div>
</div>
diff --git a/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm b/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
index ffdbbcf359..e48da608a6 100644
--- a/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
+++ b/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
@@ -66,59 +66,59 @@
<!-- tblsection -->
<fieldset class="cbi-section" id="cbi-asterisk-sip">
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th style="text-align: left; padding: 3px" class="cbi-section-table-cell" colspan="6">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div style="text-align: left; padding: 3px" class="th cbi-section-table-cell" colspan="6">
<h3>Dialzone Overview</h3>
- </th>
- </tr>
-
- <tr class="cbi-section-table-descr">
- <th style="width: 5%; text-align:right" class="cbi-section-table-cell">Name</th>
- <th style="width: 5%; text-align:right" class="cbi-section-table-cell">Prepend</th>
- <th style="width: 20%; text-align:left" class="cbi-section-table-cell">- Match</th>
- <th style="text-align:left" class="cbi-section-table-cell">Trunk</th>
- <th style="width: 35%; text-align:left" class="cbi-section-table-cell">Description</th>
- <th style="width: 4%; text-align:left" class="cbi-section-table-cell"></th>
- </tr>
+ </div>
+ </div>
+
+ <div class="tr cbi-section-table-descr">
+ <div style="width: 5%; text-align:right" class="th cbi-section-table-cell">Name</div>
+ <div style="width: 5%; text-align:right" class="th cbi-section-table-cell">Prepend</div>
+ <div style="width: 20%; text-align:left" class="th cbi-section-table-cell">- Match</div>
+ <div style="text-align:left" class="th cbi-section-table-cell">Trunk</div>
+ <div style="width: 35%; text-align:left" class="th cbi-section-table-cell">Description</div>
+ <div style="width: 4%; text-align:left" class="th cbi-section-table-cell"></div>
+ </div>
<% for i, rule in pairs(ast.dialzone.zones()) do %>
- <tr class="cbi-section-table-row <%=rowstyle(i)%>">
- <td style="text-align:right" class="cbi-value-field">
+ <div class="tr cbi-section-table-row <%=rowstyle(i)%>">
+ <div style="text-align:right" class="td cbi-value-field">
<%=rule.name%>
- </td>
- <td style="text-align:right" class="cbi-value-field">
+ </div>
+ <div style="text-align:right" class="td cbi-value-field">
<% for _ in ipairs(rule.matches) do %>
<%=rule.addprefix and digit_pattern(rule.addprefix)%>&#160;<br />
<% end %>
- </td>
- <td style="text-align:left" class="cbi-value-field">
+ </div>
+ <div style="text-align:left" class="td cbi-value-field">
<% for _, m in ipairs(rule.matches) do %>
<%=rule.localprefix and "%s " % digit_pattern(rule.localprefix)%>
<%=digit_pattern(m)%><br />
<% end %>
- </td>
- <td style="text-align:left" class="cbi-value-field">
+ </div>
+ <div style="text-align:left" class="td cbi-value-field">
<%=ast.tools.hyperlinks(
rule.trunks, function(v)
return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower()
end
)%>
- </td>
- <td style="text-align:left" class="cbi-value-field">
+ </div>
+ <div style="text-align:left" class="td cbi-value-field">
<%=rule.description or rule.name%>
- </td>
- <td style="text-align:left" class="cbi-value-field">
+ </div>
+ <div style="text-align:left" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/dialplans/out', rule.name)%>">
<img style="border:none" alt="Edit entry" title="Edit entry" src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans/zones')%>?delzone=<%=rule.name%>">
<img style="border:none" alt="Delete entry" title="Delete entry" src="/luci-static/resources/cbi/remove.gif" />
</a>
- </td>
- </tr>
+ </div>
+ </div>
<% end %>
- </table>
+ </div>
<div class="cbi-section-create cbi-tblsection-create"></div>
</div>
<br />
@@ -133,26 +133,26 @@
<br /><span style="color:red">Invalid name given!</span><br />
<% end -%>
- <table>
- <tr>
- <td style="padding:3px">
+ <div class="table">
+ <div class="tr">
+ <div class="td" style="padding:3px">
<label for="create1">1) Name</label><br />
<input type="text" class="cbi-section-create-name" id="create1" name="newzone_name" style="width:200px" />
<br /><br />
<label for="create2">2) Number Match</label><br />
<input type="text" class="cbi-section-create-name" id="create2" name="newzone_match" style="width:200px" />
- </td>
- <td style="padding:3px">
+ </div>
+ <div class="td" style="padding:3px">
<label for="create3">3) Trunks</label><br />
<select class="cbi-input-select" multiple="multiple" id="create3" name="newzone_uses" size="4" style="width:200px">
<% for i, t in ipairs(find_trunks()) do %>
<option value="<%=t[1]%>"><%=t[2]%></option>
<% end %>
</select>
- </td>
- </tr>
- </table>
+ </div>
+ </div>
+ </div>
<br />
<input type="submit" class="cbi-button cbi-button-add" name="newzone" value="Add entry" title="Add entry"/>
diff --git a/applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua b/applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua
index 632074a56f..731c3350eb 100644
--- a/applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua
+++ b/applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua
@@ -14,7 +14,8 @@ $Id$
local wa = require "luci.tools.webadmin"
local net = require "luci.model.network".init()
-local ifaces = net:get_interfaces()
+local sys = require "luci.sys"
+local ifaces = sys.net:devices()
m = Map("bcp38", translate("BCP38"),
translate("This function blocks packets with private address destinations " ..
@@ -37,10 +38,17 @@ a.rmempty = false
n = s:option(ListValue, "interface", translate("Interface name"), translate("Interface to apply the blocking to " ..
"(should be the upstream WAN interface)."))
+
for _, iface in ipairs(ifaces) do
- if iface:is_up() then
- n:value(iface:name())
- end
+ if not (iface == "lo" or iface:match("^ifb.*")) then
+ local nets = net:get_interface(iface)
+ nets = nets and nets:get_networks() or {}
+ for k, v in pairs(nets) do
+ nets[k] = nets[k].sid
+ end
+ nets = table.concat(nets, ",")
+ n:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
+ end
end
n.rmempty = false
diff --git a/applications/luci-app-ddns/Makefile b/applications/luci-app-ddns/Makefile
index bd6ddeb1b3..7295189518 100644
--- a/applications/luci-app-ddns/Makefile
+++ b/applications/luci-app-ddns/Makefile
@@ -16,10 +16,11 @@ PKG_VERSION:=2.4.9
# Release == build
# increase on changes of translation files
-PKG_RELEASE:=3
+PKG_RELEASE:=5
PKG_LICENSE:=Apache-2.0
-PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
+PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>, \
+ Ansuel Smith <ansuelsmth@gmail.com>
# LuCI specific settings
LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
diff --git a/applications/luci-app-ddns/luasrc/controller/ddns.lua b/applications/luci-app-ddns/luasrc/controller/ddns.lua
index 5f4a5118c3..e152bb0d98 100755
--- a/applications/luci-app-ddns/luasrc/controller/ddns.lua
+++ b/applications/luci-app-ddns/luasrc/controller/ddns.lua
@@ -21,7 +21,6 @@ luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh"
local srv_name = "ddns-scripts"
local srv_ver_min = "2.7.7" -- minimum version of service required
-local srv_ver_cmd = luci_helper .. [[ -V | awk {'print $2'}]]
local app_name = "luci-app-ddns"
local app_title = "Dynamic DNS"
local app_version = "2.4.9-1"
@@ -29,7 +28,6 @@ local app_version = "2.4.9-1"
function index()
local nxfs = require "nixio.fs" -- global definitions not available
local sys = require "luci.sys" -- in function index()
- local ddns = require "luci.tools.ddns" -- ddns multiused functions
local muci = require "luci.model.uci"
-- no config create an empty one
@@ -81,33 +79,40 @@ end
-- Standardized application/service functions
function app_title_main()
- return [[<a href="javascript:alert(']]
- .. I18N.translate("Version Information")
- .. [[\n\n]] .. app_name
- .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
- .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
- .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
- .. srv_ver_min .. [[ ]] .. I18N.translate("or higher")
- .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
- .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
- .. (service_version() or I18N.translate("NOT installed"))
- .. [[\n\n]]
- .. [[')">]]
- .. I18N.translate(app_title)
- .. [[</a>]]
+ tmp = {}
+ tmp[#tmp+1] = [[<a href="javascript:alert(']]
+ tmp[#tmp+1] = I18N.translate("Version Information")
+ tmp[#tmp+1] = [[\n\n]] .. app_name
+ tmp[#tmp+1] = [[\n]] .. I18N.translate("Version") .. [[: ]] .. app_version
+ tmp[#tmp+1] = [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
+ tmp[#tmp+1] = [[\n]] .. I18N.translate("Version") .. [[: ]]
+ tmp[#tmp+1] = srv_ver_min .. [[ ]] .. I18N.translate("or higher")
+ tmp[#tmp+1] = [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
+ tmp[#tmp+1] = [[\n]] .. I18N.translate("Version") .. [[: ]]
+ tmp[#tmp+1] = (service_version() or I18N.translate("NOT installed"))
+ tmp[#tmp+1] = [[\n\n]]
+ tmp[#tmp+1] = [[')">]]
+ tmp[#tmp+1] = I18N.translate(app_title)
+ tmp[#tmp+1] = [[</a>]]
+
+ return table.concat(tmp)
end
-function service_version()
- local ver = nil
-
- ver = UTIL.exec(srv_ver_cmd)
- if #ver > 0 then return ver end
- IPKG.list_installed(srv_name, function(n, v, d)
- if v and (#v > 0) then ver = v end
- end
- )
- return ver
+function service_version()
+
+ local srv_ver_cmd = luci_helper .. " -V | awk {'print $2'} "
+ local ver
+
+ if IPKG then
+ ver = IPKG.info(srv_name)[srv_name].Version
+ else
+ ver = UTIL.exec(srv_ver_cmd)
+ end
+
+ if ver and #ver > 0 then return ver or nil end
+
end
+
function service_ok()
return IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
end
diff --git a/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua b/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
index 977dbe34b1..eb2159076e 100644
--- a/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
+++ b/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
@@ -172,7 +172,7 @@ local function _option_used(option, urlscript)
end
-- function to verify if option is valid
-local function _option_validate(self, value)
+local function _option_validate(self, value, optional)
-- section is globally defined here be calling agrument (see above)
local fusev6 = usev6:formvalue(section) or "0"
local fsvc4 = svc4:formvalue(section) or "-"
@@ -204,6 +204,7 @@ local function _option_validate(self, value)
if used < 1 then return "" end
-- needed but no data then return error
if not value or (#value == 0) then
+ if optional then return nil end
return nil, err_tab_basic(self) .. translate("missing / required")
end
return value
@@ -292,6 +293,10 @@ function luh.parse(self, section, novld)
end
-- use_ipv6 -- ################################################################
+
+--We call it globally as it's called 11 times even outside specific function, saves 11 os.execute slow command!
+local has_ipv6 = DDNS.env_info("has_ipv6")
+
usev6 = ns:taboption("basic", ListValue, "use_ipv6",
translate("IP address version"),
translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") )
@@ -300,16 +305,16 @@ usev6.default = "0"
usev6:value("0", translate("IPv4-Address") )
function usev6.cfgvalue(self, section)
local value = AbstractValue.cfgvalue(self, section) or "0"
- if DDNS.has_ipv6 or (value == "1" and not DDNS.has_ipv6) then
+ if has_ipv6 or (value == "1" and not has_ipv6) then
self:value("1", translate("IPv6-Address") )
end
- if value == "1" and not DDNS.has_ipv6 then
+ if value == "1" and not has_ipv6 then
self.description = err_ipv6_basic
end
return value
end
function usev6.validate(self, value)
- if (value == "1" and DDNS.has_ipv6) or value == "0" then
+ if (value == "1" and has_ipv6) or value == "0" then
return value
end
return nil, err_tab_basic(self) .. err_ipv6_plain
@@ -360,7 +365,7 @@ svc6 = ns:taboption("basic", ListValue, "ipv6_service_name",
translate("DDNS Service provider") .. " [IPv6]" )
svc6.default = "-"
svc6:depends("use_ipv6", "1") -- only show on IPv6
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
svc6.description = err_ipv6_basic
end
function svc6.cfgvalue(self, section)
@@ -374,7 +379,7 @@ function svc6.cfgvalue(self, section)
end
function svc6.validate(self, value)
if usev6:formvalue(section) == "1" then -- do only on IPv6
- if DDNS.has_ipv6 then return value end
+ if has_ipv6 then return value end
return nil, err_tab_basic(self) .. err_ipv6_plain
else
return "" -- suppress validate error
@@ -509,18 +514,18 @@ pe = ns:taboption("basic", Value, "param_enc",
translate("Optional Encoded Parameter"),
translate("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)") )
function pe.validate(self, value)
- return _option_validate(self, value)
+ return _option_validate(self, value, true)
end
function pe.parse(self, section, novld)
DDNS.value_parse(self, section, novld)
end
--- IPv4/IPv6 - param_enc -- ###################################################
+-- IPv4/IPv6 - param_opt -- ###################################################
po = ns:taboption("basic", Value, "param_opt",
translate("Optional Parameter"),
translate("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)") )
function po.validate(self, value)
- return _option_validate(self, value)
+ return _option_validate(self, value, true)
end
function po.parse(self, section, novld)
DDNS.value_parse(self, section, novld)
@@ -586,13 +591,17 @@ end
svc6:value("-", translate("-- custom --") )
-- IPv4/IPv6 - use_https -- ###################################################
-if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
+
+--We call it globally as it's called 4 times outside specific function.
+local has_ssl = DDNS.env_info("has_ssl")
+
+if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
https = ns:taboption("basic", Flag, "use_https",
translate("Use HTTP Secure") )
https.orientation = "horizontal"
function https.cfgvalue(self, section)
local value = AbstractValue.cfgvalue(self, section)
- if not DDNS.has_ssl and value == "1" then
+ if not has_ssl and value == "1" then
self.description = bold_on .. font_red ..
translate("HTTPS not supported") .. font_off .. "<br />" ..
translate("please disable") .. " !" .. bold_off
@@ -602,7 +611,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
return value
end
function https.validate(self, value)
- if (value == "1" and DDNS.has_ssl ) or value == "0" then return value end
+ if (value == "1" and has_ssl ) or value == "0" then return value end
return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !"
end
function https.write(self, section, value)
@@ -616,7 +625,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
end
-- IPv4/IPv6 - cacert -- ######################################################
-if DDNS.has_ssl then
+if has_ssl then
cert = ns:taboption("basic", Value, "cacert",
translate("Path to CA-Certificate"),
translate("directory or path/file") .. "<br />" ..
@@ -706,7 +715,7 @@ src6:value("network", translate("Network"))
src6:value("web", translate("URL"))
src6:value("interface", translate("Interface"))
src6:value("script", translate("Script"))
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
src6.description = err_ipv6_other
end
function src6.cfgvalue(self, section)
@@ -715,7 +724,7 @@ end
function src6.validate(self, value)
if usev6:formvalue(section) ~= "1" then
return "" -- ignore on IPv4 selected
- elseif not DDNS.has_ipv6 then
+ elseif not has_ipv6 then
return nil, err_tab_adv(self) .. err_ipv6_plain
elseif not _verify_ip_source() then
return nil, err_tab_adv(self) ..
@@ -794,7 +803,7 @@ ipn6 = ns:taboption("advanced", ListValue, "ipv6_network",
ipn6:depends("ipv6_source", "network")
ipn6.default = "wan6"
WADM.cbi_add_networks(ipn6)
-if DDNS.has_ipv6 then
+if has_ipv6 then
ipn6.description = translate("Defines the network to read systems IPv6-Address from")
else
ipn6.description = err_ipv6_other
@@ -808,7 +817,7 @@ function ipn6.validate(self, value)
-- ignore if IPv4 selected OR
-- ignore everything except "network"
return ""
- elseif DDNS.has_ipv6 then
+ elseif has_ipv6 then
return value
else
return nil, err_tab_adv(self) .. err_ipv6_plain
@@ -881,7 +890,7 @@ iurl6 = ns:taboption("advanced", Value, "ipv6_url",
translate("URL to detect") .. " [IPv6]" )
iurl6:depends("ipv6_source", "web")
iurl6.default = "http://checkipv6.dyndns.com"
-if DDNS.has_ipv6 then
+if has_ipv6 then
iurl6.description = translate("Defines the Web page to read systems IPv6-Address from")
else
iurl6.description = err_ipv6_other
@@ -895,7 +904,7 @@ function iurl6.validate(self, value)
-- ignore if IPv4 selected OR
-- ignore everything except "web"
return ""
- elseif not DDNS.has_ipv6 then
+ elseif not has_ipv6 then
return nil, err_tab_adv(self) .. err_ipv6_plain
elseif not value or #value == 0 then
return nil, err_tab_adv(self) .. translate("missing / required")
@@ -1051,7 +1060,7 @@ eif6:depends("ipv6_source", "web")
eif6:depends("ipv6_source", "script")
eif6.default = "wan6"
WADM.cbi_add_networks(eif6)
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
eif6.description = err_ipv6_other
else
eif6.description = translate("Network on which the ddns-updater scripts will be started")
@@ -1065,7 +1074,7 @@ function eif6.validate(self, value)
or fsrc6 == "network"
or fsrc6 == "interface" then
return "" -- ignore IPv4, network, interface
- elseif not DDNS.has_ipv6 then
+ elseif not has_ipv6 then
return nil, err_tab_adv(self) .. err_ipv6_plain
else
return value
@@ -1084,10 +1093,13 @@ function eif6.write(self, section, value)
end
function eif6.parse(self, section, novld)
DDNS.value_parse(self, section, novld)
-end
+end
-- IPv4/IPv6 - bind_network -- ################################################
-if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
+
+local has_bindnet = DDNS.env_info("has_bindnet")
+
+if has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
bnet = ns:taboption("advanced", ListValue, "bind_network",
translate("Bind Network") )
bnet:depends("ipv4_source", "web")
@@ -1097,7 +1109,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
WADM.cbi_add_networks(bnet)
function bnet.cfgvalue(self, section)
local value = AbstractValue.cfgvalue(self, section)
- if not DDNS.has_bindnet and value ~= "" then
+ if not has_bindnet and value ~= "" then
self.description = bold_on .. font_red ..
translate("Binding to a specific network not supported") .. font_off .. "<br />" ..
translate("please set to 'default'") .. " !" .. bold_off
@@ -1108,7 +1120,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
return value
end
function bnet.validate(self, value)
- if ( (value ~= "") and DDNS.has_bindnet ) or (value == "") then return value end
+ if ( (value ~= "") and has_bindnet ) or (value == "") then return value end
return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !"
end
function bnet.parse(self, section, novld)
@@ -1119,13 +1131,16 @@ end
-- IPv4 + IPv6 - force_ipversion -- ###########################################
-- optional to force wget/curl and host to use only selected IP version
-- command parameter "-4" or "-6"
-if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
+
+local has_forceip = DDNS.env_info("has_forceip")
+
+if has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
fipv = ns:taboption("advanced", Flag, "force_ipversion",
translate("Force IP Version") )
fipv.orientation = "horizontal"
function fipv.cfgvalue(self, section)
local value = AbstractValue.cfgvalue(self, section)
- if not DDNS.has_forceip and value ~= "0" then
+ if not has_forceip and value ~= "0" then
self.description = bold_on .. font_red ..
translate("Force IP Version not supported") .. font_off .. "<br />" ..
translate("please disable") .. " !" .. bold_off
@@ -1135,14 +1150,17 @@ if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) t
return value
end
function fipv.validate(self, value)
- if (value == "1" and DDNS.has_forceip) or value == "0" then return value end
+ if (value == "1" and has_forceip) or value == "0" then return value end
return nil, err_tab_adv(self) .. translate("Force IP Version not supported")
end
end
-- IPv4 + IPv6 - dns_server -- ################################################
-- optional DNS Server to use resolving my IP
-if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
+
+local has_dnsserver = DDNS.env_info("has_dnsserver")
+
+if has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
dns = ns:taboption("advanced", Value, "dns_server",
translate("DNS-Server"),
translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "<br />" ..
@@ -1152,7 +1170,7 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
-- if .datatype is set, then it is checked before calling this function
if not value or (#value == 0) then
return "" -- ignore on empty
- elseif not DDNS.has_dnsserver then
+ elseif not has_dnsserver then
return nil, err_tab_adv(self) .. translate("Specifying a DNS-Server is not supported")
elseif not DTYP.host(value) then
return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address")
@@ -1179,13 +1197,16 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
end
-- IPv4 + IPv6 - force_dnstcp -- ##############################################
-if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
+
+local has_bindhost = DDNS.env_info("has_bindhost")
+
+if has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
tcp = ns:taboption("advanced", Flag, "force_dnstcp",
translate("Force TCP on DNS") )
tcp.orientation = "horizontal"
function tcp.cfgvalue(self, section)
local value = AbstractValue.cfgvalue(self, section)
- if not DDNS.has_bindhost and value ~= "0" then
+ if not has_bindhost and value ~= "0" then
self.description = bold_on .. font_red ..
translate("DNS requests via TCP not supported") .. font_off .. "<br />" ..
translate("please disable") .. " !" .. bold_off
@@ -1195,7 +1216,7 @@ if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) the
return value
end
function tcp.validate(self, value)
- if (value == "1" and DDNS.has_bindhost ) or value == "0" then
+ if (value == "1" and has_bindhost ) or value == "0" then
return value
end
return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported")
@@ -1204,13 +1225,16 @@ end
-- IPv4 + IPv6 - proxy -- #####################################################
-- optional Proxy to use for http/https requests [user:password@]proxyhost[:port]
-if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
+
+local has_proxy = DDNS.env_info("has_proxy")
+
+if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
pxy = ns:taboption("advanced", Value, "proxy",
translate("PROXY-Server") )
pxy.placeholder="user:password@myproxy.lan:8080"
function pxy.cfgvalue(self, section)
local value = AbstractValue.cfgvalue(self, section)
- if not DDNS.has_proxy and value ~= "" then
+ if not has_proxy and value ~= "" then
self.description = bold_on .. font_red ..
translate("PROXY-Server not supported") .. font_off .. "<br />" ..
translate("please remove entry") .. "!" .. bold_off
@@ -1226,7 +1250,7 @@ if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
-- if .datatype is set, then it is checked before calling this function
if not value or (#value == 0) then
return "" -- ignore on empty
- elseif DDNS.has_proxy then
+ elseif has_proxy then
local ipv6 = usev6:formvalue(section) or "0"
local force = fipv:formvalue(section) or "0"
local command = CTRL.luci_helper .. [[ -]]
diff --git a/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua b/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
index df39a3a7e5..419201548b 100644
--- a/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
+++ b/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
@@ -48,7 +48,7 @@ if not SYS.init.enabled("ddns") then
end
-- No IPv6 support
-if not DDNS.has_ipv6 then
+if not DDNS.env_info("has_ipv6") then
local v6 = s:option(DummyValue, "_no_ipv6")
v6.titleref = 'http://www.openwrt.org" target="_blank'
v6.rawhtml = true
@@ -60,7 +60,7 @@ if not DDNS.has_ipv6 then
end
-- No HTTPS support
-if not DDNS.has_ssl then
+if not DDNS.env_info("has_ssl") then
local sl = s:option(DummyValue, "_no_https")
sl.titleref = DISP.build_url("admin", "system", "packages")
sl.rawhtml = true
@@ -74,7 +74,7 @@ if not DDNS.has_ssl then
end
-- No bind_network
-if not DDNS.has_bindnet then
+if not DDNS.env_info("has_bindnet") then
local bn = s:option(DummyValue, "_no_bind_network")
bn.titleref = DISP.build_url("admin", "system", "packages")
bn.rawhtml = true
@@ -90,7 +90,7 @@ if not DDNS.has_bindnet then
end
-- currently only cURL possibly without proxy support
-if not DDNS.has_proxy then
+if not DDNS.env_info("has_proxy") then
local px = s:option(DummyValue, "_no_proxy")
px.titleref = DISP.build_url("admin", "system", "packages")
px.rawhtml = true
@@ -104,7 +104,7 @@ if not DDNS.has_proxy then
end
-- "Force IP Version not supported"
-if not DDNS.has_forceip then
+if not DDNS.env_info("has_forceip") then
local fi = s:option(DummyValue, "_no_force_ip")
fi.titleref = DISP.build_url("admin", "system", "packages")
fi.rawhtml = true
@@ -112,11 +112,11 @@ if not DDNS.has_forceip then
translate("Force IP Version not supported") .. bold_off
local value = translate("BusyBox's nslookup and Wget do not support to specify " ..
"the IP version to use for communication with DDNS Provider!")
- if not (DDNS.has_wgetssl or DDNS.has_curl or DDNS.has_fetch) then
+ if not (DDNS.env_info("has_wgetssl") or DDNS.env_info("has_curl") or DDNS.env_info("has_fetch")) then
value = value .. "<br />- " ..
translate("You should install 'wget' or 'curl' or 'uclient-fetch' package.")
end
- if not DDNS.has_bindhost then
+ if not DDNS.env_info("has_bindhost") then
value = value .. "<br />- " ..
translate("You should install 'bind-host' or 'knot-host' or 'drill' package for DNS requests.")
end
@@ -124,7 +124,7 @@ if not DDNS.has_forceip then
end
-- "DNS requests via TCP not supported"
-if not DDNS.has_bindhost then
+if not DDNS.env_info("has_bindhost") then
local dt = s:option(DummyValue, "_no_dnstcp")
dt.titleref = DISP.build_url("admin", "system", "packages")
dt.rawhtml = true
@@ -137,7 +137,7 @@ if not DDNS.has_bindhost then
end
-- nslookup compiled with musl produce problems when using
-if not DDNS.has_dnsserver then
+if not DDNS.env_info("has_dnsserver") then
local ds = s:option(DummyValue, "_no_dnsserver")
ds.titleref = DISP.build_url("admin", "system", "packages")
ds.rawhtml = true
@@ -151,7 +151,7 @@ if not DDNS.has_dnsserver then
end
-- certificates installed
-if DDNS.has_ssl and not DDNS.has_cacerts then
+if DDNS.env_info("has_ssl") and not DDNS.env_info("has_cacerts") then
local ca = s:option(DummyValue, "_no_certs")
ca.titleref = DISP.build_url("admin", "system", "packages")
ca.rawhtml = true
diff --git a/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua b/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
index 114f831c17..11f73800ea 100644
--- a/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
+++ b/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
@@ -1,21 +1,20 @@
-- Copyright 2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
-- Licensed to the public under the Apache License 2.0.
-local NXFS = require "nixio.fs"
local DISP = require "luci.dispatcher"
local HTTP = require "luci.http"
local SYS = require "luci.sys"
local CTRL = require "luci.controller.ddns" -- this application's controller
local DDNS = require "luci.tools.ddns" -- ddns multiused functions
-local show_hints = not (DDNS.has_ipv6 -- IPv6 support
- and DDNS.has_ssl -- HTTPS support
- and DDNS.has_proxy -- Proxy support
- and DDNS.has_bindhost -- DNS TCP support
- and DDNS.has_forceip -- Force IP version
- and DDNS.has_dnsserver -- DNS server support
- and DDNS.has_bindnet -- Bind to network/interface
- and DDNS.has_cacerts -- certificates installed at /etc/ssl/certs
+local show_hints = not (DDNS.env_info("has_ipv6") -- IPv6 support
+ and DDNS.env_info("has_ssl") -- HTTPS support
+ and DDNS.env_info("has_proxy") -- Proxy support
+ and DDNS.env_info("has_bindhost") -- DNS TCP support
+ and DDNS.env_info("has_forceip") -- Force IP version
+ and DDNS.env_info("has_dnsserver") -- DNS server support
+ and DDNS.env_info("has_bindnet") -- Bind to network/interface
+ and DDNS.env_info("has_cacerts") -- certificates installed at /etc/ssl/certs
)
local not_enabled = not SYS.init.enabled("ddns")
local need_update = not CTRL.service_ok()
diff --git a/applications/luci-app-ddns/luasrc/tools/ddns.lua b/applications/luci-app-ddns/luasrc/tools/ddns.lua
index 690b9b30ce..57913a51fe 100755
--- a/applications/luci-app-ddns/luasrc/tools/ddns.lua
+++ b/applications/luci-app-ddns/luasrc/tools/ddns.lua
@@ -5,36 +5,134 @@ module("luci.tools.ddns", package.seeall)
local NX = require "nixio"
local NXFS = require "nixio.fs"
-local OPKG = require "luci.model.ipkg"
local UCI = require "luci.model.uci"
local SYS = require "luci.sys"
-local UTIL = require "luci.util"
-local function _check_certs()
- local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
- if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
- return (v > 0)
-end
+function env_info(type)
+
+ if ( type == "has_ssl" ) or ( type == "has_proxy" ) or ( type == "has_forceip" )
+ or ( type == "has_bindnet" ) or ( type == "has_fetch" )
+ or ( type == "has_wgetssl" ) or ( type == "has_curl" )
+ or ( type == "has_curlssl" ) or ( type == "has_curlpxy" )
+ or ( type == "has_fetchssl" ) or ( type == "has_bbwget" ) then
+
+ local function has_wgetssl()
+ return (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil
+ end
+
+ local function has_curlssl()
+ return (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
+ end
+
+ local function has_fetch()
+ return (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
+ end
+
+ local function has_fetchssl()
+ return NXFS.access("/lib/libustream-ssl.so")
+ end
+
+ local function has_curl()
+ return (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
+ end
+
+ local function has_curlpxy()
+ return (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
+ end
+
+ local function has_bbwget()
+ return (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
+ end
+
+ if type == "has_wgetssl" then
+ return has_wgetssl()
+
+ elseif type == "has_curl" then
+ return has_curl()
+
+ elseif type == "has_curlssl" then
+ return has_curlssl()
+
+ elseif type == "has_curlpxy" then
+ return has_curlpxy()
+
+ elseif type == "has_fetch" then
+ return has_fetch()
+
+ elseif type == "has_fetchssl" then
+ return has_fetchssl()
+
+ elseif type == "has_bbwget" then
+ return has_bbwget()
+
+ elseif type == "has_ssl" then
+ if has_wgetssl() then return true end
+ if has_curlssl() then return true end
+ if (has_fetch() and has_fetchssl()) then return true end
+ return false
+
+ elseif type == "has_proxy" then
+ if has_wgetssl() then return true end
+ if has_curlpxy() then return true end
+ if has_fetch() then return true end
+ if has_bbwget() then return true end
+ return false
+
+ elseif type == "has_forceip" then
+ if has_wgetssl() then return true end
+ if has_curl() then return true end
+ if has_fetch() then return true end -- only really needed for transfer
+ return false
+
+ elseif type == "has_bindnet" then
+ if has_curl() then return true end
+ if has_wgetssl() then return true end
+ return false
+ end
+
+ elseif ( type == "has_dnsserver" ) or ( type == "has_bindhost" ) or ( type == "has_hostip" ) or ( type == "has_nslookup" ) then
+ local function has_bindhost()
+ if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+ if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+ if (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0) then return true end
+ if (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0) then return true end
+ return false
+ end
+
+ local function has_hostip()
+ return (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
+ end
+
+ local function has_nslookup()
+ return (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
+ end
+
+ if type == "has_bindhost" then
+ return has_bindhost()
+ elseif type == "has_hostip" then
+ return has_hostip()
+ elseif type == "has_nslookup" then
+ return has_nslookup()
+ elseif tyep == "has_dnsserver" then
+ if has_bindhost() then return true end
+ if has_hostip() then return true end
+ if has_nslookup() then return true end
+ return false
+ end
+
+ elseif type == "has_ipv6" then
+ return (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
+
+ elseif type == "has_cacerts" then
+ --old _check_certs() local function
+ local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
+ if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
+ return (v > 0)
+ else
+ return
+ end
-has_wgetssl = (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil
-has_curl = (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
-has_curlssl = (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
-has_curlpxy = (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
-has_fetch = (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
-has_fetchssl = NXFS.access("/lib/libustream-ssl.so")
-has_bbwget = (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
-has_bindhost = (SYS.call( [[which host >/dev/null 2>&1]] ) == 0)
- or (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0)
- or (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0)
-has_hostip = (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
-has_nslookup = (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
-has_ipv6 = (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
-has_ssl = (has_wgetssl or has_curlssl or (has_fetch and has_fetchssl))
-has_proxy = (has_wgetssl or has_curlpxy or has_fetch or has_bbwget)
-has_forceip = (has_wgetssl or has_curl or has_fetch) -- only really needed for transfer
-has_dnsserver = (has_bindhost or has_hostip or has_nslookup)
-has_bindnet = (has_wgetssl or has_curl)
-has_cacerts = _check_certs()
+end
-- function to calculate seconds from given interval and unit
function calc_seconds(interval, unit)
diff --git a/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm b/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
index 5bdcb03e73..7fcb882a15 100644
--- a/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
+++ b/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
@@ -1,4 +1,3 @@
-
<!-- ++ BEGIN ++ Dynamic DNS ++ system_status.htm ++ -->
<script type="text/javascript">//<![CDATA[
// helper to move status data to the relevant
@@ -10,8 +9,8 @@
if ( !(tbl) ) { return; }
// clear all rows
- while (tbl.rows.length > 1)
- tbl.deleteRow(1);
+ while (tbl.firstElementChild !== tbl.lastElementChild)
+ tbl.removeChild(tbl.lastElementChild);
// variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1)
var i = -1;
@@ -21,22 +20,22 @@
if (data[0].enabled == 0) {
var txt = '<strong><font color="red"><%:DDNS Autostart disabled%></font>' ;
var url = '<a href="' + data[0].url_up + '"><%:enable here%></a></strong>' ;
- var tr = tbl.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1);
- var td = tr.insertCell(-1);
- td.colSpan = 2 ;
- td.innerHTML = txt + " - " + url
- tr.insertCell(-1).colSpan = 3 ;
+ tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [
+ E('<div class="td">', [ txt," - ", url ])
+ ]));
i++ ;
}
+ var configuration;
+ var next_update;
+ var lookup;
+ var registered_ip;
+ var network;
+
for( j = 1; j < data.length; j++ )
{
- var tr = tbl.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1) ;
-
// configuration
- tr.insertCell(-1).innerHTML = '<strong>' + data[j].section + '</strong>' ;
+ configuration = data[j].section;
// pid
// data[j].pid ignored here
@@ -47,66 +46,74 @@
// next update
switch (data[j].datenext) {
case "_empty_":
- tr.insertCell(-1).innerHTML = '<em><%:Unknown error%></em>' ;
+ next_update = '<em><%:Unknown error%></em>';
break;
case "_stopped_":
- tr.insertCell(-1).innerHTML = '<em><%:Stopped%></em>' ;
+ next_update = '<em><%:Stopped%></em>';
break;
case "_disabled_":
- tr.insertCell(-1).innerHTML = '<em><%:Disabled%></em>' ;
+ next_update = '<em><%:Disabled%></em>';
break;
case "_noupdate_":
- tr.insertCell(-1).innerHTML = '<em><%:Update error%></em>' ;
+ next_update = '<em><%:Update error%></em>';
break;
case "_runonce_":
- tr.insertCell(-1).innerHTML = '<em><%:Run once%></em>' ;
+ next_update = '<em><%:Run once%></em>';
break;
case "_verify_":
- tr.insertCell(-1).innerHTML = '<em><%:Verify%></em>';
+ next_update = '<em><%:Verify%></em>';
break;
default:
- tr.insertCell(-1).innerHTML = data[j].datenext ;
+ next_update = data[j].datenext;
break;
}
// lookup
if (data[j].lookup == "_nolookup_")
- tr.insertCell(-1).innerHTML = '<em><%:config error%></em>';
+ lookup = '<em><%:config error%></em>';
else
- tr.insertCell(-1).innerHTML = data[j].lookup;
+ lookup = data[j].lookup;
// registered IP
switch (data[j].reg_ip) {
case "_nolookup_":
- tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
+ registered_ip = '<em><%:config error%></em>';
break;
case "_nodata_":
- tr.insertCell(-1).innerHTML = '<em><%:No data%></em>';
+ registered_ip = '<em><%:No data%></em>';
break;
case "_noipv6_":
- tr.insertCell(-1).innerHTML = '<em><%:IPv6 not supported%></em>';
+ registered_ip = '<em><%:IPv6 not supported%></em>';
break;
default:
- tr.insertCell(-1).innerHTML = data[j].reg_ip;
+ registered_ip = data[j].reg_ip;
break;
}
// monitored interface
if (data[j].iface == "_nonet_")
- tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
+ network = '<em><%:Config error%></em>';
else
- tr.insertCell(-1).innerHTML = data[j].iface;
+ network = data[j].iface;
+
+ tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [
+ E('<div class="td">', [ E('<strong>', configuration) ]),
+ E('<div class="td">', next_update),
+ E('<div class="td">', lookup),
+ E('<div class="td">', registered_ip),
+ E('<div class="td">', network)
+ ]));
}
- if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) {
+ if (tbl.firstElementChild === tbl.lastElementChild || (data[0].enabled == 0 && tbl.childNodes.length == 2) ) {
var br = '<br />';
- if (tbl.rows.length > 1)
+ var msg = '<%:There is no service configured.%>';
+ if (tbl.firstElementChild !== tbl.lastElementChild)
br = '';
- var tr = tbl.insertRow(-1);
- tr.className = "cbi-section-table-row";
- var td = tr.insertCell(-1);
- td.colSpan = 5;
- td.innerHTML = '<em>' + br + '<%:There is no service configured.%></em>' ;
+ msg = br + msg;
+ tbl.appendChild(E('<div class="tr cbi-section-table-row">', [
+ E('<div class="td">', [ E('<em>', msg) ])
+ ]));
}
}
@@ -128,17 +135,17 @@
<fieldset class="cbi-section" id="ddns_status_section">
<legend><a href="<%=url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
- <table class="cbi-section-table" id="ddns_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Configuration%></th>
- <th class="cbi-section-table-cell"><%:Next Update%></th>
- <th class="cbi-section-table-cell"><%:Lookup Hostname%></th>
- <th class="cbi-section-table-cell"><%:Registered IP%></th>
- <th class="cbi-section-table-cell"><%:Network%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="5"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
+ <div class="table cbi-section-table" id="ddns_status_table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Configuration%></div>
+ <div class="th cbi-section-table-cell"><%:Next Update%></div>
+ <div class="th cbi-section-table-cell"><%:Lookup Hostname%></div>
+ <div class="th cbi-section-table-cell"><%:Registered IP%></div>
+ <div class="th cbi-section-table-cell"><%:Network%></div>
+ </div>
+ <div class="tr cbi-section-table-row">
+ <div class="td"><em><br /><%:Collecting data...%></em></div>
+ </div>
+ </div>
</fieldset>
<!-- ++ END ++ Dynamic DNS ++ system_status.htm ++ -->
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
index 17a49483d7..d51f8fb79b 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
@@ -55,6 +55,7 @@ o = s:option(Value, "src", translate("Source zone"))
o.nocreate = true
o.default = "wan"
o.template = "cbi/firewall_zonelist"
+o.rmempty = false
o = s:option(DynamicList, "src_mac",
@@ -88,6 +89,10 @@ o.rmempty = true
o.datatype = "neg(portrange)"
o.placeholder = translate("any")
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
o = s:option(Value, "src_dip",
translate("External IP address"),
@@ -108,7 +113,10 @@ o = s:option(Value, "src_dport", translate("External port"),
"destination port or port range on this host"))
o.datatype = "neg(portrange)"
-
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
o = s:option(Value, "dest", translate("Internal zone"))
o.nocreate = true
@@ -133,6 +141,10 @@ o = s:option(Value, "dest_port",
o.placeholder = translate("any")
o.datatype = "portrange"
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
o = s:option(Flag, "reflection", translate("Enable NAT Loopback"))
o.rmempty = true
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
index e61ce73cdd..5d1ffe0913 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
@@ -54,7 +54,7 @@ function s.parse(self, ...)
if created then
m.uci:save("firewall")
luci.http.redirect(ds.build_url(
- "admin/network/firewall/redirect", created
+ "admin/network/firewall/forwards", created
))
end
end
@@ -63,8 +63,9 @@ function s.filter(self, sid)
return (self.map:get(sid, "target") ~= "SNAT")
end
-
-ft.opt_name(s, DummyValue, translate("Name"))
+function s.sectiontitle(self, sid)
+ return (self.map:get(sid, "name") or translate("Unnamed forward"))
+end
local function forward_proto_txt(self, s)
@@ -103,7 +104,6 @@ end
match = s:option(DummyValue, "match", translate("Match"))
match.rawhtml = true
-match.width = "50%"
function match.cfgvalue(self, s)
return "<small>%s<br />%s<br />%s</small>" % {
forward_proto_txt(self, s),
@@ -115,7 +115,6 @@ end
dest = s:option(DummyValue, "dest", translate("Forward to"))
dest.rawhtml = true
-dest.width = "40%"
function dest.cfgvalue(self, s)
local z = ft.fmt_zone(self.map:get(s, "dest"), translate("any zone"))
local a = ft.fmt_ip(self.map:get(s, "dest_ip"), translate("any host"))
@@ -129,6 +128,6 @@ function dest.cfgvalue(self, s)
end
end
-ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
+ft.opt_enabled(s, Flag, translate("Enable"))
return m
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
index 1c838888f1..a4763d5dc4 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
@@ -115,6 +115,10 @@ elseif rule_type == "redirect" then
o.datatype = "neg(portrange)"
o.placeholder = translate("any")
+ o:depends("proto", "tcp")
+ o:depends("proto", "udp")
+ o:depends("proto", "tcp udp")
+ o:depends("proto", "tcpudp")
o = s:option(Value, "dest", translate("Destination zone"))
o.nocreate = true
@@ -139,6 +143,10 @@ elseif rule_type == "redirect" then
o.placeholder = translate("any")
o.datatype = "neg(portrange)"
+ o:depends("proto", "tcp")
+ o:depends("proto", "udp")
+ o:depends("proto", "tcp udp")
+ o:depends("proto", "tcpudp")
o = s:option(Value, "src_dip",
translate("SNAT IP address"),
@@ -163,6 +171,10 @@ elseif rule_type == "redirect" then
o.rmempty = true
o.placeholder = translate('Do not rewrite')
+ o:depends("proto", "tcp")
+ o:depends("proto", "udp")
+ o:depends("proto", "tcp udp")
+ o:depends("proto", "tcpudp")
s:option(Value, "extra",
translate("Extra arguments"),
@@ -212,7 +224,13 @@ else
end
- o = s:option(DynamicList, "icmp_type", translate("Match ICMP type"))
+ o = s:option(DropDown, "icmp_type", translate("Match ICMP type"))
+ o.multiple = true
+ o.display = 10
+ o.dropdown = 10
+ o.custom = true
+ o.cast = "table"
+
o:value("", "any")
o:value("echo-reply")
o:value("destination-unreachable")
@@ -251,11 +269,13 @@ else
o:value("address-mask-request")
o:value("address-mask-reply")
+ o:depends("proto", "icmp")
+
o = s:option(Value, "src", translate("Source zone"))
o.nocreate = true
o.allowany = true
- o.default = "wan"
+ o.allowlocal = "src"
o.template = "cbi/firewall_zonelist"
@@ -269,7 +289,7 @@ else
o = s:option(Value, "src_ip", translate("Source address"))
- o.datatype = "neg(ipmask)"
+ o.datatype = "list(neg(ipmask))"
o.placeholder = translate("any")
luci.sys.net.ipv4_hints(function(ip, name)
@@ -281,16 +301,29 @@ else
o.datatype = "list(neg(portrange))"
o.placeholder = translate("any")
+ o:depends("proto", "tcp")
+ o:depends("proto", "udp")
+ o:depends("proto", "tcp udp")
+ o:depends("proto", "tcpudp")
- o = s:option(Value, "dest", translate("Destination zone"))
+ o = s:option(Value, "dest_local", translate("Output zone"))
+ o.nocreate = true
+ o.allowany = true
+ o.template = "cbi/firewall_zonelist"
+ o.alias = "dest"
+ o:depends("src", "")
+
+ o = s:option(Value, "dest_remote", translate("Destination zone"))
o.nocreate = true
o.allowany = true
o.allowlocal = true
o.template = "cbi/firewall_zonelist"
+ o.alias = "dest"
+ o:depends({["src"] = "", ["!reverse"] = true})
o = s:option(Value, "dest_ip", translate("Destination address"))
- o.datatype = "neg(ipmask)"
+ o.datatype = "list(neg(ipmask))"
o.placeholder = translate("any")
luci.sys.net.ipv4_hints(function(ip, name)
@@ -302,6 +335,10 @@ else
o.datatype = "list(neg(portrange))"
o.placeholder = translate("any")
+ o:depends("proto", "tcp")
+ o:depends("proto", "udp")
+ o:depends("proto", "tcp udp")
+ o:depends("proto", "tcpudp")
o = s:option(ListValue, "target", translate("Action"))
o.default = "ACCEPT"
@@ -316,9 +353,9 @@ else
translate("Passes additional arguments to iptables. Use with care!"))
end
-o = s:option(MultiValue, "weekdays", translate("Week Days"))
-o.oneline = true
-o.widget = "checkbox"
+o = s:option(DropDown, "weekdays", translate("Week Days"))
+o.multiple = true
+o.display = 5
o:value("Sun", translate("Sunday"))
o:value("Mon", translate("Monday"))
o:value("Tue", translate("Tuesday"))
@@ -327,9 +364,9 @@ o:value("Thu", translate("Thursday"))
o:value("Fri", translate("Friday"))
o:value("Sat", translate("Saturday"))
-o = s:option(MultiValue, "monthdays", translate("Month Days"))
-o.oneline = true
-o.widget = "checkbox"
+o = s:option(DropDown, "monthdays", translate("Month Days"))
+o.multiple = true
+o.display = 15
for i = 1,31 do
o:value(translate(i))
end
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
index c533491977..f4b6b2a928 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
@@ -72,7 +72,9 @@ function s.parse(self, ...)
end
end
-ft.opt_name(s, DummyValue, translate("Name"))
+function s.sectiontitle(self, sid)
+ return (self.map:get(sid, "name") or translate("Unnamed rule"))
+end
local function rule_proto_txt(self, s)
local f = self.map:get(s, "family")
@@ -89,17 +91,31 @@ local function rule_proto_txt(self, s)
end
local function rule_src_txt(self, s)
- local z = ft.fmt_zone(self.map:get(s, "src"), translate("any zone"))
- local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host"))
+ local z = ft.fmt_zone(self.map:get(s, "src"))
local p = ft.fmt_port(self.map:get(s, "src_port"))
local m = ft.fmt_mac(self.map:get(s, "src_mac"))
- if p and m then
- return translatef("From %s in %s with source %s and %s", a, z, p, m)
- elseif p or m then
- return translatef("From %s in %s with source %s", a, z, p or m)
+ -- Forward/Input
+ if z and #z > 0 then
+ local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host"))
+ if p and m then
+ return translatef("From %s in %s with source %s and %s", a, z, p, m)
+ elseif p or m then
+ return translatef("From %s in %s with source %s", a, z, p or m)
+ else
+ return translatef("From %s in %s", a, z)
+ end
+
+ -- Output
else
- return translatef("From %s in %s", a, z)
+ local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any router IP"))
+ if p and m then
+ return translatef("From %s on <var>this device</var> with source %s and %s", a, p, m)
+ elseif p or m then
+ return translatef("From %s on <var>this device</var> with source %s", a, p or m)
+ else
+ return translatef("From %s on <var>this device</var>", a)
+ end
end
end
@@ -145,7 +161,6 @@ end
match = s:option(DummyValue, "match", translate("Match"))
match.rawhtml = true
-match.width = "70%"
function match.cfgvalue(self, s)
return "<small>%s<br />%s<br />%s</small>" % {
rule_proto_txt(self, s),
@@ -156,9 +171,8 @@ end
target = s:option(DummyValue, "target", translate("Action"))
target.rawhtml = true
-target.width = "20%"
function target.cfgvalue(self, s)
- local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "dest"))
+ local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "src"), self.map:get(s, "dest"))
local l = ft.fmt_limit(self.map:get(s, "limit"),
self.map:get(s, "limit_burst"))
@@ -169,7 +183,7 @@ function target.cfgvalue(self, s)
end
end
-ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
+ft.opt_enabled(s, Flag, translate("Enable"))
--
@@ -226,11 +240,12 @@ function s.filter(self, sid)
return (self.map:get(sid, "target") == "SNAT")
end
-ft.opt_name(s, DummyValue, translate("Name"))
+function s.sectiontitle(self, sid)
+ return (self.map:get(sid, "name") or translate("Unnamed SNAT"))
+end
match = s:option(DummyValue, "match", translate("Match"))
match.rawhtml = true
-match.width = "70%"
function match.cfgvalue(self, s)
return "<small>%s<br />%s<br />%s</small>" % {
rule_proto_txt(self, s),
@@ -241,7 +256,6 @@ end
snat = s:option(DummyValue, "via", translate("Action"))
snat.rawhtml = true
-snat.width = "20%"
function snat.cfgvalue(self, s)
local a = ft.fmt_ip(self.map:get(s, "src_dip"))
local p = ft.fmt_port(self.map:get(s, "src_dport"))
@@ -253,7 +267,7 @@ function snat.cfgvalue(self, s)
end
end
-ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
+ft.opt_enabled(s, Flag, translate("Enable"))
return m
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
index a42c1499f0..e168c3c605 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
@@ -101,9 +101,12 @@ end
function net.write(self, section, value)
zone:clear_networks()
- local n
- for n in ut.imatch(value) do
- zone:add_network(n)
+ local net
+ for net in ut.imatch(value) do
+ local n = nw:get_network(net) or nw:add_network(net, { proto = "none" })
+ if n then
+ zone:add_network(n:name())
+ end
end
end
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua
index 500e5078f4..46402a8fc1 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua
@@ -3,6 +3,7 @@
local ds = require "luci.dispatcher"
local fw = require "luci.model.firewall"
+local fs = require "nixio.fs"
local m, s, o, p, i, v
@@ -32,6 +33,28 @@ for i, v in ipairs(p) do
v:value("ACCEPT", translate("accept"))
end
+-- Netfilter flow offload support
+
+local offload = fs.access("/sys/module/xt_FLOWOFFLOAD/refcnt")
+
+if offload then
+ s:option(DummyValue, "offload_advice",
+ translate("Routing/NAT Offloading"),
+ translate("Experimental feature. Not fully compatible with QoS/SQM."))
+
+ o = s:option(Flag, "flow_offloading",
+ translate("Software flow offloading"),
+ translate("Software based offloading for routing/NAT"))
+ o.optional = true
+
+ o = s:option(Flag, "flow_offloading_hw",
+ translate("Hardware flow offloading"),
+ translate("Requires hardware NAT support. Implemented at least for mt7621"))
+ o.optional = true
+ o:depends( "flow_offloading", 1)
+end
+
+-- Firewall zones
s = m:section(TypedSection, "zone", translate("Zones"))
s.template = "cbi/tblsection"
@@ -39,6 +62,11 @@ s.anonymous = true
s.addremove = true
s.extedit = ds.build_url("admin", "network", "firewall", "zones", "%s")
+function s.sectiontitle(self, sid)
+ local z = fw:get_zone(sid)
+ return z:name()
+end
+
function s.create(self)
local z = fw:new_zone()
if z then
diff --git a/applications/luci-app-firewall/luasrc/tools/firewall.lua b/applications/luci-app-firewall/luasrc/tools/firewall.lua
index 2d89bfa2a6..055342bfb3 100644
--- a/applications/luci-app-firewall/luasrc/tools/firewall.lua
+++ b/applications/luci-app-firewall/luasrc/tools/firewall.lua
@@ -198,8 +198,18 @@ function fmt_limit(limit, burst)
end
end
-function fmt_target(x, dest)
- if dest and #dest > 0 then
+function fmt_target(x, src, dest)
+ if not src or #src == 0 then
+ if x == "ACCEPT" then
+ return _("Accept output")
+ elseif x == "REJECT" then
+ return _("Refuse output")
+ elseif x == "NOTRACK" then
+ return _("Do not track output")
+ else --if x == "DROP" then
+ return _("Discard output")
+ end
+ elseif dest and #dest > 0 then
if x == "ACCEPT" then
return _("Accept forward")
elseif x == "REJECT" then
diff --git a/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm b/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm
index b3079f3a48..f48599b505 100644
--- a/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm
+++ b/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm
@@ -18,95 +18,91 @@
vals[#vals+1] = '%s (%s)' %{ ip, name }
end)
-%>
-<div class="cbi-section-create cbi-tblsection-create">
- <br />
- <table class="cbi-section-table" style="width:810px; margin-left:5px">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" colspan="8"><%:New port forward%>:</th>
- </tr>
- <tr class="cbi-section-table-descr">
- <th class="cbi-section-table-cell"><%:Name%></th>
- <th class="cbi-section-table-cell"><%:Protocol%></th>
- <th class="cbi-section-table-cell"><%:External zone%></th>
- <th class="cbi-section-table-cell"><%:External port%></th>
- <th class="cbi-section-table-cell"><%:Internal zone%></th>
- <th class="cbi-section-table-cell"><%:Internal IP address%></th>
- <th class="cbi-section-table-cell"><%:Internal port%></th>
- <th class="cbi-section-table-cell"></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td class="cbi-section-table-cell">
- <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New port forward%>" />
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <select class="cbi-input-select" id="_newfwd.proto" name="_newfwd.proto">
- <option value="tcp udp">TCP+UDP</option>
- <option value="tcp">TCP</option>
- <option value="udp">UDP</option>
- <option value="other"><%:Other...%></option>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:55px">
- <select class="cbi-input-select" id="_newfwd.extzone" name="_newfwd.extzone">
- <% for _, z in ipairs(ezl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newfwd.extport" name="_newfwd.extport" data-type="portrange" data-optional="true" />
- </td>
- <td class="cbi-section-table-cell" style="width:55px">
- <select class="cbi-input-select" id="_newfwd.intzone" name="_newfwd.intzone">
- <% for _, z in ipairs(izl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newfwd.intaddr" name="_newfwd.intaddr" data-type="host" data-optional="true"<%=
- ifattr(#keys > 0, "data-choices", {keys, vals})
- %>/>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newfwd.intport" name="_newfwd.intport" data-type="portrange" data-optional="true" />
- </td>
- <td class="cbi-section-table-cell">
- <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
- </td>
- </tr>
- </table>
- <script type="text/javascript">//<![CDATA[
- cbi_bind(document.getElementById('_newfwd.extport'), 'blur',
- function() {
- var n = document.getElementById('_newfwd.name');
- var p = document.getElementById('_newfwd.proto');
- var i = document.getElementById('_newfwd.intport');
- var hints = {
- /* port name 0=both, 1=tcp, 2=udp, 3=other */
- 21: [ 'FTP', 1 ],
- 22: [ 'SSH', 1 ],
- 53: [ 'DNS', 0 ],
- 80: [ 'HTTP', 1 ],
- 443: [ 'HTTPS', 1 ],
- 3389: [ 'RDP', 1 ],
- 5900: [ 'VNC', 1 ],
- };
+<h4><%:New port forward%></h4>
+<div class="table">
+ <div class="tr table-titles">
+ <div class="th"><%:Name%></div>
+ <div class="th"><%:Protocol%></div>
+ <div class="th"><%:External zone%></div>
+ <div class="th"><%:External port%></div>
+ <div class="th"><%:Internal zone%></div>
+ <div class="th"><%:Internal IP address%></div>
+ <div class="th"><%:Internal port%></div>
+ <div class="th"></div>
+ </div>
+ <div class="tr">
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New port forward%>" />
+ </div>
+ <div class="td">
+ <select class="cbi-input-select" id="_newfwd.proto" name="_newfwd.proto">
+ <option value="tcp udp">TCP+UDP</option>
+ <option value="tcp">TCP</option>
+ <option value="udp">UDP</option>
+ <option value="other"><%:Other...%></option>
+ </select>
+ </div>
+ <div class="td">
+ <select class="cbi-input-select" id="_newfwd.extzone" name="_newfwd.extzone">
+ <% for _, z in ipairs(ezl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
+ </select>
+ </div>
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newfwd.extport" name="_newfwd.extport" data-type="portrange" data-optional="true" />
+ </div>
+ <div class="td">
+ <select class="cbi-input-select" id="_newfwd.intzone" name="_newfwd.intzone">
+ <% for _, z in ipairs(izl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
+ </select>
+ </div>
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newfwd.intaddr" name="_newfwd.intaddr" data-type="host" data-optional="true"<%=
+ ifattr(#keys > 0, "data-choices", {keys, vals})
+ %>/>
+ </div>
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newfwd.intport" name="_newfwd.intport" data-type="portrange" data-optional="true" />
+ </div>
+ <div class="td bottom">
+ <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
+ </div>
+ </div>
+</div>
- if (!this.className.match(/invalid/))
- {
- if (!i.value) i.value = this.value;
+<script type="text/javascript">//<![CDATA[
+ cbi_bind(document.getElementById('_newfwd.extport'), 'blur',
+ function() {
+ var n = document.getElementById('_newfwd.name');
+ var p = document.getElementById('_newfwd.proto');
+ var i = document.getElementById('_newfwd.intport');
+ var hints = {
+ /* port name 0=both, 1=tcp, 2=udp, 3=other */
+ 21: [ 'FTP', 1 ],
+ 22: [ 'SSH', 1 ],
+ 53: [ 'DNS', 0 ],
+ 80: [ 'HTTP', 1 ],
+ 443: [ 'HTTPS', 1 ],
+ 3389: [ 'RDP', 1 ],
+ 5900: [ 'VNC', 1 ],
+ };
- var hint = hints[this.value || 0] || hints[i.value || 0];
- if (hint)
- {
- p.selectedIndex = hint[1];
+ if (!this.className.match(/invalid/))
+ {
+ if (!i.value) i.value = this.value;
+
+ var hint = hints[this.value || 0] || hints[i.value || 0];
+ if (hint)
+ {
+ p.selectedIndex = hint[1];
- if (!n.value)
- n.value = hint[0];
- }
- else if (!n.value)
- {
- n.value = 'Forward' + this.value;
- }
+ if (!n.value)
+ n.value = hint[0];
}
- });
- //]]></script>
-</div>
+ else if (!n.value)
+ {
+ n.value = 'Forward' + this.value;
+ }
+ }
+ });
+//]]></script>
diff --git a/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm b/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm
index b06fac3de4..273675cd30 100644
--- a/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm
+++ b/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm
@@ -5,112 +5,105 @@
local zones = fw:get_zones()
%>
-<div class="cbi-section-create cbi-tblsection-create">
- <% if wz then %>
- <br />
- <table class="cbi-section-table" style="margin-left:5px">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell left" colspan="4"><%:Open ports on router%>:</th>
- </tr>
- <tr class="cbi-section-table-descr">
- <th class="cbi-section-table-cell"><%:Name%></th>
- <th class="cbi-section-table-cell"><%:Protocol%></th>
- <th class="cbi-section-table-cell"><%:External port%></th>
- <th class="cbi-section-table-cell"></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td class="cbi-section-table-cell" style="width:130px">
- <input type="text" class="cbi-input-text" id="_newopen.name" name="_newopen.name" placeholder="<%:New input rule%>" />
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <select class="cbi-input-select" id="_newopen.proto" name="_newopen.proto">
- <option value="tcp udp">TCP+UDP</option>
- <option value="tcp">TCP</option>
- <option value="udp">UDP</option>
- <option value="other"><%:Other...%></option>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newopen.extport" name="_newopen.extport" />
- </td>
- <td class="cbi-section-table-cell left">
- <input type="submit" class="cbi-button cbi-button-add" name="_newopen.submit" value="<%:Add%>" />
- </td>
- </tr>
- </table>
- <% end %>
- <% if #zones > 1 then %>
- <table class="cbi-section-table" style="margin-left:5px">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell left" colspan="6"><br /><%:New forward rule%>:</th>
- </tr>
- <tr class="cbi-section-table-descr">
- <th class="cbi-section-table-cell"><%:Name%></th>
- <th class="cbi-section-table-cell"><%:Source zone%></th>
- <th class="cbi-section-table-cell"><%:Destination zone%></th>
- <th class="cbi-section-table-cell"></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td class="cbi-section-table-cell" style="width:130px">
- <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New forward rule%>" />
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <select class="cbi-input-text" id="_newfwd.src" name="_newfwd.src">
- <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
- <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
- <%- end %>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <select class="cbi-input-text" id="_newfwd.dest" name="_newfwd.dest">
- <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
- <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
- <%- end %>
- </select>
- </td>
- <td class="cbi-section-table-cell left">
- <input type="submit" class="cbi-button cbi-button-link" name="_newfwd.submit" value="<%:Add and edit...%>" />
- </td>
- </tr>
- </table>
- <% else %>
- <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
- <% end %>
+<% if wz then %>
+ <h4><%:Open ports on router%></h4>
+ <div class="table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th"><%:Name%></div>
+ <div class="th"><%:Protocol%></div>
+ <div class="th"><%:External port%></div>
+ <div class="th"></div>
+ </div>
+ <div class="tr">
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newopen.name" name="_newopen.name" placeholder="<%:New input rule%>" />
+ </div>
+ <div class="td">
+ <select class="cbi-input-select" id="_newopen.proto" name="_newopen.proto">
+ <option value="tcp udp">TCP+UDP</option>
+ <option value="tcp">TCP</option>
+ <option value="udp">UDP</option>
+ <option value="other"><%:Other...%></option>
+ </select>
+ </div>
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newopen.extport" name="_newopen.extport" />
+ </div>
+ <div class="td bottom">
+ <input type="submit" class="cbi-button cbi-button-add" name="_newopen.submit" value="<%:Add%>" />
+ </div>
+ </div>
+ </div>
+<% end %>
+<% if #zones > 1 then %>
+ <h4><%:New forward rule%></h4>
+ <div class="table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th"><%:Name%></div>
+ <div class="th"><%:Source zone%></div>
+ <div class="th"><%:Destination zone%></div>
+ <div class="th"></div>
+ </div>
+ <div class="tr">
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New forward rule%>" />
+ </div>
+ <div class="td">
+ <select class="cbi-input-text" id="_newfwd.src" name="_newfwd.src">
+ <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+ <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+ <%- end %>
+ </select>
+ </div>
+ <div class="td">
+ <select class="cbi-input-text" id="_newfwd.dest" name="_newfwd.dest">
+ <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+ <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+ <%- end %>
+ </select>
+ </div>
+ <div class="td bottom">
+ <input type="submit" class="cbi-button cbi-button-link" name="_newfwd.submit" value="<%:Add and edit...%>" />
+ </div>
+ </div>
+ </div>
+<% else %>
+ <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
+<% end %>
- <% if wz then %>
- <script type="text/javascript">//<![CDATA[
- cbi_validate_field('_newopen.extport', true, 'list(neg(portrange))');
- cbi_bind(document.getElementById('_newopen.extport'), 'blur',
- function() {
- var n = document.getElementById('_newopen.name');
- var p = document.getElementById('_newopen.proto');
- var hints = {
- /* port name 0=both, 1=tcp, 2=udp, 3=other */
- 22: [ 'SSH', 1 ],
- 53: [ 'DNS', 0 ],
- 80: [ 'HTTP', 1 ],
- 443: [ 'HTTPS', 1 ],
- };
+<% if wz then %>
+ <script type="text/javascript">//<![CDATA[
+ cbi_validate_field('_newopen.extport', true, 'list(neg(portrange))');
+ cbi_bind(document.getElementById('_newopen.extport'), 'blur',
+ function() {
+ var n = document.getElementById('_newopen.name');
+ var p = document.getElementById('_newopen.proto');
+ var hints = {
+ /* port name 0=both, 1=tcp, 2=udp, 3=other */
+ 22: [ 'SSH', 1 ],
+ 53: [ 'DNS', 0 ],
+ 80: [ 'HTTP', 1 ],
+ 443: [ 'HTTPS', 1 ],
+ };
- if (!this.className.match(/invalid/))
+ if (!this.className.match(/invalid/))
+ {
+ var hint = hints[this.value || 0];
+ if (hint)
{
- var hint = hints[this.value || 0];
- if (hint)
- {
- p.selectedIndex = hint[1];
+ p.selectedIndex = hint[1];
- if (!n.value)
- n.value = hint[0];
- }
- else if (!n.value && this.value)
- {
- n.value = 'Open' + this.value;
- }
+ if (!n.value)
+ n.value = hint[0];
}
- });
+ else if (!n.value && this.value)
+ {
+ n.value = 'Open' + this.value;
+ }
+ }
+ });
- cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');
- //]]></script>
- <% end %>
-</div>
+ cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');
+ //]]></script>
+<% end %>
diff --git a/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm b/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm
index 0a5913fc00..0b4774ccc0 100644
--- a/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm
+++ b/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm
@@ -12,53 +12,48 @@
end
%>
-<div class="cbi-section-create cbi-tblsection-create">
- <% if #zones > 1 then %>
- <br />
- <table class="cbi-section-table" style="width:700px; margin-left:5px">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell left" colspan="6"><%:New source NAT%>:</th>
- </tr>
- <tr class="cbi-section-table-descr">
- <th class="cbi-section-table-cell"><%:Name%></th>
- <th class="cbi-section-table-cell"><%:Source zone%></th>
- <th class="cbi-section-table-cell"><%:Destination zone%></th>
- <th class="cbi-section-table-cell"><%:To source IP%></th>
- <th class="cbi-section-table-cell"><%:To source port%></th>
- <th class="cbi-section-table-cell"></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td class="cbi-section-table-cell">
- <input type="text" class="cbi-input-text" id="_newsnat.name" name="_newsnat.name" placeholder="<%:New SNAT rule%>" />
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <select class="cbi-input-text" id="_newsnat.src" name="_newsnat.src">
- <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
- <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
- <%- end %>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <select class="cbi-input-text" id="_newsnat.dest" name="_newsnat.dest">
- <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
- <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
- <%- end %>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newsnat.dip" name="_newsnat.dip" placeholder="<%:Do not rewrite%>" data-type="ip4addr" data-optional="true"<%=
- ifattr(#keys > 0, "data-choices", { keys, vals })
- %> />
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newsnat.dport" name="_newsnat.dport" placeholder="<%:Do not rewrite%>" data-type="portrange" data-optional="true" />
- </td>
- <td class="cbi-section-table-cell">
- <input type="submit" class="cbi-button cbi-button-link" name="_newsnat.submit" value="<%:Add and edit...%>" />
- </td>
- </tr>
- </table>
- <% else %>
- <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
- <% end %>
-</div>
+<% if #zones > 1 then %>
+ <h4><%:New source NAT%></h4>
+ <div class="table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th"><%:Name%></div>
+ <div class="th"><%:Source zone%></div>
+ <div class="th"><%:Destination zone%></div>
+ <div class="th"><%:To source IP%></div>
+ <div class="th"><%:To source port%></div>
+ <div class="th"></div>
+ </div>
+ <div class="tr">
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newsnat.name" name="_newsnat.name" placeholder="<%:New SNAT rule%>" />
+ </div>
+ <div class="td">
+ <select class="cbi-input-text" id="_newsnat.src" name="_newsnat.src">
+ <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+ <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+ <%- end %>
+ </select>
+ </div>
+ <div class="td">
+ <select class="cbi-input-text" id="_newsnat.dest" name="_newsnat.dest">
+ <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+ <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+ <%- end %>
+ </select>
+ </div>
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newsnat.dip" name="_newsnat.dip" placeholder="<%:Do not rewrite%>" data-type="ip4addr" data-optional="true"<%=
+ ifattr(#keys > 0, "data-choices", { keys, vals })
+ %> />
+ </div>
+ <div class="td">
+ <input type="text" class="cbi-input-text" id="_newsnat.dport" name="_newsnat.dport" placeholder="<%:Do not rewrite%>" data-type="portrange" data-optional="true" />
+ </div>
+ <div class="td bottom">
+ <input type="submit" class="cbi-button cbi-button-link" name="_newsnat.submit" value="<%:Add and edit...%>" />
+ </div>
+ </div>
+ </div>
+<% else %>
+ <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
+<% end %>
diff --git a/applications/luci-app-firewall/po/ca/firewall.po b/applications/luci-app-firewall/po/ca/firewall.po
index ff43427eed..e1e553abba 100644
--- a/applications/luci-app-firewall/po/ca/firewall.po
+++ b/applications/luci-app-firewall/po/ca/firewall.po
@@ -48,6 +48,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Acció"
@@ -106,6 +109,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "No reescriguis"
@@ -115,6 +121,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Descarta els paquets invàlids"
@@ -130,6 +139,9 @@ msgstr "Habilita protecció contra la inundació SYN"
msgid "Enable logging on this zone"
msgstr "Habilita el registre d'aquesta zona"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Adreça IP extern"
@@ -178,9 +190,21 @@ msgstr "Des de %s en %s amb origen %s"
msgid "From %s in %s with source %s and %s"
msgstr "Des de %s en %s amb orígens %s i %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Ajusts generals"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -308,6 +332,9 @@ msgstr "Altre..."
msgid "Output"
msgstr "Sortida"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!"
@@ -337,6 +364,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -365,6 +398,9 @@ msgstr "Reescriu a l'origen %s"
msgid "Rewrite to source %s, %s"
msgstr "Reescriu als orígens %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -380,6 +416,12 @@ msgstr "Port SNAT"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Adreça IP d'origen"
@@ -513,6 +555,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Via %s"
diff --git a/applications/luci-app-firewall/po/cs/firewall.po b/applications/luci-app-firewall/po/cs/firewall.po
index caa7e19988..727e40d5be 100644
--- a/applications/luci-app-firewall/po/cs/firewall.po
+++ b/applications/luci-app-firewall/po/cs/firewall.po
@@ -44,6 +44,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Akce"
@@ -101,6 +104,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Nepřepisovat"
@@ -110,6 +116,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Zahazovat neplatné pakety"
@@ -125,6 +134,9 @@ msgstr "Povolit ochranu proti SYN-flood"
msgid "Enable logging on this zone"
msgstr "Povolit logování v této oblasti"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Vnější IP adresa"
@@ -173,9 +185,21 @@ msgstr "Z %s v %s se zdrojovou %s"
msgid "From %s in %s with source %s and %s"
msgstr "Z %s v %s se zdrojovou %s a %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Obecné nastavení"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -303,6 +327,9 @@ msgstr "Ostatní ..."
msgid "Output"
msgstr "Výstup"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Předává další argumenty iptables. Používat opatrně!"
@@ -334,6 +361,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -362,6 +395,9 @@ msgstr "Přepsat na zdrojovou %s"
msgid "Rewrite to source %s, %s"
msgstr "Přepsat na zdrojovou %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -377,6 +413,12 @@ msgstr "Port SNATu"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Zdrojová IP adresa"
@@ -508,6 +550,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Prostřednictvím %s"
diff --git a/applications/luci-app-firewall/po/de/firewall.po b/applications/luci-app-firewall/po/de/firewall.po
index fcf8bec679..9b6d2a01aa 100644
--- a/applications/luci-app-firewall/po/de/firewall.po
+++ b/applications/luci-app-firewall/po/de/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Aktion"
@@ -104,6 +107,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Nicht umschreiben"
@@ -113,6 +119,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Ungültige Pakete verwerfen"
@@ -128,6 +137,9 @@ msgstr "Schutz vor SYN-flood-Attacken"
msgid "Enable logging on this zone"
msgstr "Protokollierung innerhalb der Zone aktivieren"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Externe IP-Adresse"
@@ -176,9 +188,21 @@ msgstr "Von %s in %s mit Quell-%s"
msgid "From %s in %s with source %s and %s"
msgstr "Von %s in %s mit Quell-%s und %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Allgemein"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -301,6 +325,9 @@ msgstr "Anderes..."
msgid "Output"
msgstr "Ausgang"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
"Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht "
@@ -334,6 +361,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -362,6 +395,9 @@ msgstr "Schreibe um auf Quell-%s"
msgid "Rewrite to source %s, %s"
msgstr "Schreibe um auf Quell-%s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -377,6 +413,12 @@ msgstr "SNAT-Port"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Quell-IP-Adresse"
@@ -512,6 +554,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Ãœber %s"
diff --git a/applications/luci-app-firewall/po/el/firewall.po b/applications/luci-app-firewall/po/el/firewall.po
index 598927557b..00b61d857d 100644
--- a/applications/luci-app-firewall/po/el/firewall.po
+++ b/applications/luci-app-firewall/po/el/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "ΕνέÏγεια"
@@ -101,6 +104,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -110,6 +116,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Αγνόηση μη-έγκυÏων πακετών"
@@ -126,6 +135,9 @@ msgstr "ΠÏοστασία SYN-flood"
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "ΕξωτεÏική διεÏθυνση IP"
@@ -174,9 +186,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Γενικές Ρυθμίσεις"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -300,6 +324,9 @@ msgstr "Άλλο..."
msgid "Output"
msgstr "Έξοδος"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -327,6 +354,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -353,6 +386,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -368,6 +404,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
#, fuzzy
msgid "Source IP address"
msgstr "ΔιεÏθυνση MAC πηγής"
@@ -480,6 +522,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/en/firewall.po b/applications/luci-app-firewall/po/en/firewall.po
index df1ed4a088..0de68d5c03 100644
--- a/applications/luci-app-firewall/po/en/firewall.po
+++ b/applications/luci-app-firewall/po/en/firewall.po
@@ -44,6 +44,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Action"
@@ -98,6 +101,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -107,6 +113,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Drop invalid packets"
@@ -122,6 +131,9 @@ msgstr "Enable SYN-flood protection"
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -174,9 +186,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -299,6 +323,9 @@ msgstr ""
msgid "Output"
msgstr "Output"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -327,6 +354,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -353,6 +386,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -368,6 +404,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -507,6 +549,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/es/firewall.po b/applications/luci-app-firewall/po/es/firewall.po
index bae8b693da..fbb63ed330 100644
--- a/applications/luci-app-firewall/po/es/firewall.po
+++ b/applications/luci-app-firewall/po/es/firewall.po
@@ -47,6 +47,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Acción"
@@ -105,6 +108,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "No reescribir"
@@ -114,6 +120,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Descartar paquetes no válidos"
@@ -129,6 +138,9 @@ msgstr "Activar protección a inundación-SYN"
msgid "Enable logging on this zone"
msgstr "Activar registro en esta zona"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Dirección IP externa"
@@ -177,9 +189,21 @@ msgstr "Desde %s en %s con origen %s"
msgid "From %s in %s with source %s and %s"
msgstr "Desde %s en %s con origen %s y %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Configuración general"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -306,6 +330,9 @@ msgstr "Otros..."
msgid "Output"
msgstr "Salida"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Pasa más parámetros a IPTables. ¡Usar con cuidado!"
@@ -336,6 +363,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -364,6 +397,9 @@ msgstr "Reescribir a origen %s"
msgid "Rewrite to source %s, %s"
msgstr "Reescribir a origen %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -379,6 +415,12 @@ msgstr "Puerto SNAT"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Dirección IP origen"
@@ -511,6 +553,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Vía %s"
diff --git a/applications/luci-app-firewall/po/fr/firewall.po b/applications/luci-app-firewall/po/fr/firewall.po
index 281999b550..644f5c3b6b 100644
--- a/applications/luci-app-firewall/po/fr/firewall.po
+++ b/applications/luci-app-firewall/po/fr/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Action"
@@ -100,6 +103,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -109,6 +115,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Supprimer les paquets invalides"
@@ -124,6 +133,9 @@ msgstr "Activer la protection contre le SYN-flood"
msgid "Enable logging on this zone"
msgstr "Activer les traces (logs) sur cette zone"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Adresse IP externe"
@@ -176,9 +188,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Paramètres généraux"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -301,6 +325,9 @@ msgstr "Autre..."
msgid "Output"
msgstr "Sortie"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -332,6 +359,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -362,6 +395,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -377,6 +413,12 @@ msgstr "Port SNAT"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -533,6 +575,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/he/firewall.po b/applications/luci-app-firewall/po/he/firewall.po
index 06952d4901..55b15b2c37 100644
--- a/applications/luci-app-firewall/po/he/firewall.po
+++ b/applications/luci-app-firewall/po/he/firewall.po
@@ -41,6 +41,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -95,6 +98,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -104,6 +110,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr ""
@@ -119,6 +128,9 @@ msgstr ""
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -167,9 +179,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -290,6 +314,9 @@ msgstr ""
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -317,6 +344,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -343,6 +376,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -358,6 +394,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr ""
@@ -465,6 +507,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/hu/firewall.po b/applications/luci-app-firewall/po/hu/firewall.po
index 29aa324187..6abda1e27d 100644
--- a/applications/luci-app-firewall/po/hu/firewall.po
+++ b/applications/luci-app-firewall/po/hu/firewall.po
@@ -44,6 +44,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Művelet"
@@ -102,6 +105,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Ne írja felül"
@@ -111,6 +117,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Érvénytelen csomagok eldobása"
@@ -126,6 +135,9 @@ msgstr "SYN-flood védelem engedélyezése"
msgid "Enable logging on this zone"
msgstr "Naplózás engeélyezése ezen a zónán"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Külső IP cím"
@@ -174,9 +186,21 @@ msgstr "%s felől %s-ben %s forrással"
msgid "From %s in %s with source %s and %s"
msgstr "%s felől %s-ben %s és %s forrással"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Ãltalános beállítások"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -307,6 +331,9 @@ msgstr "Egyéb..."
msgid "Output"
msgstr "Kimenet"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
"További argumentumok küldése az iptables részére. Használja körültekintően!"
@@ -338,6 +365,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -366,6 +399,9 @@ msgstr "Ãtírás %s forrásra"
msgid "Rewrite to source %s, %s"
msgstr "Ãtírás %s, %s forrásra"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -381,6 +417,12 @@ msgstr "SNAT port"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Forrás IP cím"
@@ -515,6 +557,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "%s-en át"
diff --git a/applications/luci-app-firewall/po/it/firewall.po b/applications/luci-app-firewall/po/it/firewall.po
index 43b90a9e9b..ca7faa7f26 100644
--- a/applications/luci-app-firewall/po/it/firewall.po
+++ b/applications/luci-app-firewall/po/it/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Azione"
@@ -104,6 +107,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Non riscrivere"
@@ -113,6 +119,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Scarta pacchetti invalidi"
@@ -128,6 +137,9 @@ msgstr "Attiva protezione SYN-flood"
msgid "Enable logging on this zone"
msgstr "Attiva registro su questa zona"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Indirizzo IP Esterno"
@@ -176,9 +188,21 @@ msgstr "Da %s a %s con sorgente %s"
msgid "From %s in %s with source %s and %s"
msgstr "Da %s a %s con sorgente %s e %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Opzioni Generali"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -305,6 +329,9 @@ msgstr "Altri..."
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Passa comandi addizionali a iptables. Usare con cura!"
@@ -334,6 +361,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr "Riavvia Firewall"
@@ -362,6 +395,9 @@ msgstr "Riscrivi alla sorgente %s"
msgid "Rewrite to source %s, %s"
msgstr "Riscrivi alla sorgente %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -377,6 +413,12 @@ msgstr "Porta SNAT"
msgid "Saturday"
msgstr "Sabato"
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -531,6 +573,15 @@ msgstr ""
msgid "Tuesday"
msgstr "Martedì"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/ja/firewall.po b/applications/luci-app-firewall/po/ja/firewall.po
index 2d252797ff..6cc4714113 100644
--- a/applications/luci-app-firewall/po/ja/firewall.po
+++ b/applications/luci-app-firewall/po/ja/firewall.po
@@ -3,14 +3,14 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-03-30 17:00+0200\n"
-"PO-Revision-Date: 2018-01-15 14:56+0900\n"
+"PO-Revision-Date: 2018-06-30 23:19+0900\n"
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 2.0.5\n"
+"X-Generator: Poedit 2.0.7\n"
"Language-Team: \n"
msgid "%s in %s"
@@ -47,6 +47,9 @@ msgstr "転é€ã‚’許å¯"
msgid "Accept input"
msgstr "入力を許å¯"
+msgid "Accept output"
+msgstr "出力を許å¯"
+
msgid "Action"
msgstr "動作"
@@ -105,6 +108,9 @@ msgstr "転é€ã‚’破棄"
msgid "Discard input"
msgstr "入力を破棄"
+msgid "Discard output"
+msgstr "出力を破棄"
+
msgid "Do not rewrite"
msgstr "リライトã—ãªã„"
@@ -114,6 +120,9 @@ msgstr "転é€ã‚’追跡ã—ãªã„"
msgid "Do not track input"
msgstr "入力を追跡ã—ãªã„"
+msgid "Do not track output"
+msgstr "出力を追跡ã—ãªã„"
+
msgid "Drop invalid packets"
msgstr "無効ãªãƒ‘ケットをé®æ–­ã™ã‚‹"
@@ -129,6 +138,9 @@ msgstr "SYN-Floodプロテクションを有効ã«ã™ã‚‹"
msgid "Enable logging on this zone"
msgstr "ã“ã®ã‚¾ãƒ¼ãƒ³ã®ãƒ­ã‚°è¨˜éŒ²ã‚’有効ã«ã™ã‚‹"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr "実験的ãªæ©Ÿèƒ½ã§ã™ã€‚ QoS/SQM ã¨ã®å®Œå…¨ãªäº’æ›æ€§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
msgid "External IP address"
msgstr "外部IPアドレス"
@@ -172,14 +184,26 @@ msgid "From %s in %s"
msgstr "é€ä¿¡å…ƒ %s (%s)"
msgid "From %s in %s with source %s"
-msgstr "é€ä¿¡å…ƒ %s (%s) , é€ä¿¡å…ƒ %s"
+msgstr "é€ä¿¡å…ƒ %s (%s) , %s"
msgid "From %s in %s with source %s and %s"
-msgstr "é€ä¿¡å…ƒ %s (%s) , é€ä¿¡å…ƒ %s, é€ä¿¡å…ƒ %s"
+msgstr "é€ä¿¡å…ƒ %s (%s) , %s, %s"
+
+msgid "From %s on <var>this device</var>"
+msgstr "é€ä¿¡å…ƒ %s (<var>デãƒã‚¤ã‚¹</var>)"
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr "é€ä¿¡å…ƒ %s, %s (<var>デãƒã‚¤ã‚¹</var>)"
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr "é€ä¿¡å…ƒ %s, %s, %s (<var>デãƒã‚¤ã‚¹</var>)"
msgid "General Settings"
msgstr "一般設定"
+msgid "Hardware flow offloading"
+msgstr "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ フローオフロード"
+
msgid "IP"
msgstr "IP"
@@ -310,6 +334,9 @@ msgstr "ãã®ä»–ã®ãƒ—ロトコル"
msgid "Output"
msgstr "é€ä¿¡"
+msgid "Output zone"
+msgstr "出力ゾーン"
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
"iptablesã«ãƒ‘ススルーã™ã‚‹è¿½åŠ ã®å¼•æ•°ã‚’設定ã—ã¦ãã ã•ã„。ãŸã ã—ã€æ³¨æ„ã—ã¦è¨­å®šã—"
@@ -343,6 +370,13 @@ msgstr "転é€ã‚’æ‹’å¦"
msgid "Refuse input"
msgstr "入力を拒å¦"
+msgid "Refuse output"
+msgstr "出力を拒å¦"
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+"ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ NAT サãƒãƒ¼ãƒˆãŒå¿…è¦ã§ã™ã€‚ mt7621 ã®ã¿ã«ãŠã„ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
msgid "Restart Firewall"
msgstr "ファイアウォールã®å†èµ·å‹•"
@@ -372,6 +406,9 @@ msgstr "é€ä¿¡å…ƒ %s ã«ãƒªãƒ©ã‚¤ãƒˆ"
msgid "Rewrite to source %s, %s"
msgstr "é€ä¿¡å…ƒ %s, %s ã«ãƒªãƒ©ã‚¤ãƒˆ"
+msgid "Routing/NAT Offloading"
+msgstr "ルーティング/NAT オフロード"
+
msgid "Rule is disabled"
msgstr "ルールã¯ç„¡åŠ¹ã§ã™"
@@ -387,6 +424,12 @@ msgstr "SNAT ãƒãƒ¼ãƒˆ"
msgid "Saturday"
msgstr "土曜日"
+msgid "Software based offloading for routing/NAT"
+msgstr "ルーティング/NAT ã®ãŸã‚ã®ã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãƒ™ãƒ¼ã‚¹ã®ã‚ªãƒ•ãƒ­ãƒ¼ãƒ‰ã§ã™ã€‚"
+
+msgid "Software flow offloading"
+msgstr "ソフトウェア フローオフロード"
+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -547,6 +590,15 @@ msgstr ""
msgid "Tuesday"
msgstr "ç«æ›œæ—¥"
+msgid "Unnamed SNAT"
+msgstr "å称未設定㮠SNAT"
+
+msgid "Unnamed forward"
+msgstr "å称未設定ã®è»¢é€"
+
+msgid "Unnamed rule"
+msgstr "å称未設定ã®ãƒ«ãƒ¼ãƒ«"
+
msgid "Via %s"
msgstr "経由 %s"
diff --git a/applications/luci-app-firewall/po/ko/firewall.po b/applications/luci-app-firewall/po/ko/firewall.po
index bfe94d04a8..6b07c69dbd 100644
--- a/applications/luci-app-firewall/po/ko/firewall.po
+++ b/applications/luci-app-firewall/po/ko/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -103,6 +106,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -112,6 +118,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr ""
@@ -127,6 +136,9 @@ msgstr "SYN-flood protection 활성화"
msgid "Enable logging on this zone"
msgstr "zone ì˜ logging 활성화"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "외부 IP 주소"
@@ -175,9 +187,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -298,6 +322,9 @@ msgstr ""
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "iptables ëª…ë ¹ì— ì¶”ê°€ ì¸ìžë“¤ì„ ë”합니다. 조심해 사용하세요!"
@@ -327,6 +354,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -353,6 +386,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -368,6 +404,12 @@ msgstr ""
msgid "Saturday"
msgstr "토요ì¼"
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Source IP 주소"
@@ -499,6 +541,15 @@ msgstr ""
msgid "Tuesday"
msgstr "화요ì¼"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/ms/firewall.po b/applications/luci-app-firewall/po/ms/firewall.po
index c6ab19791e..42bc606a0b 100644
--- a/applications/luci-app-firewall/po/ms/firewall.po
+++ b/applications/luci-app-firewall/po/ms/firewall.po
@@ -40,6 +40,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -94,6 +97,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -103,6 +109,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr ""
@@ -118,6 +127,9 @@ msgstr ""
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -166,9 +178,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -289,6 +313,9 @@ msgstr ""
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -316,6 +343,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -342,6 +375,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -357,6 +393,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr ""
@@ -464,6 +506,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/no/firewall.po b/applications/luci-app-firewall/po/no/firewall.po
index e9ecb2b63c..0b9fdc6082 100644
--- a/applications/luci-app-firewall/po/no/firewall.po
+++ b/applications/luci-app-firewall/po/no/firewall.po
@@ -41,6 +41,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Handling"
@@ -98,6 +101,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Ikke omskriv"
@@ -107,6 +113,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Forkast ugyldige pakker"
@@ -122,6 +131,9 @@ msgstr "Aktiver SYN-flood beskyttelse"
msgid "Enable logging on this zone"
msgstr "Aktiver logging av denne sonen"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Ekstern IP adressse"
@@ -171,9 +183,21 @@ msgstr "Fra %s i %s med kilde %s"
msgid "From %s in %s with source %s and %s"
msgstr "Fra %s i %s med kilde %s og %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Generelle Innstillinger"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -302,6 +326,9 @@ msgstr "Andre..."
msgid "Output"
msgstr "Utdata"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!"
@@ -333,6 +360,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -361,6 +394,9 @@ msgstr "Omskriv til kilde %s"
msgid "Rewrite to source %s, %s"
msgstr "Omskriv til kilde %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -376,6 +412,12 @@ msgstr "SNAT port"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Kilde IP adresse"
@@ -509,6 +551,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Via %s"
diff --git a/applications/luci-app-firewall/po/pl/firewall.po b/applications/luci-app-firewall/po/pl/firewall.po
index fe48060237..5881f1519a 100644
--- a/applications/luci-app-firewall/po/pl/firewall.po
+++ b/applications/luci-app-firewall/po/pl/firewall.po
@@ -48,6 +48,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Działanie"
@@ -105,6 +108,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Nie przepisuj"
@@ -114,6 +120,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Porzuć wadliwe pakiety"
@@ -129,6 +138,9 @@ msgstr "WÅ‚Ä…cz ochronÄ™ przed atakiem SYN-flood"
msgid "Enable logging on this zone"
msgstr "WÅ‚Ä…cz logowanie na tej strefy"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Zewnętrzne adresy IP"
@@ -180,9 +192,21 @@ msgstr "Z %s w %s ze źródłem %s"
msgid "From %s in %s with source %s and %s"
msgstr "Z %s w %s ze źródłem %s i %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Ustawienia ogólne"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -310,6 +334,9 @@ msgstr "Inne..."
msgid "Output"
msgstr "Wyjście (Output)"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
"Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególną ostrożność!"
@@ -342,6 +369,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -374,6 +407,9 @@ msgstr "Przepisz do źródła %s"
msgid "Rewrite to source %s, %s"
msgstr "Przepisz do źródła %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -389,6 +425,12 @@ msgstr "Port SNAT"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Źródłowy adres IP"
@@ -522,6 +564,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Przez %s"
diff --git a/applications/luci-app-firewall/po/pt-br/firewall.po b/applications/luci-app-firewall/po/pt-br/firewall.po
index b49adccdda..116bf6a633 100644
--- a/applications/luci-app-firewall/po/pt-br/firewall.po
+++ b/applications/luci-app-firewall/po/pt-br/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Ação"
@@ -103,6 +106,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Não sobrescreva"
@@ -112,6 +118,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Descartar pacotes inválidos"
@@ -127,6 +136,9 @@ msgstr "Habilite proteção contra SYN-flood"
msgid "Enable logging on this zone"
msgstr "Habilite o registro nesta zona"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Endereço IP externo"
@@ -175,9 +187,21 @@ msgstr "Vindo de %s em %s com origem %s"
msgid "From %s in %s with source %s and %s"
msgstr "Vindo de %s em %s com origem %s e %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Configurações Gerais"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -307,6 +331,9 @@ msgstr "Outro..."
msgid "Output"
msgstr "Saída"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!"
@@ -337,6 +364,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr "Reiniciar o Firewall"
@@ -365,6 +398,9 @@ msgstr "Reescrever para a origem %s"
msgid "Rewrite to source %s, %s"
msgstr "Reescrever para a origem %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -380,6 +416,12 @@ msgstr "Porta da SNAT"
msgid "Saturday"
msgstr "Sábado"
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Endereço IP de origem"
@@ -512,6 +554,15 @@ msgstr ""
msgid "Tuesday"
msgstr "Terça-feira"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Via %s"
diff --git a/applications/luci-app-firewall/po/pt/firewall.po b/applications/luci-app-firewall/po/pt/firewall.po
index 29a7c7c2c7..901fd6a847 100644
--- a/applications/luci-app-firewall/po/pt/firewall.po
+++ b/applications/luci-app-firewall/po/pt/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Acção"
@@ -104,6 +107,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Não re-escrever"
@@ -113,6 +119,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Cancelar pacotes inválidos"
@@ -128,6 +137,9 @@ msgstr "Ativar a Proteção SYN-flood"
msgid "Enable logging on this zone"
msgstr "Ativar registo nesta zona"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Endereço IP externo"
@@ -176,9 +188,21 @@ msgstr "De %s em %s com origem %s"
msgid "From %s in %s with source %s and %s"
msgstr "De %s em %s com origem %s e %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Definições Gerais"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -308,6 +332,9 @@ msgstr "Outro..."
msgid "Output"
msgstr "Saída"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!"
@@ -339,6 +366,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -365,6 +398,9 @@ msgstr "Re-escrever para a origem %s"
msgid "Rewrite to source %s, %s"
msgstr "Re-escrever para a origem %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -380,6 +416,12 @@ msgstr "Porta SNAT"
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Endereço IP de origem"
@@ -497,6 +539,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Via %s"
diff --git a/applications/luci-app-firewall/po/ro/firewall.po b/applications/luci-app-firewall/po/ro/firewall.po
index cc4d7a62af..7f82271375 100644
--- a/applications/luci-app-firewall/po/ro/firewall.po
+++ b/applications/luci-app-firewall/po/ro/firewall.po
@@ -45,6 +45,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Acţiune"
@@ -99,6 +102,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Nu rescrie"
@@ -108,6 +114,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Descarcă pachetele invalide"
@@ -123,6 +132,9 @@ msgstr "Activează protecţia SYN-flood"
msgid "Enable logging on this zone"
msgstr "Activeaza log in aceasta zona"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Adresă IP externă"
@@ -171,9 +183,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Setari generale"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -294,6 +318,9 @@ msgstr "Altele..."
msgid "Output"
msgstr "IeÅŸire"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -321,6 +348,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -347,6 +380,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -362,6 +398,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "Sursă adresă IP"
@@ -469,6 +511,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/ru/firewall.po b/applications/luci-app-firewall/po/ru/firewall.po
index b8611af780..79c0f0b9a6 100644
--- a/applications/luci-app-firewall/po/ru/firewall.po
+++ b/applications/luci-app-firewall/po/ru/firewall.po
@@ -48,6 +48,9 @@ msgstr "ПринÑÑ‚ÑŒ перенаправление"
msgid "Accept input"
msgstr "ПринÑÑ‚ÑŒ входÑщий трафик"
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "ДейÑтвие"
@@ -106,6 +109,9 @@ msgstr "Отключить перенаправление"
msgid "Discard input"
msgstr "Отключить входÑщий трафик"
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Ðе перезапиÑывать"
@@ -115,6 +121,9 @@ msgstr "Ðе отÑлеживать перенаправление"
msgid "Do not track input"
msgstr "Ðе отÑлеживать входÑщий трафик"
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Ðе пропуÑкать<br />некорректные пакеты"
@@ -130,6 +139,9 @@ msgstr "Включить защиту<br />от SYN-flood атак"
msgid "Enable logging on this zone"
msgstr "Включить журналирование в Ñтой зоне"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Внешний IP-адреÑ"
@@ -178,9 +190,21 @@ msgstr "Из %s в %s Ñ Ð¸Ñточником %s"
msgid "From %s in %s with source %s and %s"
msgstr "Из %s в %s Ñ Ð¸Ñточниками %s и %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "ОÑновные наÑтройки"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr "IP-адреÑ"
@@ -312,6 +336,9 @@ msgstr "Другое..."
msgid "Output"
msgstr "ИÑходÑщий трафик"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
"Передаёт дополнительные аргументы таблице iptables. ИÑпользуйте Ñ "
@@ -346,6 +373,12 @@ msgstr "СбраÑывать перенаправление"
msgid "Refuse input"
msgstr "СбраÑывать входÑщий трафик"
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr "ПерезапуÑтить межÑетевой Ñкран"
@@ -374,6 +407,9 @@ msgstr "ПеренаправлÑÑ‚ÑŒ к иÑточнику %s"
msgid "Rewrite to source %s, %s"
msgstr "ПеренаправлÑÑ‚ÑŒ к иÑточнику %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr "Правило отключено"
@@ -389,6 +425,12 @@ msgstr "Порт SNAT"
msgid "Saturday"
msgstr "Суббота"
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника"
@@ -519,6 +561,15 @@ msgstr ""
msgid "Tuesday"
msgstr "Вторник"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Через %s"
diff --git a/applications/luci-app-firewall/po/sk/firewall.po b/applications/luci-app-firewall/po/sk/firewall.po
index a185625a02..8f936d2bed 100644
--- a/applications/luci-app-firewall/po/sk/firewall.po
+++ b/applications/luci-app-firewall/po/sk/firewall.po
@@ -41,6 +41,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -95,6 +98,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -104,6 +110,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr ""
@@ -119,6 +128,9 @@ msgstr ""
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -167,9 +179,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -290,6 +314,9 @@ msgstr ""
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -317,6 +344,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -343,6 +376,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -358,6 +394,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr ""
@@ -465,6 +507,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/sv/firewall.po b/applications/luci-app-firewall/po/sv/firewall.po
index c98eafa09a..efe29ac4b7 100644
--- a/applications/luci-app-firewall/po/sv/firewall.po
+++ b/applications/luci-app-firewall/po/sv/firewall.po
@@ -42,6 +42,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Åtgärd"
@@ -96,6 +99,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "Skriv inte om igen"
@@ -105,6 +111,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "Släpp ogiltiga paket"
@@ -120,6 +129,9 @@ msgstr ""
msgid "Enable logging on this zone"
msgstr "Aktivera loggning i den här zonen"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "Extern IP-adress"
@@ -168,9 +180,21 @@ msgstr "Från %s i %s med källa %s"
msgid "From %s in %s with source %s and %s"
msgstr "Från %s i %s med källa %s och %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "Generella inställningar"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -296,6 +320,9 @@ msgstr "Andra..."
msgid "Output"
msgstr "Utmatning"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -323,6 +350,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr "Starta om brandvägg"
@@ -349,6 +382,9 @@ msgstr "Skriv om igen till källan %s"
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -364,6 +400,12 @@ msgstr "SNAT-port"
msgid "Saturday"
msgstr "Lördag"
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "IP-adress för källa"
@@ -471,6 +513,15 @@ msgstr ""
msgid "Tuesday"
msgstr "Tisdag"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "Via %s"
diff --git a/applications/luci-app-firewall/po/templates/firewall.pot b/applications/luci-app-firewall/po/templates/firewall.pot
index 62c4a2e84a..f761c5e69a 100644
--- a/applications/luci-app-firewall/po/templates/firewall.pot
+++ b/applications/luci-app-firewall/po/templates/firewall.pot
@@ -34,6 +34,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -88,6 +91,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -97,6 +103,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr ""
@@ -112,6 +121,9 @@ msgstr ""
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -160,9 +172,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -283,6 +307,9 @@ msgstr ""
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -310,6 +337,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -336,6 +369,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -351,6 +387,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr ""
@@ -458,6 +500,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/tr/firewall.po b/applications/luci-app-firewall/po/tr/firewall.po
index f23d10aafc..9e497330f9 100644
--- a/applications/luci-app-firewall/po/tr/firewall.po
+++ b/applications/luci-app-firewall/po/tr/firewall.po
@@ -41,6 +41,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -95,6 +98,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -104,6 +110,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr ""
@@ -119,6 +128,9 @@ msgstr ""
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -167,9 +179,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -290,6 +314,9 @@ msgstr ""
msgid "Output"
msgstr ""
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -317,6 +344,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -343,6 +376,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -358,6 +394,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr ""
@@ -465,6 +507,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/uk/firewall.po b/applications/luci-app-firewall/po/uk/firewall.po
index de72ec6e0a..2262f52bcd 100644
--- a/applications/luci-app-firewall/po/uk/firewall.po
+++ b/applications/luci-app-firewall/po/uk/firewall.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2012-12-29 12:53+0200\n"
+"PO-Revision-Date: 2018-06-18 20:24+0300\n"
"Last-Translator: Yurii <yuripet@gmail.com>\n"
"Language-Team: none\n"
"Language: uk\n"
@@ -10,7 +10,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
msgid "%s in %s"
msgstr "%s у %s"
@@ -40,10 +39,13 @@ msgid "<var>%s</var> and limit to %s"
msgstr "<var>%s</var> з лімітом %s"
msgid "Accept forward"
-msgstr ""
+msgstr "Приймати переÑпрÑмовуваннÑ"
msgid "Accept input"
-msgstr ""
+msgstr "Приймати вхідний"
+
+msgid "Accept output"
+msgstr "Приймати вихідний"
msgid "Action"
msgstr "ДіÑ"
@@ -58,10 +60,10 @@ msgid "Advanced Settings"
msgstr "Розширені наÑтройки"
msgid "Allow forward from <em>source zones</em>:"
-msgstr "Дозволити ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ <em>зон-джерел</em>:"
+msgstr "Дозволити переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ <em>зон джерела</em>:"
msgid "Allow forward to <em>destination zones</em>:"
-msgstr "Дозволити ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ <em>зон призначеннÑ</em>:"
+msgstr "Дозволити переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ <em>зон призначеннÑ</em>:"
msgid "Any"
msgstr "Будь-Ñкий"
@@ -95,22 +97,28 @@ msgid "Destination zone"
msgstr "Зона призначеннÑ"
msgid "Disable"
-msgstr ""
+msgstr "Вимкнути"
msgid "Discard forward"
-msgstr ""
+msgstr "Відкидати переÑпрÑмовуваннÑ"
msgid "Discard input"
-msgstr ""
+msgstr "Відкидати вхідний"
+
+msgid "Discard output"
+msgstr "Відкидати вихідний"
msgid "Do not rewrite"
msgstr "Ðе перезапиÑувати"
msgid "Do not track forward"
-msgstr ""
+msgstr "Ðе відÑлідковувати переÑпрÑмовуваннÑ"
msgid "Do not track input"
-msgstr ""
+msgstr "Ðе відÑлідковувати вхідний"
+
+msgid "Do not track output"
+msgstr "Ðе відÑлідковувати вихідний"
msgid "Drop invalid packets"
msgstr "Відкидати помилкові пакети"
@@ -127,6 +135,9 @@ msgstr "Увімкнути захиÑÑ‚ від SYN-flood"
msgid "Enable logging on this zone"
msgstr "Увімкнути реєÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ цій зоні"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr "ЕкÑпериментальна функціÑ. Ðе повніÑÑ‚ÑŽ ÑуміÑно з QoS / SQM."
+
msgid "External IP address"
msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ IP-адреÑа"
@@ -146,7 +157,7 @@ msgid "Firewall - Custom Rules"
msgstr "Брандмауер — ÐаÑтроювані правила"
msgid "Firewall - Port Forwards"
-msgstr "Брандмауер — СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
+msgstr "Брандмауер — ПереÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
msgid "Firewall - Traffic Rules"
msgstr "Брандмауер — Правила трафіка"
@@ -158,34 +169,46 @@ msgid "Force connection tracking"
msgstr "Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·'єднань"
msgid "Forward"
-msgstr "СпрÑмовуваннÑ"
+msgstr "ПереÑпрÑмовуваннÑ"
msgid "Forward to"
-msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾"
+msgstr "переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾"
msgid "Friday"
-msgstr ""
+msgstr "П'ÑтницÑ"
msgid "From %s in %s"
msgstr "%s у %s"
msgid "From %s in %s with source %s"
-msgstr "%s у %s з вихідним %s"
+msgstr "%s у %s з джерелом %s"
msgid "From %s in %s with source %s and %s"
-msgstr "%s у %s з вихідним %s та %s"
+msgstr "%s у %s з джерелом %s та %s"
+
+msgid "From %s on <var>this device</var>"
+msgstr "Від %s на <var>цьому приÑтрої</var>"
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr "Від %s на <var>цьому приÑтрої</var> з джерелом %s"
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr "Від %s на <var>цьому приÑтрої</var> з джерелом %s та %s"
msgid "General Settings"
msgstr "Загальні наÑтройки"
+msgid "Hardware flow offloading"
+msgstr "Ðпаратні заÑоби Ñ€Ð¾Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ"
+
msgid "IP"
-msgstr ""
+msgstr "IP-адреÑа"
msgid "IP range"
-msgstr ""
+msgstr "Діапазон IP"
msgid "IPs"
-msgstr ""
+msgstr "IP-адреÑи"
msgid "IPv4"
msgstr "IPv4"
@@ -206,7 +229,7 @@ msgid "Input"
msgstr "Вхідний"
msgid "Inter-Zone Forwarding"
-msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ€Ñ–Ð·ÑŒ зони"
+msgstr "ПереÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ зонами"
msgid "Internal IP address"
msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ IP-адреÑа"
@@ -221,10 +244,10 @@ msgid "Limit log messages"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ журналу"
msgid "MAC"
-msgstr ""
+msgstr "MAC-адреÑа"
msgid "MACs"
-msgstr ""
+msgstr "MAC-адреÑи"
msgid "MSS clamping"
msgstr "ЗатиÑÐºÐ°Ð½Ð½Ñ MSS"
@@ -240,8 +263,8 @@ msgstr "ЗіÑтавлÑти ICMP типу"
msgid "Match forwarded traffic to the given destination port or port range."
msgstr ""
-"ЗіÑтавлÑти трафік, що ÑпрÑмовуєтьÑÑ Ð½Ð° заданий порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ діапазон "
-"портів."
+"ЗіÑтавлÑти трафік, що переÑпрÑмовуєтьÑÑ Ð½Ð° заданий порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ "
+"діапазон портів."
msgid ""
"Match incoming traffic directed at the given destination port or port range "
@@ -258,10 +281,10 @@ msgstr ""
"діапазоні портів вузла клієнта."
msgid "Monday"
-msgstr ""
+msgstr "Понеділок"
msgid "Month Days"
-msgstr ""
+msgstr "Дні міÑÑцÑ"
msgid "Name"
msgstr "Ім'Ñ"
@@ -270,13 +293,13 @@ msgid "New SNAT rule"
msgstr "Ðове правило SNAT"
msgid "New forward rule"
-msgstr "Ðове правило ÑпрÑмовуваннÑ"
+msgstr "Ðове правило переÑпрÑмовуваннÑ"
msgid "New input rule"
msgstr "Ðове вхідне правило"
msgid "New port forward"
-msgstr "Ðове ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ"
+msgstr "Ðове переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ"
msgid "New source NAT"
msgstr "Ðовий NAT джерела"
@@ -306,18 +329,21 @@ msgstr "Інше..."
msgid "Output"
msgstr "Вихідний"
+msgid "Output zone"
+msgstr "Вихідна зона"
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
"Передача додаткових аргументів Ð´Ð»Ñ IPTables. ВикориÑтовуйте з обережніÑÑ‚ÑŽ!"
msgid "Port Forwards"
-msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
+msgstr "ПереÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
msgid ""
"Port forwarding allows remote computers on the Internet to connect to a "
"specific computer or service within the private LAN."
msgstr ""
-"СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð² дозволÑÑ” віддаленим комп'ютерам з Інтернету "
+"ПереÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð² дозволÑÑ” віддаленим комп'ютерам з Інтернету "
"підключатиÑÑ Ð´Ð¾ певного комп'ютера або Ñлужби у приватній мережі."
msgid "Protocol"
@@ -332,19 +358,25 @@ msgid "Redirect matched incoming traffic to the specified internal host"
msgstr "ПереÑпрÑмувати відповідний вхідний трафік на заданий внутрішній вузол"
msgid "Refuse forward"
-msgstr ""
+msgstr "ВідхилÑти переÑпрÑмовуваннÑ"
msgid "Refuse input"
-msgstr ""
+msgstr "ВідхилÑти вхідний"
+
+msgid "Refuse output"
+msgstr "ВідхилÑти вихідний"
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr "Ðеобхідна апаратна підтримка NAT. Впроваджено принаймні Ð´Ð»Ñ mt7621"
msgid "Restart Firewall"
-msgstr ""
+msgstr "Перезавантажити брандмауер"
msgid "Restrict Masquerading to given destination subnets"
msgstr "Обмежити підміну заданими підмережами призначеннÑ"
msgid "Restrict Masquerading to given source subnets"
-msgstr "Обмежити підміну заданими вихідними підмережами"
+msgstr "Обмежити підміну заданими підмережами джерела"
msgid "Restrict to address family"
msgstr "Обмежити ÑімейÑтво протоколів"
@@ -360,16 +392,19 @@ msgstr ""
"порожнім, щоб перепиÑувати тільки IP-адреÑу."
msgid "Rewrite to source %s"
-msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° вихідний %s"
+msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° джерело %s"
msgid "Rewrite to source %s, %s"
-msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° вихідний %s, %s"
+msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° джерело %s, %s"
+
+msgid "Routing/NAT Offloading"
+msgstr "Ð Ð¾Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ—/NAT"
msgid "Rule is disabled"
-msgstr ""
+msgstr "Правило вимкнено"
msgid "Rule is enabled"
-msgstr ""
+msgstr "Правило ввімкнено"
msgid "SNAT IP address"
msgstr "IP-адреÑа SNAT"
@@ -378,7 +413,13 @@ msgid "SNAT port"
msgstr "Порт SNAT"
msgid "Saturday"
-msgstr ""
+msgstr "Субота"
+
+msgid "Software based offloading for routing/NAT"
+msgstr "Програмне Ñ€Ð¾Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ—/NAT"
+
+msgid "Software flow offloading"
+msgstr "Програмне Ñ€Ð¾Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ"
msgid "Source IP address"
msgstr "IP-адреÑа джерела"
@@ -405,22 +446,22 @@ msgid "Source port"
msgstr "Порт джерела"
msgid "Source zone"
-msgstr "Зона-джерело"
+msgstr "Зона джерела"
msgid "Start Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "Дата початку (рррр-мм-дд)"
msgid "Start Time (hh:mm:ss)"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ (гг:Ñ…Ñ…:ÑÑ)"
msgid "Stop Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "Дата зупинки (рррр-мм-дд)"
msgid "Stop Time (hh:mm:ss)"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ¸ (гг:Ñ…Ñ…:ÑÑ)"
msgid "Sunday"
-msgstr ""
+msgstr "ÐеділÑ"
msgid ""
"The firewall creates zones over your network interfaces to control network "
@@ -437,19 +478,21 @@ msgid ""
"rule is <em>unidirectional</em>, e.g. a forward from lan to wan does "
"<em>not</em> imply a permission to forward from wan to lan as well."
msgstr ""
-"Опції, наведені нижче, управлÑÑŽÑ‚ÑŒ політиками ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ цією (%s) та "
-"іншими зонами. <em>Зони призначеннÑ</em> покриваютьÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÐ¾Ð¼, що "
-"<strong>виходить з %q</strong>. <em>Зони-джерела</em> покриваютьÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÐ¾Ð¼ "
-"з інших зон, <strong>ÑпрÑмованим на %q</strong>. Правила ÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ” "
-"<em>одноÑпрÑмованим</em>, тобто, ÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ LAN до WAN <em>не</em> "
-"означає, що Ñ” також дозвіл ÑпрÑмовувати від WAN в LAN."
+"Опції, наведені нижче, керують політиками переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ цією (%s) та "
+"іншими зонами. <em>Зони призначеннÑ</em> покриваютьÑÑ Ð¿ÐµÑ€ÐµÑпрÑмованим "
+"трафіком, що <strong>виходить з %q</strong>. <em>Зони джерела</em> "
+"покриваютьÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÐ¾Ð¼ з інших зон, <strong>переÑпрÑмованим на %q</strong>. "
+"Правило переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ” <em>одноÑпрÑмованим</em>, тобто, ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ "
+"від LAN до WAN <em>не</em> означає, що Ñ” також дозвіл ÑпрÑмовувати від WAN "
+"до LAN."
msgid ""
"This page allows you to change advanced properties of the port forwarding "
"entry. In most cases there is no need to modify those settings."
msgstr ""
-"Ðа цій Ñторінці можна змінити додаткові влаÑтивоÑÑ‚Ñ– елемента ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ "
-"портів. У більшоÑÑ‚Ñ– випадків змінювати ці параметри немає необхідноÑÑ‚Ñ–."
+"Ðа цій Ñторінці можна змінити додаткові влаÑтивоÑÑ‚Ñ– елемента "
+"переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð². У більшоÑÑ‚Ñ– випадків змінювати ці параметри немає "
+"потреби."
msgid ""
"This page allows you to change advanced properties of the traffic rule "
@@ -458,7 +501,6 @@ msgstr ""
"Ðа цій Ñторінці можна змінити додаткові влаÑтивоÑÑ‚Ñ– елемента правил трафіка, "
"таких Ñк відповідні параметри джерела та вузлів призначеннÑ."
-#, fuzzy
msgid ""
"This section defines common properties of %q. The <em>input</em> and "
"<em>output</em> options set the default policies for traffic entering and "
@@ -468,15 +510,15 @@ msgid ""
msgstr ""
"Цей розділ визначає загальні влаÑтивоÑÑ‚Ñ– %q. Параметри <em>вхідний</em> Ñ– "
"<em>вихідний</em> задають типову політику Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÑƒ на вході й виході з "
-"цієї зони, а параметр \"ÑпрÑмовуваннÑ\" опиÑує політику ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ "
-"трафіку між різними мережами в межах зони. Пункт <em>вкриті мережі</em> "
+"цієї зони, а параметр \"переÑпрÑмовуваннÑ\" опиÑує політику ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ "
+"трафіку між різними мережами в межах зони. Пункт <em>Покриті мережі</em> "
"визначає, Ñкі доÑтупні мережі Ñ” членами цієї зони."
msgid "Thursday"
-msgstr ""
+msgstr "Четвер"
msgid "Time in UTC"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð² UTC"
msgid "To %s at %s on <var>this device</var>"
msgstr "%s на %s <var>цього приÑтрою</var>"
@@ -509,6 +551,15 @@ msgstr ""
"порти WAN на маршрутизаторі."
msgid "Tuesday"
+msgstr "Вівторок"
+
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
msgstr ""
msgid "Via %s"
@@ -518,10 +569,10 @@ msgid "Via %s at %s"
msgstr "Через %s на %s"
msgid "Wednesday"
-msgstr ""
+msgstr "Середа"
msgid "Week Days"
-msgstr ""
+msgstr "Дні тижнÑ"
msgid ""
"You may specify multiple by selecting \"-- custom --\" and then entering "
@@ -534,7 +585,7 @@ msgid "Zone %q"
msgstr "Зона %q"
msgid "Zone ⇒ Forwardings"
-msgstr "Зона ⇒ СпрÑмовуваннÑ"
+msgstr "Зона ⇒ ПереÑпрÑмовуваннÑ"
msgid "Zones"
msgstr "Зони"
@@ -555,7 +606,7 @@ msgid "any zone"
msgstr "будь-Ñкій зоні"
msgid "day"
-msgstr ""
+msgstr "день"
msgid "don't track"
msgstr "не відÑтеж."
@@ -564,31 +615,31 @@ msgid "drop"
msgstr "опуÑкати"
msgid "hour"
-msgstr ""
+msgstr "година"
msgid "minute"
-msgstr ""
+msgstr "хвилина"
msgid "not"
-msgstr ""
+msgstr "не"
msgid "port"
-msgstr ""
+msgstr "порт"
msgid "ports"
-msgstr ""
+msgstr "порти"
msgid "reject"
msgstr "відкидати"
msgid "second"
-msgstr ""
+msgstr "Ñекунда"
msgid "traffic"
-msgstr ""
+msgstr "трафік"
msgid "type"
-msgstr ""
+msgstr "типом"
msgid "types"
-msgstr ""
+msgstr "типами"
diff --git a/applications/luci-app-firewall/po/vi/firewall.po b/applications/luci-app-firewall/po/vi/firewall.po
index 24452ff1c0..5a28e35c8f 100644
--- a/applications/luci-app-firewall/po/vi/firewall.po
+++ b/applications/luci-app-firewall/po/vi/firewall.po
@@ -46,6 +46,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "Action"
@@ -101,6 +104,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr ""
@@ -110,6 +116,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "BỠqua nhưng gói không hợp lý"
@@ -126,6 +135,9 @@ msgstr "SYN-flood bảo vệ "
msgid "Enable logging on this zone"
msgstr ""
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr ""
@@ -174,9 +186,21 @@ msgstr ""
msgid "From %s in %s with source %s and %s"
msgstr ""
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr ""
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -300,6 +324,9 @@ msgstr ""
msgid "Output"
msgstr "Output"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
@@ -327,6 +354,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr ""
@@ -353,6 +386,9 @@ msgstr ""
msgid "Rewrite to source %s, %s"
msgstr ""
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -368,6 +404,12 @@ msgstr ""
msgid "Saturday"
msgstr ""
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
#, fuzzy
msgid "Source IP address"
msgstr "Äỉa chỉ MAC nguồn"
@@ -480,6 +522,15 @@ msgstr ""
msgid "Tuesday"
msgstr ""
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr ""
diff --git a/applications/luci-app-firewall/po/zh-cn/firewall.po b/applications/luci-app-firewall/po/zh-cn/firewall.po
index 9e9c64d670..bd3ad4e80d 100644
--- a/applications/luci-app-firewall/po/zh-cn/firewall.po
+++ b/applications/luci-app-firewall/po/zh-cn/firewall.po
@@ -44,6 +44,9 @@ msgstr "接å—转å‘"
msgid "Accept input"
msgstr "接å—入站"
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "动作"
@@ -100,6 +103,9 @@ msgstr "丢弃转å‘"
msgid "Discard input"
msgstr "丢弃入站"
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "ä¸é‡å†™"
@@ -109,6 +115,9 @@ msgstr "ä¸è·Ÿè¸ªè½¬å‘"
msgid "Do not track input"
msgstr "ä¸è·Ÿè¸ªå…¥ç«™"
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "丢弃无效数æ®åŒ…"
@@ -124,6 +133,9 @@ msgstr "å¯ç”¨ SYN-flood 防御"
msgid "Enable logging on this zone"
msgstr "å¯ç”¨æ­¤åŒºåŸŸçš„日志记录"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr "实验特性。与 QoS/SQM ä¸å®Œå…¨å…¼å®¹ã€‚"
+
msgid "External IP address"
msgstr "外部 IP 地å€"
@@ -172,9 +184,21 @@ msgstr "æ¥è‡ª %s ä½äºŽ %s æºäºŽ %s"
msgid "From %s in %s with source %s and %s"
msgstr "æ¥è‡ª %s ä½äºŽ %s æºç«¯å£ %s æº MAC %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "基本设置"
+msgid "Hardware flow offloading"
+msgstr "硬件æµé‡åˆ†è½½"
+
msgid "IP"
msgstr "IP"
@@ -295,6 +319,9 @@ msgstr "其它..."
msgid "Output"
msgstr "出站数æ®"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "传递到 iptables çš„é¢å¤–å‚数。å°å¿ƒä½¿ç”¨ï¼"
@@ -323,6 +350,12 @@ msgstr "æ‹’ç»è½¬å‘"
msgid "Refuse input"
msgstr "æ‹’ç»å…¥ç«™"
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr "需è¦ç¡¬ä»¶ NAT 支æŒã€‚ç›®å‰ mt7621 已实现"
+
msgid "Restart Firewall"
msgstr "é‡å¯é˜²ç«å¢™"
@@ -349,6 +382,9 @@ msgstr "æºåœ°å€æ”¹å†™æˆ %s"
msgid "Rewrite to source %s, %s"
msgstr "æºåœ°å€æ”¹å†™æˆ %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr "Routing/NAT 分载"
+
msgid "Rule is disabled"
msgstr "规则已ç¦ç”¨"
@@ -364,6 +400,12 @@ msgstr "SNAT 端å£"
msgid "Saturday"
msgstr "星期六"
+msgid "Software based offloading for routing/NAT"
+msgstr "基于软件的 Routing/NAT 分载"
+
+msgid "Software flow offloading"
+msgstr "软件æµé‡åˆ†è½½"
+
msgid "Source IP address"
msgstr "æº IP 地å€"
@@ -482,6 +524,15 @@ msgstr ""
msgid "Tuesday"
msgstr "星期二"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "通过 %s"
diff --git a/applications/luci-app-firewall/po/zh-tw/firewall.po b/applications/luci-app-firewall/po/zh-tw/firewall.po
index afc9c4e33c..ea7901ae8c 100644
--- a/applications/luci-app-firewall/po/zh-tw/firewall.po
+++ b/applications/luci-app-firewall/po/zh-tw/firewall.po
@@ -44,6 +44,9 @@ msgstr ""
msgid "Accept input"
msgstr ""
+msgid "Accept output"
+msgstr ""
+
msgid "Action"
msgstr "動作"
@@ -100,6 +103,9 @@ msgstr ""
msgid "Discard input"
msgstr ""
+msgid "Discard output"
+msgstr ""
+
msgid "Do not rewrite"
msgstr "ä¸é‡å¯«"
@@ -109,6 +115,9 @@ msgstr ""
msgid "Do not track input"
msgstr ""
+msgid "Do not track output"
+msgstr ""
+
msgid "Drop invalid packets"
msgstr "丟棄無效資料包"
@@ -124,6 +133,9 @@ msgstr "啟用 SYN-flood 防禦"
msgid "Enable logging on this zone"
msgstr "啟用此å€åŸŸçš„日誌記錄"
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
msgid "External IP address"
msgstr "外部 IP ä½å€"
@@ -172,9 +184,21 @@ msgstr "來自 %s ä½æ–¼ %s æºæ–¼ %s"
msgid "From %s in %s with source %s and %s"
msgstr "來自 %s ä½æ–¼ %s æºåŸ  %s æº MAC %s"
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
msgid "General Settings"
msgstr "基本設定"
+msgid "Hardware flow offloading"
+msgstr ""
+
msgid "IP"
msgstr ""
@@ -295,6 +319,9 @@ msgstr "其它..."
msgid "Output"
msgstr "出站資料"
+msgid "Output zone"
+msgstr ""
+
msgid "Passes additional arguments to iptables. Use with care!"
msgstr "傳éžåˆ° iptables çš„é¡å¤–引數。å°å¿ƒä½¿ç”¨ï¼"
@@ -322,6 +349,12 @@ msgstr ""
msgid "Refuse input"
msgstr ""
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
msgid "Restart Firewall"
msgstr "é‡å•Ÿé˜²ç«ç‰†"
@@ -348,6 +381,9 @@ msgstr "æºä½å€æ”¹å¯«æˆ %s"
msgid "Rewrite to source %s, %s"
msgstr "æºä½å€æ”¹å¯«æˆ %s, %s"
+msgid "Routing/NAT Offloading"
+msgstr ""
+
msgid "Rule is disabled"
msgstr ""
@@ -363,6 +399,12 @@ msgstr "SNAT 埠"
msgid "Saturday"
msgstr "星期六"
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
msgid "Source IP address"
msgstr "æº IP ä½å€"
@@ -481,6 +523,15 @@ msgstr ""
msgid "Tuesday"
msgstr "星期二"
+msgid "Unnamed SNAT"
+msgstr ""
+
+msgid "Unnamed forward"
+msgstr ""
+
+msgid "Unnamed rule"
+msgstr ""
+
msgid "Via %s"
msgstr "é€šéŽ %s"
diff --git a/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm b/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
index d861ef9fcb..2fd7168bd2 100644
--- a/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
+++ b/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
@@ -5,13 +5,12 @@ XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
var tb = document.getElementById('telephony_status_table');
if (st && tb)
{
- tb.deleteRow(1);
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-1';
-
- tr.insertCell(-1).innerHTML = st.status;
- tr.insertCell(-1).innerHTML = st.line1;
- tr.insertCell(-1).innerHTML = st.line2;
+ tb.removeChild(tb.firstChild);
+ tb.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-1">', [
+ E('<div class="td">', st.status),
+ E('<div class="td">', st.line1),
+ E('<div class="td">', st.line2)
+ ]));
}
}
);
@@ -19,14 +18,14 @@ XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
<fieldset class="cbi-section">
<legend><%:Current Telephony State%></legend>
- <table class="cbi-section-table" id="telephony_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Uplink%></th>
- <th class="cbi-section-table-cell"><%:Port1%></th>
- <th class="cbi-section-table-cell"><%:Port2%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="5"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
+ <div class="table cbi-section-table" id="telephony_status_table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Uplink%></div>
+ <div class="th cbi-section-table-cell"><%:Port1%></div>
+ <div class="th cbi-section-table-cell"><%:Port2%></div>
+ </div>
+ <div class="tr cbi-section-table-row">
+ <div class="td" colspan="5"><em><br /><%:Collecting data...%></em></div>
+ </div>
+ </div>
</fieldset>
diff --git a/applications/luci-app-mwan3/po/ja/mwan3.po b/applications/luci-app-mwan3/po/ja/mwan3.po
index 6ee351c4c2..a5826926dd 100644
--- a/applications/luci-app-mwan3/po/ja/mwan3.po
+++ b/applications/luci-app-mwan3/po/ja/mwan3.po
@@ -7,7 +7,7 @@ msgstr ""
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.3\n"
+"X-Generator: Poedit 2.0.7\n"
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ja\n"
@@ -43,6 +43,9 @@ msgstr "利用å¯èƒ½ãªå€¤: 1-256。空欄ã®å ´åˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã¯1ã§ã™ã
msgid "Check IP rules"
msgstr "IP ルールã®ãƒã‚§ãƒƒã‚¯"
+msgid "Check link quality"
+msgstr "リンクå“質ã®ãƒã‚§ãƒƒã‚¯"
+
msgid "Check routing table"
msgstr "ルーティング テーブルã®ãƒã‚§ãƒƒã‚¯"
@@ -56,7 +59,7 @@ msgid "Destination port"
msgstr "宛先ãƒãƒ¼ãƒˆ"
msgid "Detail"
-msgstr ""
+msgstr "詳細"
msgid "Diagnostics"
msgstr "診断機能"
@@ -77,7 +80,7 @@ msgid "Enter value in hex, starting with <code>0x</code>"
msgstr "<code>0x</code> ã§å§‹ã¾ã‚‹16進数ã®å€¤ã‚’入力ã—ã¦ãã ã•ã„。"
msgid "Execute"
-msgstr ""
+msgstr "実行"
msgid "Expect interface state on up event"
msgstr "Up イベント時ã«äºˆæƒ³ã•ã‚Œã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®çŠ¶æ…‹ã§ã™ã€‚"
@@ -89,10 +92,12 @@ msgid "Firewall mask"
msgstr "ファイアウォール マスク"
msgid "Flush conntrack table"
-msgstr ""
+msgstr "conntrack テーブルã®ã‚¯ãƒªã‚¢"
msgid "Flush global firewall conntrack table on interface events"
msgstr ""
+"インターフェース イベント時ã«ã‚°ãƒ­ãƒ¼ãƒãƒ« ファイアウォール conntrack テーブルを"
+"クリアã—ã¾ã™ã€‚"
msgid "Globals"
msgstr "全般"
@@ -104,7 +109,7 @@ msgid "Hotplug ifup"
msgstr "ホットプラグ ifup"
msgid "INFO: MWAN not running"
-msgstr ""
+msgstr "情報: MWAN ã¯å®Ÿè¡Œã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "IPset"
msgstr "IPset"
@@ -157,28 +162,28 @@ msgid "Local source interface"
msgstr ""
msgid "MWAN - Globals"
-msgstr ""
+msgstr "MWAN - グローãƒãƒ«"
msgid "MWAN - Interfaces"
-msgstr ""
+msgstr "MWAN - インターフェース"
msgid "MWAN - Members"
-msgstr ""
+msgstr "MWAN - メンãƒãƒ¼"
msgid "MWAN - Notification"
-msgstr ""
+msgstr "MWAN - 通知"
msgid "MWAN - Policies"
-msgstr ""
+msgstr "MWAN - ãƒãƒªã‚·ãƒ¼"
msgid "MWAN - Rules"
-msgstr ""
+msgstr "MWAN - ルール"
msgid "MWAN Interface Configuration - %s"
msgstr "MWAN インターフェース設定 - %s"
msgid "MWAN Interfaces"
-msgstr ""
+msgstr "MWAN インターフェース"
msgid "MWAN Member Configuration - %s"
msgstr "MWAN メンãƒãƒ¼è¨­å®š - %s"
@@ -190,13 +195,13 @@ msgid "MWAN Rule Configuration - %s"
msgstr "MWAN ルール設定 - %s"
msgid "MWAN Status - Detail"
-msgstr ""
+msgstr "MWAN ステータス - 詳細"
msgid "MWAN Status - Diagnostics"
-msgstr ""
+msgstr "MWAN ステータス - 診断"
msgid "MWAN Status - Troubleshooting"
-msgstr ""
+msgstr "MWAN ステータス - トラブルシューティング"
msgid ""
"MWAN supports up to 252 physical and/or logical interfaces<br />MWAN "
@@ -214,6 +219,12 @@ msgstr ""
"スã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。<br />インターフェースã«ã¯ã€è¨­å®šæ¸ˆã¿ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚„ãƒãƒª"
"シーã€ãƒ«ãƒ¼ãƒ«ã¨åŒã˜åå‰ã‚’使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+msgid "Max packet latency [ms]"
+msgstr "最大パケットレイテンシ [ms]"
+
+msgid "Max packet loss [%]"
+msgstr "最大パケットロス [%]"
+
msgid ""
"May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
"as a portrange (eg \"1024:2048\") without quotes"
@@ -246,6 +257,12 @@ msgstr "アサイン済ã¿ãƒ¡ãƒ³ãƒãƒ¼"
msgid "Metric"
msgstr "メトリック"
+msgid "Min packet latency [ms]"
+msgstr "最å°ãƒ‘ケットレイテンシ [ms]"
+
+msgid "Min packet loss [%]"
+msgstr "最å°ãƒ‘ケットロス [%]"
+
msgid ""
"Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
"youtube.com/youtube\")"
@@ -260,7 +277,7 @@ msgid "No MWAN interfaces found"
msgstr "MWAN インターフェースãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Notification"
-msgstr ""
+msgstr "通知"
msgid "Offline"
msgstr "オフライン"
@@ -342,6 +359,16 @@ msgid ""
"z, 0-9, _ and no spaces<br />Rules may not share the same name as configured "
"interfaces, members or policies"
msgstr ""
+"ルールã¯ã€ã©ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒç‰¹å®šã® MWAN ãƒãƒªã‚·ãƒ¼ã‚’使用ã™ã‚‹ã‹ã‚’指定ã—ã¾ã™<br /"
+">ルール㯠IP アドレスやãƒãƒ¼ãƒˆã€ãƒ—ロトコルã«åŸºã¥ã„ã¦ã„ã¾ã™<br />ルールã¯ä¸Šã‹ã‚‰"
+"下ã¸ãƒžãƒƒãƒãƒ³ã‚°ãŒè¡Œã‚ã‚Œã¾ã™<br />åˆè‡´ã—ãŸãƒ«ãƒ¼ãƒ«ã‚ˆã‚Šä¸‹ã®ãƒ«ãƒ¼ãƒ«ã¯ç„¡è¦–ã•ã‚Œã¾ã™"
+"<br />ã„ãšã‚Œã®ãƒ«ãƒ¼ãƒ«ã«ã‚‚マッãƒã—ãªã„トラフィックã¯ã€ãƒ¡ã‚¤ãƒ³ã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼"
+"ブルを使用ã—ã¦ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã•ã‚Œã¾ã™<br />既知(デフォルト以外)ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
+"ã¸ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã¯ã€ãƒ¡ã‚¤ãƒ³ã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ†ãƒ¼ãƒ–ルã«ã‚ˆã£ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™<br />ト"
+"ラフィックãŒãƒ«ãƒ¼ãƒ«ã«åˆè‡´ã—ã¦ã‚‚ã€å…¨ WAN インターフェース㌠down ã®å ´åˆã¯ "
+"blackhole 状態ã¨ãªã‚Šã¾ã™<br />åå‰ã¯ A-Z, a-z, 0-9, _ ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™"
+"ãŒã€ã‚¹ãƒšãƒ¼ã‚¹ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“<br />ルールã¯ã€è¨­å®šæ¸ˆã¿ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚„メン"
+"ãƒãƒ¼ã€ãƒãƒªã‚·ãƒ¼ã¨åŒã˜åå‰ã‚’使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"
msgstr "秒。利用å¯èƒ½ãªå€¤: 1-1000000。空欄ã®å ´åˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã¯600ã§ã™ã€‚"
@@ -362,7 +389,7 @@ msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"
msgstr "CIDR 表記ã®ã‚µãƒãƒ¼ãƒˆï¼ˆä¾‹: \"192.168.100.0/24\")"
msgid "Task"
-msgstr ""
+msgstr "タスク"
msgid "There are currently %d of %d supported interfaces configured"
msgstr "ç¾åœ¨ã€%d 個中 %d 個ã®ã‚µãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãŒè¨­å®šæ¸ˆã¿ã§ã™ã€‚"
@@ -397,6 +424,21 @@ msgid ""
"Physical device name which interface went up or down (e.g. \"eth0\" or "
"\"wwan0\")<br /><br />"
msgstr ""
+"ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ \"/etc/mwan3.user\" ã®å†…容を変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+"<br />ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚‚ sysupgrade ã®éš›ã«ä¿æŒã•ã‚Œã¾ã™ã€‚<br /><br />注æ„: <br />"
+"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トã¨ã—ã¦è§£é‡ˆã•ã‚Œã¾ã™ã€‚<br />最åˆã®è¡Œã¯ &#34;#!/"
+"bin/sh&#34; ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆã‚¯ã‚©ãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ä¸è¦ï¼‰ã€‚<br /># ã§å§‹ã¾ã‚‹è¡Œ"
+"ã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã‚ã‚Šã€å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。<br />mwan3 ã®ã‚«ã‚¹ã‚¿ãƒ å‹•ä½œã‚’ã“ã“ã«å…¥åŠ›ã—ã¦"
+"ãã ã•ã„。<br />ã“れらã¯ã€mwan3 ã§æœ‰åŠ¹ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®<br /> netifd "
+"hotplug インターフェース イベント毎ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚<br /><br />ã“ã®ã‚¹ã‚¯ãƒªãƒ—ト"
+"ã«å—ã‘渡ã•ã‚Œã‚‹ä¸»ã«ï¼“ã¤ã®ç’°å¢ƒå¤‰æ•°ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚<br /><br />$ACTION<br />* "
+"\"ifup\" 㯠netifd 㨠mwan3track ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•ã‚Œã¾ã™<br />* \"ifdown\" 㯠"
+"netifd 㨠mwan3track ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•ã‚Œã¾ã™<br />* \"connected\" ã¯ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°"
+"ãŒæˆåŠŸã—ãŸéš›ã« mwan3track ã«ã®ã¿ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•ã‚Œã¾ã™<br />* \"disconnected\" "
+"㯠トラッキングãŒå¤±æ•—ã—ãŸéš›ã« mwan3track ã®ã¿ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•ã‚Œã¾ã™<br />"
+"$INTERFACE up ã¾ãŸã¯ down ã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹å(例: \"wan\" ã‚„ \"wwan\")"
+"<br />$DEVICE up ã¾ãŸã¯ down ã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ç‰©ç†ãƒ‡ãƒã‚¤ã‚¹å(例: "
+"\"eth0\" や \"wwan0\")<br /><br />"
msgid "Tracking hostname or IP address"
msgstr "追跡ホストåã¾ãŸã¯ IP アドレス"
@@ -426,36 +468,42 @@ msgstr ""
"インターフェース㮠IP アドレスãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
msgid "View the content of /etc/protocols for protocol description"
-msgstr ""
+msgstr "プロトコルã®èª¬æ˜Žã«ã¤ã„ã¦ã¯ã€ /etc/protocols ã®å†…容を確èªã—ã¦ãã ã•ã„"
msgid "WARNING: %d interfaces are configured exceeding the maximum of %d!"
msgstr ""
"警告: %d 個ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãŒã€æœ€å¤§å€‹æ•°ã® %d 個 を超ãˆã¦è¨­å®šã•ã‚Œã¦ã„ã¾ã™ï¼"
msgid "WARNING: Interface %s are not found in /etc/config/network"
-msgstr ""
+msgstr "警告: インターフェース %s ㌠/etc/config/network ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "WARNING: Interface %s has a duplicate metric %s configured"
-msgstr ""
+msgstr "警告: インターフェース %s ã«é‡è¤‡ã™ã‚‹ãƒ¡ãƒˆãƒªãƒƒã‚¯ %s ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™"
msgid ""
"WARNING: Interface %s has a higher reliability requirement than tracking "
"hosts (%d)"
msgstr ""
+"警告: インターフェース %s ã¯è¿½è·¡ãƒ›ã‚¹ãƒˆæ•° (%d) よりも高ã„追跡信頼性ã®å€¤ãŒè¨­å®š"
+"ã•ã‚Œã¦ã„ã¾ã™"
msgid "WARNING: Interface %s has no default route in the main routing table"
msgstr ""
+"警告: インターフェース %s ã¯ãƒ¡ã‚¤ãƒ³ã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚° テーブル内ã§ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ«ãƒ¼ãƒˆ"
+"ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "WARNING: Policy %s has exceeding the maximum name of 15 characters"
-msgstr ""
+msgstr "警告: ãƒãƒªã‚·ãƒ¼ %s ã®åå‰ã¯15文字ã®æœ€å¤§æ–‡å­—数を超ãˆã¦ã„ã¾ã™"
msgid ""
"WARNING: Rule %s have a port configured with no or improper protocol "
"specified!"
msgstr ""
+"警告: ルール %s ã¯ãƒ—ロトコル指定ãŒä¸é©åˆ‡ã€ã¾ãŸã¯ç„¡ã„ãƒãƒ¼ãƒˆãŒè¨­å®šã•ã‚Œã¦ã„ã¾"
+"ã™ï¼"
msgid "Waiting for command to complete..."
-msgstr ""
+msgstr "コマンドを実行中ã§ã™..."
msgid "Weight"
msgstr "ウエイト"
@@ -489,289 +537,3 @@ msgstr "never"
msgid "unreachable (reject)"
msgstr "unreachable (reject)"
-
-#~ msgid "Online (tracking active)"
-#~ msgstr "オンライン(追跡実行中)"
-
-#~ msgid "MWAN Interface Live Status"
-#~ msgstr "MWAN インターフェース Live ステータス"
-
-#~ msgid "Online (tracking off)"
-#~ msgstr "オンライン(追跡オフ)"
-
-#~ msgid ""
-#~ "This section allows you to modify the content of \"/etc/mwan3.user\".<br /"
-#~ ">The file is also preserved during sysupgrade.<br /><br />Notes:<br /"
-#~ ">This file is interpreted as a shell script.<br />The first line of the "
-#~ "script must be &#34;#!/bin/sh&#34; without quotes.<br />Lines beginning "
-#~ "with # are comments and are not executed.<br />Put your custom mwan3 "
-#~ "action here, they will<br />be executed with each netifd hotplug "
-#~ "interface event<br />on interfaces for which mwan3 is enabled.<br /><br /"
-#~ ">There are three main environment variables that are passed to this "
-#~ "script.<br /><br />$ACTION Either \"ifup\" or \"ifdown\"<br />$INTERFACE "
-#~ "Name of the interface which went up or down (e.g. \"wan\" or \"wwan"
-#~ "\")<br />$DEVICE Physical device name which interface went up or down (e."
-#~ "g. \"eth0\" or \"wwan0\")<br /><br />"
-#~ msgstr ""
-#~ "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ \"/etc/mwan3.user\" ã®å†…容を変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-#~ "<br />ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ sysupgrade 時ã«ä¿æŒã•ã‚Œã¾ã™ã€‚<br /><br />注æ„: "
-#~ "<br />ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トã¨ã—ã¦è§£é‡ˆã•ã‚Œã¾ã™ã€‚<br />スクリプト"
-#~ "ã®1行目ã¯ã€&#34;#!bin/sh&#34; ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆã‚¯ã‚©ãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ä¸"
-#~ "è¦ï¼‰ã€‚<br /># ã§å§‹ã¾ã‚‹è¡Œã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã‚ã‚Šã€å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。<br />mwan3 ã®ã‚«"
-#~ "スタム動作をã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。ã“れらã¯ã€ mwan3 ãŒæœ‰åŠ¹ãªã‚¤ãƒ³ã‚¿ãƒ¼"
-#~ "フェースã®<br />netifd ホットプラグ インターフェース イベント毎ã«å®Ÿè¡Œã•ã‚Œ"
-#~ "ã¾ã™ã€‚<br /><br />主ã«3ã¤ã®ç’°å¢ƒå¤‰æ•°ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚<br /><br />$ACTION - "
-#~ "\"ifup\" ãŠã‚ˆã³ \"ifdown\"<br />$INTERFACE - Up ã¾ãŸã¯ Down ãŒè¡Œã‚ã‚ŒãŸã‚¤ãƒ³"
-#~ "ターフェースå(例: \"wan\" ã‚„ \"wwan\")<br />$DEVICE - Up ã¾ãŸã¯ Down ãŒ"
-#~ "è¡Œã‚ã‚ŒãŸç‰©ç†ãƒ‡ãƒã‚¤ã‚¹å(例: \"eth0\" ã‚„ \"wwan0\")<br /><br />"
-
-#~ msgid "Currently Configured Interfaces"
-#~ msgstr "設定済ã¿ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹"
-
-#~ msgid "Currently Configured Members"
-#~ msgstr "設定済ã¿ãƒ¡ãƒ³ãƒãƒ¼"
-
-#~ msgid "Currently Configured Policies"
-#~ msgstr "設定済ã¿ãƒãƒªã‚·ãƒ¼"
-
-#~ msgid "Detailed Status"
-#~ msgstr "詳細ステータス"
-
-#~ msgid "Diagnostic Results"
-#~ msgstr "診断çµæžœ"
-
-#~ msgid "Error collecting troubleshooting information"
-#~ msgstr "トラブルシューティング情報ã®åŽé›†ã‚¨ãƒ©ãƒ¼"
-
-#~ msgid "Errors"
-#~ msgstr "エラー"
-
-#~ msgid "Globals mwan3 options"
-#~ msgstr "MWAN3 全般オプション"
-
-#~ msgid "Interface Status"
-#~ msgstr "インターフェース ステータス"
-
-#~ msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
-#~ msgstr "ç›´è¿‘ã® MWAN システムログ(50行)ã§ã™ã€‚一番上ãŒæœ€æ–°ã®è¡Œã§ã™:"
-
-#~ msgid "MWAN Detailed Status"
-#~ msgstr "MWAN 詳細ステータス"
-
-#~ msgid "MWAN Interface Configuration"
-#~ msgstr "MWAN インターフェース設定"
-
-#~ msgid "MWAN Interface Diagnostics"
-#~ msgstr "MWAN インターフェース診断"
-
-#~ msgid "MWAN Interface Systemlog"
-#~ msgstr "MWAN インターフェース システムログ"
-
-#~ msgid "MWAN Member Configuration"
-#~ msgstr "MWAN メンãƒãƒ¼è¨­å®š"
-
-#~ msgid "MWAN Policy Configuration"
-#~ msgstr "MWAN ãƒãƒªã‚·ãƒ¼è¨­å®š"
-
-#~ msgid "MWAN Rule Configuration"
-#~ msgstr "MWAN ルール設定"
-
-#~ msgid "MWAN Service Control"
-#~ msgstr "MWAN サービス コントロール"
-
-#~ msgid "No MWAN systemlog history found"
-#~ msgstr "MWAN システムログã®å±¥æ­´ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-
-#~ msgid "No detailed status information available"
-#~ msgstr "詳細ステータス情報ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“"
-
-#~ msgid "No diagnostic results returned"
-#~ msgstr "診断çµæžœãŒã‚ã‚Šã¾ã›ã‚“"
-
-#~ msgid "No protocol specified"
-#~ msgstr "プロトコルãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-
-#~ msgid "Restart MWAN"
-#~ msgstr "MWAN ã®å†èµ·å‹•"
-
-#~ msgid ""
-#~ "Rules specify which traffic will use a particular MWAN policy based on IP "
-#~ "address, port or protocol<br />Rules are matched from top to bottom. "
-#~ "Rules below a matching rule are ignored. Traffic not matching any rule is "
-#~ "routed using the main routing table<br />Traffic destined for known "
-#~ "(other than default) networks is handled by the main routing table. "
-#~ "Traffic matching a rule, but all WAN interfaces for that policy are down "
-#~ "will be blackholed<br />Names may contain characters A-Z, a-z, 0-9, _ and "
-#~ "no spaces<br />Rules may not share the same name as configured "
-#~ "interfaces, members or policies"
-#~ msgstr ""
-#~ "ルール㯠IP アドレスやãƒãƒ¼ãƒˆã€ãƒ—ロトコルを基ã«ã€ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒã©ã® MWAN ãƒ"
-#~ "リシーを使用ã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚<br />ルールã¯ä¸Šã‹ã‚‰ä¸‹ã¸ãƒžãƒƒãƒãƒ³ã‚°ãŒè¡Œã‚"
-#~ "ã‚Œã€åˆè‡´ã—ãŸãƒ«ãƒ¼ãƒ«ã‚ˆã‚Šä¸‹ã®ãƒ«ãƒ¼ãƒ«ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚å…¨ã¦ã®ãƒ«ãƒ¼ãƒ«ã«åˆè‡´ã—ãªã„ト"
-#~ "ラフィックã¯ã€ãƒ¡ã‚¤ãƒ³ã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚° テーブルを使用ã—ã¦ãƒ«ãƒ¼ãƒˆãŒæ±ºå®šã•ã‚Œã¾"
-#~ "ã™ã€‚<br />既知(デフォルト以外)ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã¯ã€ãƒ¡ã‚¤ãƒ³ã®"
-#~ "ルーティング テーブルã«ã‚ˆã£ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚ルールã«åˆè‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã§"
-#~ "ã‚‚ã€å½“該ãƒãƒªã‚·ãƒ¼ã®å…¨ WAN インターフェース㌠Down 状態ã®å ´åˆã¯ blackhole 状"
-#~ "æ…‹ã¨ãªã‚Šã¾ã™ã€‚<br />åå‰ã¯ A-Z, a-z, 0-9, _ ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ãŒã€ã‚¹ãƒšãƒ¼"
-#~ "スã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。<br />ルールã¯ã€è¨­å®šæ¸ˆã¿ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚„メンãƒãƒ¼ã€"
-#~ "ãƒãƒªã‚·ãƒ¼ã¨åŒã˜åå‰ã‚’使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
-
-#~ msgid "Start MWAN"
-#~ msgstr "MWAN ã®èµ·å‹•"
-
-#~ msgid "Stop MWAN"
-#~ msgstr "MWAN ã®åœæ­¢"
-
-#~ msgid "Tracking IP"
-#~ msgstr "追跡 IP"
-
-#~ msgid "Traffic Rules"
-#~ msgstr "トラフィック ルール"
-
-#~ msgid "Troubleshooting Data"
-#~ msgstr "トラブルシューティング データ"
-
-#~ msgid "View the contents of /etc/protocols for protocol descriptions"
-#~ msgstr ""
-#~ "プロトコルã®èª¬æ˜Žã«ã¤ã„ã¦ã¯ã€ /etc/protocols ã®å†…容を確èªã—ã¦ãã ã•ã„。"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces are configured incorrectly or not at all in /etc/"
-#~ "config/network!"
-#~ msgstr ""
-#~ "警告: 設定を誤ã£ã¦ã„ã‚‹ã‹ã€ã‚‚ã—ãã¯å®Œå…¨ã«è¨­å®šã•ã‚Œã¦ã„ãªã„インターフェースãŒ"
-#~ "ã‚ã‚Šã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have a higher reliability requirement than there "
-#~ "are tracking IP addresses!"
-#~ msgstr ""
-#~ "警告: 追跡 IP アドレスã®å€‹æ•°ã‚ˆã‚Šå¤§ãã„追跡信頼性ã®å€¤ãŒè¨­å®šã•ã‚ŒãŸã‚¤ãƒ³ã‚¿ãƒ¼"
-#~ "フェースãŒã‚ã‚Šã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have duplicate metrics configured in /etc/config/"
-#~ "network!"
-#~ msgstr ""
-#~ "警告: /etc/config/network ã§ã€é‡è¤‡ã™ã‚‹ãƒ¡ãƒˆãƒªãƒƒã‚¯ã‚’設定ã•ã‚Œã¦ã„るインター"
-#~ "フェースãŒã‚ã‚Šã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have no default route in the main routing table!"
-#~ msgstr ""
-#~ "警告: メインã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚° テーブルã§ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ルートを設定ã•ã‚Œã¦ã„ãªã„"
-#~ "インターフェースãŒã‚ã‚Šã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have no metric configured in /etc/config/network!"
-#~ msgstr ""
-#~ "警告: /etc/config/network ã§ã€ãƒ¡ãƒˆãƒªãƒƒã‚¯ã‚’設定ã•ã‚Œã¦ã„ãªã„インターフェース"
-#~ "ãŒã‚ã‚Šã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: Some policies have names exceeding the maximum of 15 characters!"
-#~ msgstr ""
-#~ "警告: 最大文字数㮠15 文字を超ãˆã‚‹åå‰ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹ãƒãƒªã‚·ãƒ¼ãŒã‚ã‚Šã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: Some rules have a port configured with no or improper protocol "
-#~ "specified! Please configure a specific protocol!"
-#~ msgstr ""
-#~ "警告: ä¸é©åˆ‡ãªãƒ—ロトコルãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã€ã¾ãŸã¯ä½•ã‚‚指定ã•ã‚Œã¦ã„ãªã„ãƒãƒ¼ãƒˆ"
-#~ "を設定ã•ã‚ŒãŸãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã™ï¼ãƒ—ロトコルを指定ã—ç›´ã—ã¦ãã ã•ã„ï¼"
-
-#~ msgid ""
-#~ "WARNING: This and other interfaces have duplicate metrics configured in /"
-#~ "etc/config/network!"
-#~ msgstr ""
-#~ "警告: ã“ã‚Œã¨ä»–ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§é‡è¤‡ã™ã‚‹ãƒ¡ãƒˆãƒªãƒƒã‚¯ãŒ /etc/config/"
-#~ "network ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: This interface has a higher reliability requirement than there "
-#~ "are tracking IP addresses!"
-#~ msgstr ""
-#~ "警告: ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¯ã€è¿½è·¡ IP アドレスã®å€‹æ•°ã‚ˆã‚Šå¤§ãã„追跡信頼性ã®"
-#~ "値を設定ã•ã‚Œã¦ã„ã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: This interface has no default route in the main routing table!"
-#~ msgstr ""
-#~ "警告: ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¯ã€ãƒ¡ã‚¤ãƒ³ã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚° テーブルã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ "
-#~ "ルートãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼"
-
-#~ msgid ""
-#~ "WARNING: This interface has no metric configured in /etc/config/network!"
-#~ msgstr ""
-#~ "警告: ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¯ã€ /etc/config/network ã§ãƒ¡ãƒˆãƒªãƒƒã‚¯ãŒè¨­å®šã•ã‚Œ"
-#~ "ã¦ã„ã¾ã›ã‚“ï¼"
-
-#~ msgid ""
-#~ "WARNING: This interface is configured incorrectly or not at all in /etc/"
-#~ "config/network!"
-#~ msgstr ""
-#~ "警告: ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¯ /etc/config/network ã§è¨­å®šãŒèª¤ã£ã¦ã„ã‚‹ã‹ã€ã‚‚"
-#~ "ã—ãã¯å®Œå…¨ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼"
-
-#~ msgid ""
-#~ "WARNING: This policy's name is %d characters exceeding the maximum of 15!"
-#~ msgstr ""
-#~ "警告: ã“ã®ãƒãƒªã‚·ãƒ¼ã®åå‰ã¯ã€æœ€å¤§æ–‡å­—æ•° 15 文字を超ãˆã‚‹ %d 文字ãŒè¨­å®šã•ã‚Œã¦"
-#~ "ã„ã¾ã™ï¼"
-
-#~ msgid ""
-#~ "WARNING: This rule is incorrectly configured with no or improper protocol "
-#~ "specified! Please configure a specific protocol!"
-#~ msgstr ""
-#~ "警告: ã“ã®ãƒ«ãƒ¼ãƒ«ã¯ä¸é©åˆ‡ãªãƒ—ロトコルãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã‹ã€ã¾ãŸã¯ä½•ã‚‚指定ã•ã‚Œ"
-#~ "ã¦ã„ã¾ã›ã‚“ï¼ãƒ—ロトコルを指定ã—ç›´ã—ã¦ãã ã•ã„ï¼"
-
-#~ msgid "Waiting for MWAN to %s..."
-#~ msgstr "MWAN ã® %s ã‚’å¾…ã£ã¦ã„ã¾ã™..."
-
-#~ msgid "Waiting for diagnostic results..."
-#~ msgstr "診断çµæžœã‚’å¾…ã£ã¦ã„ã¾ã™..."
-
-#~ msgid "restart"
-#~ msgstr "å†èµ·å‹•"
-
-#~ msgid "start"
-#~ msgstr "èµ·å‹•"
-
-#~ msgid "stop"
-#~ msgstr "åœæ­¢"
-
-#~ msgid "Advanced"
-#~ msgstr "詳細設定"
-
-#~ msgid "Configuration"
-#~ msgstr "設定"
-
-#~ msgid "Hotplug Script"
-#~ msgstr "ホットプラグ スクリプト"
-
-#~ msgid "MWAN Config"
-#~ msgstr "MWAN 設定"
-
-#~ msgid "Network Config"
-#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®š"
-
-#~ msgid "Overview"
-#~ msgstr "概è¦"
-
-#~ msgid "This section allows you to modify the contents of /etc/config/mwan3"
-#~ msgstr ""
-#~ "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ /etc/config/mwan3 ã®å†…容を変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-
-#~ msgid ""
-#~ "This section allows you to modify the contents of /etc/config/network"
-#~ msgstr ""
-#~ "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ /etc/config/network ã®å†…容を変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-
-#~ msgid ""
-#~ "This section allows you to modify the contents of /etc/config/wireless"
-#~ msgstr ""
-#~ "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ /etc/config/wireless ã®å†…容を変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-
-#~ msgid "Wireless Config"
-#~ msgstr "無線設定"
diff --git a/applications/luci-app-mwan3/po/ru/mwan3.po b/applications/luci-app-mwan3/po/ru/mwan3.po
index 11721ecc57..140c537e73 100644
--- a/applications/luci-app-mwan3/po/ru/mwan3.po
+++ b/applications/luci-app-mwan3/po/ru/mwan3.po
@@ -46,6 +46,9 @@ msgstr "ДопуÑтимые значениÑ: 1-256 По умолчанию 1,
msgid "Check IP rules"
msgstr "Проверить правила IP"
+msgid "Check link quality"
+msgstr ""
+
msgid "Check routing table"
msgstr "Проверить таблицу маршрутизации"
@@ -216,6 +219,12 @@ msgstr ""
"Ñимволы A-Z, a-z, 0-9, _ и пробелы.<br />ИнтерфейÑÑ‹ не могут иметь "
"одинаковые имена Ñ Ð½Ð°Ñтроенными узлами, политиками или правилами."
+msgid "Max packet latency [ms]"
+msgstr ""
+
+msgid "Max packet loss [%]"
+msgstr ""
+
msgid ""
"May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
"as a portrange (eg \"1024:2048\") without quotes"
@@ -247,6 +256,12 @@ msgstr "Ðазначенные узлы"
msgid "Metric"
msgstr "Метрика"
+msgid "Min packet latency [ms]"
+msgstr ""
+
+msgid "Min packet loss [%]"
+msgstr ""
+
msgid ""
"Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
"youtube.com/youtube\")"
diff --git a/applications/luci-app-mwan3/po/templates/mwan3.pot b/applications/luci-app-mwan3/po/templates/mwan3.pot
index f6b3a1b380..bcc5e977a5 100644
--- a/applications/luci-app-mwan3/po/templates/mwan3.pot
+++ b/applications/luci-app-mwan3/po/templates/mwan3.pot
@@ -30,6 +30,9 @@ msgstr ""
msgid "Check IP rules"
msgstr ""
+msgid "Check link quality"
+msgstr ""
+
msgid "Check routing table"
msgstr ""
@@ -190,6 +193,12 @@ msgid ""
"rules"
msgstr ""
+msgid "Max packet latency [ms]"
+msgstr ""
+
+msgid "Max packet loss [%]"
+msgstr ""
+
msgid ""
"May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
"as a portrange (eg \"1024:2048\") without quotes"
@@ -216,6 +225,12 @@ msgstr ""
msgid "Metric"
msgstr ""
+msgid "Min packet latency [ms]"
+msgstr ""
+
+msgid "Min packet loss [%]"
+msgstr ""
+
msgid ""
"Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
"youtube.com/youtube\")"
diff --git a/applications/luci-app-mwan3/po/zh-cn/mwan3.po b/applications/luci-app-mwan3/po/zh-cn/mwan3.po
index ef59339862..e730004d97 100644
--- a/applications/luci-app-mwan3/po/zh-cn/mwan3.po
+++ b/applications/luci-app-mwan3/po/zh-cn/mwan3.po
@@ -41,6 +41,9 @@ msgstr "å–值范围:1-256。如果ä¸å¡«å†™ï¼Œé»˜è®¤å€¼ä¸º 1"
msgid "Check IP rules"
msgstr "检查 IP 规则"
+msgid "Check link quality"
+msgstr "检查连接数é‡"
+
msgid "Check routing table"
msgstr "检查路由表"
@@ -54,7 +57,7 @@ msgid "Destination port"
msgstr "目标端å£"
msgid "Detail"
-msgstr ""
+msgstr "详细"
msgid "Diagnostics"
msgstr "诊断"
@@ -73,7 +76,7 @@ msgid "Enter value in hex, starting with <code>0x</code>"
msgstr "输入å六进制值,以 <code>0x</code> 开头"
msgid "Execute"
-msgstr ""
+msgstr "执行"
msgid "Expect interface state on up event"
msgstr "在 up 事件å‘生时的预期接å£çŠ¶æ€"
@@ -100,7 +103,7 @@ msgid "Hotplug ifup"
msgstr "Hotplug ifup"
msgid "INFO: MWAN not running"
-msgstr ""
+msgstr "ä¿¡æ¯ï¼šMWAN 没有è¿è¡Œ"
msgid "IPset"
msgstr "IPset"
@@ -151,28 +154,28 @@ msgid "Local source interface"
msgstr "本地æºæŽ¥å£"
msgid "MWAN - Globals"
-msgstr ""
+msgstr "MWAN - 全局"
msgid "MWAN - Interfaces"
-msgstr ""
+msgstr "MWAN - 接å£"
msgid "MWAN - Members"
-msgstr ""
+msgstr "MWAN - æˆå‘˜"
msgid "MWAN - Notification"
-msgstr ""
+msgstr "MWAN - 通知"
msgid "MWAN - Policies"
-msgstr ""
+msgstr "MWAN - ç­–ç•¥"
msgid "MWAN - Rules"
-msgstr ""
+msgstr "MWAN - 规则"
msgid "MWAN Interface Configuration - %s"
msgstr "MWAN 接å£é…ç½® - %s"
msgid "MWAN Interfaces"
-msgstr ""
+msgstr "MWAN 接å£"
msgid "MWAN Member Configuration - %s"
msgstr "MWAN æˆå‘˜é…ç½® - %s"
@@ -184,13 +187,13 @@ msgid "MWAN Rule Configuration - %s"
msgstr "MWAN 规则é…ç½® - %s"
msgid "MWAN Status - Detail"
-msgstr ""
+msgstr "MWAN Status - 详细"
msgid "MWAN Status - Diagnostics"
-msgstr ""
+msgstr "MWAN Status - 诊断"
msgid "MWAN Status - Troubleshooting"
-msgstr ""
+msgstr "MWAN Status - 故障排除"
msgid ""
"MWAN supports up to 252 physical and/or logical interfaces<br />MWAN "
@@ -205,6 +208,12 @@ msgstr ""
"的接å£å称匹é…。<br />å称å…许包括 A-Zã€a-zã€0-9ã€_ 但是ä¸èƒ½æœ‰ç©ºæ ¼ã€‚<br />接"
"å£ä¸åº”该与æˆå‘˜ã€ç­–ç•¥ã€è§„则中的任æ„一个设置项使用相åŒçš„å称"
+msgid "Max packet latency [ms]"
+msgstr "最大数æ®åŒ…延迟 [ms]"
+
+msgid "Max packet loss [%]"
+msgstr "最大数æ®åŒ…丢失率 [%]"
+
msgid ""
"May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
"as a portrange (eg \"1024:2048\") without quotes"
@@ -236,6 +245,12 @@ msgstr "分é…çš„æˆå‘˜"
msgid "Metric"
msgstr "跃点数"
+msgid "Min packet latency [ms]"
+msgstr "最å°æ•°æ®åŒ…延迟 [ms]"
+
+msgid "Min packet loss [%]"
+msgstr "最å°æ•°æ®åŒ…丢失率 [%]"
+
msgid ""
"Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
"youtube.com/youtube\")"
@@ -250,7 +265,7 @@ msgid "No MWAN interfaces found"
msgstr "没有找到 MWAN 接å£"
msgid "Notification"
-msgstr ""
+msgstr "通知"
msgid "Offline"
msgstr "离线"
@@ -297,8 +312,8 @@ msgstr ""
"“策略â€æŠŠæˆå‘˜è¿›è¡Œåˆ†ç»„,告诉 MWAN 如何分é…“规则â€ä¸­ä½¿ç”¨è¿™ä¸€ç­–略的æµé‡<br />拥有"
"较低跃点数的æˆå‘˜å°†ä¼šè¢«ä¼˜å…ˆä½¿ç”¨ã€‚拥有相åŒè·ƒç‚¹æ•°çš„æˆå‘˜æŠŠæµé‡è¿›è¡Œè´Ÿè½½å‡è¡¡ã€‚<br /"
">进行负载å‡è¡¡çš„æˆå‘˜ä¹‹é—´æ‹¥æœ‰è¾ƒé«˜æ¯”é‡çš„æˆå‘˜å°†ä¼šè¢«åˆ†é…到更多æµé‡ã€‚<br />å称å…许"
-"包括A-Zã€a-zã€0-9ã€_ 但是ä¸èƒ½æœ‰ç©ºæ ¼ã€‚å称应该在 15 个字符以内<br />ç­–ç•¥ä¸åº”该"
-"与接å£ã€æˆå‘˜ã€è§„则中的任æ„一个设置项使用相åŒçš„å称"
+"包括 A-Zã€a-zã€0-9ã€_ 但是ä¸èƒ½æœ‰ç©ºæ ¼ã€‚å称应该在 15 个字符以内<br />ç­–ç•¥ä¸åº”"
+"该与接å£ã€æˆå‘˜ã€è§„则中的任æ„一个设置项使用相åŒçš„å称"
msgid "Policy"
msgstr "ç­–ç•¥"
@@ -329,6 +344,11 @@ msgid ""
"z, 0-9, _ and no spaces<br />Rules may not share the same name as configured "
"interfaces, members or policies"
msgstr ""
+"规则指定哪些æµé‡å°†ä½¿ç”¨ç‰¹å®šçš„ MWAN ç­–ç•¥<br />规则基于 IP 地å€ï¼Œç«¯å£æˆ–åè®®<br /"
+">规则从上到下匹é…<br />匹é…规则以下的规则被忽略<br />ä¸ç¬¦åˆä»»ä½•è§„则的æµé‡å°†ä½¿"
+"用主路由表进行路由<br />目的地为已知(éžé»˜è®¤ï¼‰ç½‘络的æµé‡ç”±ä¸»è·¯ç”±è¡¨å¤„ç†<br />"
+"æµé‡ç¬¦åˆè§„则,但该策略的所有 WAN 接å£å…³é—­åŽéƒ½ä¼šè¢«å¤±æ•ˆ<br />å称å¯åŒ…å«å­—符 A-"
+"Z,a-z,0-9,_和空格<br />规则ä¸èƒ½ä¸Žé…置的接å£ã€æˆå‘˜æˆ–策略共享相åŒçš„å称"
msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"
msgstr "å•ä½ä¸ºç§’。接å—的值:1-1000000。留空则使用默认值 600 秒"
@@ -349,7 +369,7 @@ msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"
msgstr "æ”¯æŒ CIDR 记法(例如:\"192.168.100.0/24\")ä¸å«å¼•å·"
msgid "Task"
-msgstr ""
+msgstr "任务"
msgid "There are currently %d of %d supported interfaces configured"
msgstr "当å‰å·²é…ç½® %d 个接å£ï¼Œæœ€å¤§æ”¯æŒ %d 个"
@@ -380,6 +400,14 @@ msgid ""
"Physical device name which interface went up or down (e.g. \"eth0\" or "
"\"wwan0\")<br /><br />"
msgstr ""
+"这里å…许您修改“/etc/mwan3.userâ€çš„内容。<br />该文件在 sysupgrade 期间也会ä¿"
+"留。<br /><br />注æ„:<br />该文件会作为 shell 脚本解释。<br />脚本的第一行必"
+"须是 &#34;#!/bin/sh&#34;,ä¸å¸¦å¼•å·ã€‚<br />以 # 开头的行是注释,ä¸ä¼šæ‰§è¡Œã€‚"
+"<br />将您的自定义 mwan3 动作放在这里,他们将<br />在å¯ç”¨ mwan3 的接å£ä¸Š<br /"
+">在 netifd hotplug 接å£äº‹ä»¶æ—¶æ‰§è¡Œã€‚<br /><br />有三个主è¦çš„环境å˜é‡ä¼ é€’给这个"
+"脚本。<br /><br />$ACTION “ifup†或 “ifdownâ€<br />$INTERFACE å¯åŠ¨æˆ–åœæ­¢çš„接å£"
+"å(例如 “wan†或 “wwanâ€ï¼‰<br />$DEVICE å¯åŠ¨æˆ–åœæ­¢æŽ¥å£çš„物ç†è®¾å¤‡å(例如 "
+"“eth0†或 “wwan0â€ï¼‰<br /><br />"
msgid "Tracking hostname or IP address"
msgstr "跟踪的主机或 IP 地å€"
@@ -406,35 +434,35 @@ msgid ""
msgstr "使用该接å£çš„ IP 地å€ä½œä¸ºè·¯ç”±å™¨æœ¬èº«å‘èµ·çš„æµé‡çš„æº IP 地å€"
msgid "View the content of /etc/protocols for protocol description"
-msgstr ""
+msgstr "查看åè®®æè¿°çš„ /etc/protocols 的内容"
msgid "WARNING: %d interfaces are configured exceeding the maximum of %d!"
msgstr "警告:已é…ç½® %d 个接å£ï¼Œè¶…过最大值 %dï¼"
msgid "WARNING: Interface %s are not found in /etc/config/network"
-msgstr ""
+msgstr "è­¦å‘Šï¼šæŽ¥å£ %s 在 /etc/config/network 中未找到"
msgid "WARNING: Interface %s has a duplicate metric %s configured"
-msgstr ""
+msgstr "è­¦å‘Šï¼šæŽ¥å£ %s çš„ metric %s é…ç½®é‡å¤"
msgid ""
"WARNING: Interface %s has a higher reliability requirement than tracking "
"hosts (%d)"
-msgstr ""
+msgstr "è­¦å‘Šï¼šæŽ¥å£ %s 比跟踪主机具有更高的å¯é æ€§è¦æ±‚(%d)"
msgid "WARNING: Interface %s has no default route in the main routing table"
-msgstr ""
+msgstr "è­¦å‘Šï¼šæŽ¥å£ %s 在主路由表中没有默认的路由"
msgid "WARNING: Policy %s has exceeding the maximum name of 15 characters"
-msgstr ""
+msgstr "警告:策略 %s å称超过 15 个字符"
msgid ""
"WARNING: Rule %s have a port configured with no or improper protocol "
"specified!"
-msgstr ""
+msgstr "警告:规则 %s 有一个端å£é…置没有指定或åè®®ä¸æ­£ç¡®ï¼"
msgid "Waiting for command to complete..."
-msgstr ""
+msgstr "正在等待命令完æˆ..."
msgid "Weight"
msgstr "比é‡"
diff --git a/applications/luci-app-mwan3/po/zh-tw/mwan3.po b/applications/luci-app-mwan3/po/zh-tw/mwan3.po
index 6af9fae7e3..9fa5263428 100644
--- a/applications/luci-app-mwan3/po/zh-tw/mwan3.po
+++ b/applications/luci-app-mwan3/po/zh-tw/mwan3.po
@@ -41,6 +41,9 @@ msgstr "å–值範åœï¼š1-256。如果ä¸å¡«å¯«ï¼Œé è¨­å€¼ç‚º 1"
msgid "Check IP rules"
msgstr "檢查 IP è¦å‰‡"
+msgid "Check link quality"
+msgstr ""
+
msgid "Check routing table"
msgstr "檢查路由表"
@@ -205,6 +208,12 @@ msgstr ""
"中的介é¢å稱匹é…。<br />å稱å…許包括 A-Zã€a-zã€0-9ã€_ 但是ä¸èƒ½æœ‰ç©ºæ ¼ã€‚<br />"
"介é¢ä¸æ‡‰è©²èˆ‡æˆå“¡ã€ç­–ç•¥ã€è¦å‰‡ä¸­çš„ä»»æ„一個設定項使用相åŒçš„å稱"
+msgid "Max packet latency [ms]"
+msgstr ""
+
+msgid "Max packet loss [%]"
+msgstr ""
+
msgid ""
"May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
"as a portrange (eg \"1024:2048\") without quotes"
@@ -236,6 +245,12 @@ msgstr "分é…çš„æˆå“¡"
msgid "Metric"
msgstr "èºé»žæ•¸"
+msgid "Min packet latency [ms]"
+msgstr ""
+
+msgid "Min packet loss [%]"
+msgstr ""
+
msgid ""
"Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
"youtube.com/youtube\")"
diff --git a/applications/luci-app-noddos/luasrc/view/noddos/clients.htm b/applications/luci-app-noddos/luasrc/view/noddos/clients.htm
index f2fb9312a7..4caf3e04e4 100644
--- a/applications/luci-app-noddos/luasrc/view/noddos/clients.htm
+++ b/applications/luci-app-noddos/luasrc/view/noddos/clients.htm
@@ -38,70 +38,70 @@
<fieldset class="cbi-section">
<legend><%:Recognized Clients%></legend>
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Hostname%></th>
- <th class="cbi-section-table-cell"><%:IPv4%></th>
- <th class="cbi-section-table-cell"><%:MAC%></th>
- <th class="cbi-section-table-cell"><%:Manufacturer%></th>
- <th class="cbi-section-table-cell"><%:Model%></th>
- <th class="cbi-section-table-cell"><%:Class%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Hostname%></div>
+ <div class="th cbi-section-table-cell"><%:IPv4%></div>
+ <div class="th cbi-section-table-cell"><%:MAC%></div>
+ <div class="th cbi-section-table-cell"><%:Manufacturer%></div>
+ <div class="th cbi-section-table-cell"><%:Model%></div>
+ <div class="th cbi-section-table-cell"><%:Class%></div>
+ </div>
<%
for i,v in ipairs(devdump) do
if v.DeviceProfileUuid ~= "" then
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
- <td class="cbi-value-field"><%=v.Hostname%></td>
- <td class="cbi-value-field"><%=v.Ipv4Address%></td>
- <td class="cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></td>
- <td class="cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Manufacturer%></td>
- <td class="cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Model%></td>
- <td class="cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].ThingClass%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
+ <div class="td cbi-value-field"><%=v.Hostname%></div>
+ <div class="td cbi-value-field"><%=v.Ipv4Address%></div>
+ <div class="td cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></div>
+ <div class="td cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Manufacturer%></div>
+ <div class="td cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Model%></div>
+ <div class="td cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].ThingClass%></div>
+ </div>
<%
style=false
end
end
%>
- </table>
+ </div>
</div>
</fieldset>
<br />
<fieldset class="cbi-section">
<legend><%:Unrecognized Clients%></legend>
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Hostname%></th>
- <th class="cbi-section-table-cell"><%:IPv4%></th>
- <th class="cbi-section-table-cell"><%:MAC%></th>
- <th class="cbi-section-table-cell"><%:Manufacturer%></th>
- <th class="cbi-section-table-cell"><%:Model%></th>
- <th class="cbi-section-table-cell"><%:DhcpVendor%></th>
- <th class="cbi-section-table-cell"><%:DhcpHostname%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Hostname%></div>
+ <div class="th cbi-section-table-cell"><%:IPv4%></div>
+ <div class="th cbi-section-table-cell"><%:MAC%></div>
+ <div class="th cbi-section-table-cell"><%:Manufacturer%></div>
+ <div class="th cbi-section-table-cell"><%:Model%></div>
+ <div class="th cbi-section-table-cell"><%:DhcpVendor%></div>
+ <div class="th cbi-section-table-cell"><%:DhcpHostname%></div>
+ </div>
<%
for i,v in ipairs(devdump) do
if v.DeviceProfileUuid == "" then
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
- <td class="cbi-value-field"><%=v.Hostname%></td>
- <td class="cbi-value-field"><%=v.Ipv4Address%></td>
- <td class="cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></td>
- <td class="cbi-value-field"><%=v.SsdpManufacturer%></td>
- <td class="cbi-value-field"><%=v.SsdpModelName%></td>
- <td class="cbi-value-field"><%=v.DhcpVendor1%></td>
- <td class="cbi-value-field"><%=v.DhcpHostname%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
+ <div class="td cbi-value-field"><%=v.Hostname%></div>
+ <div class="td cbi-value-field"><%=v.Ipv4Address%></div>
+ <div class="td cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></div>
+ <div class="td cbi-value-field"><%=v.SsdpManufacturer%></div>
+ <div class="td cbi-value-field"><%=v.SsdpModelName%></div>
+ <div class="td cbi-value-field"><%=v.DhcpVendor1%></div>
+ <div class="td cbi-value-field"><%=v.DhcpHostname%></div>
+ </div>
<%
style=false
end
end
%>
- </table>
+ </div>
</div>
</fieldset>
diff --git a/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm b/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
index 03a9ed70ee..66e44e9676 100644
--- a/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
+++ b/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
@@ -5,8 +5,8 @@
function(x)
{
var tb = document.getElementById('ocserv_status_table');
- if (tb && (idx < tb.rows.length))
- tb.rows[0].parentNode.removeChild(tb.rows[idx]);
+ if (tb && (idx + 1 < tb.childNodes.length))
+ tb.removeChild(tb.childNodes[idx + 1]);
}
);
}
@@ -18,38 +18,28 @@
if (st && tb)
{
/* clear all rows */
- while( tb.rows.length > 1 )
- tb.deleteRow(1);
+ while (tb.firstElementChild !== tb.lastElementChild)
+ tb.removeChild(tb.lastElementChild);
- for( var i = 0; i < st.length; i++ )
+ for (var i = 0; i < st.length; i++)
{
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
- tr.insertCell(-1).innerHTML = st[i].user;
- tr.insertCell(-1).innerHTML = st[i].group;
- tr.insertCell(-1).innerHTML = st[i].vpn_ip;
- tr.insertCell(-1).innerHTML = st[i].ip;
- tr.insertCell(-1).innerHTML = st[i].device;
- tr.insertCell(-1).innerHTML = st[i].time;
- tr.insertCell(-1).innerHTML = st[i].cipher;
- tr.insertCell(-1).innerHTML = st[i].status;
-
- tr.insertCell(-1).innerHTML = String.format(
- '<input class="cbi-button cbi-input-remove" type="button" value="<%:Disconnect%>" onclick="ocserv_disconnect(%d)" />',
- st[i].id
- );
+ tb.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format((i % 2) + 1), [
+ E('<div class="td">', st[i].user),
+ E('<div class="td">', st[i].group),
+ E('<div class="td">', st[i].vpn_ip),
+ E('<div class="td">', st[i].ip),
+ E('<div class="td">', st[i].device),
+ E('<div class="td">', st[i].time),
+ E('<div class="td">', st[i].cipher),
+ E('<div class="td">', st[i].status),
+ E('<div class="td">',
+ E('<input class="cbi-button cbi-input-remove" type="button" value="<%:Disconnect%>" onclick="ocserv_disconnect(%d)" />'
+ .format(st[i].id)))
+ ]));
}
- if( tb.rows.length == 1 )
- {
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 5;
- td.innerHTML = '<em><br /><%:There are no active users.%></em>';
- }
+ if (tb.firstElementChild === tb.lastElementChild)
+ tb.appendChild(E('<div class="tr cbi-section-table-row"><div class="td"><em><br /><%:There are no active users.%></em></div></div>'));
}
}
);
@@ -57,20 +47,21 @@
<fieldset class="cbi-section">
<legend><%:Active OpenConnect Users%></legend>
- <table class="cbi-section-table" id="ocserv_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:User%></th>
- <th class="cbi-section-table-cell"><%:Group%></th>
- <th class="cbi-section-table-cell"><%:IP Address%></th>
- <th class="cbi-section-table-cell"><%:VPN IP Address%></th>
- <th class="cbi-section-table-cell"><%:Device%></th>
- <th class="cbi-section-table-cell"><%:Time%></th>
- <th class="cbi-section-table-cell"><%:Cipher%></th>
- <th class="cbi-section-table-cell"><%:Status%></th>
- <th class="cbi-section-table-cell">&#160;</th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="5"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
+ <div class="table cbi-section-table" id="ocserv_status_table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:User%></div>
+ <div class="th cbi-section-table-cell"><%:Group%></div>
+ <div class="th cbi-section-table-cell"><%:IP Address%></div>
+ <div class="th cbi-section-table-cell"><%:VPN IP Address%></div>
+ <div class="th cbi-section-table-cell"><%:Device%></div>
+ <div class="th cbi-section-table-cell"><%:Time%></div>
+ <div class="th cbi-section-table-cell"><%:Cipher%></div>
+ <div class="th cbi-section-table-cell"><%:Status%></div>
+ <div class="th cbi-section-table-cell">&#160;</div>
+ </div>
+ <div class="tr cbi-section-table-row">
+ <div class="td" colspan="5"><em><br /><%:Collecting data...%></em></div>
+ </div>
+ </div>
</fieldset>
+
diff --git a/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm b/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
index 476150dd28..150ed87dad 100644
--- a/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
+++ b/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
@@ -132,11 +132,11 @@ end
{
var service = info[idx];
s += String.format(
- '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
- '<td class="cbi-section-table-titles"><a href="%s">%s</a></td>' +
- '<td class="cbi-section-table-titles">%s</td>' +
- '<td class="cbi-section-table-titles"><a href="http://%s/cgi-bin-status.html">%s</a></td>' +
- '</tr>',
+ '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
+ '<div class="td cbi-section-table-titles"><a href="%s">%s</a></div>' +
+ '<div class="td cbi-section-table-titles">%s</div>' +
+ '<div class="td cbi-section-table-titles"><a href="http://%s/cgi-bin-status.html">%s</a></div>' +
+ '</div>',
service.url, service.descr, service.proto, service.origin_link, service.origin || '?'
);
}
@@ -153,16 +153,16 @@ end
<fieldset class="cbi-section">
<legend><%:Internal services%></legend>
- <table class="cbi-section-table">
- <thead>
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Url%></th>
- <th class="cbi-section-table-cell"><%:Protocol%></th>
- <th class="cbi-section-table-cell"><%:Source%></th>
- </tr>
- </thead>
-
- <tbody id="olsr_services">
+ <div class="table cbi-section-table">
+ <div class="thead">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Url%></div>
+ <div class="th cbi-section-table-cell"><%:Protocol%></div>
+ <div class="th cbi-section-table-cell"><%:Source%></div>
+ </div>
+ </div>
+
+ <div class="tbody" id="olsr_services">
<%
for k, line in ipairs(services) do
local field = {}
@@ -178,15 +178,15 @@ end
local url, proto, descr, origin = pcdata(field[1]), pcdata(field[2]), utl.trim(pcdata(field[3])), pcdata(field[4])
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%>">
- <td class="cbi-section-table-titles"><a href="<%=url%>"><%=descr%></a></td>
- <td class="cbi-section-table-titles"><%=proto%></td>
- <td class="cbi-section-table-titles"><a href="http://<%=origin_link%>/cgi-bin-status.html"><%=origin%></a></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%>">
+ <div class="td cbi-section-table-titles"><a href="<%=url%>"><%=descr%></a></div>
+ <div class="td cbi-section-table-titles"><%=proto%></div>
+ <div class="td cbi-section-table-titles"><a href="http://<%=origin_link%>/cgi-bin-status.html"><%=origin%></a></div>
+ </div>
<% i = ((i % 2) + 1)
end %>
- </tbody>
- </table>
+ </div>
+ </div>
<br />
<%=last_update%>
</fieldset>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
index 5ea7b74e4d..2dc4ce1730 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
@@ -41,7 +41,7 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
{
var hna = info[idx];
var linkgw = ''
- s += '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + hna.proto + '">'
+ s += '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + hna.proto + '">'
if (hna.proto == '6') {
linkgw = '<a href="http://[' + hna.gateway + ']/cgi-bin-status.html">' + hna.gateway + '</a>'
} else {
@@ -61,11 +61,11 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
}
s += String.format(
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>', hna.destination + '/' + hna.genmask, linkgw + hostname, validity
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>', hna.destination + '/' + hna.genmask, linkgw + hostname, validity
)
- s += '</tr>'
+ s += '</div>'
}
hnadiv.innerHTML = s;
}
@@ -79,21 +79,21 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
<fieldset class="cbi-section">
<legend><%:Overview of currently active OLSR host net announcements%></legend>
- <table class="cbi-section-table">
- <thead>
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Announced network%></th>
- <th class="cbi-section-table-cell"><%:OLSR gateway%></th>
- <th class="cbi-section-table-cell"><%:Validity Time%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="thead">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Announced network%></div>
+ <div class="th cbi-section-table-cell"><%:OLSR gateway%></div>
+ <div class="th cbi-section-table-cell"><%:Validity Time%></div>
+ </div>
- </thead>
- <tbody id="olsrd_hna">
+ </div>
+ <div class="tbody" id="olsrd_hna">
<% for k, route in ipairs(hna) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=hna[k].proto%>">
- <td class="cbi-section-table-cell"><%=hna[k].destination%>/<%=hna[k].genmask%> </td>
- <td class="cbi-section-table-cell">
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=hna[k].proto%>">
+ <div class="td cbi-section-table-cell"><%=hna[k].destination%>/<%=hna[k].genmask%> </div>
+ <div class="td cbi-section-table-cell">
<% if hna[k].proto == '6' then %>
<a href="http://[<%=hna[k].gateway%>]/cgi-bin-status.html"><%=hna[k].gateway%></a>
<% else %>
@@ -102,20 +102,20 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
<% if hna[k].hostname then %>
/ <a href="http://<%=hna[k].hostname%>/cgi-bin-status.html"><%=hna[k].hostname%></a>
<% end %>
- </td>
+ </div>
<% if hna[k].validityTime then
validity = hna[k].validityTime .. 's'
else
validity = '-'
end %>
- <td class="cbi-section-table-cell"><%=validity%></td>
- </tr>
+ <div class="td cbi-section-table-cell"><%=validity%></div>
+ </div>
<% i = ((i % 2) + 1)
end %>
- </tbody>
- </table>
+ </div>
+ </div>
</fieldset>
<%+status-olsr/common_js%>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
index 81d0a3dd31..e3ccd0c23d 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
@@ -18,31 +18,31 @@ local i = 1
<fieldset class="cbi-section">
<legend><%:Overview of interfaces where OLSR is running%></legend>
- <table class="cbi-section-table">
- <tr>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- <th class="cbi-section-table-cell"><%:State%></th>
- <th class="cbi-section-table-cell"><%:MTU%></th>
- <th class="cbi-section-table-cell"><%:WLAN%></th>
- <th class="cbi-section-table-cell"><%:Source address%></th>
- <th class="cbi-section-table-cell"><%:Netmask%></th>
- <th class="cbi-section-table-cell"><%:Broadcast address%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr">
+ <div class="th cbi-section-table-cell"><%:Interface%></div>
+ <div class="th cbi-section-table-cell"><%:State%></div>
+ <div class="th cbi-section-table-cell"><%:MTU%></div>
+ <div class="th cbi-section-table-cell"><%:WLAN%></div>
+ <div class="th cbi-section-table-cell"><%:Source address%></div>
+ <div class="th cbi-section-table-cell"><%:Netmask%></div>
+ <div class="th cbi-section-table-cell"><%:Broadcast address%></div>
+ </div>
<% for k, iface in ipairs(iface) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=iface.proto%>">
- <td class="cbi-section-table-cell"><%=iface.name%></td>
- <td class="cbi-section-table-cell"><%=iface.state%></td>
- <td class="cbi-section-table-cell"><%=iface.olsrMTU%></td>
- <td class="cbi-section-table-cell"><%=iface.wireless and luci.i18n.translate('yes') or luci.i18n.translate('no')%></td>
- <td class="cbi-section-table-cell"><%=iface.ipv4Address or iface.ipv6Address%></td>
- <td class="cbi-section-table-cell"><%=iface.netmask%></td>
- <td class="cbi-section-table-cell"><%=iface.broadcast or iface.multicast%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=iface.proto%>">
+ <div class="td cbi-section-table-cell"><%=iface.name%></div>
+ <div class="td cbi-section-table-cell"><%=iface.state%></div>
+ <div class="td cbi-section-table-cell"><%=iface.olsrMTU%></div>
+ <div class="td cbi-section-table-cell"><%=iface.wireless and luci.i18n.translate('yes') or luci.i18n.translate('no')%></div>
+ <div class="td cbi-section-table-cell"><%=iface.ipv4Address or iface.ipv6Address%></div>
+ <div class="td cbi-section-table-cell"><%=iface.netmask%></div>
+ <div class="td cbi-section-table-cell"><%=iface.broadcast or iface.multicast%></div>
+ </div>
<% i = ((i % 2) + 1)
end %>
- </table>
+ </div>
</fieldset>
<%+status-olsr/common_js%>
<%+footer%>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
index f658288fc1..8c9f63af0b 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
@@ -15,11 +15,11 @@ local i = 1
<div id="togglebuttons"></div>
<fieldset class="cbi-section">
<legend><%:Overview of known multiple interface announcements%></legend>
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:OLSR node%></th>
- <th class="cbi-section-table-cell" ><%:Secondary OLSR interfaces%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:OLSR node%></div>
+ <div class="th cbi-section-table-cell" ><%:Secondary OLSR interfaces%></div>
+ </div>
<% for k, mid in ipairs(mids) do
local aliases = ''
@@ -37,14 +37,14 @@ local i = 1
end
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=mid.proto%>">
- <td class="cbi-section-table-cell"><a href="http://<%=host%>/cgi-bin-status.html"><%=mid.ipAddress%></a></td>
- <td class="cbi-section-table-cell"><%=aliases%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=mid.proto%>">
+ <div class="td cbi-section-table-cell"><a href="http://<%=host%>/cgi-bin-status.html"><%=mid.ipAddress%></a></div>
+ <div class="td cbi-section-table-cell"><%=aliases%></div>
+ </div>
<% i = ((i % 2) + 1)
end %>
- </table>
+ </div>
</fieldset>
<%+status-olsr/common_js%>
<%+footer%>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
index c077c20486..ab09865865 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
@@ -64,36 +64,36 @@ end
if (neigh.proto == '6') {
s += String.format(
- '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
- '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://[%s]/cgi-bin-status.html">%s</a></td>',
+ '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s"><a href="http://[%s]/cgi-bin-status.html">%s</a></div>',
neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip
);
} else {
s += String.format(
- '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
- '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>',
+ '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></div>',
neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip
);
}
if (neigh.hn) {
s += String.format(
- '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>',
+ '<div class="td cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></div>',
neigh.dfgcolor, neigh.hn, neigh.hn
);
} else {
s += String.format(
- '<td class="cbi-section-table-titles" style="background-color:%s">?</td>',
+ '<div class="td cbi-section-table-titles" style="background-color:%s">?</div>',
neigh.dfgcolor
);
}
s += String.format(
- '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
- '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
- '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
- '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
- '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
- '<td class="cbi-section-table-titles" style="background-color:%s" title="Signal: %s Noise: %s">%s</td>' +
- '</tr>',
+ '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+ '<div class="td cbi-section-table-titles" style="background-color:%s" title="Signal: %s Noise: %s">%s</div>' +
+ '</div>',
neigh.dfgcolor, neigh.ifn, neigh.dfgcolor, neigh.lip, neigh.dfgcolor, neigh.lq, neigh.dfgcolor, neigh.nlq, neigh.color, neigh.cost, neigh.snr_color, neigh.signal, neigh.noise, neigh.snr || '?'
);
}
@@ -112,21 +112,21 @@ end
<fieldset class="cbi-section">
<legend><%:Overview of currently established OLSR connections%></legend>
- <table class="cbi-section-table">
- <thead>
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Neighbour IP%></th>
- <th class="cbi-section-table-cell"><%:Hostname%></th>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- <th class="cbi-section-table-cell"><%:Local interface IP%></th>
- <th class="cbi-section-table-cell">LQ</th>
- <th class="cbi-section-table-cell">NLQ</th>
- <th class="cbi-section-table-cell">ETX</th>
- <th class="cbi-section-table-cell">SNR</th>
- </tr>
- </thead>
+ <div class="table cbi-section-table">
+ <div class="thead">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Neighbour IP%></div>
+ <div class="th cbi-section-table-cell"><%:Hostname%></div>
+ <div class="th cbi-section-table-cell"><%:Interface%></div>
+ <div class="th cbi-section-table-cell"><%:Local interface IP%></div>
+ <div class="th cbi-section-table-cell">LQ</div>
+ <div class="th cbi-section-table-cell">NLQ</div>
+ <div class="th cbi-section-table-cell">ETX</div>
+ <div class="th cbi-section-table-cell">SNR</div>
+ </div>
+ </div>
- <tbody id="olsr_neigh_table">
+ <div class="tbody" id="olsr_neigh_table">
<% local i = 1
for k, link in ipairs(links) do
link.linkCost = tonumber(link.linkCost) or 0
@@ -147,25 +147,25 @@ end
end
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=link.proto%>">
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=link.proto%>">
<% if link.proto == "6" then %>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://[<%=link.remoteIP%>]/cgi-bin-status.html"><%=link.remoteIP%></a></td>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://[<%=link.remoteIP%>]/cgi-bin-status.html"><%=link.remoteIP%></a></div>
<% else %>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.remoteIP%>/cgi-bin-status.html"><%=link.remoteIP%></a></td>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.remoteIP%>/cgi-bin-status.html"><%=link.remoteIP%></a></div>
<% end %>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.hostname%>/cgi-bin-status.html"><%=link.hostname%></a></td>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.interface%></td>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.localIP%></td>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.linkQuality)%></td>
- <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.neighborLinkQuality)%></td>
- <td class="cbi-section-table-titles" style="background-color:<%=color%>"><%=string.format("%.3f", link.linkCost)%></td>
- <td class="cbi-section-table-titles" style="background-color:<%=snr_color%>" title="Signal: <%=link.signal%> Noise: <%=link.noise%>"><%=link.snr%></td>
- </tr>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.hostname%>/cgi-bin-status.html"><%=link.hostname%></a></div>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.interface%></div>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.localIP%></div>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.linkQuality)%></div>
+ <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.neighborLinkQuality)%></div>
+ <div class="td cbi-section-table-titles" style="background-color:<%=color%>"><%=string.format("%.3f", link.linkCost)%></div>
+ <div class="td cbi-section-table-titles" style="background-color:<%=snr_color%>" title="Signal: <%=link.signal%> Noise: <%=link.noise%>"><%=link.snr%></div>
+ </div>
<%
i = ((i % 2) + 1)
end %>
- </tbody>
- </table>
+ </div>
+ </div>
<br />
<%+status-olsr/legend%>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
index 61e17b3b2d..832a27aed7 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
@@ -160,48 +160,48 @@ XHR.poll(10, '<%=REQUEST_URI%>/json', { },
<fieldset class="cbi-section">
<legend><%:Network%></legend>
- <table width="100%" cellspacing="10">
- <tr><td width="33%"><%:Interfaces%></td><td>
+ <div class="table" width="100%" cellspacing="10">
+ <div class="tr"><div class="td" width="33%"><%:Interfaces%></div><div class="td">
<a href="<%=REQUEST_URI%>/interfaces">
<span id="nr_ifaces">-<span>
</a>
- </td></tr>
- <tr><td width="33%"><%:Neighbors%></td><td>
+ </div></div>
+ <div class="tr"><div class="td" width="33%"><%:Neighbors%></div><div class="td">
<a href="<%=REQUEST_URI%>/neighbors">
<span id="nr_neigh">-</span>
</a>
- </td></tr>
- <tr><td width="33%"><%:Nodes%></td><td>
+ </div></div>
+ <div class="tr"><div class="td" width="33%"><%:Nodes%></div><div class="td">
<a href="<%=REQUEST_URI%>/topology">
<span id="nr_nodes">-</span>
</a>
- </td></tr>
- <tr><td width="33%"><%:HNA%></td><td>
+ </div></div>
+ <div class="tr"><div class="td" width="33%"><%:HNA%></div><div class="td">
<a href="<%=REQUEST_URI%>/hna">
<span id="nr_hna">-</span>
</a>
- </td></tr>
- <tr><td width="33%"><%:Links total%></td><td>
+ </div></div>
+ <div class="tr"><div class="td" width="33%"><%:Links total%></div><div class="td">
<a href="<%=REQUEST_URI%>/topology">
<span id="nr_topo">-</span>
</a>
- </td></tr>
- <tr><td width="33%"><%:Links per node (average)%></td><td>
+ </div></div>
+ <div class="tr"><div class="td" width="33%"><%:Links per node (average)%></div><div class="td">
<span id="meshfactor">-</span>
- </td></tr>
+ </div></div>
- </table>
+ </div>
</fieldset>
<fieldset class="cbi-section">
<legend>OLSR <%:Configuration%></legend>
- <table width="100%" cellspacing="10">
- <tr><td width="33%"><%:Version%></td><td>
+ <div class="table" width="100%" cellspacing="10">
+ <div class="tr"><div class="td" width="33%"><%:Version%></div><div class="td">
<span id="version">-<span>
- </td></tr>
- <tr><td width="33%"><%:Download Config%></td><td>
+ </div></div>
+ <div class="tr"><div class="td" width="33%"><%:Download Config%></div><div class="td">
<% if has_ipv4_conf then %>
<a href="<%=REQUEST_URI%>?openwrt_v4">OpenWrt (IPv4)</a>,
<% end %>
@@ -214,8 +214,8 @@ XHR.poll(10, '<%=REQUEST_URI%>/json', { },
<% if has_ipv6_conf then %>
<a href="<%=REQUEST_URI%>?conf_v6">OLSRD (IPv6)</a>
<% end %>
- </td></tr>
- </table>
+ </div></div>
+ </div>
</fieldset>
<%+footer%>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
index 8e46daa022..c75b94fcef 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
@@ -50,9 +50,9 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
var route = info[idx];
s += String.format(
- '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
- '<td class="cbi-section-table-cell">%s/%s</td>' +
- '<td class="cbi-section-table-cell">' +
+ '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
+ '<div class="td cbi-section-table-cell">%s/%s</div>' +
+ '<div class="td cbi-section-table-cell">' +
'<a href="http://%s/cgi-bin-status.html">%s</a>',
route.proto, route.dest, route.genmask, route.gw, route.gw
)
@@ -72,11 +72,11 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
}
s += String.format(
- '</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell" style="background-color:%s">%s</td>' +
- '</tr>',
+ '</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell" style="background-color:%s">%s</div>' +
+ '</div>',
route.interface, route.metric, route.color, route.etx || '?'
);
}
@@ -96,27 +96,27 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
<fieldset class="cbi-section">
<legend><%:Overview of currently known routes to other OLSR nodes%></legend>
-<table class="cbi-section-table">
- <thead>
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Announced network%></th>
- <th class="cbi-section-table-cell"><%:OLSR gateway%></th>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- <th class="cbi-section-table-cell"><%:Metric%></th>
- <th class="cbi-section-table-cell">ETX</th>
- </tr>
- </thead>
+<div class="table cbi-section-table">
+ <div class="thead">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Announced network%></div>
+ <div class="th cbi-section-table-cell"><%:OLSR gateway%></div>
+ <div class="th cbi-section-table-cell"><%:Interface%></div>
+ <div class="th cbi-section-table-cell"><%:Metric%></div>
+ <div class="th cbi-section-table-cell">ETX</div>
+ </div>
+ </div>
- <tbody id="olsrd_routes">
+ <div class="tbody" id="olsrd_routes">
<% for k, route in ipairs(routes) do
ETX = tonumber(route.rtpMetricCost)/1024 or '0'
color = olsrtools.etx_color(ETX)
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
- <td class="cbi-section-table-cell"><%=route.destination%>/<%=route.genmask%></td>
- <td class="cbi-section-table-cell">
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
+ <div class="td cbi-section-table-cell"><%=route.destination%>/<%=route.genmask%></div>
+ <div class="td cbi-section-table-cell">
<% if route.proto == '6' then %>
<a href="http://[<%=route.gateway%>]/cgi-bin-status.html"><%=route.gateway%></a>
<% else %>
@@ -125,16 +125,16 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
<% if route.hostname then %>
/ <a href="http://<%=route.Hostname%>/cgi-bin-status.html"><%=route.hostname%></a>
<% end %>
- </td>
- <td class="cbi-section-table-cell"><%=route.networkInterface%></td>
- <td class="cbi-section-table-cell"><%=route.metric%></td>
- <td class="cbi-section-table-cell" style="background-color:<%=color%>"><%=string.format("%.3f", ETX)%></td>
- </tr>
+ </div>
+ <div class="td cbi-section-table-cell"><%=route.networkInterface%></div>
+ <div class="td cbi-section-table-cell"><%=route.metric%></div>
+ <div class="td cbi-section-table-cell" style="background-color:<%=color%>"><%=string.format("%.3f", ETX)%></div>
+ </div>
<%
i = ((i % 2) + 1)
end %>
- </tbody>
-</table>
+ </div>
+</div>
<%+status-olsr/legend%>
</fieldset>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
index 6aa7a75461..7ca66816ae 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
@@ -56,7 +56,7 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
for (var idx = 0; idx < info.length; idx++)
{
var smartgw = info[idx];
- s += '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + smartgw.proto + '">'
+ s += '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + smartgw.proto + '">'
if (smartgw.proto == '6') {
linkgw = '<a href="http://[' + smartgw.ipAddress + ']/cgi-bin-status.html">' + smartgw.ipAddress + '</a>'
} else {
@@ -64,18 +64,18 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
}
s += String.format(
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>',
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>',
linkgw, smartgw.status, smartgw.tcPathCost, smartgw.hopCount, smartgw.uplinkSpeed, smartgw.downlinkSpeed, smartgw.v4, smartgw.v6, smartgw.externalPrefix
)
- s += '</tr>'
+ s += '</div>'
}
smartgwdiv.innerHTML = s;
}
@@ -94,23 +94,23 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
<fieldset class="cbi-section">
<legend><%:Overview of smart gateways in this network%></legend>
- <table class="cbi-section-table">
- <thead>
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Gateway%></th>
- <th class="cbi-section-table-cell"><%:Status%></th>
- <th class="cbi-section-table-cell"><%:ETX%></th>
- <th class="cbi-section-table-cell"><%:Hops%></th>
- <th class="cbi-section-table-cell"><%:Uplink%></th>
- <th class="cbi-section-table-cell"><%:Downlink%></th>
- <th class="cbi-section-table-cell"><%:IPv4%></th>
- <th class="cbi-section-table-cell"><%:IPv6%></th>
- <th class="cbi-section-table-cell"><%:Prefix%></th>
-
- </tr>
- </thead>
-
- <tbody id="olsrd_smartgw">
+ <div class="table cbi-section-table">
+ <div class="thead">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Gateway%></div>
+ <div class="th cbi-section-table-cell"><%:Status%></div>
+ <div class="th cbi-section-table-cell"><%:ETX%></div>
+ <div class="th cbi-section-table-cell"><%:Hops%></div>
+ <div class="th cbi-section-table-cell"><%:Uplink%></div>
+ <div class="th cbi-section-table-cell"><%:Downlink%></div>
+ <div class="th cbi-section-table-cell"><%:IPv4%></div>
+ <div class="th cbi-section-table-cell"><%:IPv6%></div>
+ <div class="th cbi-section-table-cell"><%:Prefix%></div>
+
+ </div>
+ </div>
+
+ <div class="tbody" id="olsrd_smartgw">
<% for k, gw in ipairs(gws) do
gw.tcPathCost = tonumber(gw.tcPathCost)/1024 or 0
@@ -119,27 +119,27 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
end
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=proto%>">
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=proto%>">
<% if gw.proto == '6' then %>
- <td class="cbi-section-table-cell"><a href="http://[<%=gw.ipAddress%>]/cgi-bin-status.html"><%=gw.ipAddress%></a></td>
+ <div class="td cbi-section-table-cell"><a href="http://[<%=gw.ipAddress%>]/cgi-bin-status.html"><%=gw.ipAddress%></a></div>
<% else %>
- <td class="cbi-section-table-cell"><a href="http://<%=gw.ipAddress%>/cgi-bin-status.html"><%=gw.ipAddress%></a></td>
+ <div class="td cbi-section-table-cell"><a href="http://<%=gw.ipAddress%>/cgi-bin-status.html"><%=gw.ipAddress%></a></div>
<% end %>
- <td class="cbi-section-table-cell"><%=gw.ipv4Status or gw.ipv6Status or '-' %></td>
- <td class="cbi-section-table-cell"><%=string.format("%.3f", gw.tcPathCost)%></td>
- <td class="cbi-section-table-cell"><%=gw.hopCount%></td>
- <td class="cbi-section-table-cell"><%=gw.uplinkSpeed%></td>
- <td class="cbi-section-table-cell"><%=gw.downlinkSpeed%></td>
- <td class="cbi-section-table-cell"><%=gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></td>
- <td class="cbi-section-table-cell"><%=gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></td>
- <td class="cbi-section-table-cell"><%=gw.externalPrefix%></td>
- </tr>
+ <div class="td cbi-section-table-cell"><%=gw.ipv4Status or gw.ipv6Status or '-' %></div>
+ <div class="td cbi-section-table-cell"><%=string.format("%.3f", gw.tcPathCost)%></div>
+ <div class="td cbi-section-table-cell"><%=gw.hopCount%></div>
+ <div class="td cbi-section-table-cell"><%=gw.uplinkSpeed%></div>
+ <div class="td cbi-section-table-cell"><%=gw.downlinkSpeed%></div>
+ <div class="td cbi-section-table-cell"><%=gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></div>
+ <div class="td cbi-section-table-cell"><%=gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></div>
+ <div class="td cbi-section-table-cell"><%=gw.externalPrefix%></div>
+ </div>
<% i = ((i % 2) + 1)
end %>
- </tbody>
- </table>
+ </div>
+ </div>
</fieldset>
<% else %>
diff --git a/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm b/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
index b3abeaecbe..02fdfddac3 100644
--- a/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
+++ b/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
@@ -17,14 +17,14 @@ local olsrtools = require "luci.tools.olsr"
<fieldset class="cbi-section">
<legend><%:Overview of currently known OLSR nodes%></legend>
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:OLSR node%></th>
- <th class="cbi-section-table-cell"><%:Last hop%></th>
- <th class="cbi-section-table-cell"><%:LQ%></th>
- <th class="cbi-section-table-cell"><%:NLQ%></th>
- <th class="cbi-section-table-cell"><%:ETX%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:OLSR node%></div>
+ <div class="th cbi-section-table-cell"><%:Last hop%></div>
+ <div class="th cbi-section-table-cell"><%:LQ%></div>
+ <div class="th cbi-section-table-cell"><%:NLQ%></div>
+ <div class="th cbi-section-table-cell"><%:ETX%></div>
+ </div>
<% for k, route in ipairs(routes) do
local cost = string.format("%.3f", tonumber(route.tcEdgeCost/1024) or 0)
@@ -33,28 +33,28 @@ local olsrtools = require "luci.tools.olsr"
local nlq = string.format("%.3f", tonumber(route.neighborLinkQuality) or 0)
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
<% if route.proto == "6" then %>
- <td class="cbi-section-table-cell"><a href="http://[<%=route.destinationIP%>]/cgi-bin-status.html"><%=route.destinationIP%></a></td>
- <td class="cbi-section-table-cell"><a href="http://[<%=route.lastHopIP%>]/cgi-bin-status.html"><%=route.lastHopIP%></a></td>
+ <div class="td cbi-section-table-cell"><a href="http://[<%=route.destinationIP%>]/cgi-bin-status.html"><%=route.destinationIP%></a></div>
+ <div class="td cbi-section-table-cell"><a href="http://[<%=route.lastHopIP%>]/cgi-bin-status.html"><%=route.lastHopIP%></a></div>
<% else %>
- <td class="cbi-section-table-cell"><a href="http://<%=route.destinationIP%>/cgi-bin-status.html"><%=route.destinationIP%></a></td>
- <td class="cbi-section-table-cell"><a href="http://<%=route.lastHopIP%>/cgi-bin-status.html"><%=route.lastHopIP%></a></td>
+ <div class="td cbi-section-table-cell"><a href="http://<%=route.destinationIP%>/cgi-bin-status.html"><%=route.destinationIP%></a></div>
+ <div class="td cbi-section-table-cell"><a href="http://<%=route.lastHopIP%>/cgi-bin-status.html"><%=route.lastHopIP%></a></div>
<%end%>
- <td class="cbi-section-table-cell"><%=lq%></td>
- <td class="cbi-section-table-cell"><%=nlq%></td>
- <td class="cbi-section-table-cell" style="background-color:<%=color%>"><%=cost%></td>
- </tr>
+ <div class="td cbi-section-table-cell"><%=lq%></div>
+ <div class="td cbi-section-table-cell"><%=nlq%></div>
+ <div class="td cbi-section-table-cell" style="background-color:<%=color%>"><%=cost%></div>
+ </div>
<% i = ((i % 2) + 1)
end %>
- </table>
+ </div>
<%+status-olsr/legend%>
</fieldset>
diff --git a/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua b/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua
index d2b5d32c05..a6b0e1dd90 100644
--- a/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua
+++ b/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua
@@ -56,7 +56,7 @@ function s.create(self, name)
luci.cbi.CREATE_PREFIX .. self.config .. "." ..
self.sectiontype .. ".text"
)
- if string.len(name)>3 and not name:match("[^a-zA-Z0-9_]") then
+ if #name > 3 and not name:match("[^a-zA-Z0-9_]") then
uci:section(
"openvpn", "openvpn", name,
uci:get_all( "openvpn_recipes", recipe )
@@ -67,9 +67,11 @@ function s.create(self, name)
uci:save("openvpn")
luci.http.redirect( self.extedit:format(name) )
- else
+ elseif #name > 0 then
self.invalid_cts = true
end
+
+ return 0
end
@@ -103,10 +105,7 @@ function updown.cfgvalue(self, section)
end
function updown.write(self, section, value)
if self.option == "stop" then
- local pid = s.getPID(section)
- if pid ~= nil then
- sys.process.signal(pid,15)
- end
+ luci.sys.call("/etc/init.d/openvpn stop %s" % section)
else
luci.sys.call("/etc/init.d/openvpn start %s" % section)
end
@@ -126,5 +125,8 @@ function proto.cfgvalue(self, section)
return val or "udp"
end
+function m.on_after_commit(self,map)
+ require("luci.sys").call('/etc/init.d/openvpn reload')
+end
return m
diff --git a/applications/luci-app-rp-pppoe-server/Makefile b/applications/luci-app-rp-pppoe-server/Makefile
index 6cf4595cea..aa3ae538cd 100644
--- a/applications/luci-app-rp-pppoe-server/Makefile
+++ b/applications/luci-app-rp-pppoe-server/Makefile
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk
-LUCI_TITLE:=Roaring Penguing PPPoE Server
+LUCI_TITLE:=Roaring Penguin PPPoE Server
LUCI_DEPENDS:=+rp-pppoe-server
include ../../luci.mk
diff --git a/applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua b/applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua
index af1a75b6f2..5fc20c52bc 100644
--- a/applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua
+++ b/applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua
@@ -23,7 +23,7 @@ function values_actions(o)
end
function values_redir(o, xmode)
- o.map.uci.foreach("shadowsocks-libev", "ss_redir", function(sdata)
+ o.map.uci:foreach("shadowsocks-libev", "ss_redir", function(sdata)
local disabled = ucival_to_bool(sdata["disabled"])
local sname = sdata[".name"]
local mode = sdata["mode"] or "tcp_only"
@@ -37,7 +37,7 @@ function values_redir(o, xmode)
end
function values_serverlist(o)
- o.map.uci.foreach("shadowsocks-libev", "server", function(sdata)
+ o.map.uci:foreach("shadowsocks-libev", "server", function(sdata)
local sname = sdata[".name"]
local server = sdata["server"]
local server_port = sdata["server_port"]
diff --git a/applications/luci-app-shadowsocks-libev/luasrc/view/shadowsocks-libev/add_instance.htm b/applications/luci-app-shadowsocks-libev/luasrc/view/shadowsocks-libev/add_instance.htm
index 219d89b074..f016dd47e6 100644
--- a/applications/luci-app-shadowsocks-libev/luasrc/view/shadowsocks-libev/add_instance.htm
+++ b/applications/luci-app-shadowsocks-libev/luasrc/view/shadowsocks-libev/add_instance.htm
@@ -1,24 +1,17 @@
<div class="cbi-section-create cbi-tblsection-create">
- <br />
- <table class="cbi-section-table">
- <tr class="cbi-section-table-row">
- <td class="cbi-section-table-cell" style="width:140px">
- <select class="cbi-input-select" id="_newinst.type" name="_newinst.type">
- <option value="_dummy">-- instance type --</option>
- <option value="ss_local">ss-local</option>
- <option value="ss_tunnel">ss-tunnel</option>
- <option value="ss_redir">ss-redir</option>
- <option value="ss_server">ss-server</option>
- </select>
- </td>
- <td class="cbi-section-table-cell" style="width:110px">
- <input type="text" class="cbi-input-text" id="_newinst.name" name="_newinst.name" placeholder="<%:Name%>"/>
- </td>
- <td class="cbi-section-table-cell left">
- <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>" value="<%:Add%>" />
- </td>
- </tr>
- </table>
+ <div>
+ <select class="cbi-input-select" id="_newinst.type" name="_newinst.type">
+ <option value="_dummy">-- instance type --</option>
+ <option value="ss_local">ss-local</option>
+ <option value="ss_tunnel">ss-tunnel</option>
+ <option value="ss_redir">ss-redir</option>
+ <option value="ss_server">ss-server</option>
+ </select>
+ </div>
+ <div>
+ <input type="text" class="cbi-input-text" id="_newinst.name" name="_newinst.name" placeholder="<%:Name%>"/>
+ </div>
+ <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>" value="<%:Add%>" />
</div>
<script type="text/javascript">//<![CDATA[
XHR.poll(5, '<%=url('admin/services/shadowsocks-libev/status')%>', null,
diff --git a/applications/luci-app-splash/luasrc/view/admin_status/splash.htm b/applications/luci-app-splash/luasrc/view/admin_status/splash.htm
index 37f67776aa..aad330791d 100644
--- a/applications/luci-app-splash/luasrc/view/admin_status/splash.htm
+++ b/applications/luci-app-splash/luasrc/view/admin_status/splash.htm
@@ -145,19 +145,19 @@ end
{
var s = '';
if (info.length == undefined) {
- s += '<tr class="cbi-section-table-row"><td colspan="7" class="cbi-section-table-cell"><br /><em><%:No clients connected%></em><br /></td></tr>'
+ s += '<div class="tr cbi-section-table-row"><div colspan="7" class="td cbi-section-table-cell"><br /><em><%:No clients connected%></em><br /></div></div>'
};
for (var idx = 0; idx < info.length; idx++)
{
var splash = info[idx];
s += String.format(
- '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s</td>' +
- '<td class="cbi-section-table-cell">%s/%s</td>' +
- '<td class="cbi-section-table-cell">',
+ '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s</div>' +
+ '<div class="td cbi-section-table-cell">%s/%s</div>' +
+ '<div class="td cbi-section-table-cell">',
splash.hostname, splash.ip, splash.mac, splash.timeleft, splash.trafficin, splash.trafficout);
<% if is_admin then %>
@@ -185,7 +185,7 @@ end
<% else %>
s += String.format('%s', splash.policy);
<% end %>
- s += '</td></tr>'
+ s += '</div></div>'
}
tbody.innerHTML = s;
}
@@ -200,18 +200,18 @@ end
<legend><%:Active Clients%></legend>
<div class="cbi-section-node">
<% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><input type="hidden" name="token" value="<%=token%>" /><% end %>
- <table class="cbi-section-table">
- <thead>
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Hostname%></th>
- <th class="cbi-section-table-cell"><%:IP Address%></th>
- <th class="cbi-section-table-cell"><%:MAC Address%></th>
- <th class="cbi-section-table-cell"><%:Time remaining%></th>
- <th class="cbi-section-table-cell"><%:Traffic in/out%></th>
- <th class="cbi-section-table-cell"><%:Policy%></th>
- </tr>
- </thead>
- <tbody id="splash_table">
+ <div class="table cbi-section-table">
+ <div class="thead">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Hostname%></div>
+ <div class="th cbi-section-table-cell"><%:IP Address%></div>
+ <div class="th cbi-section-table-cell"><%:MAC Address%></div>
+ <div class="th cbi-section-table-cell"><%:Time remaining%></div>
+ <div class="th cbi-section-table-cell"><%:Traffic in/out%></div>
+ <div class="th cbi-section-table-cell"><%:Policy%></div>
+ </div>
+ </div>
+ <div class="tbody" id="splash_table">
<%-
local count = 0
@@ -227,16 +227,16 @@ end
if c.ip then
count = count + 1
-%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=2-(count%2)%>">
- <td class="cbi-section-table-cell"><%=c.hostname or "<em>" .. translate("unknown") .. "</em>"%></td>
- <td class="cbi-section-table-cell"><%=c.ip or "<em>" .. translate("unknown") .. "</em>"%></td>
- <td class="cbi-section-table-cell"><%=showmac(c.mac)%></td>
- <td class="cbi-section-table-cell"><%=
+ <div class="tr cbi-section-table-row cbi-rowstyle-<%=2-(count%2)%>">
+ <div class="td cbi-section-table-cell"><%=c.hostname or "<em>" .. translate("unknown") .. "</em>"%></div>
+ <div class="td cbi-section-table-cell"><%=c.ip or "<em>" .. translate("unknown") .. "</em>"%></div>
+ <div class="td cbi-section-table-cell"><%=showmac(c.mac)%></div>
+ <div class="td cbi-section-table-cell"><%=
(c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or
(c.policy ~= "normal") and "-" or "<em>" .. translate("expired") .. "</em>"
- %></td>
- <td class="cbi-section-table-cell"><%=wat.byte_format(c.bytes_in)%> / <%=wat.byte_format(c.bytes_out)%></td>
- <td class="cbi-section-table-cell">
+ %></div>
+ <div class="td cbi-section-table-cell"><%=wat.byte_format(c.bytes_in)%> / <%=wat.byte_format(c.bytes_out)%></div>
+ <div class="td cbi-section-table-cell">
<% if is_admin then %>
<select name="policy.<%=c.mac:lower()%>" style="width:200px">
<option value="whitelist"<%=c.policy=="whitelist" and ' selected="selected"'%>><%:whitelisted%></option>
@@ -250,21 +250,21 @@ end
<% else %>
<%=c.policy%>
<% end %>
- </td>
- </tr>
+ </div>
+ </div>
<%-
end
end
if count == 0 then
-%>
- <tr class="cbi-section-table-row">
- <td colspan="7" class="cbi-section-table-cell">
+ <div class="tr cbi-section-table-row">
+ <div colspan="7" class="td cbi-section-table-cell">
<br /><em><%:No clients connected%></em><br />
- </td>
- </tr>
+ </div>
+ </div>
<%- end -%>
- </tbody>
- </table>
+ </div>
+ </div>
<% if is_admin then %></form><% end %>
</div>
</fieldset>
diff --git a/applications/luci-app-transmission/root/etc/uci-defaults/40_luci-transmission b/applications/luci-app-transmission/root/etc/uci-defaults/40_luci-transmission
index 456e8b89ac..08dc719974 100644
--- a/applications/luci-app-transmission/root/etc/uci-defaults/40_luci-transmission
+++ b/applications/luci-app-transmission/root/etc/uci-defaults/40_luci-transmission
@@ -1,7 +1,7 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
- delete ucitrack.@tranmsmission[-1]
+ delete ucitrack.@transmission[-1]
add ucitrack transmission
set ucitrack.@transmission[-1].init=transmission
commit ucitrack
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm
index 6cbeaffde6..c40bdeeb59 100644
--- a/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm
@@ -6,10 +6,10 @@ This is free software, licensed under the Apache License, Version 2.0
<%+header%>
<div class="cbi-map">
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for travelmate related messages only.%></div>
<textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
- </fieldset>
+ </div>
</div>
<script type="text/javascript">
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
index f76b52e9cc..ffacc2f6df 100644
--- a/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
@@ -11,20 +11,22 @@ This is free software, licensed under the Apache License, Version 2.0
<%+header%>
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
<div class="cbi-map">
<div class="cbi-map-descr">
<%=translatef("Provides an overview of all configured uplinks for the travelmate interface (%s). You can edit, delete or re-order existing uplinks or scan for a new one. The currently used uplink is emphasized in blue.", trmiface)%>
</div>
-<fieldset class="cbi-section">
- <table class="cbi-section-table" style="empty-cells:hide">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" style="text-align:left"><%:Device%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:SSID%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:BSSID%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Encryption%></th>
- <th class="cbi-section-table-cell" style="text-align:center" colspan="2"><%:Actions%></th>
- </tr>
+<div class="cbi-section">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th left"><%:Device%></div>
+ <div class="th left"><%:SSID%></div>
+ <div class="th left"><%:BSSID%></div>
+ <div class="th left"><%:Encryption%></div>
+ <div class="th center">&#160;</div>
+ </div>
<%
uci:foreach("wireless", "wifi-iface", function(s)
local iface = s.network or ""
@@ -40,26 +42,24 @@ This is free software, licensed under the Apache License, Version 2.0
style = "text-align:left;color:#0069d6;font-weight:bold"
end
%>
- <tr class="cbi-section-table-row cbi-rowstyle-1" style="<%=style%>">
- <td style="<%=style%>"><%=device%></td>
- <td style="<%=style%>"><%=ssid%></td>
- <td style="<%=style%>"><%=bssid%></td>
- <td style="<%=style%>"><%=encryption%></td>
- <td class="cbi-value-field" style="width:80px">
- <input class="cbi-button cbi-button-up" type="button" value="" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&dir=up'" alt="<%:Move up%>" title="<%:Move up%>"/>
- <input class="cbi-button cbi-button-down" type="button" value="" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&dir=down'" alt="<%:Move down%>" title="<%:Move down%>"/>
- </td>
- <td class="cbi-value-field" style="width:150px">
+ <div class="tr cbi-section-table-row cbi-rowstyle-1" style="<%=style%>">
+ <div class="td" style="<%=style%>"><%=device%></div>
+ <div class="td" style="<%=style%>"><%=ssid%></div>
+ <div class="td" style="<%=style%>"><%=bssid%></div>
+ <div class="td" style="<%=style%>"><%=encryption%></div>
+ <div class="td cbi-section-actions">
+ <input class="cbi-button cbi-button-up" type="button" value="<%:Up%>" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&amp;dir=up'" alt="<%:Move up%>" title="<%:Move up%>"/>
+ <input class="cbi-button cbi-button-down" type="button" value="<%:Down%>" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&amp;dir=down'" alt="<%:Move down%>" title="<%:Move down%>"/>
<input type="button" class="cbi-button cbi-button-edit" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiedit')%>?cfg=<%=section%>'" title="<%:Edit this Uplink%>" value="<%:Edit%>"/>
<input type="button" class="cbi-button cbi-button-remove" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifidelete')%>?cfg=<%=section%>'" title="<%:Delete this Uplink%>" value="<%:Delete%>"/>
- </td>
- </tr>
+ </div>
+ </div>
<%
end
end)
%>
- </table>
-</fieldset>
+ </div>
+</div>
<div class="cbi-page-actions right">
<%
uci:foreach("wireless", "wifi-device", function(s)
@@ -68,7 +68,7 @@ This is free software, licensed under the Apache License, Version 2.0
<form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiscan')%>" method="post">
<input type="hidden" name="device" value="<%=device%>"/>
<input type="hidden" name="token" value="<%=token%>"/>
- <input type="submit" class="cbi-button cbi-button-find" title="<%:Find and join network on%> <%=device%>" value="<%:Scan%> <%=device%>"/>
+ <input type="submit" class="cbi-button cbi-button-action important" title="<%:Find and join network on%> <%=device%>" value="<%:Scan%> <%=device%>"/>
</form>
<%
end)
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
index a8f63a17e2..57efd97376 100644
--- a/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
@@ -39,31 +39,33 @@ This is free software, licensed under the Apache License, Version 2.0
<%+header%>
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
<div class="cbi-map">
<h2 name="content"><%:Wireless Scan%></h2>
- <fieldset class="cbi-section">
- <table class="cbi-section-table" style="empty-cells:hide">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" style="text-align:left"><%:Uplink SSID%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Uplink BSSID%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Encryption%></th>
- <th class="cbi-section-table-cell" style="text-align:left" colspan="2"><%:Signal strength%></th>
- </tr>
+ <div class="cbi-section">
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th left"><%:Uplink SSID%></div>
+ <div class="th left"><%:Uplink BSSID%></div>
+ <div class="th left"><%:Encryption%></div>
+ <div class="th left"><%:Signal strength%></div>
+ </div>
<% for i, net in ipairs(iw.scanlist or { }) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-1">
- <td class="cbi-value-field" style="text-align:left">
+ <div class="tr cbi-section-table-row cbi-rowstyle-1">
+ <div class="td left">
<%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%>
- </td>
- <td class="cbi-value-field" style="text-align:left">
+ </div>
+ <div class="td left">
<%=net.bssid and utl.pcdata(net.bssid)%>
- </td>
- <td class="cbi-value-field" style="text-align:left">
+ </div>
+ <div class="td left">
<%=format_wifi_encryption(net.encryption)%>
- </td>
- <td class="cbi-value-field" style="text-align:left">
+ </div>
+ <div class="td left">
<%=percent_wifi_signal(net)%> %
- </td>
- <td class="cbi-value-field" style="width:100px;text-align:right">
+ </div>
+ <div class="td cbi-section-actions">
<form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiadd')%>" method="post">
<input type="hidden" name="token" value="<%=token%>"/>
<input type="hidden" name="device" value="<%=utl.pcdata(dev)%>"/>
@@ -76,20 +78,20 @@ This is free software, licensed under the Apache License, Version 2.0
<% end %>
<input class="cbi-button cbi-button-apply" type="submit" value="<%:Add Uplink%>"/>
</form>
- </td>
- </tr>
+ </div>
+ </div>
<% end %>
- </table>
- </fieldset>
+ </div>
+ </div>
<div class="cbi-page-actions right">
+ <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/stations')%>" method="get">
+ <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>"/>
+ </form>
<form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiscan')%>" method="post">
<input type="hidden" name="token" value="<%=token%>"/>
<input type="hidden" name="device" value="<%=utl.pcdata(dev)%>"/>
<input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>"/>
</form>
- <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/stations')%>" method="post">
- <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>"/>
- </form>
</div>
</div>
diff --git a/applications/luci-app-travelmate/po/ja/travelmate.po b/applications/luci-app-travelmate/po/ja/travelmate.po
index 535a9db260..f1d1220b7c 100644
--- a/applications/luci-app-travelmate/po/ja/travelmate.po
+++ b/applications/luci-app-travelmate/po/ja/travelmate.po
@@ -7,17 +7,11 @@ msgstr ""
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.0.7\n"
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ja\n"
-msgid "Actions"
-msgstr "æ“作"
-
-msgid "Add Interface"
-msgstr "インターフェースã®è¿½åŠ "
-
msgid "Add Uplink"
msgstr "アップリンクã®è¿½åŠ "
@@ -71,7 +65,7 @@ msgstr ""
msgid "Connection Limit"
msgstr "接続制é™"
-msgid "Create Uplink Interface"
+msgid "Create Uplink interface"
msgstr "アップリンク インターフェースã®ä½œæˆ"
msgid ""
@@ -89,6 +83,9 @@ msgstr "ã“ã®ã‚¢ãƒƒãƒ—リンクを削除"
msgid "Device"
msgstr "デãƒã‚¤ã‚¹"
+msgid "Down"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP メソッド"
@@ -202,7 +199,7 @@ msgid "Overall Timeout"
msgstr "実行間隔"
msgid "Overall retry timeout in seconds."
-msgstr ""
+msgstr "全体的ãªå†è©¦è¡Œã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆï¼ˆç§’)ã§ã™ã€‚"
msgid "Overview"
msgstr "概è¦"
@@ -283,6 +280,8 @@ msgstr "ステーション電波"
msgid ""
"The BSSID information '%s' is optional and only required for hidden networks"
msgstr ""
+"BSSID 情報 '%s' ã¯ã‚ªãƒ—ションã§ã‚ã‚Šã€ã‚¹ãƒ†ãƒ«ã‚¹åŒ–ã•ã‚ŒãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã®ã¿å¿…è¦ã§"
+"ã™ã€‚"
msgid ""
"This form allows you to modify the content of the main firewall "
@@ -319,6 +318,9 @@ msgstr ""
"ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°å†…ã® Travelmate ã«é–¢ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ãŒè¡¨ç¤ºã•"
"ã‚Œã¾ã™ã€‚"
+msgid "This step has only to be done once."
+msgstr "ã“ã®æ‰‹é †ã¯ã€ä¸€åº¦ã ã‘実行ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
msgid "Travelmate"
msgstr "Travelmate"
@@ -337,6 +339,9 @@ msgstr "トリガé…延"
msgid "Unknown"
msgstr "ä¸æ˜Ž"
+msgid "Up"
+msgstr ""
+
msgid "Uplink / Trigger interface"
msgstr "アップリンク / トリガー インターフェース"
@@ -346,9 +351,6 @@ msgstr "アップリンク BSSID"
msgid "Uplink SSID"
msgstr "アップリンク SSID"
-msgid "Uplink interface"
-msgstr "アップリンク インターフェース"
-
msgid "View AP QR-Codes"
msgstr "AP QR-コードを確èª"
@@ -379,37 +381,14 @@ msgstr "無線スキャン"
msgid "Wireless Stations"
msgstr "無線ステーション"
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
-msgstr ""
-"ファイアウォール㮠wan ゾーンã«è¿½åŠ ã—ã¾ã™ã€‚ã“ã®ã‚¹ãƒ†ãƒƒãƒ—ã¯ã€ä¸€åº¦ã ã‘実行ã•ã‚Œã‚‹"
-"å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr "ファイアウォール㮠wan ゾーンã«è¿½åŠ ã—ã¾ã™ã€‚<br />"
msgid "hidden"
-msgstr "(ä¸æ˜Žï¼‰"
+msgstr "(ステルス)"
msgid "n/a"
msgstr "利用ä¸å¯"
-#~ msgid "Enable 'automatic' mode"
-#~ msgstr "'automatic' モードã®æœ‰åŠ¹åŒ–"
-
-#~ msgid "Force a manual uplink rescan / reconnect in 'trigger' mode."
-#~ msgstr ""
-#~ "'trigger' モード時ã«ã€æ‰‹å‹•ã§ã‚¢ãƒƒãƒ—リンクã®å†ã‚¹ã‚­ãƒ£ãƒ³ã¨å†æŽ¥ç¶šã‚’è¡Œã„ã¾ã™ã€‚"
-
-#~ msgid ""
-#~ "Keep travelmate in an active state. Check every n seconds the connection "
-#~ "status, i.e. the uplink availability."
-#~ msgstr ""
-#~ "Travelmate をアクティブ状態ã§ç¶­æŒã—ã¾ã™ã€‚\"実行間隔\" ã§è¨­å®šã•ã‚ŒãŸæ™‚間毎"
-#~ "(秒)ã«ã€ã‚¢ãƒƒãƒ—リンクã®å¯ç”¨æ€§ã‚’確èªã™ã‚‹ãŸã‚ã«æŽ¥ç¶šçŠ¶æ…‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™"
-
-#~ msgid "Manual Rescan"
-#~ msgstr "手動å†ã‚¹ã‚­ãƒ£ãƒ³"
-
-#~ msgid "Rescan"
-#~ msgstr "å†ã‚¹ã‚­ãƒ£ãƒ³"
-
-#~ msgid "Timeout in seconds between retries in 'automatic' mode."
-#~ msgstr "'automatic' モード時ã«æŽ¥ç¶šã‚’確èªã¾ãŸã¯å†è©¦è¡Œã™ã‚‹é–“隔(秒)ã§ã™ã€‚"
+#~ msgid "Actions"
+#~ msgstr "æ“作"
diff --git a/applications/luci-app-travelmate/po/pt-br/travelmate.po b/applications/luci-app-travelmate/po/pt-br/travelmate.po
index 5ea4d4a0d3..2bed677d35 100644
--- a/applications/luci-app-travelmate/po/pt-br/travelmate.po
+++ b/applications/luci-app-travelmate/po/pt-br/travelmate.po
@@ -12,12 +12,6 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Language: pt_BR\n"
-msgid "Actions"
-msgstr ""
-
-msgid "Add Interface"
-msgstr ""
-
msgid "Add Uplink"
msgstr ""
@@ -67,7 +61,7 @@ msgstr ""
msgid "Connection Limit"
msgstr ""
-msgid "Create Uplink Interface"
+msgid "Create Uplink interface"
msgstr ""
msgid ""
@@ -83,6 +77,9 @@ msgstr ""
msgid "Device"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
@@ -292,6 +289,9 @@ msgid ""
"messages only."
msgstr ""
+msgid "This step has only to be done once."
+msgstr ""
+
msgid "Travelmate"
msgstr "Travelmate"
@@ -310,6 +310,9 @@ msgstr ""
msgid "Unknown"
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Uplink / Trigger interface"
msgstr ""
@@ -319,9 +322,6 @@ msgstr ""
msgid "Uplink SSID"
msgstr ""
-msgid "Uplink interface"
-msgstr ""
-
msgid "View AP QR-Codes"
msgstr ""
@@ -352,8 +352,7 @@ msgstr ""
msgid "Wireless Stations"
msgstr ""
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
+msgid "add it to the wan zone of the firewall.<br />"
msgstr ""
msgid "hidden"
diff --git a/applications/luci-app-travelmate/po/ru/travelmate.po b/applications/luci-app-travelmate/po/ru/travelmate.po
index fad31bb849..d3dbd24752 100644
--- a/applications/luci-app-travelmate/po/ru/travelmate.po
+++ b/applications/luci-app-travelmate/po/ru/travelmate.po
@@ -15,12 +15,6 @@ msgstr ""
"Project-Info: Это техничеÑкий перевод, не доÑловный. Главное-удобный руÑÑкий "
"интерфейÑ, вÑе проверÑлоÑÑŒ в графичеÑком режиме, ÑовмеÑтим Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ apps\n"
-msgid "Actions"
-msgstr "ДейÑтвиÑ"
-
-msgid "Add Interface"
-msgstr "Добавить интерфейÑ"
-
msgid "Add Uplink"
msgstr "Подключение к Ñети"
@@ -70,8 +64,8 @@ msgstr ""
msgid "Connection Limit"
msgstr "Ограничение Ñоединений"
-msgid "Create Uplink Interface"
-msgstr "Создать Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñети"
+msgid "Create Uplink interface"
+msgstr ""
msgid ""
"Create a new wireless wan uplink interface, configure it to use dhcp and"
@@ -88,6 +82,9 @@ msgstr "Удалить Ñеть"
msgid "Device"
msgstr "УÑтройÑтво"
+msgid "Down"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Метод EAP"
@@ -315,6 +312,9 @@ msgstr ""
"Страница проÑмотра ÑиÑтемного журнала, показаны только ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ ÑвÑзанные Ñ "
"работой утилиты TravelMate."
+msgid "This step has only to be done once."
+msgstr ""
+
msgid "Travelmate"
msgstr "TravelMate"
@@ -333,6 +333,9 @@ msgstr ""
msgid "Unknown"
msgstr "ÐеизвеÑтно"
+msgid "Up"
+msgstr ""
+
msgid "Uplink / Trigger interface"
msgstr "Включить интерфейÑ<br />внешней Ñети"
@@ -342,9 +345,6 @@ msgstr "BSSID внешней Ñети"
msgid "Uplink SSID"
msgstr "SSID внешней Ñети"
-msgid "Uplink interface"
-msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ Ñети"
-
msgid "View AP QR-Codes"
msgstr ""
@@ -375,9 +375,8 @@ msgstr "Ðайденные точки доÑтупа Wi-Fi"
msgid "Wireless Stations"
msgstr "Клиенты беÑпроводной Ñети"
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
-msgstr "добавить в wan зону межÑетевого Ñкрана. Можно Ñделать только один раз."
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr ""
msgid "hidden"
msgstr "Ñкрытый"
@@ -385,6 +384,24 @@ msgstr "Ñкрытый"
msgid "n/a"
msgstr "нет данных"
+#~ msgid "Actions"
+#~ msgstr "ДейÑтвиÑ"
+
+#~ msgid "Add Interface"
+#~ msgstr "Добавить интерфейÑ"
+
+#~ msgid "Create Uplink Interface"
+#~ msgstr "Создать Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñети"
+
+#~ msgid "Uplink interface"
+#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ Ñети"
+
+#~ msgid ""
+#~ "add it to the wan zone of the firewall. This step has only to be done "
+#~ "once."
+#~ msgstr ""
+#~ "добавить в wan зону межÑетевого Ñкрана. Можно Ñделать только один раз."
+
#~ msgid "Enable 'automatic' mode"
#~ msgstr "Включить режим 'автоматичеÑки'"
diff --git a/applications/luci-app-travelmate/po/templates/travelmate.pot b/applications/luci-app-travelmate/po/templates/travelmate.pot
index 8ba17668ec..b3e80e3c96 100644
--- a/applications/luci-app-travelmate/po/templates/travelmate.pot
+++ b/applications/luci-app-travelmate/po/templates/travelmate.pot
@@ -1,12 +1,6 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
-msgid "Actions"
-msgstr ""
-
-msgid "Add Interface"
-msgstr ""
-
msgid "Add Uplink"
msgstr ""
@@ -56,7 +50,7 @@ msgstr ""
msgid "Connection Limit"
msgstr ""
-msgid "Create Uplink Interface"
+msgid "Create Uplink interface"
msgstr ""
msgid ""
@@ -72,6 +66,9 @@ msgstr ""
msgid "Device"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
@@ -281,6 +278,9 @@ msgid ""
"messages only."
msgstr ""
+msgid "This step has only to be done once."
+msgstr ""
+
msgid "Travelmate"
msgstr ""
@@ -299,6 +299,9 @@ msgstr ""
msgid "Unknown"
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Uplink / Trigger interface"
msgstr ""
@@ -308,9 +311,6 @@ msgstr ""
msgid "Uplink SSID"
msgstr ""
-msgid "Uplink interface"
-msgstr ""
-
msgid "View AP QR-Codes"
msgstr ""
@@ -341,8 +341,7 @@ msgstr ""
msgid "Wireless Stations"
msgstr ""
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
+msgid "add it to the wan zone of the firewall.<br />"
msgstr ""
msgid "hidden"
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 bf2b65a0a1..256bbb8392 100644
--- a/applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua
+++ b/applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua
@@ -9,7 +9,7 @@ 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
+local rpn, din, dfw, ath
local ucl = luci.model.uci.cursor()
local valman = ucl:get_first("unbound", "unbound", "manual_conf")
@@ -100,15 +100,6 @@ if valman ~= "1" then
pfx.optional = true
pfx:depends({ dns64 = true })
- qry = s1:taboption("basic", Flag, "query_minimize", translate("Query Minimize:"),
- translate("Break down query components for limited added privacy"))
- qry.rmempty = false
-
- qrs = s1:taboption("basic", 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 })
-
prt = s1:taboption("basic", Value, "listen_port", translate("Listening Port:"),
translate("Choose Unbounds listening port"))
prt.datatype = "port"
@@ -216,26 +207,43 @@ if valman ~= "1" then
pro = s1:taboption("resource", ListValue, "protocol", translate("Recursion Protocol:"),
translate("Chose the protocol recursion queries leave on"))
- pro:value("mixed", translate("IP4 and IP6"))
- pro:value("ip6_prefer", translate("IP6 Preferred"))
+ 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("aggressive", translate("Aggressive"))
rsn:value("default", translate("Default"))
rsn:value("passive", translate("Passive"))
+ rsn:value("aggressive", translate("Aggressive"))
rsn.rmempty = false
- rsc = s1:taboption("resource", ListValue, "resource", translate("Memory Resource:"),
- translate("Use menu System/Processes to observe any memory growth"))
- rsc:value("large", translate("Large"))
- rsc:value("medium", translate("Medium"))
- rsc:value("small", translate("Small"))
- rsc:value("tiny", translate("Tiny"))
- rsc.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"))
diff --git a/applications/luci-app-upnp/luasrc/view/upnp_status.htm b/applications/luci-app-upnp/luasrc/view/upnp_status.htm
index 89fdb5e218..ee385b24a8 100644
--- a/applications/luci-app-upnp/luasrc/view/upnp_status.htm
+++ b/applications/luci-app-upnp/luasrc/view/upnp_status.htm
@@ -4,8 +4,8 @@
function(x)
{
var tb = document.getElementById('upnp_status_table');
- if (tb && (idx < tb.rows.length))
- tb.rows[0].parentNode.removeChild(tb.rows[idx]);
+ if (tb && (idx + 1 < tb.childNodes.length))
+ tb.removeChild(tb.childNodes[idx + 1]);
}
);
}
@@ -16,54 +16,37 @@
var tb = document.getElementById('upnp_status_table');
if (st && tb)
{
- /* clear all rows */
- while( tb.rows.length > 1 )
- tb.deleteRow(1);
+ var rows = [];
- for( var i = 0; i < st.length; i++ )
- {
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
+ for (var i = 0; i < st.length; i++)
+ rows.push([
+ st[i].proto,
+ st[i].extport,
+ st[i].intaddr,
+ st[i].intport,
+ st[i].descr,
+ E('<input class="cbi-button cbi-button-remove" type="button" value="<%:Delete%>" onclick="upnp_delete_fwd(%d)" />'.format(st[i].num))
+ ]);
- tr.insertCell(-1).innerHTML = st[i].proto;
- tr.insertCell(-1).innerHTML = st[i].extport;
- tr.insertCell(-1).innerHTML = st[i].intaddr;
- tr.insertCell(-1).innerHTML = st[i].intport;
- tr.insertCell(-1).innerHTML = st[i].descr;
-
- tr.insertCell(-1).innerHTML = String.format(
- '<input class="cbi-button cbi-input-remove" type="button" value="<%:Delete%>" onclick="upnp_delete_fwd(%d)" />',
- st[i].num
- );
- }
-
- if( tb.rows.length == 1 )
- {
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 5;
- td.innerHTML = '<em><br /><%:There are no active redirects.%></em>';
- }
+ cbi_update_table(tb, rows, '<em><%:There are no active redirects.%></em>');
}
}
);
//]]></script>
-<fieldset class="cbi-section">
- <legend><%:Active UPnP Redirects%></legend>
- <table class="cbi-section-table" id="upnp_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Protocol%></th>
- <th class="cbi-section-table-cell"><%:External Port%></th>
- <th class="cbi-section-table-cell"><%:Client Address%></th>
- <th class="cbi-section-table-cell"><%:Client Port%></th>
- <th class="cbi-section-table-cell"><%:Description%></th>
- <th class="cbi-section-table-cell">&#160;</th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="5"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
-</fieldset>
+<div class="cbi-section">
+ <h3><%:Active UPnP Redirects%></h3>
+ <div class="table" id="upnp_status_table">
+ <div class="tr table-titles">
+ <div class="th"><%:Protocol%></div>
+ <div class="th"><%:External Port%></div>
+ <div class="th"><%:Client Address%></div>
+ <div class="th"><%:Client Port%></div>
+ <div class="th"><%:Description%></div>
+ <div class="th cbi-section-actions">&#160;</div>
+ </div>
+ <div class="tr placeholder">
+ <div class="td"><em><%:Collecting data...%></em></div>
+ </div>
+ </div>
+</div>
diff --git a/applications/luci-app-upnp/po/uk/upnp.po b/applications/luci-app-upnp/po/uk/upnp.po
index 8f43ae371a..8dbffe9767 100644
--- a/applications/luci-app-upnp/po/uk/upnp.po
+++ b/applications/luci-app-upnp/po/uk/upnp.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2013-05-26 19:26+0200\n"
+"PO-Revision-Date: 2018-06-17 23:15+0300\n"
"Last-Translator: Yurii <yuripet@gmail.com>\n"
"Language-Team: none\n"
"Language: uk\n"
@@ -10,13 +10,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
msgid ""
"ACLs specify which external ports may be redirected to which internal "
"addresses and ports"
msgstr ""
-"СпиÑок кнтролю доÑтупу визначає, Ñкі зовнішні порти можуть бути "
+"СпиÑок контролю доÑтупу визначає, Ñкі зовнішні порти можуть бути "
"переÑпрÑмовані на Ñкі внутрішні адреÑи й порти"
msgid "Action"
@@ -29,7 +28,7 @@ msgid "Advanced Settings"
msgstr "Додаткові параметри"
msgid "Advertise as IGDv1 device instead of IGDv2"
-msgstr ""
+msgstr "Оголошувати Ñк приÑтрій IGDv1 заміÑÑ‚ÑŒ IGDv2"
msgid "Allow adding forwards only to requesting ip addresses"
msgstr ""
@@ -63,16 +62,16 @@ msgid "Delete"
msgstr ""
msgid "Description"
-msgstr ""
+msgstr "ОпиÑ"
msgid "Device UUID"
msgstr "UUID приÑтрою"
msgid "Downlink"
-msgstr "Ðизхідний канал"
+msgstr "Ðизхідне з’єднаннÑ"
msgid "Enable IGDv1 mode"
-msgstr ""
+msgstr "Увімкнути режим IGDv1"
msgid "Enable NAT-PMP functionality"
msgstr "Увімкнути функцію NAT-PMP"
@@ -148,20 +147,10 @@ msgid "Universal Plug & Play"
msgstr "Universal Plug & Play"
msgid "Uplink"
-msgstr "ВиÑхідний канал"
+msgstr "ВиÑхідне з’єднаннÑ"
msgid "Value in KByte/s, informational only"
-msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (КБ/Ñ) тільки Ð´Ð»Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—"
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (КБ/Ñ), тільки Ð´Ð»Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—"
#~ msgid "Delete Redirect"
#~ msgstr "Видалити переÑпрÑмуваннÑ"
-
-#~ msgid ""
-#~ "UPNP allows clients in the local network to automatically configure the "
-#~ "router."
-#~ msgstr ""
-#~ "UPnP надає клієнтам у локальній мережі змогу автоматично наÑтроювати "
-#~ "маршрутизатор."
-
-#~ msgid "enable"
-#~ msgstr "Увімкнути"
diff --git a/applications/luci-app-wireguard/luasrc/view/wireguard.htm b/applications/luci-app-wireguard/luasrc/view/wireguard.htm
index 5af6232ae6..64d9955296 100644
--- a/applications/luci-app-wireguard/luasrc/view/wireguard.htm
+++ b/applications/luci-app-wireguard/luasrc/view/wireguard.htm
@@ -164,43 +164,43 @@
for ikey, iface in pairs(data) do
-%>
<legend><%:Interface%> <%=ikey%></legend>
- <table width="100%" cellspacing="10">
- <tr>
- <td width="33%" style="vertical-align:top"><%:Configuration%></td>
- <td>
- <table>
- <tr>
- <td id="<%=ikey%>_icon" style="width:16px; text-align:center; padding:3px">
+ <div class="table" width="100%" cellspacing="10">
+ <div class="tr">
+ <div class="td" width="33%" style="vertical-align:top"><%:Configuration%></div>
+ <div class="td">
+ <div class="table">
+ <div class="tr">
+ <div class="td" id="<%=ikey%>_icon" style="width:16px; text-align:center; padding:3px">
&nbsp;
- </td>
- <td id="<%=ikey%>_info" style="vertical-align:middle; padding: 3px">
+ </div>
+ <div class="td" id="<%=ikey%>_info" style="vertical-align:middle; padding: 3px">
<em><%:Collecting data...%></em>
- </td>
- </tr></table>
- </td>
- </tr>
+ </div>
+ </div></div>
+ </div>
+ </div>
<%-
for pkey, peer in pairs(iface.peers) do
-%>
- <tr>
- <td width="33%" style="vertical-align:top"><%:Peer%></td>
- <td>
- <table>
- <tr>
- <td id="<%=ikey%>_<%=peer.public_key%>_icon" style="width:16px; text-align:center; padding:3px">
+ <div class="tr">
+ <div class="td" width="33%" style="vertical-align:top"><%:Peer%></div>
+ <div class="td">
+ <div class="table">
+ <div class="tr">
+ <div class="td" id="<%=ikey%>_<%=peer.public_key%>_icon" style="width:16px; text-align:center; padding:3px">
<img src="<%=resource%>/icons/tunnel_disabled.png" /><br />
<small>?</small>
- </td>
- <td id="<%=ikey%>_<%=peer.public_key%>_info" style="vertical-align:middle; padding: 3px">
+ </div>
+ <div class="td" id="<%=ikey%>_<%=peer.public_key%>_info" style="vertical-align:middle; padding: 3px">
<em><%:Collecting data...%></em>
- </td>
- </tr></table>
- </td>
- </tr>
+ </div>
+ </div></div>
+ </div>
+ </div>
<%-
end
-%>
- </table>
+ </div>
<%-
end
-%>
diff --git a/collections/luci-nginx/Makefile b/collections/luci-nginx/Makefile
new file mode 100644
index 0000000000..7d14b1df7d
--- /dev/null
+++ b/collections/luci-nginx/Makefile
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TYPE:=col
+LUCI_BASENAME:=nginx
+
+LUCI_TITLE:=LuCI interface with Nginx as Webserver
+LUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
+LUCI_DEPENDS:= \
+ +nginx +nginx-mod-luci +luci-mod-admin-full +luci-theme-bootstrap \
+ +luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6 \
+ +rpcd-mod-rrdns
+
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/collections/luci-ssl-nginx/Makefile b/collections/luci-ssl-nginx/Makefile
new file mode 100644
index 0000000000..d7ff49a7a3
--- /dev/null
+++ b/collections/luci-ssl-nginx/Makefile
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2008-2016 The LuCI Team
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TYPE:=col
+LUCI_BASENAME:=ssl
+
+LUCI_TITLE:=LuCI with HTTPS support (mbedTLS as SSL backend)
+LUCI_DEPENDS:=+luci-nginx +nginx-mod-luci-ssl +libustream-mbedtls +px5g
+
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/collections/luci-ssl-openssl-nginx/Makefile b/collections/luci-ssl-openssl-nginx/Makefile
new file mode 100644
index 0000000000..51096471e1
--- /dev/null
+++ b/collections/luci-ssl-openssl-nginx/Makefile
@@ -0,0 +1,21 @@
+#
+# Copyright (C) 2016 The LuCI Team
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TYPE:=col
+LUCI_BASENAME:=ssl-openssl
+
+LUCI_TITLE:=LuCI with HTTPS support (OpenSSL as SSL backend)
+LUCI_DESCRIPTION:=LuCI with OpenSSL as the SSL backend (libustream-openssl). \
+ OpenSSL cmd tools (openssl-util) are used by uhttpd for SSL key generation \
+ instead of the default px5g. (If px5g is installed, uhttpd will prefer that.)
+
+LUCI_DEPENDS:=+luci-nginx +nginx-mod-luci-ssl +libustream-openssl +openssl-util
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/collections/luci/Makefile b/collections/luci/Makefile
index 9b495c3187..3c765c396b 100644
--- a/collections/luci/Makefile
+++ b/collections/luci/Makefile
@@ -9,7 +9,8 @@ include $(TOPDIR)/rules.mk
LUCI_TYPE:=col
LUCI_BASENAME:=luci
-LUCI_TITLE:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
+LUCI_TITLE:=LuCI interface with Uhttpd as Webserver (default)
+LUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
LUCI_DEPENDS:= \
+uhttpd +uhttpd-mod-ubus +luci-mod-admin-full +luci-theme-bootstrap \
+luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6 \
diff --git a/luci.mk b/luci.mk
index cc39c0f4c8..6ece81c3d6 100644
--- a/luci.mk
+++ b/luci.mk
@@ -34,7 +34,7 @@ LUCI_LANG.ru=РуÑÑкий (Russian)
LUCI_LANG.sk=SlovenÄina (Slovak)
LUCI_LANG.sv=Svenska (Swedish)
LUCI_LANG.tr=Türkçe (Turkish)
-LUCI_LANG.uk=україÌнÑька (Ukrainian)
+LUCI_LANG.uk=УкраїнÑька (Ukrainian)
LUCI_LANG.vi=Tiếng Việt (Vietnamese)
LUCI_LANG.zh-cn=中文 (Chinese)
LUCI_LANG.zh-tw=臺ç£è¯èªž (Taiwanese)
@@ -153,7 +153,7 @@ LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci
define SrcDiet
$(FIND) $(1) -type f -name '*.lua' | while read src; do \
- if LuaSrcDiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
+ if luasrcdiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
then mv "$$$$src.o" "$$$$src"; fi; \
done
endef
diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile
index 7f7d7e772f..5c38d99c58 100644
--- a/modules/luci-base/Makefile
+++ b/modules/luci-base/Makefile
@@ -14,12 +14,13 @@ LUCI_BASENAME:=base
LUCI_TITLE:=LuCI core libraries
LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +liblucihttp-lua
-PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
-PKG_SOURCE_URL:=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/luasrcdiet
-PKG_HASH:=ed7680f2896269ae8633756e7edcf09050812f78c8f49e280e63c30d14f35aea
-PKG_LICENSE:=Apache-2.0
-HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/LuaSrcDiet-0.12.1
+PKG_SOURCE:=v1.0.0.tar.gz
+PKG_SOURCE_URL:=https://github.com/jirutka/luasrcdiet/archive/
+PKG_HASH:=48162e63e77d009f5848f18a5cabffbdfc867d0e5e73c6d407f6af5d6880151b
+PKG_LICENSE:=MIT
+
+HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/luasrcdiet-1.0.0
include $(INCLUDE_DIR)/host-build.mk
@@ -36,13 +37,13 @@ endef
define Host/Compile
$(MAKE) -C src/ clean po2lmo
- $(MAKE) -C $(HOST_BUILD_DIR) bin/LuaSrcDiet.lua
+ $(MAKE) -C $(HOST_BUILD_DIR) bin/luasrcdiet
endef
define Host/Install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) src/po2lmo $(1)/bin/po2lmo
- $(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/LuaSrcDiet.lua $(1)/bin/LuaSrcDiet
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/luasrcdiet $(1)/bin/luasrcdiet
endef
$(eval $(call HostBuild))
diff --git a/modules/luci-base/htdocs/luci-static/resources/cbi.js b/modules/luci-base/htdocs/luci-static/resources/cbi.js
index 6c35372cdd..6a487366f8 100644
--- a/modules/luci-base/htdocs/luci-static/resources/cbi.js
+++ b/modules/luci-base/htdocs/luci-static/resources/cbi.js
@@ -465,31 +465,16 @@ function cbi_d_add(field, dep, index) {
}
function cbi_d_checkvalue(target, ref) {
- var t = document.getElementById(target);
- var value;
+ var value = null,
+ query = 'input[id="'+target+'"], input[name="'+target+'"], ' +
+ 'select[id="'+target+'"], select[name="'+target+'"]';
- if (!t) {
- var tl = document.getElementsByName(target);
-
- if( tl.length > 0 && (tl[0].type == 'radio' || tl[0].type == 'checkbox'))
- for( var i = 0; i < tl.length; i++ )
- if( tl[i].checked ) {
- value = tl[i].value;
- break;
- }
-
- value = value ? value : "";
- } else if (!t.value) {
- value = "";
- } else {
- value = t.value;
-
- if (t.type == "checkbox") {
- value = t.checked ? value : "";
- }
- }
+ document.querySelectorAll(query).forEach(function(i) {
+ if (value === null && ((i.type !== 'radio' && i.type !== 'checkbox') || i.checked === true))
+ value = i.value;
+ });
- return (value == ref)
+ return (((value !== null) ? value : "") == ref);
}
function cbi_d_check(deps) {
@@ -634,6 +619,14 @@ function cbi_init() {
node.getAttribute('data-type'));
}
+ document.querySelectorAll('.cbi-dropdown').forEach(function(s) {
+ cbi_dropdown_init(s);
+ });
+
+ document.querySelectorAll('.cbi-tooltip:not(:empty)').forEach(function(s) {
+ s.parentNode.classList.add('cbi-tooltip-container');
+ });
+
cbi_d_update();
}
@@ -1243,51 +1236,53 @@ function cbi_validate_field(cbid, optional, type)
function cbi_row_swap(elem, up, store)
{
- var tr = elem.parentNode;
- while (tr && tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
+ var tr = findParent(elem.parentNode, '.cbi-section-table-row');
if (!tr)
return false;
- var table = tr.parentNode;
- while (table && table.nodeName.toLowerCase() != 'table')
- table = table.parentNode;
+ tr.classList.remove('flash');
- if (!table)
- return false;
+ if (up) {
+ var prev = tr.previousElementSibling;
- var s = up ? 3 : 2;
- var e = up ? table.rows.length : table.rows.length - 1;
-
- for (var idx = s; idx < e; idx++)
- {
- if (table.rows[idx] == tr)
- {
- if (up)
- tr.parentNode.insertBefore(table.rows[idx], table.rows[idx-1]);
- else
- tr.parentNode.insertBefore(table.rows[idx+1], table.rows[idx]);
+ if (prev && prev.classList.contains('cbi-section-table-row'))
+ tr.parentNode.insertBefore(tr, prev);
+ else
+ return;
+ }
+ else {
+ var next = tr.nextElementSibling ? tr.nextElementSibling.nextElementSibling : null;
- break;
- }
+ if (next && next.classList.contains('cbi-section-table-row'))
+ tr.parentNode.insertBefore(tr, next);
+ else if (!next)
+ tr.parentNode.appendChild(tr);
+ else
+ return;
}
var ids = [ ];
- for (idx = 2; idx < table.rows.length; idx++)
- {
- table.rows[idx].className = table.rows[idx].className.replace(
- /cbi-rowstyle-[12]/, 'cbi-rowstyle-' + (1 + (idx % 2))
- );
- if (table.rows[idx].id && table.rows[idx].id.match(/-([^\-]+)$/) )
- ids.push(RegExp.$1);
+ for (var i = 0, n = 0; i < tr.parentNode.childNodes.length; i++) {
+ var node = tr.parentNode.childNodes[i];
+ if (node.classList && node.classList.contains('cbi-section-table-row')) {
+ node.classList.remove('cbi-rowstyle-1');
+ node.classList.remove('cbi-rowstyle-2');
+ node.classList.add((n++ % 2) ? 'cbi-rowstyle-2' : 'cbi-rowstyle-1');
+
+ if (/-([^\-]+)$/.test(node.id))
+ ids.push(RegExp.$1);
+ }
}
var input = document.getElementById(store);
if (input)
input.value = ids.join(' ');
+ window.scrollTo(0, tr.offsetTop);
+ window.setTimeout(function() { tr.classList.add('flash'); }, 1);
+
return false;
}
@@ -1311,58 +1306,6 @@ function cbi_tag_last(container)
}
}
-String.prototype.serialize = function()
-{
- var o = this;
- switch(typeof(o))
- {
- case 'object':
- // null
- if( o == null )
- {
- return 'null';
- }
-
- // array
- else if( o.length )
- {
- var i, s = '';
-
- for( var i = 0; i < o.length; i++ )
- s += (s ? ', ' : '') + String.serialize(o[i]);
-
- return '[ ' + s + ' ]';
- }
-
- // object
- else
- {
- var k, s = '';
-
- for( k in o )
- s += (s ? ', ' : '') + k + ': ' + String.serialize(o[k]);
-
- return '{ ' + s + ' }';
- }
-
- break;
-
- case 'string':
- // complex string
- if( o.match(/[^a-zA-Z0-9_,.: -]/) )
- return 'decodeURIComponent("' + encodeURIComponent(o) + '")';
-
- // simple string
- else
- return '"' + o + '"';
-
- break;
-
- default:
- return o.toString();
- }
-}
-
String.prototype.format = function()
{
if (!RegExp)
@@ -1473,10 +1416,6 @@ String.prototype.format = function()
subst = esc(param, quot_esc);
break;
- case 'j':
- subst = String.serialize(param);
- break;
-
case 't':
var td = 0;
var th = 0;
@@ -1543,14 +1482,6 @@ String.prototype.nobr = function()
return this.replace(/[\s\n]+/g, '&#160;');
}
-String.serialize = function()
-{
- var a = [ ];
- for (var i = 1; i < arguments.length; i++)
- a.push(arguments[i]);
- return ''.serialize.apply(arguments[0], a);
-}
-
String.format = function()
{
var a = [ ];
@@ -1566,3 +1497,631 @@ String.nobr = function()
a.push(arguments[i]);
return ''.nobr.apply(arguments[0], a);
}
+
+
+var dummyElem, domParser;
+
+function isElem(e)
+{
+ return (typeof(e) === 'object' && e !== null && 'nodeType' in e);
+}
+
+function toElem(s)
+{
+ var elem;
+
+ try {
+ domParser = domParser || new DOMParser();
+ elem = domParser.parseFromString(s, 'text/html').body.firstChild;
+ }
+ catch(e) {}
+
+ if (!elem) {
+ try {
+ dummyElem = dummyElem || document.createElement('div');
+ dummyElem.innerHTML = s;
+ elem = dummyElem.firstChild;
+ }
+ catch (e) {}
+ }
+
+ return elem || null;
+}
+
+function findParent(node, selector)
+{
+ while (node)
+ if (node.msMatchesSelector && node.msMatchesSelector(selector))
+ return node;
+ else if (node.matches && node.matches(selector))
+ return node;
+ else
+ node = node.parentNode;
+
+ return null;
+}
+
+function E()
+{
+ var html = arguments[0],
+ attr = (arguments[1] instanceof Object && !Array.isArray(arguments[1])) ? arguments[1] : null,
+ data = attr ? arguments[2] : arguments[1],
+ elem;
+
+ if (isElem(html))
+ elem = html;
+ else if (html.charCodeAt(0) === 60)
+ elem = toElem(html);
+ else
+ elem = document.createElement(html);
+
+ if (!elem)
+ return null;
+
+ if (attr)
+ for (var key in attr)
+ if (attr.hasOwnProperty(key) && attr[key] !== null && attr[key] !== undefined)
+ elem.setAttribute(key, attr[key]);
+
+ if (typeof(data) === 'function')
+ data = data(elem);
+
+ if (isElem(data)) {
+ elem.appendChild(data);
+ }
+ else if (Array.isArray(data)) {
+ for (var i = 0; i < data.length; i++)
+ if (isElem(data[i]))
+ elem.appendChild(data[i]);
+ else
+ elem.appendChild(document.createTextNode('' + data[i]));
+ }
+ else if (data !== null && data !== undefined) {
+ elem.innerHTML = '' + data;
+ }
+
+ return elem;
+}
+
+if (typeof(window.CustomEvent) !== 'function') {
+ function CustomEvent(event, params) {
+ params = params || { bubbles: false, cancelable: false, detail: undefined };
+ var evt = document.createEvent('CustomEvent');
+ evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
+ return evt;
+ }
+
+ CustomEvent.prototype = window.Event.prototype;
+ window.CustomEvent = CustomEvent;
+}
+
+CBIDropdown = {
+ openDropdown: function(sb) {
+ var st = window.getComputedStyle(sb, null),
+ ul = sb.querySelector('ul'),
+ li = ul.querySelectorAll('li'),
+ sel = ul.querySelector('[selected]'),
+ rect = sb.getBoundingClientRect(),
+ h = sb.clientHeight - parseFloat(st.paddingTop) - parseFloat(st.paddingBottom),
+ mh = this.dropdown_items * h,
+ eh = Math.min(mh, li.length * h);
+
+ document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+ s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+ });
+
+ ul.style.maxHeight = mh + 'px';
+ sb.setAttribute('open', '');
+
+ ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
+ ul.querySelectorAll('[selected] input[type="checkbox"]').forEach(function(c) {
+ c.checked = true;
+ });
+
+ ul.style.top = ul.style.bottom = '';
+ ul.style[((sb.getBoundingClientRect().top + eh) > window.innerHeight) ? 'bottom' : 'top'] = rect.height + 'px';
+ ul.classList.add('dropdown');
+
+ var pv = ul.cloneNode(true);
+ pv.classList.remove('dropdown');
+ pv.classList.add('preview');
+
+ sb.insertBefore(pv, ul.nextElementSibling);
+
+ li.forEach(function(l) {
+ l.setAttribute('tabindex', 0);
+ });
+
+ sb.lastElementChild.setAttribute('tabindex', 0);
+
+ this.setFocus(sb, sel || li[0], true);
+ },
+
+ closeDropdown: function(sb, no_focus) {
+ if (!sb.hasAttribute('open'))
+ return;
+
+ var pv = sb.querySelector('ul.preview'),
+ ul = sb.querySelector('ul.dropdown'),
+ li = ul.querySelectorAll('li');
+
+ li.forEach(function(l) { l.removeAttribute('tabindex'); });
+ sb.lastElementChild.removeAttribute('tabindex');
+
+ sb.removeChild(pv);
+ sb.removeAttribute('open');
+ sb.style.width = sb.style.height = '';
+
+ ul.classList.remove('dropdown');
+
+ if (!no_focus)
+ this.setFocus(sb, sb);
+
+ this.saveValues(sb, ul);
+ },
+
+ toggleItem: function(sb, li, force_state) {
+ if (li.hasAttribute('unselectable'))
+ return;
+
+ if (this.multi) {
+ var cbox = li.querySelector('input[type="checkbox"]'),
+ items = li.parentNode.querySelectorAll('li'),
+ label = sb.querySelector('ul.preview'),
+ sel = li.parentNode.querySelectorAll('[selected]').length,
+ more = sb.querySelector('.more'),
+ ndisplay = this.display_items,
+ n = 0;
+
+ if (li.hasAttribute('selected')) {
+ if (force_state !== true) {
+ if (sel > 1 || this.optional) {
+ li.removeAttribute('selected');
+ cbox.checked = cbox.disabled = false;
+ sel--;
+ }
+ else {
+ cbox.disabled = true;
+ }
+ }
+ }
+ else {
+ if (force_state !== false) {
+ li.setAttribute('selected', '');
+ cbox.checked = true;
+ cbox.disabled = false;
+ sel++;
+ }
+ }
+
+ while (label.firstElementChild)
+ label.removeChild(label.firstElementChild);
+
+ for (var i = 0; i < items.length; i++) {
+ items[i].removeAttribute('display');
+ if (items[i].hasAttribute('selected')) {
+ if (ndisplay-- > 0) {
+ items[i].setAttribute('display', n++);
+ label.appendChild(items[i].cloneNode(true));
+ }
+ var c = items[i].querySelector('input[type="checkbox"]');
+ if (c)
+ c.disabled = (sel == 1 && !this.optional);
+ }
+ }
+
+ if (ndisplay < 0)
+ sb.setAttribute('more', '');
+ else
+ sb.removeAttribute('more');
+
+ if (ndisplay === this.display_items)
+ sb.setAttribute('empty', '');
+ else
+ sb.removeAttribute('empty');
+
+ more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
+ }
+ else {
+ var sel = li.parentNode.querySelector('[selected]');
+ if (sel) {
+ sel.removeAttribute('display');
+ sel.removeAttribute('selected');
+ }
+
+ li.setAttribute('display', 0);
+ li.setAttribute('selected', '');
+
+ this.closeDropdown(sb, true);
+ }
+
+ this.saveValues(sb, li.parentNode);
+ },
+
+ transformItem: function(sb, li) {
+ var cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' })),
+ label = E('label');
+
+ while (li.firstChild)
+ label.appendChild(li.firstChild);
+
+ li.appendChild(cbox);
+ li.appendChild(label);
+ },
+
+ saveValues: function(sb, ul) {
+ var sel = ul.querySelectorAll('[selected]'),
+ div = sb.lastElementChild;
+
+ while (div.lastElementChild)
+ div.removeChild(div.lastElementChild);
+
+ sel.forEach(function (s) {
+ div.appendChild(E('input', {
+ type: 'hidden',
+ name: s.hasAttribute('name') ? s.getAttribute('name') : (sb.getAttribute('name') || ''),
+ value: s.hasAttribute('value') ? s.getAttribute('value') : s.innerText
+ }));
+ });
+
+ cbi_d_update();
+ },
+
+ setFocus: function(sb, elem, scroll) {
+ if (sb && sb.hasAttribute && sb.hasAttribute('locked-in'))
+ return;
+
+ document.querySelectorAll('.focus').forEach(function(e) {
+ if (e.nodeName.toLowerCase() !== 'input') {
+ e.classList.remove('focus');
+ e.blur();
+ }
+ });
+
+ if (elem) {
+ elem.focus();
+ elem.classList.add('focus');
+
+ if (scroll)
+ elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop;
+ }
+ },
+
+ createItems: function(sb, value) {
+ var sbox = this,
+ val = (value || '').trim().split(/\s+/),
+ ul = sb.querySelector('ul');
+
+ if (!sbox.multi)
+ val.length = Math.min(val.length, 1);
+
+ val.forEach(function(item) {
+ var new_item = null;
+
+ ul.childNodes.forEach(function(li) {
+ if (li.getAttribute && li.getAttribute('value') === item)
+ new_item = li;
+ });
+
+ if (!new_item) {
+ var markup,
+ tpl = sb.querySelector(sbox.template);
+
+ if (tpl)
+ markup = (tpl.textContent || tpl.innerHTML || tpl.firstChild.data).replace(/^<!--|-->$/, '').trim();
+ else
+ markup = '<li value="{{value}}">{{value}}</li>';
+
+ new_item = E(markup.replace(/{{value}}/g, item));
+
+ if (sbox.multi) {
+ sbox.transformItem(sb, new_item);
+ }
+ else {
+ var old = ul.querySelector('li[created]');
+ if (old)
+ ul.removeChild(old);
+
+ new_item.setAttribute('created', '');
+ }
+
+ new_item = ul.insertBefore(new_item, ul.lastElementChild);
+ }
+
+ sbox.toggleItem(sb, new_item, true);
+ sbox.setFocus(sb, new_item, true);
+ });
+ },
+
+ closeAllDropdowns: function() {
+ document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+ s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+ });
+ }
+};
+
+function cbi_dropdown_init(sb) {
+ if (!(this instanceof cbi_dropdown_init))
+ return new cbi_dropdown_init(sb);
+
+ this.multi = sb.hasAttribute('multiple');
+ this.optional = sb.hasAttribute('optional');
+ this.placeholder = sb.getAttribute('placeholder') || '---';
+ this.display_items = parseInt(sb.getAttribute('display-items') || 3);
+ this.dropdown_items = parseInt(sb.getAttribute('dropdown-items') || 5);
+ this.create = sb.getAttribute('item-create') || '.create-item-input';
+ this.template = sb.getAttribute('item-template') || 'script[type="item-template"]';
+
+ var sbox = this,
+ ul = sb.querySelector('ul'),
+ items = ul.querySelectorAll('li'),
+ more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···')),
+ open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, 'â–¾')),
+ canary = sb.appendChild(E('div')),
+ create = sb.querySelector(this.create),
+ ndisplay = this.display_items,
+ n = 0;
+
+ if (this.multi) {
+ for (var i = 0; i < items.length; i++) {
+ sbox.transformItem(sb, items[i]);
+
+ if (items[i].hasAttribute('selected') && ndisplay-- > 0)
+ items[i].setAttribute('display', n++);
+ }
+ }
+ else {
+ var sel = sb.querySelectorAll('[selected]');
+
+ sel.forEach(function(s) {
+ s.removeAttribute('selected');
+ });
+
+ var s = sel[0] || items[0];
+ if (s) {
+ s.setAttribute('selected', '');
+ s.setAttribute('display', n++);
+ }
+
+ ndisplay--;
+
+ if (this.optional && !ul.querySelector('li[value=""]')) {
+ var placeholder = E('li', { placeholder: '' }, this.placeholder);
+ ul.firstChild ? ul.insertBefore(placeholder, ul.firstChild) : ul.appendChild(placeholder);
+ }
+ }
+
+ sbox.saveValues(sb, ul);
+
+ ul.setAttribute('tabindex', -1);
+ sb.setAttribute('tabindex', 0);
+
+ if (ndisplay < 0)
+ sb.setAttribute('more', '')
+ else
+ sb.removeAttribute('more');
+
+ if (ndisplay === this.display_items)
+ sb.setAttribute('empty', '')
+ else
+ sb.removeAttribute('empty');
+
+ more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
+
+
+ sb.addEventListener('click', function(ev) {
+ if (!this.hasAttribute('open')) {
+ if (ev.target.nodeName.toLowerCase() !== 'input')
+ sbox.openDropdown(this);
+ }
+ else {
+ var li = findParent(ev.target, 'li');
+ if (li && li.parentNode.classList.contains('dropdown'))
+ sbox.toggleItem(this, li);
+ }
+
+ ev.preventDefault();
+ ev.stopPropagation();
+ });
+
+ sb.addEventListener('keydown', function(ev) {
+ if (ev.target.nodeName.toLowerCase() === 'input')
+ return;
+
+ if (!this.hasAttribute('open')) {
+ switch (ev.keyCode) {
+ case 37:
+ case 38:
+ case 39:
+ case 40:
+ sbox.openDropdown(this);
+ ev.preventDefault();
+ }
+ }
+ else
+ {
+ var active = findParent(document.activeElement, 'li');
+
+ switch (ev.keyCode) {
+ case 27:
+ sbox.closeDropdown(this);
+ break;
+
+ case 13:
+ if (active) {
+ if (!active.hasAttribute('selected'))
+ sbox.toggleItem(this, active);
+ sbox.closeDropdown(this);
+ ev.preventDefault();
+ }
+ break;
+
+ case 32:
+ if (active) {
+ sbox.toggleItem(this, active);
+ ev.preventDefault();
+ }
+ break;
+
+ case 38:
+ if (active && active.previousElementSibling) {
+ sbox.setFocus(this, active.previousElementSibling);
+ ev.preventDefault();
+ }
+ break;
+
+ case 40:
+ if (active && active.nextElementSibling) {
+ sbox.setFocus(this, active.nextElementSibling);
+ ev.preventDefault();
+ }
+ break;
+ }
+ }
+ });
+
+ sb.addEventListener('cbi-dropdown-close', function(ev) {
+ sbox.closeDropdown(this, true);
+ });
+
+ if ('ontouchstart' in window) {
+ sb.addEventListener('touchstart', function(ev) { ev.stopPropagation(); });
+ window.addEventListener('touchstart', sbox.closeAllDropdowns);
+ }
+ else {
+ sb.addEventListener('mouseover', function(ev) {
+ if (!this.hasAttribute('open'))
+ return;
+
+ var li = findParent(ev.target, 'li');
+ if (li) {
+ if (li.parentNode.classList.contains('dropdown'))
+ sbox.setFocus(this, li);
+
+ ev.stopPropagation();
+ }
+ });
+
+ sb.addEventListener('focus', function(ev) {
+ document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+ if (s !== this || this.hasAttribute('open'))
+ s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+ });
+ });
+
+ canary.addEventListener('focus', function(ev) {
+ sbox.closeDropdown(this.parentNode);
+ });
+
+ window.addEventListener('mouseover', sbox.setFocus);
+ window.addEventListener('click', sbox.closeAllDropdowns);
+ }
+
+ if (create) {
+ create.addEventListener('keydown', function(ev) {
+ switch (ev.keyCode) {
+ case 13:
+ sbox.createItems(sb, this.value);
+ ev.preventDefault();
+ this.value = '';
+ this.blur();
+ break;
+ }
+ });
+
+ create.addEventListener('focus', function(ev) {
+ var cbox = findParent(this, 'li').querySelector('input[type="checkbox"]');
+ if (cbox) cbox.checked = true;
+ sb.setAttribute('locked-in', '');
+ });
+
+ create.addEventListener('blur', function(ev) {
+ var cbox = findParent(this, 'li').querySelector('input[type="checkbox"]');
+ if (cbox) cbox.checked = false;
+ sb.removeAttribute('locked-in');
+ });
+
+ var li = findParent(create, 'li');
+
+ li.setAttribute('unselectable', '');
+ li.addEventListener('click', function(ev) {
+ this.querySelector(sbox.create).focus();
+ });
+ }
+}
+
+cbi_dropdown_init.prototype = CBIDropdown;
+
+function cbi_update_table(table, data, placeholder) {
+ target = isElem(table) ? table : document.querySelector(table);
+
+ if (!isElem(target))
+ return;
+
+ target.querySelectorAll('.tr.table-titles, .cbi-section-table-titles').forEach(function(thead) {
+ var titles = [];
+
+ thead.querySelectorAll('.th').forEach(function(th) {
+ titles.push(th);
+ });
+
+ if (Array.isArray(data)) {
+ var n = 0, rows = target.querySelectorAll('.tr');
+
+ data.forEach(function(row) {
+ var trow = E('div', { 'class': 'tr' });
+
+ for (var i = 0; i < titles.length; i++) {
+ var text = titles[i].innerText;
+ var td = trow.appendChild(E('div', {
+ 'class': titles[i].className,
+ 'data-title': text ? text.trim() : null
+ }, row[i] || ''));
+
+ td.classList.remove('th');
+ td.classList.add('td');
+ }
+
+ trow.classList.add('cbi-rowstyle-%d'.format((n++ % 2) ? 2 : 1));
+
+ if (rows[n])
+ target.replaceChild(trow, rows[n]);
+ else
+ target.appendChild(trow);
+ });
+
+ while (rows[++n])
+ target.removeChild(rows[n]);
+
+ if (placeholder && target.firstElementChild === target.lastElementChild) {
+ var trow = target.appendChild(E('div', { 'class': 'tr placeholder' }));
+ var td = trow.appendChild(E('div', { 'class': titles[0].className }, placeholder));
+
+ td.classList.remove('th');
+ td.classList.add('td');
+ }
+ }
+ else {
+ thead.parentNode.style.display = 'none';
+
+ thead.parentNode.querySelectorAll('.tr, .cbi-section-table-row').forEach(function(trow) {
+ if (trow !== thead) {
+ var n = 0;
+ trow.querySelectorAll('.th, .td').forEach(function(td) {
+ if (n < titles.length) {
+ var text = (titles[n++].innerText || '').trim();
+ if (text !== '')
+ td.setAttribute('data-title', text);
+ }
+ });
+ }
+ });
+
+ thead.parentNode.style.display = '';
+ }
+ });
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+ document.querySelectorAll('.table').forEach(cbi_update_table);
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/xhr.js b/modules/luci-base/htdocs/luci-static/resources/xhr.js
index de4476cdd3..f1537a4481 100644
--- a/modules/luci-base/htdocs/luci-static/resources/xhr.js
+++ b/modules/luci-base/htdocs/luci-static/resources/xhr.js
@@ -204,7 +204,6 @@ XHR.poll = function(interval, url, data, callback, post)
};
XHR._q.push(e);
- XHR.run();
return e;
}
@@ -260,3 +259,5 @@ XHR.running = function()
{
return !!(XHR._r && XHR._i);
}
+
+document.addEventListener('DOMContentLoaded', XHR.run);
diff --git a/modules/luci-base/luasrc/cbi.lua b/modules/luci-base/luasrc/cbi.lua
index 4728642118..d275c5b275 100644
--- a/modules/luci-base/luasrc/cbi.lua
+++ b/modules/luci-base/luasrc/cbi.lua
@@ -1226,13 +1226,14 @@ function TypedSection.parse(self, novld)
local stval = RESORT_PREFIX .. self.config .. "." .. self.sectiontype
local order = self.map:formvalue(stval)
if order and #order > 0 then
- local sid
- local num = 0
+ local sids, sid = { }, nil
for sid in util.imatch(order) do
- self.map.uci:reorder(self.config, sid, num)
- num = num + 1
+ sids[#sids+1] = sid
+ end
+ if #sids > 0 then
+ self.map.uci:reorder(self.config, sids)
+ self.changed = true
end
- self.changed = (num > 0)
end
end
@@ -1416,6 +1417,12 @@ function AbstractValue.parse(self, section, novld)
self:add_error(section, "invalid", val_err)
end
+ if self.alias then
+ self.section.aliased = self.section.aliased or {}
+ self.section.aliased[section] = self.section.aliased[section] or {}
+ self.section.aliased[section][self.alias] = true
+ end
+
if fvalue and (self.forcewrite or not (fvalue == cvalue)) then
if self:write(section, fvalue) then
-- Push events
@@ -1425,10 +1432,16 @@ function AbstractValue.parse(self, section, novld)
end
else -- Unset the UCI or error
if self.rmempty or self.optional then
- if self:remove(section) then
- -- Push events
- self.section.changed = true
- --luci.util.append(self.map.events, self.events)
+ if not self.alias or
+ not self.section.aliased or
+ not self.section.aliased[section] or
+ not self.section.aliased[section][self.alias]
+ then
+ if self:remove(section) then
+ -- Push events
+ self.section.changed = true
+ --luci.util.append(self.map.events, self.events)
+ end
end
elseif cvalue ~= fvalue and not novld then
-- trigger validator with nil value to get custom user error msg.
@@ -1454,7 +1467,7 @@ function AbstractValue.cfgvalue(self, section)
if self.tag_error[section] then
value = self:formvalue(section)
else
- value = self.map:get(section, self.option)
+ value = self.map:get(section, self.alias or self.option)
end
if not value then
@@ -1495,12 +1508,12 @@ AbstractValue.transform = AbstractValue.validate
-- Write to UCI
function AbstractValue.write(self, section, value)
- return self.map:set(section, self.option, value)
+ return self.map:set(section, self.alias or self.option, value)
end
-- Remove from UCI
function AbstractValue.remove(self, section)
- return self.map:del(section, self.option)
+ return self.map:del(section, self.alias or self.option)
end
@@ -1833,6 +1846,15 @@ function DynamicList.formvalue(self, section)
end
+DropDown = class(MultiValue)
+
+function DropDown.__init__(self, ...)
+ ListValue.__init__(self, ...)
+ self.template = "cbi/dropdown"
+ self.delimiter = " "
+end
+
+
--[[
TextValue - A multi-line value
rows: Rows
diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua
index 45e1e308f8..6850d7e3a9 100644
--- a/modules/luci-base/luasrc/dispatcher.lua
+++ b/modules/luci-base/luasrc/dispatcher.lua
@@ -358,7 +358,7 @@ function dispatch(request)
elseif key == "REQUEST_URI" then
return build_url(unpack(ctx.requestpath))
elseif key == "FULL_REQUEST_URI" then
- local url = { http.getenv("SCRIPT_NAME"), http.getenv("PATH_INFO") }
+ local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") }
local query = http.getenv("QUERY_STRING")
if query and #query > 0 then
url[#url+1] = "?"
@@ -507,10 +507,11 @@ function dispatch(request)
else
ok, err = util.copcall(target, unpack(args))
end
- assert(ok,
- "Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
- " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
- "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
+ if not ok then
+ error500("Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
+ " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
+ "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
+ end
else
local root = node()
if not root or not root.target then
diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua
index 461ba9d5a3..92c0d8f699 100644
--- a/modules/luci-base/luasrc/model/uci.lua
+++ b/modules/luci-base/luasrc/model/uci.lua
@@ -8,7 +8,7 @@ local table = require "table"
local setmetatable, rawget, rawset = setmetatable, rawget, rawset
local require, getmetatable, assert = require, getmetatable, assert
-local error, pairs, ipairs = error, pairs, ipairs
+local error, pairs, ipairs, select = error, pairs, ipairs, select
local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
-- The typical workflow for UCI is: Get a cursor instance from the
@@ -106,7 +106,7 @@ function changes(self, config)
local _, change
for _, change in ipairs(changes) do
local operation, section, option, value = unpack(change)
- if option and value and operation ~= "add" then
+ if option and operation ~= "add" then
res[package][section] = res[package][section] or { }
if operation == "list-add" then
@@ -373,15 +373,15 @@ function add(self, config, stype)
return self:section(config, stype)
end
-function set(self, config, section, option, value)
- if value == nil then
+function set(self, config, section, option, ...)
+ if select('#', ...) == 0 then
local sname, err = self:section(config, option, section)
return (not not sname), err
else
local _, err = call("set", {
config = config,
section = section,
- values = { [option] = value }
+ values = { [option] = select(1, ...) }
})
return (err == nil), ERRSTR[err]
end
diff --git a/modules/luci-base/luasrc/tools/status.lua b/modules/luci-base/luasrc/tools/status.lua
index 06a9ad4154..635995310f 100644
--- a/modules/luci-base/luasrc/tools/status.lua
+++ b/modules/luci-base/luasrc/tools/status.lua
@@ -6,9 +6,25 @@ module("luci.tools.status", package.seeall)
local uci = require "luci.model.uci".cursor()
local ipc = require "luci.ip"
+local function duid_to_mac(duid)
+ local b1, b2, b3, b4, b5, b6
+
+ -- DUID-LLT / Ethernet
+ if type(duid) == "string" and #duid == 28 then
+ b1, b2, b3, b4, b5, b6 = duid:match("^00010001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)%x%x%x%x%x%x%x%x$")
+
+ -- DUID-LL / Ethernet
+ elseif type(duid) == "string" and #duid == 20 then
+ b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
+ end
+
+ return b1 and ipc.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":"))
+end
+
local function dhcp_leases_common(family)
local rv = { }
local nfs = require "nixio.fs"
+ local sys = require "luci.sys"
local leasefile = "/tmp/dhcp.leases"
uci:foreach("dhcp", "dnsmasq",
@@ -87,6 +103,22 @@ local function dhcp_leases_common(family)
fd:close()
end
+ if family == 6 then
+ local _, lease
+ local hosts = sys.net.host_hints()
+ for _, lease in ipairs(rv) do
+ local mac = duid_to_mac(lease.duid)
+ local host = mac and hosts[mac]
+ if host then
+ if not lease.name then
+ lease.host_hint = host.name or host.ipv4 or host.ipv6
+ elseif host.name and lease.hostname ~= host.name then
+ lease.host_hint = host.name
+ end
+ end
+ end
+ end
+
return rv
end
@@ -113,6 +145,11 @@ function wifi_networks()
local net
for _, net in ipairs(dev:get_wifinets()) do
+ local a, an = nil, 0
+ for _, a in pairs(net:assoclist() or {}) do
+ an = an + 1
+ end
+
rd.networks[#rd.networks+1] = {
name = net:shortname(),
link = net:adminlink(),
@@ -128,10 +165,10 @@ function wifi_networks()
noise = net:noise(),
bitrate = net:bitrate(),
ifname = net:ifname(),
- assoclist = net:assoclist(),
country = net:country(),
txpower = net:txpower(),
txpoweroff = net:txpower_offset(),
+ num_assoc = an,
disabled = (dev:get("disabled") == "1" or
net:get("disabled") == "1")
}
@@ -165,7 +202,6 @@ function wifi_network(id)
noise = net:noise(),
bitrate = net:bitrate(),
ifname = net:ifname(),
- assoclist = net:assoclist(),
country = net:country(),
txpower = net:txpower(),
txpoweroff = net:txpower_offset(),
@@ -182,6 +218,52 @@ function wifi_network(id)
return { }
end
+function wifi_assoclist()
+ local sys = require "luci.sys"
+ local ntm = require "luci.model.network".init()
+ local hosts = sys.net.host_hints()
+
+ local assoc = {}
+ local _, dev, net, bss
+
+ for _, dev in ipairs(ntm:get_wifidevs()) do
+ local radioname = dev:get_i18n()
+
+ for _, net in ipairs(dev:get_wifinets()) do
+ local netname = net:shortname()
+ local netlink = net:adminlink()
+ local ifname = net:ifname()
+
+ for _, bss in pairs(net:assoclist() or {}) do
+ local host = hosts[_]
+
+ bss.bssid = _
+ bss.ifname = ifname
+ bss.radio = radioname
+ bss.name = netname
+ bss.link = netlink
+
+ bss.host_name = (host) and (host.name or host.ipv4 or host.ipv6)
+ bss.host_hint = (host and host.name and (host.ipv4 or host.ipv6)) and (host.ipv4 or host.ipv6)
+
+ assoc[#assoc+1] = bss
+ end
+ end
+ end
+
+ table.sort(assoc, function(a, b)
+ if a.radio ~= b.radio then
+ return a.radio < b.radio
+ elseif a.ifname ~= b.ifname then
+ return a.ifname < b.ifname
+ else
+ return a.bssid < b.bssid
+ end
+ end)
+
+ return assoc
+end
+
function switch_status(devs)
local dev
local switches = { }
diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua
index ce42af2fb0..10428b0b35 100644
--- a/modules/luci-base/luasrc/util.lua
+++ b/modules/luci-base/luasrc/util.lua
@@ -100,6 +100,8 @@ end
-- Scope manipulation routines
--
+coxpt = setmetatable({}, { __mode = "kv" })
+
local tl_meta = {
__mode = "k",
@@ -697,73 +699,69 @@ function checklib(fullpathexe, wantedlib)
return false
end
+-------------------------------------------------------------------------------
+-- Coroutine safe xpcall and pcall versions
--
--- Coroutine safe xpcall and pcall versions modified for Luci
--- original version:
--- coxpcall 1.13 - Copyright 2005 - Kepler Project (www.keplerproject.org)
+-- Encapsulates the protected calls with a coroutine based loop, so errors can
+-- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
+-- yielding inside the call to pcall or xpcall.
--
--- Copyright © 2005 Kepler Project.
--- Permission is hereby granted, free of charge, to any person obtaining a
--- copy of this software and associated documentation files (the "Software"),
--- to deal in the Software without restriction, including without limitation
--- the rights to use, copy, modify, merge, publish, distribute, sublicense,
--- and/or sell copies of the Software, and to permit persons to whom the
--- Software is furnished to do so, subject to the following conditions:
+-- Authors: Roberto Ierusalimschy and Andre Carregal
+-- Contributors: Thomas Harning Jr., Ignacio Burgueño, Fabio Mascarenhas
--
--- The above copyright notice and this permission notice shall be
--- included in all copies or substantial portions of the Software.
+-- Copyright 2005 - Kepler Project
--
--- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
--- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
--- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
--- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
--- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
--- OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-local performResume, handleReturnValue
-local oldpcall, oldxpcall = pcall, xpcall
-coxpt = {}
-setmetatable(coxpt, {__mode = "kv"})
-
--- Identity function for copcall
-local function copcall_id(trace, ...)
- return ...
-end
-
--- values of either the function or the error handler
-function coxpcall(f, err, ...)
- local res, co = oldpcall(coroutine.create, f)
- if not res then
- local params = {...}
- local newf = function() return f(unpack(params)) end
- co = coroutine.create(newf)
- end
- local c = coroutine.running()
- coxpt[co] = coxpt[c] or c or 0
+-- $Id: coxpcall.lua,v 1.13 2008/05/19 19:20:02 mascarenhas Exp $
+-------------------------------------------------------------------------------
- return performResume(err, co, ...)
-end
-
--- values of the function or the error object
-function copcall(f, ...)
- return coxpcall(f, copcall_id, ...)
-end
+-------------------------------------------------------------------------------
+-- Implements xpcall with coroutines
+-------------------------------------------------------------------------------
+local coromap = setmetatable({}, { __mode = "k" })
--- Handle return value of protected call
-function handleReturnValue(err, co, status, ...)
+local function handleReturnValue(err, co, status, ...)
if not status then
return false, err(debug.traceback(co, (...)), ...)
end
-
- if coroutine.status(co) ~= 'suspended' then
+ if coroutine.status(co) == 'suspended' then
+ return performResume(err, co, coroutine.yield(...))
+ else
return true, ...
end
-
- return performResume(err, co, coroutine.yield(...))
end
--- Resume execution of protected function call
function performResume(err, co, ...)
return handleReturnValue(err, co, coroutine.resume(co, ...))
end
+
+local function id(trace, ...)
+ return trace
+end
+
+function coxpcall(f, err, ...)
+ local current = coroutine.running()
+ if not current then
+ if err == id then
+ return pcall(f, ...)
+ else
+ if select("#", ...) > 0 then
+ local oldf, params = f, { ... }
+ f = function() return oldf(unpack(params)) end
+ end
+ return xpcall(f, err)
+ end
+ else
+ local res, co = pcall(coroutine.create, f)
+ if not res then
+ local newf = function(...) return f(...) end
+ co = coroutine.create(newf)
+ end
+ coromap[co] = current
+ coxpt[co] = coxpt[current] or current or 0
+ return performResume(err, co, ...)
+ end
+end
+
+function copcall(f, ...)
+ return coxpcall(f, id, ...)
+end
diff --git a/modules/luci-base/luasrc/view/cbi/apply_widget.htm b/modules/luci-base/luasrc/view/cbi/apply_widget.htm
index 543ef0b80b..e3090da656 100644
--- a/modules/luci-base/luasrc/view/cbi/apply_widget.htm
+++ b/modules/luci-base/luasrc/view/cbi/apply_widget.htm
@@ -1,59 +1,98 @@
<% export("cbi_apply_widget", function(redirect_ok) -%>
<style type="text/css">
- #cbi_apply_status {
+ .alert-message.notice {
+ background: linear-gradient(#fff 0%, #eee 100%);
+ }
+
+ #cbi_apply_overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ background: rgba(0, 0, 0, 0.7);
+ display: none;
+ z-index: 20000;
+ }
+
+ #cbi_apply_overlay .alert-message {
+ position: relative;
+ top: 10%;
+ width: 60%;
+ margin: auto;
display: flex;
flex-wrap: wrap;
min-height: 32px;
align-items: center;
- margin: 1.5em 0 1.5em 0;
}
- #cbi_apply_status > h4,
- #cbi_apply_status > p,
- #cbi_apply_status > div {
+ #cbi_apply_overlay .alert-message > h4,
+ #cbi_apply_overlay .alert-message > p,
+ #cbi_apply_overlay .alert-message > div {
flex-basis: 100%;
}
- #cbi_apply_status > img {
+ #cbi_apply_overlay .alert-message > img {
margin-right: 1em;
flex-basis: 32px;
}
- #cbi_apply_status + script + .cbi-section {
- margin-top: -1em;
+ body.apply-overlay-active {
+ overflow: hidden;
+ height: 100vh;
}
- .alert-message.notice {
- background: linear-gradient(#fff 0%, #eee 100%);
+ body.apply-overlay-active #cbi_apply_overlay {
+ display: block;
}
</style>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript">//<![CDATA[
var xhr = new XHR(),
- stat, indicator,
uci_apply_auth = { sid: '<%=luci.dispatcher.context.authsession%>', token: '<%=token%>' },
uci_apply_rollback = <%=math.max(luci.config and luci.config.apply and luci.config.apply.rollback or 30, 30)%>,
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)%>;
+ function uci_status_message(type, content) {
+ var overlay = document.getElementById('cbi_apply_overlay') || document.body.appendChild(E('<div id="cbi_apply_overlay"><div class="alert-message"></div></div>')),
+ message = overlay.querySelector('.alert-message');
+
+ if (message && type) {
+ if (!message.classList.contains(type)) {
+ message.classList.remove('notice');
+ message.classList.remove('warning');
+ message.classList.add(type);
+ }
+
+ if (content)
+ message.innerHTML = content;
+
+ document.body.classList.add('apply-overlay-active');
+ }
+ else {
+ document.body.classList.remove('apply-overlay-active');
+ }
+ }
+
function uci_rollback(checked) {
if (checked) {
- stat.classList.remove('notice');
- stat.classList.add('warning');
- stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
- '<%:Failed to confirm apply within %ds, waiting for rollback…%>'.format(uci_apply_rollback);
+ uci_status_message('warning',
+ '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+ '<%:Failed to confirm apply within %ds, waiting for rollback…%>'.format(uci_apply_rollback));
var call = function(r) {
if (r.status === 204) {
- stat.innerHTML = '<h4><%:Configuration has been rolled back!%></h4>' +
+ uci_status_message('warning',
+ '<h4><%:Configuration has been rolled back!%></h4>' +
'<p><%:The device could not be reached within %d seconds after applying the pending changes, which caused the configuration to be rolled back for safety reasons. If you believe that the configuration changes are correct nonetheless, perform an unchecked configuration apply. Alternatively, you can dismiss this warning and edit changes before attempting to apply again, or revert all pending changes to keep the currently working configuration state.%></p>'.format(uci_apply_rollback) +
'<div class="right">' +
- '<input type="button" class="btn" onclick="this.parentNode.parentNode.style.display=\'none\'" value="<%:Dismiss%>" /> ' +
+ '<input type="button" class="btn" onclick="uci_status_message(false)" value="<%:Dismiss%>" /> ' +
'<input type="button" class="btn" onclick="uci_revert()" value="<%:Revert changes%>" /> ' +
'<input type="button" class="btn danger" onclick="uci_apply(false)" value="<%:Apply unchecked%>" />' +
- '</div>';
+ '</div>');
return;
}
@@ -64,10 +103,9 @@
call({ status: 0 });
}
else {
- stat.classList.remove('notice');
- stat.classList.add('warning');
- stat.innerHTML = '<h4><%:Device unreachable!%></h4>' +
- '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>';
+ uci_status_message('warning',
+ '<h4><%:Device unreachable!%></h4>' +
+ '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>');
}
}
@@ -75,12 +113,7 @@
var tt;
var ts = Date.now();
- stat = document.getElementById('cbi_apply_status');
- stat.style.display = '';
- stat.classList.remove('warning');
- stat.classList.add('notice');
-
- indicator = document.querySelector('.uci_change_indicator');
+ uci_status_message('notice');
var call = function(r) {
if (Date.now() >= deadline) {
@@ -88,15 +121,18 @@
return;
}
else if (r && (r.status === 200 || r.status === 204)) {
- if (indicator)
- indicator.style.display = 'none';
+ var indicator = document.querySelector('.uci_change_indicator');
+ if (indicator) indicator.style.display = 'none';
- stat.innerHTML = '<%:Configuration has been applied.%>';
+ uci_status_message('notice', '<%:Configuration has been applied.%>');
window.clearTimeout(tt);
window.setTimeout(function() {
- stat.style.display = 'none';
- <% if redirect_ok then %>location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');<% end %>
+ <% if redirect_ok then -%>
+ location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
+ <%- else -%>
+ window.location = window.location.href.split('#')[0];
+ <% end %>
}, uci_apply_display * 1000);
return;
@@ -108,8 +144,9 @@
var tick = function() {
var now = Date.now();
- stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
- '<%:Waiting for configuration to get applied… %ds%>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0));
+ uci_status_message('notice',
+ '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+ '<%:Waiting for configuration to get applied… %ds%>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0)));
if (now >= deadline)
return;
@@ -125,43 +162,39 @@
}
function uci_apply(checked) {
- stat = document.getElementById('cbi_apply_status');
- stat.style.display = '';
- stat.classList.remove('warning');
- stat.classList.add('notice');
- stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
- '<%:Starting configuration apply…%>';
+ uci_status_message('notice',
+ '<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) {
if (r.status === (checked ? 200 : 204)) {
uci_confirm(checked, Date.now() + uci_apply_rollback * 1000);
}
else if (checked && r.status === 204) {
- stat.innerHTML = '<%:There are no changes to apply.%>';
+ uci_status_message('notice', '<%:There are no changes to apply.%>');
window.setTimeout(function() {
- stat.style.display = 'none';
- <% if redirect_ok then %>location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');<% end %>
+ <% if redirect_ok then -%>
+ location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
+ <%- else -%>
+ uci_status_message(false);
+ <%- end %>
}, uci_apply_display * 1000);
}
else {
- stat.classList.add('warning');
- stat.classList.remove('notice');
- stat.innerHTML = '<%_Apply request failed with status <code>%h</code>%>'.format(r.responseText || r.statusText || r.status);
+ uci_status_message('warning', '<%_Apply request failed with status <code>%h</code>%>'.format(r.responseText || r.statusText || r.status));
+ window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
}
});
}
function uci_revert() {
- stat = document.getElementById('cbi_apply_status');
- stat.style.display = '';
- stat.classList.remove('warning');
- stat.classList.add('notice');
- stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
- '<%:Reverting configuration…%>';
+ uci_status_message('notice',
+ '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+ '<%:Reverting configuration…%>');
xhr.post('<%=url("admin/uci/revert")%>', uci_apply_auth, function(r) {
if (r.status === 200) {
- stat.innerHTML = '<%:Changes have been reverted.%>';
+ uci_status_message('notice', '<%:Changes have been reverted.%>');
window.setTimeout(function() {
<% if redirect_ok then -%>
location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
@@ -171,9 +204,8 @@
}, uci_apply_display * 1000);
}
else {
- stat.classList.add('warning');
- stat.classList.remove('notice');
- stat.innerHTML = '<%_Revert request failed with status <code>%h</code>%>'.format(r.statusText || r.status);
+ uci_status_message('warning', '<%_Revert request failed with status <code>%h</code>%>'.format(r.statusText || r.status));
+ window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
}
});
}
diff --git a/modules/luci-base/luasrc/view/cbi/button.htm b/modules/luci-base/luasrc/view/cbi/button.htm
index 30f8ddfda5..6ccba58f23 100644
--- a/modules/luci-base/luasrc/view/cbi/button.htm
+++ b/modules/luci-base/luasrc/view/cbi/button.htm
@@ -1,6 +1,6 @@
<%+cbi/valueheader%>
<% if self:cfgvalue(section) ~= false then %>
- <input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> />
+ <input class="cbi-button cbi-button-<%=self.inputstyle or "button" %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> />
<% else %>
-
<% end %>
diff --git a/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm b/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm
index 786ee43d10..bdd6bc9687 100644
--- a/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm
+++ b/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm
@@ -1,2 +1,2 @@
</div>
-</td>
+</div>
diff --git a/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm b/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
index 9c9c21814b..dbb0e1120b 100644
--- a/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
+++ b/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
@@ -1,2 +1,10 @@
-<td class="cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %>">
+<%-
+ local title = luci.util.trim(striptags(self.title))
+ local ftype = self.template and self.template:gsub("^.+/", "")
+-%>
+<div class="td cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %>"<%=
+ attr("data-name", self.option) ..
+ ifattr(ftype and #ftype > 0, "data-type", ftype) ..
+ ifattr(title and #title > 0, "data-title", title)
+%>>
<div id="cbi-<%=self.config.."-"..section.."-"..self.option%>" data-index="<%=self.index%>" data-depends="<%=pcdata(self:deplist2json(section))%>">
diff --git a/modules/luci-base/luasrc/view/cbi/dropdown.htm b/modules/luci-base/luasrc/view/cbi/dropdown.htm
new file mode 100644
index 0000000000..cf8c03d22c
--- /dev/null
+++ b/modules/luci-base/luasrc/view/cbi/dropdown.htm
@@ -0,0 +1,54 @@
+<%+cbi/valueheader%>
+
+<%-
+ local selected = { }
+
+ if self.multiple then
+ local val
+ for val in luci.util.imatch(self:cfgvalue(section)) do
+ selected[val] = true
+ end
+ else
+ selected[self:cfgvalue(section)] = true
+ end
+
+ if not next(selected) and self.default then
+ selected[self.default] = true
+ end
+-%>
+
+<div class="cbi-dropdown"<%=
+ attr("name", cbid) ..
+ attr("display-items", self.display or self.size or 3) ..
+ attr("dropdown-items", self.dropdown or self.display or self.size or 5) ..
+ attr("placeholder", self.placeholder or translate("-- please select --")) ..
+ ifattr(self.multiple, "multiple", "multiple") ..
+ ifattr(self.optional or self.rmempty, "optional", "optional")
+%>>
+ <ul>
+ <% local i, key; for i, key in pairs(self.keylist) do %>
+ <li<%=
+ attr("data-index", i) ..
+ attr("data-depends", self:deplist2json(section, self.deplist[i])) ..
+ attr("value", key) ..
+ ifattr(selected[key], "selected", "selected")
+ %>>
+ <%=pcdata(self.vallist[i])%>
+ </li>
+ <% end %>
+ <% if self.custom then %>
+ <li>
+ <input type="password" style="display:none" />
+ <input class="create-item-input" type="text"<%=
+ attr("placeholder", self.custom ~= true and
+ self.custom or
+ (self.multiple and
+ translate("Enter custom values") or
+ translate("Enter custom value")))
+ %> />
+ </li>
+ <% end %>
+ </ul>
+</div>
+
+<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm b/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
index 546fd8e85a..b38e4b13db 100644
--- a/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
+++ b/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
@@ -14,46 +14,59 @@
local def = fwm:get_defaults()
local zone = fwm:get_zone(value)
local empty = true
+
+ local function render_zone(zone)
+-%>
+ <label class="zonebadge" style="background-color:<%=zone:get_color()%>">
+ <strong><%=zone:name()%></strong>
+ <div class="cbi-tooltip">
+ <%-
+ local zempty = true
+ for _, net in ipairs(zone:get_networks()) do
+ net = nwm:get_network(net)
+ if net then
+ zempty = false
+ -%>
+ <span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:&#160;
+ <%
+ local nempty = true
+ for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
+ nempty = false
+ %>
+ <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+ <% end %>
+ <% if nempty then %><em><%:(empty)%></em><% end %>
+ </span>
+ <%- end end -%>
+ <% if zempty then %><span class="ifacebadge"><em><%:(empty)%></em></span><% end %>
+ </div>
+ </label>
+<%-
+ end
-%>
<% if zone then %>
-<div style="white-space:nowrap">
- <label class="zonebadge" style="background-color:<%=zone:get_color()%>">
- <strong><%=zone:name()%>:</strong>
- <%-
- local zempty = true
- for _, net in ipairs(zone:get_networks()) do
- net = nwm:get_network(net)
- if net then
- zempty = false
- -%>
- <span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:
- <%
- local nempty = true
- for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
- nempty = false
- %>
- <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
- <% end %>
- <% if nempty then %><em><%:(empty)%></em><% end %>
- </span>
- <%- end end -%>
- <%- if zempty then %><em><%:(empty)%></em><% end -%>
- </label>
- &#160;&#8658;&#160;
- <% for _, fwd in ipairs(zone:get_forwardings_by("src")) do
- fz = fwd:dest_zone()
- if fz then
- empty = false %>
- <label class="zonebadge" style="background-color:<%=fz:get_color()%>">
- <strong><%=fz:name()%></strong>
- </label>&#160;
- <% end end %>
- <% if empty then %>
+<div class="zone-forwards">
+ <div class="zone-src">
+ <%=render_zone(zone)%>
+ </div>
+ <span>&#8658;</span>
+ <div class="zone-dest">
+ <%
+ for _, fwd in ipairs(zone:get_forwardings_by("src")) do
+ fz = fwd:dest_zone()
+ if fz then
+ empty = false
+ render_zone(fz)
+ end
+ end
+ if empty then
+ %>
<label class="zonebadge zonebadge-empty">
<strong><%=zone:forward():upper()%></strong>
</label>
<% end %>
+ </div>
</div>
<% end %>
diff --git a/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm b/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
index b4260707ef..3a108020b6 100644
--- a/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
+++ b/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
@@ -24,26 +24,42 @@
end
-%>
-<span>
- <ul style="margin:0; list-style-type:none; text-align:left">
+<div class="cbi-dropdown" dropdown-items="5" placeholder="<%:-- please select -- %>"<%=
+ attr("name", cbid) ..
+ ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+ ifattr(self.rmempty or self.optional, "optional", "optional")
+%>>
+ <script type="item-template"><!--
+ <li value="{{value}}">
+ <span class="zonebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">
+ <strong>{{value}}:</strong><em>(<%:create%>)</em>
+ </span>
+ </li>
+ --></script>
+ <ul>
<% if self.allowlocal then %>
- <li style="padding:0.5em">
- <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_empty") .. attr("name", cbid) .. attr("value", "") .. ifattr(checked[""], "checked", "checked")%> /> &#160;
- <label<%=attr("for", cbid .. "_empty")%>></label>
- <label<%=attr("for", cbid .. "_empty")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
+ <li value=""<%=ifattr(checked[""], "selected", "selected")%>>
+ <span style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
<strong><%:Device%></strong>
- <% if self.allowany and self.allowlocal then %>(<%:input%>)<% end %>
- </label>
+ <% if self.allowany and self.allowlocal then -%>
+ (<%= self.alias ~= "dest"
+ and translate("output") or translate("input") %>)
+ <%- end %>
+ </span>
+ </li>
+ <% elseif self.widget ~= "checkbox" and (self.rmempty or self.optional) then %>
+ <li value=""<%=ifattr(checked[""], "selected", "selected")%>>
+ <span class="zonebadge">
+ <em><%:unspecified%></em>
+ </span>
</li>
<% end %>
<% if self.allowany then %>
- <li style="padding:0.5em">
- <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_any") .. attr("name", cbid) .. attr("value", "*") .. ifattr(checked["*"], "checked", "checked")%> /> &#160;
- <label<%=attr("for", cbid .. "_any")%>></label>
- <label<%=attr("for", cbid .. "_any")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
+ <li value="*"<%=ifattr(checked["*"], "selected", "selected")%>>
+ <span style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
<strong><%:Any zone%></strong>
<% if self.allowany and self.allowlocal then %>(<%:forward%>)<% end %>
- </label>
+ </span>
</li>
<% end %>
<%
@@ -51,45 +67,42 @@
if zone:name() ~= self.exclude then
selected = selected or (value == zone:name())
%>
- <li style="padding:0.5em">
- <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "." .. zone:name()) .. attr("name", cbid) .. attr("value", zone:name()) .. ifattr(checked[zone:name()], "checked", "checked")%> /> &#160;
- <label<%=attr("for", cbid .. "." .. zone:name())%>></label>
- <label<%=attr("for", cbid .. "." .. zone:name())%> style="background-color:<%=zone:get_color()%>" class="zonebadge">
+ <li<%=attr("value", zone:name()) .. ifattr(checked[zone:name()], "selected", "selected")%>>
+ <span style="background-color:<%=zone:get_color()%>" class="zonebadge">
<strong><%=zone:name()%>:</strong>
- <%
+ <%-
local zempty = true
for _, net in ipairs(zone:get_networks()) do
net = nwm:get_network(net)
if net then
zempty = false
- %>
+ -%>
<span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:
- <%
+ <%-
local nempty = true
for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
nempty = false
%>
- <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+ <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
<% end %>
- <% if nempty then %><em><%:(empty)%></em><% end %>
+ <% if nempty then %><em><%:(empty)%></em><% end -%>
</span>
- <% end end %>
- <% if zempty then %><em><%:(empty)%></em><% end %>
- </label>
+ <%- end end -%>
+ <%- if zempty then %><em><%:(empty)%></em><% end -%>
+ </span>
</li>
<% end end %>
<% if self.widget ~= "checkbox" and not self.nocreate then %>
- <li style="padding:0.5em">
- <input class="cbi-input-radio" data-update="click change" type="radio"<%=attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not selected, "checked", "checked")%> /> &#160;
- <label<%=attr("for", cbid .. "_new")%>></label>
- <div onclick="document.getElementById('<%=cbid%>_new').checked=true" class="zonebadge" style="background-color:<%=fwm.zone.get_color()%>">
- <em><%:unspecified -or- create:%>&#160;</em>
- <input type="text"<%=attr("name", cbid .. ".newzone") .. ifattr(not selected, "value", luci.http.formvalue(cbid .. ".newzone") or self.default)%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
- </div>
+ <li value="-">
+ <span class="zonebadge">
+ <em><%:create%>:</em>
+ <input type="password" style="display:none" />
+ <input class="create-item-input" type="text" />
+ </span>
</li>
<% end %>
</ul>
-</span>
+</div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/footer.htm b/modules/luci-base/luasrc/view/cbi/footer.htm
index e6acfb0697..5f939b6469 100644
--- a/modules/luci-base/luasrc/view/cbi/footer.htm
+++ b/modules/luci-base/luasrc/view/cbi/footer.htm
@@ -1,9 +1,7 @@
<%- if pageaction then -%>
<div class="cbi-page-actions">
<% if redirect and not flow.hidebackbtn then %>
- <div style="float:left">
<input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
- </div>
<% end %>
<% if flow.skip then %>
diff --git a/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm b/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm
index f780936766..d4ad093efa 100644
--- a/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm
+++ b/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm
@@ -3,7 +3,6 @@
<br />
<%- end %>
<div class="cbi-value-description">
- <span class="cbi-value-helpicon"><img src="<%=resource%>/cbi/help.gif" alt="<%:help%>" /></span>
<%=self.description%>
</div>
<%- end %>
diff --git a/modules/luci-base/luasrc/view/cbi/map.htm b/modules/luci-base/luasrc/view/cbi/map.htm
index 69ef3615a2..83c3cb2170 100644
--- a/modules/luci-base/luasrc/view/cbi/map.htm
+++ b/modules/luci-base/luasrc/view/cbi/map.htm
@@ -1,5 +1,5 @@
<%- if firstmap and messages then local msg; for _, msg in ipairs(messages) do -%>
- <div class="errorbox"><%=pcdata(msg)%></div>
+ <div class="alert-message warning"><%=pcdata(msg)%></div>
<%- end end -%>
<div class="cbi-map" id="cbi-<%=self.config%>">
@@ -31,7 +31,6 @@
</li>
<% end %>
</ul>
- <br />
<% for i, section in ipairs(self.children) do %>
<div class="cbi-tabcontainer" id="container.m-<%=self.config%>.<%=section.section or section.sectiontype%>"<% if section.sectiontype ~= self.selected_tab then %> style="display:none"<% end %>>
<% section:render() %>
@@ -53,6 +52,4 @@
<% else %>
<%- self:render_children() %>
<% end %>
-
- <br />
</div>
diff --git a/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm b/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
index 62dbde7dd4..abfa33e1ed 100644
--- a/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
+++ b/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
@@ -19,7 +19,9 @@
if value then
for value in utl.imatch(value) do
- checked[value] = true
+ for value in utl.imatch(value) do
+ checked[value] = true
+ end
end
else
local n = self.network and net:get_network(self.network)
@@ -33,57 +35,51 @@
-%>
<input type="hidden" name="<%=cbeid%>" value="1" />
-<ul style="margin:0; list-style-type:none">
- <% for _, iface in ipairs(ifaces) do
- local link = iface:adminlink()
- if (not self.nobridges or not iface:is_bridge()) and
- (not self.noinactive or iface:is_up()) and
- iface:name() ~= self.exclude
- then %>
- <li>
- <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
- attr("type", self.widget or "radio") ..
- attr("id", cbid .. "." .. iface:name()) ..
- attr("name", cbid) .. attr("value", iface:name()) ..
- ifattr(checked[iface:name()], "checked", "checked")
- %> />
- <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
- <label<%=attr("for", cbid .. "." .. iface:name())%>></label>
- <%- end -%>
- &#160;
- <label<%=attr("for", cbid .. "." .. iface:name())%>>
- <% if link then -%><a href="<%=link%>"><% end -%>
- <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
- <% if link then -%></a><% end -%>
- <%=pcdata(iface:get_i18n())%>
- <% local ns = iface:get_networks(); if #ns > 0 then %>(
- <%- local i, n; for i, n in ipairs(ns) do -%>
- <%-= (i>1) and ', ' -%>
- <a href="<%=n:adminlink()%>"><%=n:name()%></a>
- <%- end -%>
- )<% end %>
- </label>
- </li>
- <% end end %>
- <% if not self.nocreate then %>
- <li>
- <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
- attr("type", self.widget or "radio") ..
- attr("id", cbid .. "_custom") ..
- attr("name", cbid) ..
- attr("value", " ")
- %> />
- <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
- <label<%=attr("for", cbid .. "_custom")%>></label>
- <%- end -%>
- &#160;
- <label<%=attr("for", cbid .. "_custom")%>>
- <img title="<%:Custom Interface%>" style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/ethernet_disabled.png" />
- <%:Custom Interface%>:
- </label>
- <input type="text" style="width:50px" onfocus="document.getElementById('<%=cbid%>_custom').checked=true" onblur="var x=document.getElementById('<%=cbid%>_custom'); x.value=this.value; x.checked=true" />
- </li>
- <% end %>
-</ul>
+
+<div class="cbi-dropdown" display-items="5" placeholder="<%:-- please select -- %>"<%=
+ attr("name", cbid) ..
+ ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+ ifattr(self.widget == "checkbox", "optional", "optional")
+%>>
+ <script type="item-template"><!--
+ <li value="{{value}}">
+ <img title="<%:Custom Interface%>: &quot;{{value}}&quot;" src="<%=resource%>/icons/ethernet_disabled.png" />
+ <span class="hide-open">{{value}}</span>
+ <span class="hide-close"><%:Custom Interface%>: "{{value}}"</span>
+ </li>
+ --></script>
+ <ul>
+ <% for _, iface in ipairs(ifaces) do
+ if (not self.nobridges or not iface:is_bridge()) and
+ (not self.noinactive or iface:is_up()) and
+ iface:name() ~= self.exclude
+ then %>
+ <li<%=
+ attr("value", iface:name()) ..
+ ifattr(checked[iface:name()], "selected", "selected")
+ %>>
+ <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+ <span class="hide-open"><%=pcdata(iface:name())%></span>
+ <span class="hide-close">
+ <%=pcdata(iface:get_i18n())%>
+ <% local ns = iface:get_networks(); if #ns > 0 then %>(
+ <%- local i, n; for i, n in ipairs(ns) do -%>
+ <%-= (i>1) and ', ' -%>
+ <a href="<%=n:adminlink()%>"><%=n:name()%></a>
+ <%- end -%>
+ )<% end %>
+ </span>
+ </li>
+ <% end end %>
+ <% if not self.nocreate then %>
+ <li value="">
+ <img title="<%:Custom Interface%>" src="<%=resource%>/icons/ethernet_disabled.png" />
+ <span><%:Custom Interface%>:</span>
+ <input type="password" style="display:none" />
+ <input class="create-item-input" type="text" />
+ </li>
+ <% end %>
+ </ul>
+</div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/network_netlist.htm b/modules/luci-base/luasrc/view/cbi/network_netlist.htm
index 8bf1a70a20..ba6ebb8434 100644
--- a/modules/luci-base/luasrc/view/cbi/network_netlist.htm
+++ b/modules/luci-base/luasrc/view/cbi/network_netlist.htm
@@ -20,66 +20,62 @@
end
-%>
-<ul style="margin:0; list-style-type:none; text-align:left">
- <% for _, net in ipairs(networks) do
- if (net:name() ~= "loopback") and
- (net:name() ~= self.exclude) and
- (not self.novirtual or not net:is_virtual())
- then %>
- <li style="padding:0.25em 0">
- <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
- attr("type", self.widget or "radio") ..
- attr("id", cbid .. "." .. net:name()) ..
- attr("name", cbid) .. attr("value", net:name()) ..
- ifattr(checked[net:name()], "checked", "checked")
- %> /> &#160;
- <label<%=attr("for", cbid .. "." .. net:name())%>>
+<div class="cbi-dropdown" display-items="5" placeholder="<%:-- please select -- %>"<%=
+ attr("name", cbid) ..
+ ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+ ifattr(self.widget == "checkbox", "optional", "optional")
+%>>
+ <script type="item-template"><!--
+ <li value="{{value}}">
+ <span class="ifacebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">
+ {{value}}: <em>(<%:create%>)</em>
+ </span>
+ </li>
+ --></script>
+ <ul>
+ <% if self.widget ~= "checkbox" then %>
+ <li value=""<%= ifattr(not value, "selected", "selected") %>>
+ <em><%:unspecified%></em>
+ </li>
+ <% end %>
+
+ <% for _, net in ipairs(networks) do
+ if (net:name() ~= "loopback") and
+ (net:name() ~= self.exclude) and
+ (not self.novirtual or not net:is_virtual())
+ then %>
+ <li<%= attr("value", net:name()) .. ifattr(checked[net:name()], "selected", "selected") %>>
<span class="ifacebadge"><%=net:name()%>:
<%
local empty = true
for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
if not iface:is_bridge() then
empty = false
- %>
+ -%>
<img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
- <% end end %>
- <% if empty then %><em><%:(no interfaces attached)%></em><% end %>
+ <%- end end %>
+ <% if empty then %>
+ <em class="hide-close"><%:(no interfaces attached)%></em>
+ <em class="hide-open">-</em>
+ <% end %>
</span>
- </label>
- </li>
- <% end end %>
+ </li>
+ <% end end %>
- <% if not self.nocreate then %>
- <li style="padding:0.25em 0">
- <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not value and self.widget ~= "checkbox", "checked", "checked")%> /> &#160;
- <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
- <label<%=attr("for", cbid .. "_new")%>></label>
- <%- end -%>
- <div style="padding:0.5em; display:inline">
- <label<%=attr("for", cbid .. "_new")%>><em>
+ <% if not self.nocreate then %>
+ <li value="-"<%= ifattr(not value and self.widget ~= "checkbox", "selected", "selected") %>>
+ <em>
<%- if self.widget == "checkbox" then -%>
<%:create:%>
<%- else -%>
<%:unspecified -or- create:%>
- <%- end -%>&#160;</em></label>
+ <%- end -%>
+ </em>
<input style="display:none" type="password" />
- <input style="width:6em" type="text"<%=attr("name", cbid .. ".newnet")%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
- </div>
- </li>
- <% elseif self.widget ~= "checkbox" and self.unspecified then %>
- <li style="padding:0.25em 0">
- <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
- attr("type", self.widget or "radio") ..
- attr("id", cbid .. "_uns") ..
- attr("name", cbid) ..
- attr("value", "") ..
- ifattr(not value or #value == 0, "checked", "checked")
- %> /> &#160;
- <div style="padding:0.5em; display:inline">
- <label<%=attr("for", cbid .. "_uns")%>><em><%:unspecified%></em></label>
- </div>
- </li>
- <% end %>
-</ul>
+ <input class="create-item-input" type="text" />
+ </li>
+ <% end %>
+ </ul>
+</div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/nsection.htm b/modules/luci-base/luasrc/view/cbi/nsection.htm
index abf67596f0..63abc57734 100644
--- a/modules/luci-base/luasrc/view/cbi/nsection.htm
+++ b/modules/luci-base/luasrc/view/cbi/nsection.htm
@@ -1,5 +1,5 @@
<% if self:cfgvalue(self.section) then section = self.section %>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<% if self.title and #self.title > 0 then -%>
<legend><%=self.title%></legend>
<%- end %>
@@ -15,17 +15,16 @@
<div class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
<%+cbi/ucisection%>
</div>
- <br />
- </fieldset>
+ </div>
<% elseif self.addremove then %>
<% if self.template_addremove then include(self.template_addremove) else -%>
- <fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.section%>">
+ <div class="cbi-section" id="cbi-<%=self.config%>-<%=self.section%>">
<% if self.title and #self.title > 0 then -%>
<legend><%=self.title%></legend>
<%- end %>
<div class="cbi-section-descr"><%=self.description%></div>
<input type="submit" class="cbi-button cbi-button-add" name="cbi.cns.<%=self.config%>.<%=self.section%>" value="<%:Add%>" />
- </fieldset>
+ </div>
<%- end %>
<% end %>
<!-- /nsection -->
diff --git a/modules/luci-base/luasrc/view/cbi/nullsection.htm b/modules/luci-base/luasrc/view/cbi/nullsection.htm
index ef169593af..7230719d19 100644
--- a/modules/luci-base/luasrc/view/cbi/nullsection.htm
+++ b/modules/luci-base/luasrc/view/cbi/nullsection.htm
@@ -1,4 +1,4 @@
-<fieldset class="cbi-section">
+<div class="cbi-section">
<% if self.title and #self.title > 0 then -%>
<legend><%=self.title%></legend>
<%- end %>
@@ -25,8 +25,7 @@
</div>
<%- end %>
</div>
- <br />
-</fieldset>
+</div>
<%-
if type(self.hidden) == "table" then
for k, v in pairs(self.hidden) do
diff --git a/modules/luci-base/luasrc/view/cbi/simpleform.htm b/modules/luci-base/luasrc/view/cbi/simpleform.htm
index 3b758d70ee..c6000d22b3 100644
--- a/modules/luci-base/luasrc/view/cbi/simpleform.htm
+++ b/modules/luci-base/luasrc/view/cbi/simpleform.htm
@@ -10,7 +10,6 @@
<% 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 %>
<% self:render_children() %>
- <br />
</div>
<%- if self.message then %>
<div><%=self.message%></div>
@@ -30,9 +29,12 @@
end
%>
<% if redirect then %>
- <div style="float:left">
- <input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
- </div>
+ <input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
+<% end %>
+<%- if self.cancel ~= false and self.on_cancel then %>
+ <input class="cbi-button cbi-button-link" type="submit" name="cbi.cancel" value="
+ <%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
+ " />
<% end %>
<%- if self.flow and self.flow.skip then %>
<input class="cbi-button cbi-button-skip" type="submit" name="cbi.skip" value="<%:Skip%>" />
@@ -47,11 +49,6 @@
<%- if not self.reset then -%><%-:Reset-%><%-else-%><%=self.reset%><%end-%>
" />
<% end %>
-<%- if self.cancel ~= false and self.on_cancel then %>
- <input class="cbi-button cbi-button-reset" type="submit" name="cbi.cancel" value="
- <%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
- " />
-<% end %>
</div>
</form>
<% end %>
diff --git a/modules/luci-base/luasrc/view/cbi/tblsection.htm b/modules/luci-base/luasrc/view/cbi/tblsection.htm
index 3cb87563f1..ab13922040 100644
--- a/modules/luci-base/luasrc/view/cbi/tblsection.htm
+++ b/modules/luci-base/luasrc/view/cbi/tblsection.htm
@@ -14,10 +14,14 @@ function width(o)
end
return ''
end
+
+local anonclass = (not self.anonymous or self.sectiontitle) and "named" or "anonymous"
+local titlename = ifattr(not self.anonymous or self.sectiontitle, "data-title", translate("Name"))
+
-%>
<!-- tblsection -->
-<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
+<div class="cbi-section cbi-tblsection" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
<% if self.title and #self.title > 0 then -%>
<legend><%=self.title%></legend>
<%- end %>
@@ -25,121 +29,107 @@ end
<input type="hidden" id="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" name="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" value="" />
<%- end -%>
<div class="cbi-section-descr"><%=self.description%></div>
- <div class="cbi-section-node">
- <%- local count = 0 -%>
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <%- if not self.anonymous then -%>
- <%- if self.sectionhead then -%>
- <th class="cbi-section-table-cell"><%=self.sectionhead%></th>
- <%- else -%>
- <th>&#160;</th>
- <%- end -%>
- <%- count = count +1; end -%>
- <%- for i, k in pairs(self.children) do if not k.optional then -%>
- <th class="cbi-section-table-cell"<%=width(k)%>>
- <%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
- <%-=k.title-%>
- <%- if k.titleref then -%></a><%- end -%>
- </th>
- <%- count = count + 1; end; end; if self.sortable then -%>
- <th class="cbi-section-table-cell"><%:Sort%></th>
- <%- count = count + 1; end; if self.extedit or self.addremove then -%>
- <th class="cbi-section-table-cell">&#160;</th>
- <%- count = count + 1; end -%>
- </tr>
- <tr class="cbi-section-table-descr">
- <%- if not self.anonymous then -%>
- <%- if self.sectiondesc then -%>
- <th class="cbi-section-table-cell"><%=self.sectiondesc%></th>
- <%- else -%>
- <th></th>
- <%- end -%>
- <%- end -%>
- <%- for i, k in pairs(self.children) do if not k.optional then -%>
- <th class="cbi-section-table-cell"<%=width(k)%>><%=k.description%></th>
- <%- end; end; if self.sortable then -%>
- <th class="cbi-section-table-cell"></th>
- <%- end; if self.extedit or self.addremove then -%>
- <th class="cbi-section-table-cell"></th>
- <%- end -%>
- </tr>
- <%- local isempty = true
- for i, k in ipairs(self:cfgsections()) do
- section = k
- isempty = false
- scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
- -%>
- <tr class="cbi-section-table-row<% if self.extedit or self.rowcolors then %> cbi-rowstyle-<%=rowstyle()%><% end %>" id="cbi-<%=self.config%>-<%=section%>">
- <% if not self.anonymous then -%>
- <th><h3><%=(type(self.sectiontitle) == "function") and self:sectiontitle(section) or k%></h3></th>
- <%- end %>
-
+ <%- local count = 0 -%>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles <%=anonclass%>"<%=titlename%>>
+ <%- for i, k in pairs(self.children) do if not k.optional then -%>
+ <div class="th cbi-section-table-cell"<%=
+ width(k) ..
+ attr("data-type", k.template and k.template:gsub("^.+/", "") or "")
+ %>>
+ <%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
+ <%-=k.title-%>
+ <%- if k.titleref then -%></a><%- end -%>
+ </div>
+ <%- count = count + 1; end; end; if self.sortable or self.extedit or self.addremove then -%>
+ <div class="th cbi-section-table-cell cbi-section-actions"></div>
+ <%- count = count + 1; end -%>
+ </div>
+ <div class="tr cbi-section-table-descr <%=anonclass%>">
+ <%- for i, k in pairs(self.children) do if not k.optional then -%>
+ <div class="th cbi-section-table-cell"<%=
+ width(k) ..
+ attr("data-type", k.template and k.template:gsub("^.+/", "") or "")
+ %>><%=k.description%></div>
+ <%- end; end; if self.sortable or self.extedit or self.addremove then -%>
+ <div class="th cbi-section-table-cell cbi-section-actions"></div>
+ <%- end -%>
+ </div>
+ <%- local isempty, i, k = true, nil, nil
+ for i, k in ipairs(self:cfgsections()) do
+ isempty = false
- <%-
- for k, node in ipairs(self.children) do
- if not node.optional then
- node:render(section, scope or {})
- end
+ local section = k
+ local sectionname = striptags((type(self.sectiontitle) == "function") and self:sectiontitle(section) or k)
+ local sectiontitle = ifattr(sectionname and (not self.anonymous or self.sectiontitle), "data-title", sectionname)
+ local colorclass = (self.extedit or self.rowcolors) and " cbi-rowstyle-%d" % rowstyle() or ""
+ local scope = {
+ valueheader = "cbi/cell_valueheader",
+ valuefooter = "cbi/cell_valuefooter"
+ }
+ -%>
+ <div class="tr cbi-section-table-row<%=colorclass%>" id="cbi-<%=self.config%>-<%=section%>"<%=sectiontitle%>>
+ <%-
+ local node
+ for k, node in ipairs(self.children) do
+ if not node.optional then
+ node:render(section, scope or {})
end
- -%>
-
- <%- if self.sortable then -%>
- <td class="cbi-section-table-cell">
- <input class="cbi-button cbi-button-up" type="button" value="" onclick="return cbi_row_swap(this, true, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move up%>" title="<%:Move up%>" />
- <input class="cbi-button cbi-button-down" type="button" value="" onclick="return cbi_row_swap(this, false, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move down%>" title="<%:Move down%>" />
- </td>
- <%- end -%>
-
- <%- if self.extedit or self.addremove then -%>
- <td class="cbi-section-table-cell">
- <%- if self.extedit then -%>
- <input class="cbi-button cbi-button-edit" type="button" value="<%:Edit%>"
- <%- if type(self.extedit) == "string" then
- %> onclick="location.href='<%=self.extedit:format(section)%>'"
- <%- elseif type(self.extedit) == "function" then
- %> onclick="location.href='<%=self:extedit(section)%>'"
- <%- end
- %> alt="<%:Edit%>" title="<%:Edit%>" />
- <%- end; if self.addremove then %>
- <input class="cbi-button cbi-button-remove" type="submit" value="<%:Delete%>" onclick="this.form.cbi_state='del-section'; return true" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" />
- <%- end -%>
- </td>
- <%- end -%>
- </tr>
- <%- end -%>
+ end
+ -%>
- <%- if isempty then -%>
- <tr class="cbi-section-table-row">
- <td colspan="<%=count%>"><em><br /><%:This section contains no values yet%></em></td>
- </tr>
+ <%- if self.sortable or self.extedit or self.addremove then -%>
+ <div class="td cbi-section-table-cell nowrap cbi-section-actions">
+ <%- if self.sortable then -%>
+ <input class="cbi-button cbi-button-up" type="button" value="<%:Up%>" onclick="return cbi_row_swap(this, true, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" title="<%:Move up%>" />
+ <input class="cbi-button cbi-button-down" type="button" value="<%:Down%>" onclick="return cbi_row_swap(this, false, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" title="<%:Move down%>" />
+ <% end; if self.extedit then -%>
+ <input class="cbi-button cbi-button-edit" type="button" value="<%:Edit%>"
+ <%- if type(self.extedit) == "string" then
+ %> onclick="location.href='<%=self.extedit:format(section)%>'"
+ <%- elseif type(self.extedit) == "function" then
+ %> onclick="location.href='<%=self:extedit(section)%>'"
+ <%- end
+ %> alt="<%:Edit%>" title="<%:Edit%>" />
+ <% end; if self.addremove then %>
+ <input class="cbi-button cbi-button-remove" type="submit" value="<%:Delete%>" onclick="this.form.cbi_state='del-section'; return true" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" />
+ <%- end -%>
+ </div>
<%- end -%>
- </table>
-
- <% if self.error then %>
- <div class="cbi-section-error">
- <ul><% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%>
- <li><%=pcdata(e):gsub("\n","<br />")%></li>
- <%- end end %></ul>
- </div>
- <% end %>
+ </div>
+ <%- end -%>
- <%- if self.addremove then -%>
- <% if self.template_addremove then include(self.template_addremove) else -%>
- <div class="cbi-section-create cbi-tblsection-create">
- <% if self.anonymous then %>
- <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" title="<%:Add%>" />
- <% else %>
- <% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
- <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" data-type="uciname" data-optional="true" />
- <input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
- <% if self.invalid_cts then -%>
- <br /><%:Invalid%></div>
- <%- end %>
- <% end %>
- </div>
- <%- end %>
+ <%- if isempty then -%>
+ <div class="tr cbi-section-table-row placeholder">
+ <div class="td"><em><%:This section contains no values yet%></em></div>
+ </div>
<%- end -%>
</div>
-</fieldset>
+
+ <% if self.error then %>
+ <div class="cbi-section-error">
+ <ul><% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%>
+ <li><%=pcdata(e):gsub("\n","<br />")%></li>
+ <%- end end %></ul>
+ </div>
+ <% end %>
+
+ <%- if self.addremove then -%>
+ <% if self.template_addremove then include(self.template_addremove) else -%>
+ <div class="cbi-section-create cbi-tblsection-create">
+ <% if self.anonymous then %>
+ <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" title="<%:Add%>" />
+ <% else %>
+ <% if self.invalid_cts then -%>
+ <div class="cbi-section-error"><%:Invalid%></div>
+ <%- end %>
+ <div>
+ <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." data-type="uciname" data-optional="true" />
+ </div>
+ <input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
+ <% end %>
+ </div>
+ <%- end %>
+ <%- end -%>
+</div>
<!-- /tblsection -->
diff --git a/modules/luci-base/luasrc/view/cbi/tsection.htm b/modules/luci-base/luasrc/view/cbi/tsection.htm
index 726521ae3f..1a13df0c04 100644
--- a/modules/luci-base/luasrc/view/cbi/tsection.htm
+++ b/modules/luci-base/luasrc/view/cbi/tsection.htm
@@ -1,4 +1,4 @@
-<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
+<div class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
<% if self.title and #self.title > 0 then -%>
<legend><%=self.title%></legend>
<%- end %>
@@ -20,10 +20,9 @@
<%+cbi/tabmenu%>
- <fieldset class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
+ <div class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
<%+cbi/ucisection%>
- </fieldset>
- <br />
+ </div>
<%- end %>
<% if isempty then -%>
@@ -36,14 +35,15 @@
<% if self.anonymous then -%>
<input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
<%- else -%>
- <% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
- <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" data-type="uciname" data-optional="true" />
- <input type="submit" class="cbi-button cbi-button-add" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" />
<% if self.invalid_cts then -%>
- <br /><%:Invalid%></div>
+ <div class="cbi-section-error"><%:Invalid%></div>
<%- end %>
+ <div>
+ <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." data-type="uciname" data-optional="true" />
+ </div>
+ <input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
<%- end %>
</div>
<%- end %>
<%- end %>
-</fieldset>
+</div>
diff --git a/modules/luci-base/luasrc/view/cbi/upload.htm b/modules/luci-base/luasrc/view/cbi/upload.htm
index 4fb5201aac..3c3d82b653 100644
--- a/modules/luci-base/luasrc/view/cbi/upload.htm
+++ b/modules/luci-base/luasrc/view/cbi/upload.htm
@@ -8,7 +8,7 @@
<%:Uploaded File%> (<%=t.byte_format(s.size)%>)
<% if self.unsafeupload then %>
<input type="hidden"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
- <input class="cbi-button cbi-input-image" type="image" value="<%:Replace entry%>" name="cbi.rlf.<%=section .. "." .. self.option%>" alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" />
+ <input class="cbi-button cbi-button-image" type="image" value="<%:Replace entry%>" name="cbi.rlf.<%=section .. "." .. self.option%>" alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" />
<% end %>
<% end %>
diff --git a/modules/luci-base/luasrc/view/sysauth.htm b/modules/luci-base/luasrc/view/sysauth.htm
index b3ec9b7617..9b0e2de780 100644
--- a/modules/luci-base/luasrc/view/sysauth.htm
+++ b/modules/luci-base/luasrc/view/sysauth.htm
@@ -8,7 +8,9 @@
<form method="post" action="<%=pcdata(FULL_REQUEST_URI)%>">
<%- if fuser then %>
- <div class="errorbox"><%:Invalid username and/or password! Please try again.%></div>
+ <div class="alert-message warning">
+ <p><%:Invalid username and/or password! Please try again.%></p>
+ </div>
<% end -%>
<div class="cbi-map">
@@ -16,23 +18,23 @@
<div class="cbi-map-descr">
<%:Please enter your username and password.%>
</div>
- <fieldset class="cbi-section"><fieldset class="cbi-section-node">
+ <div class="cbi-section"><div class="cbi-section-node">
<div class="cbi-value">
<label class="cbi-value-title"><%:Username%></label>
<div class="cbi-value-field">
- <input class="cbi-input-user" type="text" name="luci_username" value="<%=duser%>" />
+ <input class="cbi-input-text" type="text" name="luci_username" value="<%=duser%>" />
</div>
</div>
<div class="cbi-value cbi-value-last">
<label class="cbi-value-title"><%:Password%></label>
<div class="cbi-value-field">
- <input class="cbi-input-password" type="password" name="luci_password" />
+ <input class="cbi-input-text" type="password" name="luci_password" />
</div>
</div>
- </fieldset></fieldset>
+ </div></div>
</div>
- <div>
+ <div class="cbi-page-actions">
<input type="submit" value="<%:Login%>" class="cbi-button cbi-button-apply" />
<input type="reset" value="<%:Reset%>" class="cbi-button cbi-button-reset" />
</div>
diff --git a/modules/luci-base/po/ca/base.po b/modules/luci-base/po/ca/base.po
index b08344b404..12f9d40969 100644
--- a/modules/luci-base/po/ca/base.po
+++ b/modules/luci-base/po/ca/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Càrrega d'1 minut:"
@@ -174,9 +177,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -213,9 +213,6 @@ msgstr "Número de dispositiu ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Concentrador d'accés"
@@ -323,11 +320,6 @@ msgstr "Permet respostes del rang 127.0.0.0/8, p.e. per serveis RBL"
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -406,11 +398,14 @@ msgstr "Configuració d'antena"
msgid "Any zone"
msgstr "Qualsevol zona"
-msgid "Apply"
-msgstr "Aplica"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Aplicant els canvis"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -426,6 +421,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Estacions associades"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -517,9 +515,6 @@ msgstr "Adreça mal especificada!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -593,12 +588,20 @@ msgstr "Canvis"
msgid "Changes applied."
msgstr "Canvis aplicats."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Canvia la paraula clau de l'administrador per accedir al dispositiu"
msgid "Channel"
msgstr "Canal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Comprovació"
@@ -678,12 +681,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configuració"
-msgid "Configuration applied."
-msgstr "S'ha aplicat la configuració."
-
msgid "Configuration files will be kept."
msgstr "Es mantindran els fitxers de configuració."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmació"
@@ -696,12 +702,15 @@ msgstr "Connectat"
msgid "Connection Limit"
msgstr "Límit de connexió"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Connexions"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "País"
@@ -755,9 +764,6 @@ msgstr ""
"Personalitza el comportament dels <abbr title=\"Light Emitting Diode\">LED</"
"abbr>s del dispositiu, si és possible."
-msgid "DHCP Leases"
-msgstr "Arrendaments DHCP"
-
msgid "DHCP Server"
msgstr "Servidor DHCP"
@@ -770,9 +776,6 @@ msgstr "Client DHCP"
msgid "DHCP-Options"
msgstr "Opcions DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Arrendaments DHCPv6"
-
msgid "DHCPv6 client"
msgstr ""
@@ -830,9 +833,6 @@ msgstr "Passarel·la per defecte"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Estat per defecte"
@@ -872,6 +872,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnòstics"
@@ -906,6 +909,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Descarta les respostes RFC1918 des de dalt"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Mostrant només els paquets que contenen"
@@ -957,6 +963,9 @@ msgstr ""
"No reenviïs les peticions <abbr title=\"Domain Name System\">DNS</abbr> "
"sense el nom <abbr title=\"Domain Name System\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Descarrega i instal·la el paquet"
@@ -1070,6 +1079,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1102,6 +1114,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Esborrant..."
@@ -1160,6 +1178,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fitxer"
@@ -1281,7 +1302,7 @@ msgstr "Espai lliure"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1355,9 +1376,6 @@ msgstr "Penja"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1418,8 +1436,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Tallafocs IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Estat WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Adreça IPv4"
@@ -1469,15 +1487,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Estat WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Adreça IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2056,9 +2071,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Candidats de servidor NTP"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nom"
@@ -2182,6 +2194,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2233,12 +2248,6 @@ msgstr "Opció treta"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2590,12 +2599,12 @@ msgstr ""
"\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2603,12 +2612,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2699,9 +2708,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2760,6 +2766,15 @@ msgstr "Mostra/amaga la contrasenya"
msgid "Revert"
msgstr "Reverteix"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Arrel"
@@ -2775,9 +2790,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2803,14 +2815,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2838,9 +2842,6 @@ msgstr "Desa"
msgid "Save & Apply"
msgstr "Desa i aplica"
-msgid "Save &#38; Apply"
-msgstr "Desa i aplica"
-
msgid "Scan"
msgstr "Escaneja"
@@ -2867,17 +2868,6 @@ msgstr "Clients separats"
msgid "Server Settings"
msgstr "Ajusts de servidor"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Nom de servei"
@@ -2965,15 +2955,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr "Ordena"
-
msgid "Source"
msgstr "Origen"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Especifica el directori a que el dispositiu està adjuntat"
@@ -3012,6 +2996,9 @@ msgstr "Inici"
msgid "Start priority"
msgstr "Prioritat d'inici"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Arrencada"
@@ -3166,6 +3153,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3191,9 +3188,6 @@ msgstr ""
"<br />Fes clic a \"Procedeix\" a continuació per començar el procés "
"d'escriptura a la memòria flaix."
-msgid "The following changes have been committed"
-msgstr "S'han comès els següents canvis"
-
msgid "The following changes have been reverted"
msgstr "S&#39;han desfet els següents canvis"
@@ -3259,11 +3253,6 @@ msgstr ""
"tinguis."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3273,8 +3262,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "No hi ha arrendaments actius."
-msgid "There are no pending changes to apply!"
-msgstr "No hi ha canvis pendents per aplicar!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "No hi ha canvis pendents per revertir!"
@@ -3423,15 +3412,6 @@ msgstr "Interfície del túnel"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Potència Tx"
@@ -3480,6 +3460,9 @@ msgstr "Canvis sense desar"
msgid "Unsupported protocol type."
msgstr "Tipus de protocol no suportat."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Actualitza les llistes"
@@ -3607,12 +3590,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "Classe de venidor per enviar al sol·licitar DHCP"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Verifica"
@@ -3644,16 +3621,15 @@ msgstr ""
"La xifratge WPA requereix que sigui instal·lat el wpa_supplicant (pel mode "
"client) o el hostapd (pels modes AP i ad hoc)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Esperant que s'apliquin els canvis..."
msgid "Waiting for command to complete..."
msgstr "Esperant que s'acabi l'ordre..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr "Esperant el dispositiu..."
@@ -3668,12 +3644,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3753,6 +3723,9 @@ msgstr ""
msgid "bridged"
msgstr "pontejat"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "crea:"
@@ -3790,9 +3763,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr "ajuda"
-
msgid "hidden"
msgstr "amagat"
@@ -3817,9 +3787,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "fitxer <abbr title=\"Domain Name System\">DNS</abbr> local"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3844,6 +3811,9 @@ msgstr "engegat"
msgid "open"
msgstr "obert"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3895,6 +3865,42 @@ msgstr "sí"
msgid "« Back"
msgstr "« Enrere"
+#~ msgid "DHCP Leases"
+#~ msgstr "Arrendaments DHCP"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Arrendaments DHCPv6"
+
+#~ msgid "Sort"
+#~ msgstr "Ordena"
+
+#~ msgid "help"
+#~ msgstr "ajuda"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estat WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estat WAN IPv6"
+
+#~ msgid "Apply"
+#~ msgstr "Aplica"
+
+#~ msgid "Applying changes"
+#~ msgstr "Aplicant els canvis"
+
+#~ msgid "Configuration applied."
+#~ msgstr "S'ha aplicat la configuració."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Desa i aplica"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "S'han comès els següents canvis"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "No hi ha canvis pendents per aplicar!"
+
#~ msgid "Action"
#~ msgstr "Acció"
diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po
index aa4144758b..7ecd4868da 100644
--- a/modules/luci-base/po/cs/base.po
+++ b/modules/luci-base/po/cs/base.po
@@ -47,6 +47,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Zatížení za 1 minutu:"
@@ -169,9 +172,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -208,9 +208,6 @@ msgstr "Äíslo ATM zařízení"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Přístupový koncentrátor"
@@ -319,11 +316,6 @@ msgstr "Povolit upstream odpovědi na 127.0.0.0/8 rozsah, např. pro RBL služby
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -402,11 +394,14 @@ msgstr "Konfigurace antén"
msgid "Any zone"
msgstr "Libovolná zóna"
-msgid "Apply"
-msgstr "Použít"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Probíhá uplatňování nastavení"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -422,6 +417,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Připojení klienti"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -512,9 +510,6 @@ msgstr "Zadána neplatná adresa!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -586,12 +581,20 @@ msgstr "Změny"
msgid "Changes applied."
msgstr "Změny aplikovány."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Změní administrátorské heslo pro přístup k zařízení"
msgid "Channel"
msgstr "Kanál"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Kontrola"
@@ -672,12 +675,15 @@ msgstr ""
msgid "Configuration"
msgstr "Nastavení"
-msgid "Configuration applied."
-msgstr "Nastavení uplatněno."
-
msgid "Configuration files will be kept."
msgstr "KonfiguraÄní soubory budou zachovány."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Ověření"
@@ -690,12 +696,15 @@ msgstr "Připojeno"
msgid "Connection Limit"
msgstr "Omezení poÄtu pÅ™ipojení"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Připojení"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "ZemÄ›"
@@ -749,9 +758,6 @@ msgstr ""
"Upraví chování <abbr title=\"Light Emitting Diode\">LED</abbr> diod zařízení "
"pokud je to možné."
-msgid "DHCP Leases"
-msgstr "DHCP výpůjÄky"
-
msgid "DHCP Server"
msgstr "DHCP server"
@@ -764,9 +770,6 @@ msgstr "DHCP klient"
msgid "DHCP-Options"
msgstr "Volby DHCP"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6 přidělené IP"
-
msgid "DHCPv6 client"
msgstr ""
@@ -824,9 +827,6 @@ msgstr "Výchozí brána"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Výchozí stav"
@@ -868,6 +868,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostika"
@@ -902,6 +905,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Vyřadit upstream RFC1918 odpovědi"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Zobrazeny pouze balíÄky obsahující"
@@ -955,6 +961,9 @@ msgstr ""
"Nepřeposílat <abbr title=\"Domain Name System\">DNS</abbr> dotazy bez <abbr "
"title=\"Domain Name System\">DNS</abbr> jména"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Stáhnout a nainstalovat balíÄek"
@@ -1070,6 +1079,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "Povolit tento přípojný bod"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Povolit tento swapovací oddíl"
@@ -1102,6 +1114,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Odstraňování..."
@@ -1162,6 +1180,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Soubor"
@@ -1283,7 +1304,7 @@ msgstr "Volné místo"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1355,9 +1376,6 @@ msgstr "Zavěsit"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1417,8 +1435,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 firewall"
-msgid "IPv4 WAN Status"
-msgstr "Stav IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4 adresa"
@@ -1468,15 +1486,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Stav IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "IPv6 adresa"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2064,9 +2079,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Kandidáti NTP serveru"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Název"
@@ -2190,6 +2202,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Vypnutí prodlevy"
@@ -2240,12 +2255,6 @@ msgstr "Volba odstraněna"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2601,15 +2610,12 @@ msgstr ""
"Host Configuration Protocol\">DHCP</abbr> Serveru"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Opravdu odstranit toto rozhraní? Odstranění nelze vrátit zpět!\n"
-"Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
-"tohoto rozhraní."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Opravdu odstranit bezdrátovou síť? Odstranění nelze vrátit zpět!\n"
@@ -2619,17 +2625,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "Opravdu resetovat všechny změny?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Opravdu vypnout síť ?\n"
-"Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
-"tohoto rozhraní."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Opravdu vypnout rozhraní \"%s\" ?\n"
@@ -2723,9 +2725,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2785,6 +2784,15 @@ msgstr "Odhalit/skrýt heslo"
msgid "Revert"
msgstr "Vrátit zpět"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Root"
@@ -2800,9 +2808,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2827,14 +2832,6 @@ msgstr "Spustit kontrolu souborového systému"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2862,9 +2859,6 @@ msgstr "Uložit"
msgid "Save & Apply"
msgstr "Uložit & použít"
-msgid "Save &#38; Apply"
-msgstr "Uložit &#38; použít"
-
msgid "Scan"
msgstr "Skenovat"
@@ -2893,17 +2887,6 @@ msgstr "Oddělovat klienty"
msgid "Server Settings"
msgstr "Nastavení serveru"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Název služby"
@@ -2994,15 +2977,9 @@ msgstr ""
"systému. Nový obraz firmwaru musí být zapsán ruÄnÄ›. Prosím, obraÅ¥te se na "
"wiki pro zařízení specifické instalaÄní instrukce."
-msgid "Sort"
-msgstr "Seřadit"
-
msgid "Source"
msgstr "Zdroj"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -3043,6 +3020,9 @@ msgstr "Start"
msgid "Start priority"
msgstr "Priorita spouštění"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Po spuštění"
@@ -3206,6 +3186,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3230,9 +3220,6 @@ msgstr ""
"souboru s originálním souborem pro zajištění integrity dat.<br /> Kliknutím "
"na \"PokraÄovat\" spustíte proceduru flashování."
-msgid "The following changes have been committed"
-msgstr "Následující změny byly provedeny"
-
msgid "The following changes have been reverted"
msgstr "Následující změny byly vráceny"
@@ -3302,11 +3289,6 @@ msgstr ""
"mohli znovu připojit."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3314,8 +3296,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Nejsou žádné aktivní zápůjÄky."
-msgid "There are no pending changes to apply!"
-msgstr "Nejsou zde žádné nevyřízené změny k aplikaci!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Nejsou zde žádné nevyřízené změny k navrácení!"
@@ -3463,15 +3445,6 @@ msgstr "Rozhraní tunelu"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Tx-Power"
@@ -3520,6 +3493,9 @@ msgstr "Neuložené změny"
msgid "Unsupported protocol type."
msgstr "Nepodporovaný typ protokolu."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Aktualizovat seznamy"
@@ -3650,12 +3626,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Ověřit"
@@ -3687,16 +3657,15 @@ msgstr ""
"Šifrování WPA vyžaduje nainstalovaný wpa_supplicant (pro klientský režim) "
"nebo hostapd (pro AP a ad-hoc režim)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Čekání na realizaci změn..."
msgid "Waiting for command to complete..."
msgstr "ÄŒekání na dokonÄení příkazu..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3711,12 +3680,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3794,6 +3757,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "přemostěný"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3831,9 +3797,6 @@ msgstr "plný-duplex"
msgid "half-duplex"
msgstr "poloviÄní-duplex"
-msgid "help"
-msgstr "pomoc"
-
msgid "hidden"
msgstr "skrytý"
@@ -3858,9 +3821,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "místní <abbr title=\"Domain Name System\">DNS</abbr> soubor"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3885,6 +3845,9 @@ msgstr "on"
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3936,6 +3899,59 @@ msgstr "ano"
msgid "« Back"
msgstr "« Zpět"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP výpůjÄky"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6 přidělené IP"
+
+#~ 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 ""
+#~ "Opravdu odstranit toto rozhraní? Odstranění nelze vrátit zpět!\n"
+#~ "Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
+#~ "tohoto rozhraní."
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Opravdu vypnout síť ?\n"
+#~ "Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
+#~ "tohoto rozhraní."
+
+#~ msgid "Sort"
+#~ msgstr "Seřadit"
+
+#~ msgid "help"
+#~ msgstr "pomoc"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Stav IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Stav IPv6 WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Použít"
+
+#~ msgid "Applying changes"
+#~ msgstr "Probíhá uplatňování nastavení"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Nastavení uplatněno."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Uložit &#38; použít"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Následující změny byly provedeny"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Nejsou zde žádné nevyřízené změny k aplikaci!"
+
#~ msgid "Action"
#~ msgstr "Akce"
diff --git a/modules/luci-base/po/de/base.po b/modules/luci-base/po/de/base.po
index 574ddf184a..bffed8e7ad 100644
--- a/modules/luci-base/po/de/base.po
+++ b/modules/luci-base/po/de/base.po
@@ -49,6 +49,9 @@ msgstr "-- anhand Label selektieren --"
msgid "-- match by uuid --"
msgstr "-- UUID vergleichen --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Systemlast (1 Minute):"
@@ -172,9 +175,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -211,9 +211,6 @@ msgstr "ATM Geräteindex"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Access Concentrator"
@@ -322,13 +319,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr "Erlaubte IP-Adressen"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"Siehe auch <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> bei SIXXS."
-
msgid "Always announce default router"
msgstr "Immer Defaultrouter ankündigen"
@@ -409,11 +399,14 @@ msgstr "Antennenkonfiguration"
msgid "Any zone"
msgstr "Beliebige Zone"
-msgid "Apply"
-msgstr "Anwenden"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Änderungen werden angewandt"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -433,6 +426,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Assoziierte Clients"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr "Berechtigungsgruppe"
@@ -523,9 +519,6 @@ msgstr "Ungültige Adresse angegeben!"
msgid "Band"
msgstr "Frequenztyp"
-msgid "Behind NAT"
-msgstr "NAT"
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -604,12 +597,20 @@ msgstr "Änderungen"
msgid "Changes applied."
msgstr "Änderungen angewendet."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Ändert das Administratorpasswort für den Zugriff auf dieses Gerät"
msgid "Channel"
msgstr "Kanal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Prüfen"
@@ -696,12 +697,15 @@ msgstr ""
msgid "Configuration"
msgstr "Konfiguration"
-msgid "Configuration applied."
-msgstr "Konfiguration angewendet."
-
msgid "Configuration files will be kept."
msgstr "Konfigurationsdateien sichern"
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Bestätigung"
@@ -714,12 +718,15 @@ msgstr "Verbunden"
msgid "Connection Limit"
msgstr "Verbindungslimit"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "TLS zwingend vorraussetzen und abbrechen wenn TLS fehlschlägt."
-
msgid "Connections"
msgstr "Verbindungen"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Land"
@@ -773,9 +780,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr "Passt das Verhalten der Geräte-LEDs an - wenn dies möglich ist."
-msgid "DHCP Leases"
-msgstr "DHCP-Leases"
-
msgid "DHCP Server"
msgstr "DHCP-Server"
@@ -788,9 +792,6 @@ msgstr "DHCP Client"
msgid "DHCP-Options"
msgstr "DHCP-Optionen"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6-Leases"
-
msgid "DHCPv6 client"
msgstr "DHCPv6 Client"
@@ -848,9 +849,6 @@ msgstr "Default Gateway"
msgid "Default is stateless + stateful"
msgstr "Der Standardwert ist zustandslos und zustandsorientiert"
-msgid "Default route"
-msgstr "Default Route"
-
msgid "Default state"
msgstr "Ausgangszustand"
@@ -892,6 +890,9 @@ msgstr "Das Gerät startet neu..."
msgid "Device unreachable"
msgstr "Das Gerät ist nicht erreichbar"
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnosen"
@@ -926,6 +927,9 @@ msgstr "Deaktiviert (Standard)"
msgid "Discard upstream RFC1918 responses"
msgstr "Eingehende RFC1918-Antworten verwerfen"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Nur Pakete mit folgendem Inhalt anzeigen"
@@ -980,6 +984,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr "Anfragen ohne Domainnamen nicht weiterleiten"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Paket herunterladen und installieren"
@@ -1097,6 +1104,9 @@ msgstr "Das DF-Bit (Nicht fragmentieren) auf gekapselten Paketen setzen."
msgid "Enable this mount"
msgstr "Diesen Mountpunkt aktivieren"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Diesen Auslagerungsspeicher aktivieren"
@@ -1131,6 +1141,12 @@ msgstr "Entfernter Server"
msgid "Endpoint Port"
msgstr "Entfernter Port"
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Lösche..."
@@ -1192,6 +1208,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Datei"
@@ -1318,10 +1337,10 @@ msgstr "Freier Platz"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
"Weitere Informationen zu WireGuard-Schnittstellen und Peers unter <a href="
-"\"http://wireguard.io\">wireguard.io</a>."
+"\"http://wireguard.com\">wireguard.com</a>."
msgid "GHz"
msgstr "GHz"
@@ -1394,9 +1413,6 @@ msgstr "Auflegen"
msgid "Header Error Code Errors (HEC)"
msgstr "Anzahl Header-Error-Code-Fehler (HEC)"
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1455,8 +1471,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 Firewall"
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN Status"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4 Adresse"
@@ -1506,15 +1522,12 @@ msgstr "IPv6 Einstellungen"
msgid "IPv6 ULA-Prefix"
msgstr "IPv6 ULA-Präfix"
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN Status"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "IPv6 Adresse"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr "Zum lokalen Tunnelendpunkt delegierte IPv6-Adresse (optional)"
-
msgid "IPv6 assignment hint"
msgstr "IPv6 Zuweisungshinweis"
@@ -2129,9 +2142,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "NTP Server Kandidaten"
-msgid "NTP sync time-out"
-msgstr "NTP Synchronisierungstimeout"
-
msgid "Name"
msgstr "Name"
@@ -2256,6 +2266,9 @@ msgstr "Chiffriertes Gruppenpasswort"
msgid "Obfuscated Password"
msgstr "Chiffriertes Passwort"
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Verzögerung für Ausschalt-Zustand"
@@ -2307,14 +2320,6 @@ msgstr "Option entfernt"
msgid "Optional"
msgstr "Optional"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-"Optional, angeben um den Standardserver (tic.sixxs.net) zu überschreiben"
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-"Optional, angeben wenn das SIXSS Konto mehr als einen Tunnel beinhaltet"
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2685,16 +2690,12 @@ msgid ""
msgstr "Lese Informationen aus /etc/ethers um den DHCP-Server zu konfigurieren"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig "
-"gemacht werden!\n"
-"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
-"Schnittstelle verbunden sind."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Dieses Drahtlosnetzwerk wirklich löschen? Der Schritt kann nicht rückgängig "
@@ -2705,17 +2706,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "Sollen wirklich alle Änderungen verworfen werden?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Das Netzwerk wirklich herunterfahren?\n"
-"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
-"Schnittstelle verbunden sind."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Die Schnitstelle \"%s\" wirklich herunterfahren?\n"
@@ -2809,9 +2806,6 @@ msgstr "IPv6-Adresse anfordern"
msgid "Request IPv6-prefix of length"
msgstr "IPv6-Präfix dieser Länge anfordern"
-msgid "Require TLS"
-msgstr "TLS erfordern"
-
msgid "Required"
msgstr "Benötigt"
@@ -2879,6 +2873,15 @@ msgstr "Passwort zeigen/verstecken"
msgid "Revert"
msgstr "Verwerfen"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Root"
@@ -2894,9 +2897,6 @@ msgstr "Erlaubte IP-Addressen routen"
msgid "Route type"
msgstr "Routen-Typ"
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "Geroutetes IPv6-Präfix für nachgelagerte Schnittstellen"
-
msgid "Router Advertisement-Service"
msgstr "Router-Advertisement-Dienst"
@@ -2922,14 +2922,6 @@ msgstr "Dateisystemprüfung durchführen"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2957,9 +2949,6 @@ msgstr "Speichern"
msgid "Save & Apply"
msgstr "Speichern & Anwenden"
-msgid "Save &#38; Apply"
-msgstr "Speichern &#38; Anwenden"
-
msgid "Scan"
msgstr "Scan"
@@ -2988,19 +2977,6 @@ msgstr "Clients isolieren"
msgid "Server Settings"
msgstr "Servereinstellungen"
-msgid "Server password"
-msgstr "Server Passwort"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-"Server Passwort bzw. das tunnelspezifische Passwort wenn der Benutzername "
-"eine Tunnel-ID beinhaltet."
-
-msgid "Server username"
-msgstr "Server Benutzername"
-
msgid "Service Name"
msgstr "Service-Name"
@@ -3095,15 +3071,9 @@ msgstr ""
"geflasht werden. Weitere Informationen sowie gerätespezifische "
"Installationsanleitungen entnehmen Sie bitte dem Wiki."
-msgid "Sort"
-msgstr "Sortieren"
-
msgid "Source"
msgstr "Quelle"
-msgid "Source routing"
-msgstr "Quell-Routing"
-
msgid "Specifies the directory the device is attached to"
msgstr "Nennt das Verzeichnis, an welches das Gerät angebunden ist"
@@ -3150,6 +3120,9 @@ msgstr "Start"
msgid "Start priority"
msgstr "Startpriorität"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Systemstart"
@@ -3325,6 +3298,16 @@ msgstr ""
"werden:"
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr "Die Gerätedatei des Speichers oder der Partition (z.B.: /dev/sda)"
@@ -3345,9 +3328,6 @@ msgstr ""
"Integrität sicherzustellen.<br /> Klicken Sie \"Fortfahren\" um die Flash-"
"Prozedur zu starten."
-msgid "The following changes have been committed"
-msgstr "Die folgenden Änderungen wurden angewendet"
-
msgid "The following changes have been reverted"
msgstr "Die folgenden Änderungen wurden verworfen"
@@ -3422,13 +3402,6 @@ msgstr ""
"Adresse beziehen müssen um auf das Gerät zugreifen zu können."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-"Der lokale Tunnel-Endpunkt ist hinter einem NAT. Standard ist deaktiviert, "
-"nur auf AYIYA anwendbar."
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3438,8 +3411,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Es gibt z.Z. keine aktiven Leases."
-msgid "There are no pending changes to apply!"
-msgstr "Es gibt keine ausstehenen Änderungen anzuwenden!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Es gibt keine ausstehenen Änderungen zurückzusetzen!"
@@ -3600,15 +3573,6 @@ msgstr "Tunnelschnittstelle"
msgid "Tunnel Link"
msgstr "Basisschnittstelle"
-msgid "Tunnel broker protocol"
-msgstr "Tunnel-Boker-Protokoll"
-
-msgid "Tunnel setup server"
-msgstr "Tunnel-Setup-Server"
-
-msgid "Tunnel type"
-msgstr "Tunneltyp"
-
msgid "Tx-Power"
msgstr "Sendestärke"
@@ -3657,6 +3621,9 @@ msgstr "Ungespeicherte Änderungen"
msgid "Unsupported protocol type."
msgstr "Nicht unterstützter Protokolltyp."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Listen aktualisieren"
@@ -3790,12 +3757,6 @@ msgstr "Hersteller"
msgid "Vendor Class to send when requesting DHCP"
msgstr "Bei DHCP-Anfragen gesendete Vendor-Klasse"
-msgid "Verbose"
-msgstr "Umfangreiche Ausgaben"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Aktiviert erweiterte Protokollierung durch den AICCU-Prozess"
-
msgid "Verify"
msgstr "Verifizieren"
@@ -3827,18 +3788,15 @@ msgstr ""
"WPA-Verschlüsselung benötigt wpa_supplicant (für Client-Modus) oder hostapd "
"(für AP oder Ad-Hoc Modus)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Warte die angegebene Anzahl an Sekunden auf NTP-Synchronisierung, der Wert 0 "
-"deaktiviert das Warten (optional)"
-
msgid "Waiting for changes to be applied..."
msgstr "Änderungen werden angewandt..."
msgid "Waiting for command to complete..."
msgstr "Der Befehl wird ausgeführt..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr "Warte auf Gerät..."
@@ -3857,13 +3815,6 @@ msgstr ""
"Wenn PSK in Verwendung ist, können PMK-Schlüssel lokal ohne Inter-Access-"
"Point-Kommunikation erzeugt werden."
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-"Gibt an, ob eine IPv6-Default-Route durch den Tunnel etabliert werden soll"
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "Gibt an, ob nur Pakete von delegierten Präfixen geroutet werden sollen"
-
msgid "Width"
msgstr "Breite"
@@ -3943,6 +3894,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "bridged"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "erstelle:"
@@ -3978,9 +3932,6 @@ msgstr "Voll-Duplex"
msgid "half-duplex"
msgstr "Halb-Duplex"
-msgid "help"
-msgstr "Hilfe"
-
msgid "hidden"
msgstr "versteckt"
@@ -4005,9 +3956,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "Lokale DNS-Datei"
-msgid "minimum 1280, maximum 1480"
-msgstr "Minimum 1280, Maximum 1480"
-
msgid "minutes"
msgstr "Minuten"
@@ -4032,6 +3980,9 @@ msgstr "ein"
msgid "open"
msgstr "offen"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr "Overlay"
@@ -4083,107 +4034,38 @@ msgstr "ja"
msgid "« Back"
msgstr "« Zurück"
-#~ msgid "Action"
-#~ msgstr "Aktion"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP-Leases"
-#~ msgid "Buttons"
-#~ msgstr "Knöpfe"
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6-Leases"
-#~ msgid "Handler"
-#~ msgstr "Handler"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Maximalzeit zum Halten der Verbindung"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Minimalzeit zum Halten der Verbindung"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "Ausführbare Datei welche das Schalter-Ereignis verarbeitet"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Gibt den zu behandelnden Tastenstatus an"
-
-#~ msgid "This page allows the configuration of custom button actions"
+#~ 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 ""
-#~ "Diese Seite ermöglicht die Konfiguration benutzerdefinierter "
-#~ "Tastenaktionen"
-
-#~ msgid "Leasetime"
-#~ msgstr "Laufzeit"
-
-#~ msgid "Optional."
-#~ msgstr "Optional"
-
-#~ msgid "AuthGroup"
-#~ msgstr "Berechtigungsgruppe"
-
-#~ msgid "automatic"
-#~ msgstr "automatisch"
+#~ "Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig "
+#~ "gemacht werden!\n"
+#~ "Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
+#~ "Schnittstelle verbunden sind."
-#~ msgid "AR Support"
-#~ msgstr "AR-Unterstützung"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Atheros 802.11%s W-LAN Adapter"
-
-#~ msgid "Background Scan"
-#~ msgstr "Hintergrundscan"
-
-#~ msgid "Compression"
-#~ msgstr "Kompression"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Deaktiviere Hardware-Beacon Zeitgeber"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Scan-Anforderungen nicht beantworten"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Schnelle Frames"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Höchstübertragungsrate"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Mindestübertragungsrate"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Multicastrate"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Funkkanal für den Ausseneinsatz"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Geltungsbereich (Regulatory Domain)"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Separates WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Statisches WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Turbo Modus"
-
-#~ msgid "XR Support"
-#~ msgstr "XR-Unterstützung"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
#~ msgstr ""
-#~ "Erzeugt ein zusätzliches Netzwerk wenn diese Option nicht ausgewählt ist"
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Netzwerk beitreten: Einstellungen"
+#~ "Das Netzwerk wirklich herunterfahren?\n"
+#~ "Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
+#~ "Schnittstelle verbunden sind."
-#~ msgid "CPU"
-#~ msgstr "Prozessor"
+#~ msgid "Sort"
+#~ msgstr "Sortieren"
-#~ msgid "Port %d"
-#~ msgstr "Port %d"
+#~ msgid "help"
+#~ msgstr "Hilfe"
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Port %d ist untagged in mehreren VLANs!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN Status"
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN Schnittstelle"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN Status"
diff --git a/modules/luci-base/po/el/base.po b/modules/luci-base/po/el/base.po
index f746db32a4..f9246a58d3 100644
--- a/modules/luci-base/po/el/base.po
+++ b/modules/luci-base/po/el/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "ΦοÏτίο 1 λεπτοÏ:"
@@ -172,9 +175,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -211,9 +211,6 @@ msgstr "ΑÏιθμός συσκευής ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "ΣυγκεντÏωτής ΠÏόσβασης "
@@ -326,11 +323,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -409,11 +401,14 @@ msgstr ""
msgid "Any zone"
msgstr "Οιαδήποτε ζώνη"
-msgid "Apply"
-msgstr "ΕφαÏμογή"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "ΕφαÏμογή αλλαγών"
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -429,6 +424,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Συνδεδεμένοι Σταθμοί"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -520,9 +518,6 @@ msgstr "Μη έγκυÏη διεÏθυνση!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -595,12 +590,20 @@ msgstr "Αλλαγές"
msgid "Changes applied."
msgstr "Αλλαγές εφαÏμόστηκαν."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Αλλάζει τον κωδικό διαχειÏιστή για Ï€Ïόσβαση στη συσκευή"
msgid "Channel"
msgstr "Κανάλι"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Έλεγχος"
@@ -681,12 +684,15 @@ msgstr ""
msgid "Configuration"
msgstr "ΠαÏαμετÏοποίηση"
-msgid "Configuration applied."
-msgstr "Η ΠαÏαμετÏοποίηση εφαÏμόστηκε."
-
msgid "Configuration files will be kept."
msgstr "Τα αÏχεία παÏαμετÏοποίησης θα διατηÏηθοÏν."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Επιβεβαίωση"
@@ -699,12 +705,15 @@ msgstr "Συνδεδεμένος"
msgid "Connection Limit"
msgstr "ÎŒÏιο Συνδέσεων"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Συνδέσεις"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "ΧώÏα"
@@ -758,9 +767,6 @@ msgstr ""
"Ρυθμίζει, αν είναι δυνατόν, την συμπεÏιφοÏά των <abbr title=\"Light Emitting "
"Diode\">LED</abbr> της συσκευής."
-msgid "DHCP Leases"
-msgstr "DHCP Leases"
-
msgid "DHCP Server"
msgstr "ΕξυπηÏετητής DHCP"
@@ -773,9 +779,6 @@ msgstr "Πελάτης DHCP"
msgid "DHCP-Options"
msgstr "Επιλογές DHCP"
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -833,9 +836,6 @@ msgstr "ΠÏοεπιλεγμένη Ï€Ïλη"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "ΠÏοεπιλεγμένη κατάσταση"
@@ -877,6 +877,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Διαγνωστικά"
@@ -911,6 +914,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Αγνόησε τις απαντήσεις ανοδικής Ïοής RFC1918"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Εμφάνιση μόνο πακέτων που πεÏιέχουν"
@@ -966,6 +972,9 @@ msgstr ""
"Îα μην Ï€ÏοωθοÏνται εÏωτήματα <abbr title=\"Domain Name System\">DNS</abbr> "
"χωÏίς όνομα τομέα <abbr title=\"Domain Name System\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Κατέβασμα και εγκατάσταση πακέτου"
@@ -1082,6 +1091,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "ΕνεÏγοποίηση αυτής της Ï€ÏοσάÏτησης"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "ΕνεÏγοποίηση αυτής της swap"
@@ -1114,6 +1126,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "ΔιαγÏάφεται..."
@@ -1175,6 +1193,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "ΑÏχείο"
@@ -1297,7 +1318,7 @@ msgstr "ΕλεÏθεÏος χώÏος"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1369,9 +1390,6 @@ msgstr "ΚÏέμασμα"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1430,7 +1448,7 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 Τείχος ΠÏοστασίας"
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1481,15 +1499,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Κατάσταση IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "ΔιεÏθυνση IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2072,9 +2087,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Όνομα"
@@ -2198,6 +2210,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2249,12 +2264,6 @@ msgstr "Η επιλογή αφαιÏέθηκε"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2607,12 +2616,12 @@ msgstr ""
"εξυπηÏετητή <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2620,12 +2629,12 @@ msgid "Really reset all changes?"
msgstr "ΑÏχικοποίηση όλων των αλλαγών;"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2716,9 +2725,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2777,6 +2783,15 @@ msgstr ""
msgid "Revert"
msgstr "ΑναίÏεση"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Root"
@@ -2792,9 +2807,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2821,14 +2833,6 @@ msgstr "Εκτέλεση ελέγχου συστήματος αÏχείων"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2856,9 +2860,6 @@ msgstr "Αποθήκευση"
msgid "Save & Apply"
msgstr "Αποθήκευση & ΕφαÏμογή"
-msgid "Save &#38; Apply"
-msgstr "Αποθήκευση &#38; ΕφαÏμογή"
-
msgid "Scan"
msgstr "ΣάÏωση"
@@ -2886,17 +2887,6 @@ msgstr "Απομόνωση Πελατών"
msgid "Server Settings"
msgstr "Ρυθμίσεις ΕξυπηÏετητή"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Όνομα ΥπηÏεσίας"
@@ -2983,15 +2973,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr "Ταξινόμηση"
-
msgid "Source"
msgstr "Πηγή"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -3032,6 +3016,9 @@ msgstr "ΑÏχή"
msgid "Start priority"
msgstr "ΠÏοτεÏαιότητα εκκίνησης"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Εκκίνηση"
@@ -3184,6 +3171,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3205,9 +3202,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr "Οι παÏακάτω αλλαγές έχουν υποβληθεί"
-
msgid "The following changes have been reverted"
msgstr "Οι παÏακάτω αλλαγές έχουν αναιÏεθεί"
@@ -3266,11 +3260,6 @@ msgstr ""
"να αποκτήσετε ξανά Ï€Ïόσβαση στη συσκευή."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3280,7 +3269,7 @@ msgstr ""
msgid "There are no active leases."
msgstr "Δεν υπάÏχουν ενεÏγά leases."
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3422,15 +3411,6 @@ msgstr "Διεπαφή ΤοÏνελ"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "ΙσχÏÏ‚ Εκπομπής"
@@ -3479,6 +3459,9 @@ msgstr "Μη-αποθηκευμένες Αλλαγές"
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3603,12 +3586,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3638,16 +3615,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3662,12 +3638,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3745,6 +3715,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3783,9 +3756,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr "βοήθεια"
-
msgid "hidden"
msgstr ""
@@ -3810,9 +3780,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "τοπικό αÏχείο <abbr title=\"Domain Name System\">DNS</abbr>"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3837,6 +3804,9 @@ msgstr "ανοιχτό"
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3888,6 +3858,33 @@ msgstr "ναι"
msgid "« Back"
msgstr "« Πίσω"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP Leases"
+
+#~ msgid "Sort"
+#~ msgstr "Ταξινόμηση"
+
+#~ msgid "help"
+#~ msgstr "βοήθεια"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Κατάσταση IPv6 WAN"
+
+#~ msgid "Apply"
+#~ msgstr "ΕφαÏμογή"
+
+#~ msgid "Applying changes"
+#~ msgstr "ΕφαÏμογή αλλαγών"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Η ΠαÏαμετÏοποίηση εφαÏμόστηκε."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Αποθήκευση &#38; ΕφαÏμογή"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Οι παÏακάτω αλλαγές έχουν υποβληθεί"
+
#~ msgid "Action"
#~ msgstr "ΕνέÏγεια"
diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po
index 50a7c92815..f2f65a53b2 100644
--- a/modules/luci-base/po/en/base.po
+++ b/modules/luci-base/po/en/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "1 Minute Load:"
@@ -172,9 +175,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -211,9 +211,6 @@ msgstr "ATM device number"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Access Concentrator"
@@ -317,11 +314,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -400,11 +392,14 @@ msgstr ""
msgid "Any zone"
msgstr "Any zone"
-msgid "Apply"
-msgstr "Apply"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "Applying changes"
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -420,6 +415,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Associated Stations"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -510,9 +508,6 @@ msgstr "Bad address specified!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -584,12 +579,20 @@ msgstr "Changes"
msgid "Changes applied."
msgstr "Changes applied."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Changes the administrator password for accessing the device"
msgid "Channel"
msgstr "Channel"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Check"
@@ -668,12 +671,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configuration"
-msgid "Configuration applied."
-msgstr "Configuration applied."
-
msgid "Configuration files will be kept."
msgstr "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmation"
@@ -686,12 +692,15 @@ msgstr "Connected"
msgid "Connection Limit"
msgstr "Connection Limit"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Country"
@@ -745,9 +754,6 @@ msgstr ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
-msgid "DHCP Leases"
-msgstr "DHCP Leases"
-
msgid "DHCP Server"
msgstr "DHCP Server"
@@ -760,9 +766,6 @@ msgstr "DHCP client"
msgid "DHCP-Options"
msgstr "DHCP-Options"
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -820,9 +823,6 @@ msgstr "Default gateway"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Default state"
@@ -865,6 +865,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostics"
@@ -897,6 +900,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -948,6 +954,9 @@ msgstr ""
"Don&#39;t forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests "
"without <abbr title=\"Domain Name System\">DNS</abbr>-Name"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Download and install package"
@@ -1061,6 +1070,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1093,6 +1105,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1272,7 +1293,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1344,9 +1365,6 @@ msgstr "Hang Up"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1404,7 +1422,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1455,15 +1473,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2039,9 +2054,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Name"
@@ -2165,6 +2177,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2216,12 +2231,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2573,12 +2582,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr>-Server"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2586,12 +2595,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2682,9 +2691,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2743,6 +2749,15 @@ msgstr ""
msgid "Revert"
msgstr "Revert"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2758,9 +2773,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2786,14 +2798,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2821,9 +2825,6 @@ msgstr "Save"
msgid "Save & Apply"
msgstr "Save & Apply"
-msgid "Save &#38; Apply"
-msgstr ""
-
msgid "Scan"
msgstr "Scan"
@@ -2850,17 +2851,6 @@ msgstr "Separate Clients"
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2947,15 +2937,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
msgstr "Source"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2994,6 +2978,9 @@ msgstr "Start"
msgid "Start priority"
msgstr "Start priority"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3144,6 +3131,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3165,9 +3162,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr "The following changes have been reverted"
@@ -3226,11 +3220,6 @@ msgstr ""
"settings."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3240,7 +3229,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3379,15 +3368,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3436,6 +3416,9 @@ msgstr "Unsaved Changes"
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3560,12 +3543,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3597,16 +3574,15 @@ msgstr ""
"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
"and ad-hoc mode) to be installed."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3621,12 +3597,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3703,6 +3673,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3740,9 +3713,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr "help"
-
msgid "hidden"
msgstr ""
@@ -3767,9 +3737,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "local <abbr title=\"Domain Name System\">DNS</abbr> file"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3794,6 +3761,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3845,6 +3815,21 @@ msgstr ""
msgid "« Back"
msgstr "« Back"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP Leases"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "Apply"
+#~ msgstr "Apply"
+
+#~ msgid "Applying changes"
+#~ msgstr "Applying changes"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuration applied."
+
#~ msgid "Action"
#~ msgstr "Action"
diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po
index 8aed2e9ee3..66b3145454 100644
--- a/modules/luci-base/po/es/base.po
+++ b/modules/luci-base/po/es/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Carga a 1 minuto:"
@@ -174,9 +177,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -213,9 +213,6 @@ msgstr "Número de dispositivo ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Concentrador de acceso"
@@ -323,11 +320,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -406,11 +398,14 @@ msgstr "Configuración de la antena"
msgid "Any zone"
msgstr "Cualquier zona"
-msgid "Apply"
-msgstr "Aplicar"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Aplicando cambios"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -426,6 +421,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Estaciones asociadas"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -516,9 +514,6 @@ msgstr "¡Dirección no válida!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -591,12 +586,20 @@ msgstr "Cambios"
msgid "Changes applied."
msgstr "Cambios aplicados."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Cambie la contraseña del administrador para acceder al dispositivo"
msgid "Channel"
msgstr "Canal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Comprobar"
@@ -677,12 +680,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configuración"
-msgid "Configuration applied."
-msgstr "Configuración establecida."
-
msgid "Configuration files will be kept."
msgstr "Se mantendrán los ficheros de configuración."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmación"
@@ -695,12 +701,15 @@ msgstr "Conectado"
msgid "Connection Limit"
msgstr "Límite de conexión"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Conexiones"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "País"
@@ -754,9 +763,6 @@ msgstr ""
"Personaliza el comportamiento de los <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s del dispositivo, si es posible."
-msgid "DHCP Leases"
-msgstr "Cesiones DHCP"
-
msgid "DHCP Server"
msgstr "Servidor DHCP"
@@ -769,9 +775,6 @@ msgstr "Cliente DHCP"
msgid "DHCP-Options"
msgstr "Opciones de DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Cesiones DHCPv6"
-
msgid "DHCPv6 client"
msgstr ""
@@ -829,9 +832,6 @@ msgstr "Gateway por defecto"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Estado por defecto"
@@ -874,6 +874,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnósticos"
@@ -908,6 +911,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Descartar respuestas RFC1918 salientes"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Mostrar sólo paquete que contienen"
@@ -961,6 +967,9 @@ msgstr ""
"No reenviar peticiones de <abbr title=\"Domain Name System\">DNS</abbr> sin "
"un nombre de <abbr title=\"Domain Name System\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Descargar e instalar paquete"
@@ -1076,6 +1085,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "Active este punto de montaje"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Activar este swap"
@@ -1108,6 +1120,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Borrando..."
@@ -1169,6 +1187,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fichero"
@@ -1291,7 +1312,7 @@ msgstr "Espacio libre"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1365,9 +1386,6 @@ msgstr "Suspender"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1426,8 +1444,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Cortafuegos IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Estado de la WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Dirección IPv4"
@@ -1477,15 +1495,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Estado de la WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Dirección IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2078,9 +2093,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Servidores NTP a consultar"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nombre"
@@ -2204,6 +2216,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Retraso de desconexión"
@@ -2254,12 +2269,6 @@ msgstr "Opción eliminada"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2615,16 +2624,12 @@ msgstr ""
"\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"¿Está seguro de borrar esta interfaz?. ¡No será posible deshacer el "
-"borrado!\n"
-"Puede perder el acceso a este dispositivo si está conectado por esta "
-"interfaz."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"¿Está seguro de borrar esta red inalámbrica?. ¡No será posible deshacer el "
@@ -2634,16 +2639,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "¿Está seguro de querer reiniciar todos los cambios?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"¿Está seguro de querer apagar esta red?.\n"
-"Puede perder el acceso a este dispositivo si está conectado por esta red."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"¿Está seguro de apagar la interfaz \"%s\"?.\n"
@@ -2736,9 +2738,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2797,6 +2796,15 @@ msgstr "Mostrar/ocultar contraseña"
msgid "Revert"
msgstr "Anular"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Raíz"
@@ -2812,9 +2820,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2840,14 +2845,6 @@ msgstr "Comprobar el sistema de ficheros"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2875,9 +2872,6 @@ msgstr "Guardar"
msgid "Save & Apply"
msgstr "Guardar y aplicar"
-msgid "Save &#38; Apply"
-msgstr "Guardar y aplicar"
-
msgid "Scan"
msgstr "Explorar"
@@ -2906,17 +2900,6 @@ msgstr "Aislar clientes"
msgid "Server Settings"
msgstr "Configuración del servidor"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Nombre de servicio"
@@ -3007,15 +2990,9 @@ msgstr ""
"grabarse manualmente. Por favor, mire el wiki para instrucciones de "
"instalación específicas."
-msgid "Sort"
-msgstr "Ordenar"
-
msgid "Source"
msgstr "Origen"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Especifica el directorio al que está enlazado el dispositivo"
@@ -3059,6 +3036,9 @@ msgstr "Arrancar"
msgid "Start priority"
msgstr "Prioridad de arranque"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Arranque"
@@ -3226,6 +3206,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3250,9 +3240,6 @@ msgstr ""
"coinciden con los del original.<br />Pulse \"Proceder\" para empezar el "
"grabado."
-msgid "The following changes have been committed"
-msgstr "Se han hecho los siguientes cambios"
-
msgid "The following changes have been reverted"
msgstr "Se han anulado los siguientes cambios"
@@ -3322,11 +3309,6 @@ msgstr ""
"conexión de su ordenador para poder acceder de nuevo al dispositivo."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3336,8 +3318,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Sin cesiones activas."
-msgid "There are no pending changes to apply!"
-msgstr "¡No hay cambios pendientes!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "¡No hay cambios a anular!"
@@ -3488,15 +3470,6 @@ msgstr "Interfaz de túnel"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Potencia-TX"
@@ -3545,6 +3518,9 @@ msgstr "Cambios no guardados"
msgid "Unsupported protocol type."
msgstr "Tipo de protocolo no soportado."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Actualizar listas"
@@ -3676,12 +3652,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "Clase de vendedor a enviar cuando solicite DHCP"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Verificar"
@@ -3713,16 +3683,15 @@ msgstr ""
"WPA-Encryption necesita que estén instalados wpa_supplicant (para el modo "
"cliente o hostapd (para los modos AP y ad-hoc)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Esperando a que se realicen los cambios..."
msgid "Waiting for command to complete..."
msgstr "Esperando a que termine el comando..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3737,12 +3706,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3821,6 +3784,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "puenteado"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "crear:"
@@ -3858,9 +3824,6 @@ msgstr "full dúplex"
msgid "half-duplex"
msgstr "half dúplex"
-msgid "help"
-msgstr "ayuda"
-
msgid "hidden"
msgstr "oculto"
@@ -3885,9 +3848,6 @@ msgstr "Kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "Archvo <abbr title=\"Domain Name System\">DNS</abbr> local"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3912,6 +3872,9 @@ msgstr "activo"
msgid "open"
msgstr "abierto"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3963,6 +3926,59 @@ msgstr "sí"
msgid "« Back"
msgstr "« Volver"
+#~ msgid "DHCP Leases"
+#~ msgstr "Cesiones DHCP"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Cesiones DHCPv6"
+
+#~ 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 ""
+#~ "¿Está seguro de borrar esta interfaz?. ¡No será posible deshacer el "
+#~ "borrado!\n"
+#~ "Puede perder el acceso a este dispositivo si está conectado por esta "
+#~ "interfaz."
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "¿Está seguro de querer apagar esta red?.\n"
+#~ "Puede perder el acceso a este dispositivo si está conectado por esta red."
+
+#~ msgid "Sort"
+#~ msgstr "Ordenar"
+
+#~ msgid "help"
+#~ msgstr "ayuda"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado de la WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado de la WAN IPv6"
+
+#~ msgid "Apply"
+#~ msgstr "Aplicar"
+
+#~ msgid "Applying changes"
+#~ msgstr "Aplicando cambios"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuración establecida."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Guardar y aplicar"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Se han hecho los siguientes cambios"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "¡No hay cambios pendientes!"
+
#~ msgid "Action"
#~ msgstr "Acción"
diff --git a/modules/luci-base/po/fr/base.po b/modules/luci-base/po/fr/base.po
index e09343815d..4176c7f86f 100644
--- a/modules/luci-base/po/fr/base.po
+++ b/modules/luci-base/po/fr/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Charge sur 1 minute :"
@@ -173,9 +176,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -216,9 +216,6 @@ msgstr "Numéro de périphérique ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Concentrateur d'accès"
@@ -329,11 +326,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -412,11 +404,14 @@ msgstr "Configuration de l'antenne"
msgid "Any zone"
msgstr "N'importe quelle zone"
-msgid "Apply"
-msgstr "Appliquer"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Changements en cours"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -432,6 +427,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Équipements associés"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -522,9 +520,6 @@ msgstr "Adresse spécifiée incorrecte!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -596,12 +591,20 @@ msgstr "Changements"
msgid "Changes applied."
msgstr "Changements appliqués."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Change le mot de passe administrateur pour accéder à l'équipement"
msgid "Channel"
msgstr "Canal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Vérification"
@@ -684,12 +687,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configuration"
-msgid "Configuration applied."
-msgstr "Configuration appliquée."
-
msgid "Configuration files will be kept."
msgstr "Les fichiers de configuration seront préservés."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmation"
@@ -702,12 +708,15 @@ msgstr "Connecté"
msgid "Connection Limit"
msgstr "Limite de connexion"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Connexions"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Pays"
@@ -761,9 +770,6 @@ msgstr ""
"Personnaliser le comportement des <abbr title=\"Diode Électro-Luminescente"
"\">DEL</abbr>s si possible."
-msgid "DHCP Leases"
-msgstr "Baux DHCP"
-
msgid "DHCP Server"
msgstr "Serveur DHCP"
@@ -776,9 +782,6 @@ msgstr "client DHCP"
msgid "DHCP-Options"
msgstr "Options DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Bails DHCPv6"
-
msgid "DHCPv6 client"
msgstr ""
@@ -836,9 +839,6 @@ msgstr "Passerelle par défaut"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "État par défaut"
@@ -881,6 +881,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostics"
@@ -915,6 +918,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Jeter les réponses en RFC1918 amont"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "N'afficher que les paquets contenant"
@@ -971,6 +977,9 @@ msgstr ""
"Ne pas transmettre de requêtes <abbr title=\"Domain Name System\">DNS</abbr> "
"sans nom <abbr title=\"Domain Name System\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Télécharge et installe le paquet"
@@ -1086,6 +1095,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "Activer ce montage"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Activer cette mémoire d'échange (swap)"
@@ -1120,6 +1132,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Effacement…"
@@ -1181,6 +1199,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fichier"
@@ -1302,7 +1323,7 @@ msgstr "Espace libre"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1376,9 +1397,6 @@ msgstr "Signal (HUP)"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1438,8 +1456,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Pare-feu IPv4"
-msgid "IPv4 WAN Status"
-msgstr "État IPv4 du WAN"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Adresse IPv4"
@@ -1489,15 +1507,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "État IPv6 du WAN"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Adresse IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2092,9 +2107,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Serveurs NTP candidats"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nom"
@@ -2218,6 +2230,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Durée éteinte"
@@ -2267,12 +2282,6 @@ msgstr "Option retirée"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2626,16 +2635,12 @@ msgid ""
msgstr "Lire /etc/ethers pour configurer le serveur DHCP"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Voulez-vous vraiment supprimer cette interface? L'effacement ne peut être "
-"annulé!\n"
-"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
-"cette interface."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Voulez-vous vraiment supprimer ce réseau sans-fil? L'effacement ne peut être "
@@ -2647,15 +2652,12 @@ msgid "Really reset all changes?"
msgstr "Voulez-vous vraiment ré-initialiser toutes les modifications ?"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Voulez-vous vraiment arrêter l'interface %s ?\n"
-"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
-"cette interface."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Voulez-vous vraiment arrêter l'interface %s ?\n"
@@ -2749,9 +2751,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2810,6 +2809,15 @@ msgstr "Montrer/cacher le mot de passe"
msgid "Revert"
msgstr "Revenir"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Racine"
@@ -2825,9 +2833,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2854,14 +2859,6 @@ msgstr "Faire une vérification du système de fichiers"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2889,9 +2886,6 @@ msgstr "Sauvegarder"
msgid "Save & Apply"
msgstr "Sauvegarder et Appliquer"
-msgid "Save &#38; Apply"
-msgstr "Sauvegarder et appliquer"
-
msgid "Scan"
msgstr "Scan"
@@ -2920,17 +2914,6 @@ msgstr "Isoler les clients"
msgid "Server Settings"
msgstr "Paramètres du serveur"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Nom du service"
@@ -3022,15 +3005,9 @@ msgstr ""
"au wiki pour connaître les instructions d'installation spécifiques à votre "
"matériel."
-msgid "Sort"
-msgstr "Trier"
-
msgid "Source"
msgstr "Source"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Indique le répertoire auquel le périphérique est rattaché"
@@ -3071,6 +3048,9 @@ msgstr "Démarrer"
msgid "Start priority"
msgstr "Priorité de démarrage"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Démarrage"
@@ -3238,6 +3218,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr "Le périphérique de bloc contenant la partition (ex : /dev/sda1)"
@@ -3260,9 +3250,6 @@ msgstr ""
"assurer de son intégrité.<br /> Cliquez sur \"Continuer\" pour lancer la "
"procédure d'écriture."
-msgid "The following changes have been committed"
-msgstr "Les changements suivants ont été appliqués"
-
msgid "The following changes have been reverted"
msgstr "Les changements suivants ont été annulés"
@@ -3335,11 +3322,6 @@ msgstr ""
"settings."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3349,8 +3331,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Il n'y a aucun bail actif."
-msgid "There are no pending changes to apply!"
-msgstr "Il n'y a aucun changement en attente d'être appliqués !"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Il n'y a aucun changement à annuler !"
@@ -3506,15 +3488,6 @@ msgstr "Interface du tunnel"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Puissance d'émission"
@@ -3563,6 +3536,9 @@ msgstr "Changements non appliqués"
msgid "Unsupported protocol type."
msgstr "Type de protocole non pris en charge."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Mettre les listes à jour"
@@ -3695,12 +3671,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "Classe de fournisseur à envoyer dans les requêtes DHCP"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Vérifier"
@@ -3732,16 +3702,15 @@ msgstr ""
"Le chiffrage WPA nécessite l'installation du paquet wpa_supplicant (en mode "
"client) ou hostapd (en mode Point d'accès ou Ad-hoc)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "En attente de l'application des changements..."
msgid "Waiting for command to complete..."
msgstr "En attente de la fin de la commande..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3756,12 +3725,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3841,6 +3804,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "ponté"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "créer:"
@@ -3876,9 +3842,6 @@ msgstr "full-duplex"
msgid "half-duplex"
msgstr "half-duplex"
-msgid "help"
-msgstr "aide"
-
msgid "hidden"
msgstr "cacher"
@@ -3903,9 +3866,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "fichier de résolution local"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3930,6 +3890,9 @@ msgstr "Actif"
msgid "open"
msgstr "ouvrir"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3981,6 +3944,59 @@ msgstr "oui"
msgid "« Back"
msgstr "« Retour"
+#~ msgid "DHCP Leases"
+#~ msgstr "Baux DHCP"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Bails DHCPv6"
+
+#~ 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 ""
+#~ "Voulez-vous vraiment supprimer cette interface? L'effacement ne peut être "
+#~ "annulé!\n"
+#~ "Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
+#~ "cette interface."
+
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Voulez-vous vraiment arrêter l'interface %s ?\n"
+#~ "Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
+#~ "cette interface."
+
+#~ msgid "Sort"
+#~ msgstr "Trier"
+
+#~ msgid "help"
+#~ msgstr "aide"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "État IPv4 du WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "État IPv6 du WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Appliquer"
+
+#~ msgid "Applying changes"
+#~ msgstr "Changements en cours"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuration appliquée."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Sauvegarder et appliquer"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Les changements suivants ont été appliqués"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Il n'y a aucun changement en attente d'être appliqués !"
+
#~ msgid "Action"
#~ msgstr "Action"
diff --git a/modules/luci-base/po/he/base.po b/modules/luci-base/po/he/base.po
index cb4c74a3f6..437127fd66 100644
--- a/modules/luci-base/po/he/base.po
+++ b/modules/luci-base/po/he/base.po
@@ -47,6 +47,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "עומס במשך דקה:"
@@ -163,9 +166,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -203,9 +203,6 @@ msgstr "מס' התקן של ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
#, fuzzy
msgid "Access Concentrator"
msgstr "מרכז גישות"
@@ -316,11 +313,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -401,11 +393,14 @@ msgstr "הגדרות ×נטנה"
msgid "Any zone"
msgstr "כל תחו×"
-msgid "Apply"
-msgstr "החל"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "מחיל הגדרות"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -421,6 +416,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "תחנות קשורות"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -511,9 +509,6 @@ msgstr "פורטה כתובת ×œ× ×ª×§×™× ×”"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -586,12 +581,20 @@ msgstr "שינויי×"
msgid "Changes applied."
msgstr "×”×©×™× ×•×™×™× ×”×•×—×œ×•"
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "משנה ×ת סיסמת המנהל לגישה למכשיר"
msgid "Channel"
msgstr "ערוץ"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "לבדוק"
@@ -661,12 +664,15 @@ msgstr ""
msgid "Configuration"
msgstr "הגדרות"
-msgid "Configuration applied."
-msgstr "הגדרות הוחלו"
-
msgid "Configuration files will be kept."
msgstr "קבצי ההגדרות ישמרו."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "×ישור"
@@ -679,12 +685,15 @@ msgstr "מחובר"
msgid "Connection Limit"
msgstr "מגבלת חיבורי×"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "חיבורי×"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "מדינה"
@@ -738,9 +747,6 @@ msgstr ""
"מת××™× ×ת הגדרות ×”-<abbr title=\"Light Emitting Diode\">LED</abbr>-×™× ×‘×ž×›×©×™×¨ "
"(×× ×פשרי)."
-msgid "DHCP Leases"
-msgstr "הרש×ות DHCP"
-
msgid "DHCP Server"
msgstr "שרת DHCP"
@@ -753,9 +759,6 @@ msgstr "לקוח DHCP"
msgid "DHCP-Options"
msgstr "×פשרויות-DHCP"
-msgid "DHCPv6 Leases"
-msgstr "הרש×ות DHCPv6"
-
msgid "DHCPv6 client"
msgstr ""
@@ -813,9 +816,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr ""
@@ -857,6 +857,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "×בחון"
@@ -889,6 +892,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "מציג רק חבילות המכילות"
@@ -934,6 +940,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "הורד והתקן חבילות"
@@ -1046,6 +1055,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1078,6 +1090,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "מוחק..."
@@ -1136,6 +1154,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1257,7 +1278,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1329,9 +1350,6 @@ msgstr ""
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1387,7 +1405,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1438,15 +1456,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2012,9 +2027,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "ש×"
@@ -2138,6 +2150,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2183,12 +2198,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2538,28 +2547,25 @@ msgid ""
msgstr ""
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
msgid "Really reset all changes?"
msgstr ""
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"×”×× ×œ×ž×—×•×§ ×ת הרשת ×”×לחוטית הזו? המחיקה ××™× ×” ניתנת לביטול!\n"
-"ייתכן ות×בד גישה לנתב ×”×–×” ×× ×תה מחובר דרך השרת הזו."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2650,9 +2656,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2711,6 +2714,15 @@ msgstr ""
msgid "Revert"
msgstr ""
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2726,9 +2738,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2752,14 +2761,6 @@ msgstr "הרץ בדיקת מערכת קבצי×"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2787,9 +2788,6 @@ msgstr ""
msgid "Save & Apply"
msgstr ""
-msgid "Save &#38; Apply"
-msgstr ""
-
msgid "Scan"
msgstr ""
@@ -2816,17 +2814,6 @@ msgstr ""
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2916,15 +2903,9 @@ msgstr ""
"סליחה, ×ין תמיכה בעדכון מערכת, ולכן קושחה חדשה חייבת להיצרב ידנית. ×× × ×¤× ×” "
"×ל ×”-wiki של OpenWrt/LEDE עבור הור×ות ספציפיות למכשיר שלך."
-msgid "Sort"
-msgstr "מיין"
-
msgid "Source"
msgstr "מקור"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2963,6 +2944,9 @@ msgstr ""
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "×תחול"
@@ -3116,6 +3100,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3132,9 +3126,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr ""
@@ -3189,11 +3180,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3201,7 +3187,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3337,15 +3323,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "עוצמת שידור"
@@ -3394,6 +3371,9 @@ msgstr ""
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3518,12 +3498,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3553,16 +3527,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3577,12 +3550,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3656,6 +3623,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3691,9 +3661,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr "עזרה"
-
msgid "hidden"
msgstr ""
@@ -3718,9 +3685,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr ""
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3745,6 +3709,9 @@ msgstr "פועל"
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3796,6 +3763,35 @@ msgstr "כן"
msgid "« Back"
msgstr "<< ×חורה"
+#~ msgid "DHCP Leases"
+#~ msgstr "הרש×ות DHCP"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "הרש×ות DHCPv6"
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "×”×× ×œ×ž×—×•×§ ×ת הרשת ×”×לחוטית הזו? המחיקה ××™× ×” ניתנת לביטול!\n"
+#~ "ייתכן ות×בד גישה לנתב ×”×–×” ×× ×תה מחובר דרך השרת הזו."
+
+#~ msgid "Sort"
+#~ msgstr "מיין"
+
+#~ msgid "help"
+#~ msgstr "עזרה"
+
+#~ msgid "Apply"
+#~ msgstr "החל"
+
+#~ msgid "Applying changes"
+#~ msgstr "מחיל הגדרות"
+
+#~ msgid "Configuration applied."
+#~ msgstr "הגדרות הוחלו"
+
#~ msgid "Action"
#~ msgstr "פעולה"
diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po
index e49b5303f0..f855fcf065 100644
--- a/modules/luci-base/po/hu/base.po
+++ b/modules/luci-base/po/hu/base.po
@@ -47,6 +47,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Terhelés (utolsó 1 perc):"
@@ -170,9 +173,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -209,9 +209,6 @@ msgstr "ATM eszközszám"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Elérési központ"
@@ -322,11 +319,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -405,11 +397,14 @@ msgstr "Antenna beállítások"
msgid "Any zone"
msgstr "Bármelyik zóna"
-msgid "Apply"
-msgstr "Alkalmaz"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Módosítások alkalmazása"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -425,6 +420,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Kapcsolódó kliensek"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -515,9 +513,6 @@ msgstr "Hibás címet adott meg!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -590,6 +585,9 @@ msgstr "Módosítások"
msgid "Changes applied."
msgstr "A módosítások alkalmazva."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr ""
"Itt módosíthatja az eszköz eléréséhez szükséges adminisztrátori jelszót"
@@ -597,6 +595,11 @@ msgstr ""
msgid "Channel"
msgstr "Csatorna"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Ellenőrzés"
@@ -679,12 +682,15 @@ msgstr ""
msgid "Configuration"
msgstr "Beállítás"
-msgid "Configuration applied."
-msgstr "Beállítások alkalmazva."
-
msgid "Configuration files will be kept."
msgstr "A konfigurációs fájlok megmaradnak."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Megerősítés"
@@ -697,12 +703,15 @@ msgstr "Kapcsolódva"
msgid "Connection Limit"
msgstr "Kapcsolati korlát"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Kapcsolatok"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Ország"
@@ -756,9 +765,6 @@ msgstr ""
"Az eszköz <abbr title=\"Light Emitting Diode\">LED</abbr>-jei működésének "
"testreszabása."
-msgid "DHCP Leases"
-msgstr "DHCP bérletek"
-
msgid "DHCP Server"
msgstr "DHCP kiszolgáló"
@@ -771,9 +777,6 @@ msgstr "DHCP ügyfél"
msgid "DHCP-Options"
msgstr "DHCP beállítások"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6 bérletek"
-
msgid "DHCPv6 client"
msgstr ""
@@ -831,9 +834,6 @@ msgstr "Alapértelmezett átjáró"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Alapértelmezett állapot"
@@ -875,6 +875,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnosztika"
@@ -909,6 +912,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Beérkező RFC1918 DHCP válaszok elvetése. "
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Csak azon csomagok megjelenítése, amelyek tartalmazzák"
@@ -962,6 +968,9 @@ msgstr ""
"Ne továbbítsa a <abbr title=\"Domain Name System\">DNS</abbr>-név nélküli "
"<abbr title=\"Domain Name System\">DNS</abbr>-kéréseket "
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Csomag letöltése és telepítése"
@@ -1079,6 +1088,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "A csatolás engedélyezése"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "A lapozó terület engedélyezése"
@@ -1111,6 +1123,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Törlés..."
@@ -1170,6 +1188,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fájl"
@@ -1293,7 +1314,7 @@ msgstr "Szabad hely"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1365,9 +1386,6 @@ msgstr "Befejezés"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1427,8 +1445,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 tűzfal"
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN állapot"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4 cím"
@@ -1478,15 +1496,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN állapot"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "IPv6 cím"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2081,9 +2096,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Kijelölt NTP kiszolgálók"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Név"
@@ -2207,6 +2219,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Kikapcsolt állapot késleltetés"
@@ -2257,12 +2272,6 @@ msgstr "Beállítás eltávolítva"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2618,15 +2627,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr> kiszolgáló beállításához"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Biztosan törli az interfészt? A törlés nem visszavonható!\n"
-" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az "
-"interfészen keresztül kapcsolódik."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Biztosan törli ezt a vezetéknélküli hálózatot? A törlés nem visszavonható!\n"
@@ -2636,17 +2642,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "Biztos, hogy visszavonja az összes módosítást?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Biztos, hogy leállítja a hálózatot?!\n"
-" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen a "
-"hálózaton keresztül kapcsolódik."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Biztos, hogy leállítja a \"%s\" interfészt?\n"
@@ -2740,9 +2742,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2802,6 +2801,15 @@ msgstr "Jelszó mutatása/elrejtése"
msgid "Revert"
msgstr "Visszavonás"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Gyökérkönyvtár"
@@ -2817,9 +2825,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2845,14 +2850,6 @@ msgstr "Fájlrendszer ellenőrzés futtatása"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2880,9 +2877,6 @@ msgstr "Mentés"
msgid "Save & Apply"
msgstr "Mentés & Alkalmazás"
-msgid "Save &#38; Apply"
-msgstr "Mentés &#38; Alkalmazás"
-
msgid "Scan"
msgstr "Felderítés"
@@ -2911,17 +2905,6 @@ msgstr "Kliensek szétválasztása"
msgid "Server Settings"
msgstr "Kiszolgáló beállításai"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Szolgáltatás neve"
@@ -3012,15 +2995,9 @@ msgstr ""
"telepítését manuálisan kell elvégezni. Az eszközhöz tartozó telepítési "
"utasításokért keresse fel az wiki-t."
-msgid "Sort"
-msgstr "Sorbarendezés"
-
msgid "Source"
msgstr "Forrás"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Megadja az eszköz csatlakozási könyvtárát."
@@ -3062,6 +3039,9 @@ msgstr "Indítás"
msgid "Start priority"
msgstr "Indítás prioritása"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Rendszerindítás"
@@ -3227,6 +3207,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3252,9 +3242,6 @@ msgstr ""
"ellenőrzéséhez.<br />Kattintson az alábbi \"Folytatás\" gombra a flash-elési "
"eljárás elindításához."
-msgid "The following changes have been committed"
-msgstr "A következő módosítások lettek alkalmazva"
-
msgid "The following changes have been reverted"
msgstr "A következő módosítások lettek visszavonva"
@@ -3324,11 +3311,6 @@ msgstr ""
"megújítása."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3338,8 +3320,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Nincsenek aktív bérletek."
-msgid "There are no pending changes to apply!"
-msgstr "Nincsenek alkalmazásra váró módosítások!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Nincsenek visszavonásra váró változtatások!"
@@ -3494,15 +3476,6 @@ msgstr "Tunnel interfész"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Adóteljesítmény"
@@ -3551,6 +3524,9 @@ msgstr "El nem mentett módosítások"
msgid "Unsupported protocol type."
msgstr "Nem támogatott protokoll típus."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Listák frissítése"
@@ -3682,12 +3658,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "DHCP kérés során küldendő 'Vendor Class'"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Ellenőrzés"
@@ -3719,16 +3689,15 @@ msgstr ""
"WPA titkosításhoz kliens módnál 'wpa_supplicant', hozzáférési pont illetve "
"ad-hoc módnál 'hostapd' telepítése szükséges."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Várakozás a változtatások alkalmazására..."
msgid "Waiting for command to complete..."
msgstr "Várakozás a parancs befejezésére..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3743,12 +3712,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3828,6 +3791,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "áthidalt"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "új:"
@@ -3865,9 +3831,6 @@ msgstr "full-duplex"
msgid "half-duplex"
msgstr "half-duplex"
-msgid "help"
-msgstr "súgó"
-
msgid "hidden"
msgstr "rejtett"
@@ -3892,9 +3855,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "helyi <abbr title=\"Domain Name System\">DNS</abbr> fájl"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3919,6 +3879,9 @@ msgstr "be"
msgid "open"
msgstr "nyitás"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3970,6 +3933,59 @@ msgstr "igen"
msgid "« Back"
msgstr "« Vissza"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP bérletek"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6 bérletek"
+
+#~ 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 ""
+#~ "Biztosan törli az interfészt? A törlés nem visszavonható!\n"
+#~ " Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az "
+#~ "interfészen keresztül kapcsolódik."
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Biztos, hogy leállítja a hálózatot?!\n"
+#~ " Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen a "
+#~ "hálózaton keresztül kapcsolódik."
+
+#~ msgid "Sort"
+#~ msgstr "Sorbarendezés"
+
+#~ msgid "help"
+#~ msgstr "súgó"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN állapot"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN állapot"
+
+#~ msgid "Apply"
+#~ msgstr "Alkalmaz"
+
+#~ msgid "Applying changes"
+#~ msgstr "Módosítások alkalmazása"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Beállítások alkalmazva."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Mentés &#38; Alkalmazás"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "A következő módosítások lettek alkalmazva"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Nincsenek alkalmazásra váró módosítások!"
+
#~ msgid "Action"
#~ msgstr "Művelet"
diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po
index ce866d9e7b..c975295b34 100644
--- a/modules/luci-base/po/it/base.po
+++ b/modules/luci-base/po/it/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Carico in 1 minuto:"
@@ -177,9 +180,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -216,9 +216,6 @@ msgstr "Numero dispositivo ATM "
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Accesso Concentratore"
@@ -331,11 +328,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -414,11 +406,14 @@ msgstr "Configurazione dell'Antenna"
msgid "Any zone"
msgstr "Qualsiasi Zona"
-msgid "Apply"
-msgstr "Applica"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Applica modifiche"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -434,6 +429,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Dispositivi Wi-Fi connessi"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -524,9 +522,6 @@ msgstr "E' stato specificato un indirizzo errato!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -598,12 +593,20 @@ msgstr "Modifiche"
msgid "Changes applied."
msgstr "Modifiche applicate."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Cambia la password di amministratore per accedere al dispositivo"
msgid "Channel"
msgstr "Canale"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Verifica"
@@ -684,12 +687,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configurazione"
-msgid "Configuration applied."
-msgstr "Configurazione salvata."
-
msgid "Configuration files will be kept."
msgstr "I file di configurazione verranno mantenuti."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Conferma"
@@ -702,12 +708,15 @@ msgstr "Connesso"
msgid "Connection Limit"
msgstr "Limite connessioni"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Connessioni"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Nazione"
@@ -761,9 +770,6 @@ msgstr ""
"Personalizza la configurazione dei <abbr title=\"Light Emitting Diode\">LED</"
"abbr> del sistema se possibile."
-msgid "DHCP Leases"
-msgstr "Contratti DHCP"
-
msgid "DHCP Server"
msgstr "Server DHCP"
@@ -776,9 +782,6 @@ msgstr "Cliente DHCP"
msgid "DHCP-Options"
msgstr "Opzioni DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Contratti DHCPv6"
-
msgid "DHCPv6 client"
msgstr "Cliente DHCPv6"
@@ -836,9 +839,6 @@ msgstr "Gateway predefinito"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Stato Predefinito"
@@ -881,6 +881,9 @@ msgstr "Dispositivo in riavvio..."
msgid "Device unreachable"
msgstr "Dispositivo irraggiungibile"
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostica"
@@ -915,6 +918,9 @@ msgstr "Disabilitato (default)"
msgid "Discard upstream RFC1918 responses"
msgstr "Ignora risposte RFC1918 upstream"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Visualizza solo i pacchetti contenenti"
@@ -967,6 +973,9 @@ msgstr ""
"Non inoltrare le richieste <abbr title=\"Domain Name System\">DNS</abbr> "
"senza nome <abbr title=\"Domain Name System\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Scarica e installa pacchetto"
@@ -1082,6 +1091,9 @@ msgstr "Abilita l'opzione DF (non Frammentare) dei pacchetti incapsulati"
msgid "Enable this mount"
msgstr "Abilita questo mount"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Abilita questo swap"
@@ -1114,6 +1126,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Cancellazione..."
@@ -1174,6 +1192,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "File"
@@ -1295,7 +1316,7 @@ msgstr "Spazio libero"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1369,9 +1390,6 @@ msgstr "Hangup"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1432,8 +1450,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 Firewall"
-msgid "IPv4 WAN Status"
-msgstr "Stato WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Indirizzi IPv4"
@@ -1483,15 +1501,12 @@ msgstr "Impostazioni IPv6"
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Stato WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Indirizzi IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2081,9 +2096,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Candidati server NTP"
-msgid "NTP sync time-out"
-msgstr "Sincronizzazione NTP scaduta"
-
msgid "Name"
msgstr "Nome"
@@ -2207,6 +2219,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2257,12 +2272,6 @@ msgstr "Opzione cancellata"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2616,30 +2625,32 @@ msgstr ""
"\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
+"Vuoi davvero rimuovere questa interfaccia wireless? La rimozione non può "
+"essere ripristinata! Potresti perdere l'accesso a questo dispositivo se sei "
+"connesso con questa rete."
msgid "Really reset all changes?"
msgstr "Azzerare veramente tutte le modifiche?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Vuoi davvero spegnere questa interfaccia \"%s\" ?\\nPotresti perdere "
-"l'accesso a questo router se stai usando questa interfaccia."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
+"Vuoi davvero spegnere questa interfaccia \"%s\"? Potresti perdere l'accesso "
+"a questo router se stai usando questa interfaccia."
msgid "Really switch protocol?"
msgstr "Cambiare veramente il protocollo?"
@@ -2728,9 +2739,6 @@ msgstr "Richiede indirizzo-IPv6"
msgid "Request IPv6-prefix of length"
msgstr "Richiede prefisso-IPv6 di lunghezza"
-msgid "Require TLS"
-msgstr "Richiede TLS"
-
msgid "Required"
msgstr "Richiesto"
@@ -2789,6 +2797,15 @@ msgstr "Rivela/nascondi password"
msgid "Revert"
msgstr "Ripristina"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2804,9 +2821,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2832,14 +2846,6 @@ msgstr "Esegui controllo del filesystem"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2867,9 +2873,6 @@ msgstr "Salva"
msgid "Save & Apply"
msgstr "Salva & applica"
-msgid "Save &#38; Apply"
-msgstr "Salva &#38; Applica"
-
msgid "Scan"
msgstr "Scan"
@@ -2896,17 +2899,6 @@ msgstr "Isola utenti"
msgid "Server Settings"
msgstr "Impostazioni Server"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2997,15 +2989,9 @@ msgstr ""
"riferimento al wiki per le istruzioni di installazione di dispositivi "
"specifici."
-msgid "Sort"
-msgstr "Ordina"
-
msgid "Source"
msgstr "Origine"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Specifica la cartella a cui è collegato il dispositivo in"
@@ -3048,6 +3034,9 @@ msgstr "Inizio"
msgid "Start priority"
msgstr "Priorità di avvio"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Avvio"
@@ -3213,6 +3202,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3233,9 +3232,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr "Le seguenti modifiche sono state annullate"
@@ -3294,11 +3290,6 @@ msgstr ""
"settings."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3308,8 +3299,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Non ci sono contratti attivi."
-msgid "There are no pending changes to apply!"
-msgstr "Non ci sono cambiamenti pendenti da applicare!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Non ci sono cambiamenti pendenti da regredire"
@@ -3451,15 +3442,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3508,6 +3490,9 @@ msgstr "Modifiche non salvate"
msgid "Unsupported protocol type."
msgstr "Tipo protocollo non supportato."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Aggiorna liste"
@@ -3641,12 +3626,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "Classe del Produttore da 'inviare al momento della richiesta DHCP"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Verifica"
@@ -3678,18 +3657,15 @@ msgstr ""
"La crittografia WPA richiede wpa_supplicant (per la modalità client) o "
"hostapd (per AP e modalità ad hoc) per essere installato."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Attendi sincro NTP quei dati secondi, immetti 0 per disabilitare l'attesa "
-"(opzionale)"
-
msgid "Waiting for changes to be applied..."
msgstr "In attesa delle modifiche da applicare ..."
msgid "Waiting for command to complete..."
msgstr "In attesa del comando da completare..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3704,12 +3680,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3790,6 +3760,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "ponte"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "crea:"
@@ -3827,9 +3800,6 @@ msgstr "full-duplex"
msgid "half-duplex"
msgstr "half-duplex"
-msgid "help"
-msgstr "aiuto"
-
msgid "hidden"
msgstr "nascosto"
@@ -3854,9 +3824,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "File <abbr title=\"Sistema Nome Dominio\">DNS</abbr> locale"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3881,6 +3848,9 @@ msgstr "acceso"
msgid "open"
msgstr "apri"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3932,84 +3902,35 @@ msgstr "Sì"
msgid "« Back"
msgstr "« Indietro"
-#~ msgid "Action"
-#~ msgstr "Azione"
-
-#~ msgid "Buttons"
-#~ msgstr "Pulsanti"
-
-#~ msgid "Handler"
-#~ msgstr "Gestore"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Tempo massimo di attesa"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Velocità minima"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Specifica lo stato del pulsante da gestire"
-
-#~ msgid "Leasetime"
-#~ msgstr "Tempo di contratto"
-
-#, fuzzy
-#~ msgid "automatic"
-#~ msgstr "statico"
-
-#~ msgid "AR Support"
-#~ msgstr "Supporto AR"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Dispositivo Wireless Atheros 802.11%s"
-
-#~ msgid "Background Scan"
-#~ msgstr "Scansione in background"
-
-#~ msgid "Compression"
-#~ msgstr "Compressione"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Disabilita Timer Beacon HW"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Disabilita Probe-Responses"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Frame veloci"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Velocità massima"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Velocità minima"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Velocità multicast"
-
-#~ msgid "Separate WDS"
-#~ msgstr "WDS separati"
-
-#~ msgid "Static WDS"
-#~ msgstr "WDS statico"
+#~ msgid "DHCP Leases"
+#~ msgstr "Contratti DHCP"
-#~ msgid "Turbo Mode"
-#~ msgstr "Modalità turbo"
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Contratti DHCPv6"
-#~ msgid "XR Support"
-#~ msgstr "Supporto XR"
+#~ 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 ""
+#~ "Vuoi davvero rimuovere questa interfaccia? La rimozione non può essere "
+#~ "ripristinata! Potresti perdere l'accesso a questo dispositivo se sei "
+#~ "connesso con questa rete."
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Sarà creata una rete aggiuntiva se lasci questo senza spunta."
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Vuoi davvero spegnere questa interfaccia? Potresti perdere l'accesso a "
+#~ "questo router se sei connesso usando questa interfaccia."
-#~ msgid "Join Network: Settings"
-#~ msgstr "Aggiunta Rete: Impostazioni"
+#~ msgid "Sort"
+#~ msgstr "Ordina"
-#~ msgid "CPU"
-#~ msgstr "CPU"
+#~ msgid "help"
+#~ msgstr "aiuto"
-#~ msgid "Port %d"
-#~ msgstr "Porta %d"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Stato WAN IPv4"
-#~ msgid "VLAN Interface"
-#~ msgstr "Interfaccia VLAN"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Stato WAN IPv6"
diff --git a/modules/luci-base/po/ja/base.po b/modules/luci-base/po/ja/base.po
index 07eeec5ee3..1408c07f27 100644
--- a/modules/luci-base/po/ja/base.po
+++ b/modules/luci-base/po/ja/base.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
-"PO-Revision-Date: 2018-05-03 00:23+0900\n"
+"PO-Revision-Date: 2018-06-01 02:42+0900\n"
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
@@ -49,6 +49,9 @@ msgstr "-- ラベルを指定 --"
msgid "-- match by uuid --"
msgstr "-- UUID を指定 --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "éŽåŽ»1分ã®è² è·:"
@@ -175,9 +178,6 @@ msgstr "A43C + J43 + A43 + V43"
msgid "ADSL"
msgstr "ADSL"
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
msgid "ANSI T1.413"
msgstr "ANSI T1.413"
@@ -211,9 +211,6 @@ msgstr "ATMデãƒã‚¤ã‚¹ç•ªå·"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Access Concentrator"
@@ -321,11 +318,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr "許å¯ã•ã‚Œã‚‹IP"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr "常ã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ルーターã¨ã—ã¦é€šçŸ¥ã™ã‚‹"
@@ -406,11 +398,14 @@ msgstr "アンテナ設定"
msgid "Any zone"
msgstr "å…¨ã¦ã®ã‚¾ãƒ¼ãƒ³"
-msgid "Apply"
-msgstr "é©ç”¨"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr "é©ç”¨ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ <code>%h</code> ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—ãŸ"
+
+msgid "Apply unchecked"
+msgstr "ãƒã‚§ãƒƒã‚¯ãªã—ã®é©ç”¨"
-msgid "Applying changes"
-msgstr "変更をé©ç”¨"
+msgid "Architecture"
+msgstr "アーキテクãƒãƒ£"
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -426,6 +421,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "èªè¨¼æ¸ˆã¿ç«¯æœ«"
+msgid "Associations"
+msgstr "アソシエーション数"
+
msgid "Auth Group"
msgstr "èªè¨¼ã‚°ãƒ«ãƒ¼ãƒ—"
@@ -516,9 +514,6 @@ msgstr "無効ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -593,12 +588,22 @@ msgstr "変更"
msgid "Changes applied."
msgstr "変更ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚"
+msgid "Changes have been reverted."
+msgstr "変更ã¯å–り消ã•ã‚Œã¾ã—ãŸã€‚"
+
msgid "Changes the administrator password for accessing the device"
msgstr "デãƒã‚¤ã‚¹ã®ç®¡ç†è€…パスワードを変更ã—ã¾ã™"
msgid "Channel"
msgstr "ãƒãƒ£ãƒãƒ«"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+"ãƒãƒ£ãƒ³ãƒãƒ« %d ã¯ã€ %s 領域内ã§ã¯è¦åˆ¶ã«ã‚ˆã‚Šåˆ©ç”¨ã§ãã¾ã›ã‚“。%d ã¸è‡ªå‹•èª¿æ•´ã•ã‚Œã¾"
+"ã—ãŸã€‚"
+
msgid "Check"
msgstr "ãƒã‚§ãƒƒã‚¯"
@@ -685,12 +690,15 @@ msgstr ""
msgid "Configuration"
msgstr "設定"
-msgid "Configuration applied."
-msgstr "設定をé©ç”¨ã—ã¾ã—ãŸã€‚"
-
msgid "Configuration files will be kept."
msgstr "設定ファイルã¯ä¿æŒã•ã‚Œã¾ã™ã€‚"
+msgid "Configuration has been applied."
+msgstr "設定ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚"
+
+msgid "Configuration has been rolled back!"
+msgstr "設定ã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã•ã‚Œã¾ã—ãŸï¼"
+
msgid "Confirmation"
msgstr "確èª"
@@ -703,12 +711,18 @@ msgstr "接続中"
msgid "Connection Limit"
msgstr "接続制é™"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "TLSãŒä½¿ç”¨ã§ããªã„ã¨ãã€ã‚µãƒ¼ãƒãƒ¼ã¸ã®æŽ¥ç¶šã¯å¤±æ•—ã—ã¾ã™ã€‚"
-
msgid "Connections"
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶š"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+"設定ã®å¤‰æ›´ã‚’é©ç”¨å¾Œã€ãƒ‡ãƒã‚¤ã‚¹ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’回復ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã— IP アド"
+"レスや無線ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£èªè¨¼æƒ…å ±ãªã©ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é–¢é€£ã®è¨­å®šã‚’変更ã—ãŸå ´åˆã€"
+"å†æŽ¥ç¶šãŒå¿…è¦ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。"
+
msgid "Country"
msgstr "国"
@@ -766,9 +780,6 @@ msgstr ""
"<abbr title=\"Light Emitting Diode\">LED</abbr> デãƒã‚¤ã‚¹ã®æŒ™å‹•ã‚’カスタマイズ"
"ã—ã¾ã™ã€‚"
-msgid "DHCP Leases"
-msgstr "DHCPリース"
-
msgid "DHCP Server"
msgstr "DHCPサーãƒãƒ¼"
@@ -781,9 +792,6 @@ msgstr "DHCP クライアント"
msgid "DHCP-Options"
msgstr "DHCPオプション"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6 リース"
-
msgid "DHCPv6 client"
msgstr "DHCPv6 クライアント"
@@ -841,9 +849,6 @@ msgstr "デフォルト ゲートウェイ"
msgid "Default is stateless + stateful"
msgstr "デフォルト㯠ステートレス + ステートフル ã§ã™ã€‚"
-msgid "Default route"
-msgstr "デフォルト ルート"
-
msgid "Default state"
msgstr "標準状態"
@@ -885,6 +890,9 @@ msgstr "デãƒã‚¤ã‚¹ã‚’å†èµ·å‹•ä¸­ã§ã™..."
msgid "Device unreachable"
msgstr "デãƒã‚¤ã‚¹ã«åˆ°é”ã§ãã¾ã›ã‚“"
+msgid "Device unreachable!"
+msgstr "デãƒã‚¤ã‚¹ã«åˆ°é”ã§ãã¾ã›ã‚“ï¼"
+
msgid "Diagnostics"
msgstr "診断機能"
@@ -919,6 +927,9 @@ msgstr "無効(デフォルト)"
msgid "Discard upstream RFC1918 responses"
msgstr "RFC1918ã®å¿œç­”を破棄ã—ã¾ã™"
+msgid "Dismiss"
+msgstr "警告ã®é™¤åŽ»"
+
msgid "Displaying only packages containing"
msgstr "å³è¨˜ã®æ–‡å­—列をå«ã‚“ã ãƒ‘ッケージã®ã¿ã‚’表示中"
@@ -971,6 +982,9 @@ msgstr ""
"<abbr title=\"Domain Name System\">DNS</abbr>åã®ç„¡ã„ <abbr title=\"Domain "
"Name System\">DNS</abbr>リクエストを転é€ã—ã¾ã›ã‚“"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "パッケージã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
@@ -1088,6 +1102,9 @@ msgstr "カプセル化ã•ã‚ŒãŸãƒ‘ケット㮠DF (Don't Fragment) フラグを
msgid "Enable this mount"
msgstr "マウント設定を有効ã«ã™ã‚‹"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "スワップ設定を有効ã«ã™ã‚‹"
@@ -1120,6 +1137,12 @@ msgstr "エンドãƒã‚¤ãƒ³ãƒˆ ホスト"
msgid "Endpoint Port"
msgstr "エンドãƒã‚¤ãƒ³ãƒˆ ãƒãƒ¼ãƒˆ"
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "消去中..."
@@ -1180,6 +1203,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr "%d 秒以内ã®é©ç”¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ロールãƒãƒƒã‚¯ä¸­ã§ã™..."
+
msgid "File"
msgstr "ファイル"
@@ -1304,10 +1330,10 @@ msgstr "ディスクã®ç©ºã容é‡"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
"WireGuard インターフェースã¨ãƒ”ã‚¢ã«ã¤ã„ã¦ã®è©³ç´°æƒ…å ±: <a href=\"http://"
-"wireguard.io\">wireguard.io</a>"
+"wireguard.com\">wireguard.com</a>"
msgid "GHz"
msgstr "GHz"
@@ -1378,9 +1404,6 @@ msgstr "å†èµ·å‹•"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr "ãƒãƒ¼ãƒˆãƒ“ート"
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1438,8 +1461,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 ファイアウォール"
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN ステータス"
+msgid "IPv4 Upstream"
+msgstr "IPv4 アップストリーム"
msgid "IPv4 address"
msgstr "IPv4 アドレス"
@@ -1489,15 +1512,12 @@ msgstr "IPv6 設定"
msgid "IPv6 ULA-Prefix"
msgstr "IPv6 ULA-プレフィクス"
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN ステータス"
+msgid "IPv6 Upstream"
+msgstr "IPv6 アップストリーム"
msgid "IPv6 address"
msgstr "IPv6 アドレス"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2092,9 +2112,6 @@ msgstr "NT ドメイン"
msgid "NTP server candidates"
msgstr "NTPサーãƒãƒ¼å€™è£œ"
-msgid "NTP sync time-out"
-msgstr "NTP åŒæœŸã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
-
msgid "Name"
msgstr "åå‰"
@@ -2220,6 +2237,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "消ç¯æ™‚é–“"
@@ -2271,12 +2291,6 @@ msgstr "削除ã•ã‚Œã‚‹ã‚ªãƒ—ション"
msgid "Optional"
msgstr "オプション"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2636,16 +2650,12 @@ msgstr ""
"ã¨ã—ã¦<code>/etc/ethers</code> をロードã—ã¾ã™"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"本当ã«ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾"
-"ã›ã‚“!\n"
-"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããª"
-"ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"本当ã«ã“ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾"
@@ -2657,15 +2667,12 @@ msgid "Really reset all changes?"
msgstr "本当ã«å…¨ã¦ã®å¤‰æ›´ã‚’リセットã—ã¾ã™ã‹?"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"本当ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’åœæ­¢ã—ã¾ã™ã‹?\n"
-"ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚‹å ´"
-"åˆãŒã‚ã‚Šã¾ã™ã€‚"
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"本当ã«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ \"%s\" ã‚’åœæ­¢ã—ã¾ã™ã‹?\n"
@@ -2759,9 +2766,6 @@ msgstr "IPv6-アドレスã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
msgid "Request IPv6-prefix of length"
msgstr "リクエストã™ã‚‹IPv6-プレフィクス長"
-msgid "Require TLS"
-msgstr "TLSãŒå¿…è¦"
-
msgid "Required"
msgstr "å¿…é ˆ"
@@ -2822,6 +2826,15 @@ msgstr "パスワードを表示ã™ã‚‹/éš ã™"
msgid "Revert"
msgstr "å…ƒã«æˆ»ã™"
+msgid "Revert changes"
+msgstr "変更ã®å–り消ã—"
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr "å–り消ã—ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ <code>%h</code> ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—ãŸ"
+
+msgid "Reverting configuration…"
+msgstr "設定を元ã«æˆ»ã—ã¦ã„ã¾ã™..."
+
msgid "Root"
msgstr "ルート"
@@ -2837,9 +2850,6 @@ msgstr ""
msgid "Route type"
msgstr "ルート タイプ"
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr "ルーター アドãƒã‚¿ã‚¤ã‚ºãƒ¡ãƒ³ãƒˆ-サービス"
@@ -2865,14 +2875,6 @@ msgstr "ファイルシステムãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†"
msgid "SHA256"
msgstr "SHA256"
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr "SNR"
@@ -2900,9 +2902,6 @@ msgstr "ä¿å­˜"
msgid "Save & Apply"
msgstr "ä¿å­˜ & é©ç”¨"
-msgid "Save &#38; Apply"
-msgstr "ä¿å­˜ &#38; é©ç”¨"
-
msgid "Scan"
msgstr "スキャン"
@@ -2931,17 +2930,6 @@ msgstr "クライアントã®åˆ†é›¢"
msgid "Server Settings"
msgstr "サーãƒãƒ¼è¨­å®š"
-msgid "Server password"
-msgstr "サーãƒãƒ¼ パスワード"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr "サーãƒãƒ¼ ユーザーå"
-
msgid "Service Name"
msgstr "サービスå"
@@ -3031,15 +3019,9 @@ msgstr ""
"ファームウェア更新ã¯æ‰‹å‹•ã§è¡Œã£ã¦ã„ãŸã ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚wikiã‚’å‚ç…§ã—ã¦ã€ã“ã®"
"デãƒã‚¤ã‚¹ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ‰‹é †ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-msgid "Sort"
-msgstr "ソート"
-
msgid "Source"
msgstr "é€ä¿¡å…ƒ"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "デãƒã‚¤ã‚¹ãŒæŽ¥ç¶šã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定ã—ã¾ã™"
@@ -3078,6 +3060,9 @@ msgstr "開始"
msgid "Start priority"
msgstr "優先順ä½"
+msgid "Starting configuration apply…"
+msgstr "設定ã®é©ç”¨ã‚’開始ã—ã¦ã„ã¾ã™..."
+
msgid "Startup"
msgstr "スタートアップ"
@@ -3240,6 +3225,22 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr "設定ファイルã¯ä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Šèª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:"
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+"未é©ç”¨ã®å¤‰æ›´ã‚’é©ç”¨å¾Œã€ãƒ‡ãƒã‚¤ã‚¹ã¯ %d 秒以内ã«å®Œäº†ã§ããªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾"
+"ã™ã€‚ã“ã‚Œã¯ã€å®‰å…¨ä¸Šã®ç†ç”±ã«ã‚ˆã‚Šãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã•ã‚Œã‚‹è¨­å®šã«èµ·å› ã™ã‚‹ã‚‚ã®ã§ã™ã€‚ãã‚Œ"
+"ã§ã‚‚設定ã®å¤‰æ›´ãŒæ­£ã—ã„ã¨æ€ã†å ´åˆã¯ã€ãƒã‚§ãƒƒã‚¯ãªã—ã®å¤‰æ›´ã®é©ç”¨ã‚’è¡Œã£ã¦ãã ã•"
+"ã„。もã—ãã¯ã€å†åº¦é©ç”¨ã‚’試行ã™ã‚‹å‰ã«ã“ã®è­¦å‘Šã‚’除去ã—ã¦è¨­å®šå†…容ã®ç·¨é›†ã‚’è¡Œã†"
+"ã‹ã€ç¾åœ¨å‹•ä½œã—ã¦ã„る設定状æ³ã‚’維æŒã™ã‚‹ãŸã‚ã«æœªé©ç”¨ã®å¤‰æ›´ã‚’å–り消ã—ã¦ãã ã•"
+"ã„。"
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3264,9 +3265,6 @@ msgstr ""
"イズã§ã™ã€‚オリジナルファイルã¨æ¯”較ã—ã€æ•´åˆæ€§ã‚’確èªã—ã¦ãã ã•ã„。<br />\"続行"
"\"ボタンをクリックã™ã‚‹ã¨ã€æ›´æ–°å‡¦ç†ã‚’開始ã—ã¾ã™ã€‚"
-msgid "The following changes have been committed"
-msgstr "以下ã®å¤‰æ›´ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ"
-
msgid "The following changes have been reverted"
msgstr "以下ã®å¤‰æ›´ãŒå–り消ã•ã‚Œã¾ã—ãŸ"
@@ -3332,11 +3330,6 @@ msgstr ""
"ã‚Œã°ãªã‚‰ãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3347,8 +3340,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "リース中ã®IPアドレスã¯ã‚ã‚Šã¾ã›ã‚“。"
-msgid "There are no pending changes to apply!"
-msgstr "é©ç”¨ãŒæœªå®Œäº†ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼"
+msgid "There are no changes to apply."
+msgstr "é©ç”¨ã™ã‚‹å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "There are no pending changes to revert!"
msgstr "復元ãŒæœªå®Œäº†ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼"
@@ -3504,15 +3497,6 @@ msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹"
msgid "Tunnel Link"
msgstr "トンãƒãƒ«ãƒªãƒ³ã‚¯"
-msgid "Tunnel broker protocol"
-msgstr "トンãƒãƒ«ãƒ–ローカー プロトコル"
-
-msgid "Tunnel setup server"
-msgstr "トンãƒãƒ«ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ— サーãƒãƒ¼"
-
-msgid "Tunnel type"
-msgstr "トンãƒãƒ«ã‚¿ã‚¤ãƒ—"
-
msgid "Tx-Power"
msgstr "é€ä¿¡é›»åŠ›"
@@ -3561,6 +3545,9 @@ msgstr "ä¿å­˜ã•ã‚Œã¦ã„ãªã„変更"
msgid "Unsupported protocol type."
msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„プロトコルタイプ"
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "リストã®æ›´æ–°"
@@ -3693,12 +3680,6 @@ msgstr "ベンダー"
msgid "Vendor Class to send when requesting DHCP"
msgstr "DHCPリクエストé€ä¿¡æ™‚ã®ãƒ™ãƒ³ãƒ€ãƒ¼ã‚¯ãƒ©ã‚¹ã‚’設定"
-msgid "Verbose"
-msgstr "詳細"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "確èª"
@@ -3731,16 +3712,15 @@ msgstr ""
"hostapd (アクセスãƒã‚¤ãƒ³ãƒˆåŠã³ã‚¢ãƒ‰ãƒ›ãƒƒã‚¯) ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾"
"ã™ã€‚"
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "変更をé©ç”¨ä¸­ã§ã™..."
msgid "Waiting for command to complete..."
msgstr "コマンド実行中ã§ã™..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "設定をé©ç”¨ä¸­ã§ã™... %d 秒"
+
msgid "Waiting for device..."
msgstr "デãƒã‚¤ã‚¹ã‚’起動中ã§ã™..."
@@ -3755,12 +3735,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr "帯域幅"
@@ -3841,6 +3815,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "ブリッジ"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "作æˆ:"
@@ -3878,9 +3855,6 @@ msgstr "全二é‡"
msgid "half-duplex"
msgstr "åŠäºŒé‡"
-msgid "help"
-msgstr "ヘルプ"
-
msgid "hidden"
msgstr "(ä¸æ˜Ž)"
@@ -3905,9 +3879,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "ローカル <abbr title=\"Domain Name System\">DNS</abbr>ファイル"
-msgid "minimum 1280, maximum 1480"
-msgstr "最å°å€¤ 1280ã€æœ€å¤§å€¤ 1480"
-
msgid "minutes"
msgstr "分"
@@ -3932,6 +3903,9 @@ msgstr "オン"
msgid "open"
msgstr "オープン"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr "オーãƒãƒ¼ãƒ¬ã‚¤"
@@ -3982,3 +3956,32 @@ msgstr "ã¯ã„"
msgid "« Back"
msgstr "« 戻る"
+
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCPリース"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6 リース"
+
+#~ 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 ""
+#~ "本当ã«ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§"
+#~ "ãã¾ã›ã‚“!\n"
+#~ "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã"
+#~ "ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
+
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "本当ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’åœæ­¢ã—ã¾ã™ã‹?\n"
+#~ "ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚‹"
+#~ "å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
+
+#~ msgid "Sort"
+#~ msgstr "ソート"
+
+#~ msgid "help"
+#~ msgstr "ヘルプ"
diff --git a/modules/luci-base/po/ko/base.po b/modules/luci-base/po/ko/base.po
index e4f77c78f5..e9050ce9b0 100644
--- a/modules/luci-base/po/ko/base.po
+++ b/modules/luci-base/po/ko/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "1 분 부하:"
@@ -168,9 +171,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -204,9 +204,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr ""
@@ -311,11 +308,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -394,10 +386,13 @@ msgstr ""
msgid "Any zone"
msgstr ""
-msgid "Apply"
-msgstr "ì ìš©"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
+msgid "Architecture"
msgstr ""
msgid ""
@@ -414,6 +409,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "ì—°ê²°ëœ station 들"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -504,9 +502,6 @@ msgstr ""
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -580,12 +575,20 @@ msgstr "변경 사항"
msgid "Changes applied."
msgstr ""
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "장비 ì ‘ê·¼ì„ ìœ„í•œ ê´€ë¦¬ìž ì•”í˜¸ë¥¼ 변경합니다"
msgid "Channel"
msgstr ""
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr ""
@@ -664,10 +667,13 @@ msgstr ""
msgid "Configuration"
msgstr "설정"
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
msgstr ""
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
msgstr ""
msgid "Confirmation"
@@ -682,12 +688,15 @@ msgstr "연결 시간"
msgid "Connection Limit"
msgstr ""
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "ì—°ê²°"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr ""
@@ -743,9 +752,6 @@ msgstr ""
"ì›í•œë‹¤ë©´ ìž¥ì¹˜ì— ë¶€ì°©ëœ <abbr title=\"Light Emitting Diode\">LED</abbr> ë“¤ì˜ "
"í–‰ë™ì„ 마ìŒëŒ€ë¡œ 변경할 수 있습니다."
-msgid "DHCP Leases"
-msgstr "DHCP 임대 정보"
-
msgid "DHCP Server"
msgstr "DHCP 서버"
@@ -758,9 +764,6 @@ msgstr "DHCP client"
msgid "DHCP-Options"
msgstr "DHCP-옵션들"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6 임대 정보"
-
msgid "DHCPv6 client"
msgstr ""
@@ -818,9 +821,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "기본 ìƒíƒœ"
@@ -863,6 +863,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "진단"
@@ -897,6 +900,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -945,6 +951,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "패키지 다운로드 후 설치"
@@ -1059,6 +1068,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1091,6 +1103,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1149,6 +1167,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1270,7 +1291,7 @@ msgstr "여유 공간"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1342,9 +1363,6 @@ msgstr ""
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1403,8 +1421,8 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr "IPv4 방화벽"
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN ìƒíƒœ"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4 주소"
@@ -1454,13 +1472,10 @@ msgstr "IPv6 설정"
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN ìƒíƒœ"
-
-msgid "IPv6 address"
+msgid "IPv6 Upstream"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
+msgid "IPv6 address"
msgstr ""
msgid "IPv6 assignment hint"
@@ -2030,9 +2045,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "NTP 서버 목ë¡"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "ì´ë¦„"
@@ -2156,6 +2168,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2207,12 +2222,6 @@ msgstr "ì‚­ì œëœ option"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2566,12 +2575,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr>-서버를 설정합니다"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2579,14 +2588,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"ì •ë§ë¡œ 네트워í¬ë¥¼ shutdown 하시겠습니까?\\nì´ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 통해 연결하였다면 "
-"ì ‘ì†ì´ ëŠì–´ì§ˆ 수 있습니다."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2677,9 +2684,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2738,6 +2742,15 @@ msgstr "암호 ë³´ì´ê¸°/숨기기"
msgid "Revert"
msgstr "변경 취소"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2753,9 +2766,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2781,14 +2791,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2816,9 +2818,6 @@ msgstr "저장"
msgid "Save & Apply"
msgstr "저장 & ì ìš©"
-msgid "Save &#38; Apply"
-msgstr "저장 &#38; ì ìš©"
-
msgid "Scan"
msgstr "Scan 하기"
@@ -2845,17 +2844,6 @@ msgstr ""
msgid "Server Settings"
msgstr "서버 설정"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2942,15 +2930,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr "순서"
-
msgid "Source"
msgstr ""
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2989,6 +2971,9 @@ msgstr "시작"
msgid "Start priority"
msgstr "시작 우선순위"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "시작 프로그램"
@@ -3147,6 +3132,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3163,9 +3158,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr "다ìŒì˜ 변경 ì‚¬í•­ë“¤ì´ ì·¨ì†Œë˜ì—ˆìŠµë‹ˆë‹¤"
@@ -3224,11 +3216,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3236,7 +3223,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3381,15 +3368,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3438,6 +3416,9 @@ msgstr "ì ìš© ì•ˆëœ ë³€ê²½ 사항"
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3570,12 +3551,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "DHCP 요청시 전송할 Vendor Class"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3605,16 +3580,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "변경 ì‚¬í•­ì´ ì ìš©ë˜ê¸°ë¥¼ 기다리는 중입니다..."
msgid "Waiting for command to complete..."
msgstr "실행한 ëª…ë ¹ì´ ë나기를 기다리는 중입니다..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3629,12 +3603,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3712,6 +3680,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3749,9 +3720,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr ""
-
msgid "hidden"
msgstr ""
@@ -3776,9 +3744,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "local <abbr title=\"Domain Name System\">DNS</abbr> 파ì¼"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3803,6 +3768,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3854,5 +3822,33 @@ msgstr ""
msgid "« Back"
msgstr ""
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP 임대 정보"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6 임대 정보"
+
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "ì •ë§ë¡œ 네트워í¬ë¥¼ shutdown 하시겠습니까?\\nì´ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 통해 연결하였다"
+#~ "ë©´ ì ‘ì†ì´ ëŠì–´ì§ˆ 수 있습니다."
+
+#~ msgid "Sort"
+#~ msgstr "순서"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN ìƒíƒœ"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN ìƒíƒœ"
+
+#~ msgid "Apply"
+#~ msgstr "ì ìš©"
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "저장 &#38; ì ìš©"
+
#~ msgid "Leasetime"
#~ msgstr "임대 시간"
diff --git a/modules/luci-base/po/ms/base.po b/modules/luci-base/po/ms/base.po
index d5c889580b..b91eac9dfa 100644
--- a/modules/luci-base/po/ms/base.po
+++ b/modules/luci-base/po/ms/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr ""
@@ -165,9 +168,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -201,9 +201,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr ""
@@ -306,11 +303,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -389,11 +381,14 @@ msgstr ""
msgid "Any zone"
msgstr ""
-msgid "Apply"
-msgstr "Melaksanakan"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "Melaksanakan perubahan"
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -409,6 +404,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Associated Stesen"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -499,9 +497,6 @@ msgstr ""
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -570,12 +565,20 @@ msgstr "Laman"
msgid "Changes applied."
msgstr "Laman diterapkan."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr ""
msgid "Channel"
msgstr "Saluran"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr ""
@@ -646,10 +649,13 @@ msgstr ""
msgid "Configuration"
msgstr "Konfigurasi"
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
msgstr ""
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
msgstr ""
msgid "Confirmation"
@@ -664,10 +670,13 @@ msgstr ""
msgid "Connection Limit"
msgstr "Sambungan Batas"
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
msgstr ""
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
msgstr ""
msgid "Country"
@@ -721,9 +730,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr "Mengkustomisasi perilaku peranti LED jika mungkin."
-msgid "DHCP Leases"
-msgstr ""
-
msgid "DHCP Server"
msgstr ""
@@ -736,9 +742,6 @@ msgstr ""
msgid "DHCP-Options"
msgstr "DHCP-Pilihan"
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -796,9 +799,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr ""
@@ -838,6 +838,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
@@ -870,6 +873,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -920,6 +926,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr "Jangan hantar permintaan DNS tanpa nama DNS"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Turun dan memasang pakej"
@@ -1031,6 +1040,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1063,6 +1075,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1121,6 +1139,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1242,7 +1263,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1314,9 +1335,6 @@ msgstr "Menutup"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1374,7 +1392,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1425,15 +1443,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2010,9 +2025,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nama"
@@ -2136,6 +2148,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2186,12 +2201,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2542,12 +2551,12 @@ msgid ""
msgstr "Baca /etc/ethers untuk mengkonfigurasikan DHCP-Server"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2555,12 +2564,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2651,9 +2660,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2712,6 +2718,15 @@ msgstr ""
msgid "Revert"
msgstr "Kembali"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2727,9 +2742,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2755,14 +2767,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2790,9 +2794,6 @@ msgstr "Simpan"
msgid "Save & Apply"
msgstr "Simpan & Melaksanakan"
-msgid "Save &#38; Apply"
-msgstr ""
-
msgid "Scan"
msgstr "Scan"
@@ -2819,17 +2820,6 @@ msgstr "Pisahkan Pelanggan"
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2916,15 +2906,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
msgstr "Sumber"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2963,6 +2947,9 @@ msgstr "Mula"
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3116,6 +3103,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr "Fail peranti memori atau partisyen, (contohnya: /dev/sda)"
@@ -3136,9 +3133,6 @@ msgstr ""
"integriti data.<br /> Klik butang terus di bawah untuk memulakan prosedur "
"flash."
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr "Laman berikut telah kembali"
@@ -3197,11 +3191,6 @@ msgstr ""
"bergantung pada tetapan anda."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3211,7 +3200,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3352,15 +3341,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3409,6 +3389,9 @@ msgstr "Perubahan yang belum disimpan"
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3533,12 +3516,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3570,16 +3547,15 @@ msgstr ""
"WPA-Enkripsi memerlukan pemohan wpa (untuk mod pelanggan) atau hostapd "
"(untuk AP dan mod ad-hoc) yang akan dipasangkan."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3594,12 +3570,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3673,6 +3643,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3708,9 +3681,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr "Membantu"
-
msgid "hidden"
msgstr ""
@@ -3735,9 +3705,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "Fail DNS tempatan"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3762,6 +3729,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3813,6 +3783,15 @@ msgstr ""
msgid "« Back"
msgstr "« Kembali"
+#~ msgid "help"
+#~ msgstr "Membantu"
+
+#~ msgid "Apply"
+#~ msgstr "Melaksanakan"
+
+#~ msgid "Applying changes"
+#~ msgstr "Melaksanakan perubahan"
+
#~ msgid "Action"
#~ msgstr "Aksi"
diff --git a/modules/luci-base/po/no/base.po b/modules/luci-base/po/no/base.po
index 1805d8e990..1156f1b768 100644
--- a/modules/luci-base/po/no/base.po
+++ b/modules/luci-base/po/no/base.po
@@ -44,6 +44,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "1 minutts belastning:"
@@ -167,9 +170,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -210,9 +210,6 @@ msgstr "<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> enhetsnummer"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Tilgangskonsentrator"
@@ -315,11 +312,6 @@ msgstr "Tillat oppstrøms svar i 127.0.0.0/8 nettet, f.eks for RBL tjenester"
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -398,11 +390,14 @@ msgstr "Antennekonfigurasjon"
msgid "Any zone"
msgstr "Alle soner"
-msgid "Apply"
-msgstr "Bruk"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Utfører endringer"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -418,6 +413,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Tilkoblede Klienter"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -508,9 +506,6 @@ msgstr "Ugyldig adresse oppgitt!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -582,12 +577,20 @@ msgstr "Endringer"
msgid "Changes applied."
msgstr "Endringer utført."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Endrer administrator passordet for tilgang til enheten"
msgid "Channel"
msgstr "Kanal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Kontroller"
@@ -668,12 +671,15 @@ msgstr ""
msgid "Configuration"
msgstr "Konfigurasjon"
-msgid "Configuration applied."
-msgstr "Konfigurasjons endring utført."
-
msgid "Configuration files will be kept."
msgstr "Konfigurasjonsfiler vil bli bevart."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Bekreftelse"
@@ -686,12 +692,15 @@ msgstr "Tilkoblet"
msgid "Connection Limit"
msgstr "Tilkoblingsgrense (antall)"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Tilkoblinger"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Land"
@@ -745,9 +754,6 @@ msgstr ""
"Tilpasser oppførselen til enhetens <abbr title=\"Light Emitting Diode\">LED</"
"abbr>s om mulig."
-msgid "DHCP Leases"
-msgstr "DHCP Leier"
-
msgid "DHCP Server"
msgstr "DHCP Server"
@@ -760,9 +766,6 @@ msgstr "DHCP klient"
msgid "DHCP-Options"
msgstr "DHCP-Alternativer"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6 Leier"
-
msgid "DHCPv6 client"
msgstr ""
@@ -820,9 +823,6 @@ msgstr "Standard gateway"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Standard tilstand"
@@ -864,6 +864,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Nettverksdiagnostikk"
@@ -898,6 +901,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Forkast oppstrøms RFC1918 svar"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Viser bare pakker som inneholder"
@@ -951,6 +957,9 @@ msgstr ""
"Ikke videresend <abbr title=\"Domain Name System\">DNS</abbr>-Forespørsler "
"uten <abbr title=\"Domain Name System\">DNS</abbr>-Navn"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Last ned og installer pakken"
@@ -1066,6 +1075,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "Aktiver dette monteringspunktet"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Aktiver denne swapenhet"
@@ -1098,6 +1110,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Sletter..."
@@ -1157,6 +1175,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fil"
@@ -1279,7 +1300,7 @@ msgstr "Ledig plass"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1351,9 +1372,6 @@ msgstr "Slå av"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1413,8 +1431,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 Brannmur"
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN Status"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4 adresse"
@@ -1464,15 +1482,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN Status"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "IPv6 adresse"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2055,9 +2070,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "NTP server kandidater"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Navn"
@@ -2181,6 +2193,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Forsinkelse ved tilstand Av"
@@ -2232,12 +2247,6 @@ msgstr "Innstilling fjernet"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2593,15 +2602,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr>-Server"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\n"
-"Du kan miste kontakten med ruteren om du er tilkoblet via dette "
-"grensesnittet."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Fjerne dette trådløse nettverket? Slettingen kan ikke omgjøres!\n"
@@ -2610,17 +2616,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "Vil du nullstille alle endringer?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Slå av dette nettverket ?\n"
-"Du kan miste kontakten med ruteren om du er tilkoblet via dette "
-"grensesnittet."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Slå av dette grensesnittet \"%s\" ?\n"
@@ -2714,9 +2716,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2775,6 +2774,15 @@ msgstr "Vis/Skjul passord"
msgid "Revert"
msgstr "Tilbakestill"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Rot"
@@ -2790,9 +2798,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2818,14 +2823,6 @@ msgstr "Kjør filsystem sjekk"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2853,9 +2850,6 @@ msgstr "Lagre"
msgid "Save & Apply"
msgstr "Lagre & Aktiver"
-msgid "Save &#38; Apply"
-msgstr "Lagre &#38; Aktiver"
-
msgid "Scan"
msgstr "Skann"
@@ -2884,17 +2878,6 @@ msgstr "Separerte Klienter"
msgid "Server Settings"
msgstr "Server Innstillinger"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Tjeneste navn"
@@ -2985,15 +2968,9 @@ msgstr ""
"flashes manuelt. Viser til wiki for installering av firmare på forskjellige "
"enheter."
-msgid "Sort"
-msgstr "Sortering"
-
msgid "Source"
msgstr "Kilde"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Hvor lagrings enheten blir tilsluttet filsystemet (f.eks. /mnt/sda1)"
@@ -3033,6 +3010,9 @@ msgstr "Start"
msgid "Start priority"
msgstr "Start prioritet"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Oppstart"
@@ -3198,6 +3178,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3222,9 +3212,6 @@ msgstr ""
"sammenlign dem med den opprinnelige filen for å sikre dataintegriteten.<br /"
"> Klikk \"Fortsett\" nedenfor for å starte flash prosedyren."
-msgid "The following changes have been committed"
-msgstr "Følgende endringer er foretatt"
-
msgid "The following changes have been reverted"
msgstr "Følgende endringer er forkastet"
@@ -3293,11 +3280,6 @@ msgstr ""
"datamaskinen din for å nå enheten på nytt. (avhengig av innstillingene dine)"
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3307,8 +3289,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Det er ingen aktive leieavtaler."
-msgid "There are no pending changes to apply!"
-msgstr "Det finnes ingen endringer som kan utføres!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Det finnes ingen endriger å reversere!"
@@ -3459,15 +3441,6 @@ msgstr "Tunnel grensesnitt"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Tx-Styrke"
@@ -3516,6 +3489,9 @@ msgstr "Ulagrede Endringer"
msgid "Unsupported protocol type."
msgstr "Protokoll type er ikke støttet."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Oppdater lister"
@@ -3647,12 +3623,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "Leverandør klasse som sendes ved DHCP spørring"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Bekreft"
@@ -3684,16 +3654,15 @@ msgstr ""
"WPA-Kryptering krever at wpa_supplicant (for klient-modus) eller hostapd "
"(for AP og ad-hoc-modus) er installert."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Venter på at endringer utføres..."
msgid "Waiting for command to complete..."
msgstr "Venter på at kommando fullføres..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3708,12 +3677,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3793,6 +3756,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "brokoblet"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "opprett:"
@@ -3830,9 +3796,6 @@ msgstr "full-dupleks"
msgid "half-duplex"
msgstr "halv-dupleks"
-msgid "help"
-msgstr "Hjelp"
-
msgid "hidden"
msgstr "skjult"
@@ -3857,9 +3820,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "lokal <abbr title=\"Domain Navn System\">DNS</abbr>-fil"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3884,6 +3844,9 @@ msgstr "på"
msgid "open"
msgstr "Ã¥pen"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3935,6 +3898,59 @@ msgstr "ja"
msgid "« Back"
msgstr "« Tilbake"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP Leier"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6 Leier"
+
+#~ 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 ""
+#~ "Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\n"
+#~ "Du kan miste kontakten med ruteren om du er tilkoblet via dette "
+#~ "grensesnittet."
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Slå av dette nettverket ?\n"
+#~ "Du kan miste kontakten med ruteren om du er tilkoblet via dette "
+#~ "grensesnittet."
+
+#~ msgid "Sort"
+#~ msgstr "Sortering"
+
+#~ msgid "help"
+#~ msgstr "Hjelp"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN Status"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN Status"
+
+#~ msgid "Apply"
+#~ msgstr "Bruk"
+
+#~ msgid "Applying changes"
+#~ msgstr "Utfører endringer"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Konfigurasjons endring utført."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Lagre &#38; Aktiver"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Følgende endringer er foretatt"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Det finnes ingen endringer som kan utføres!"
+
#~ msgid "Action"
#~ msgstr "Handling"
diff --git a/modules/luci-base/po/pl/base.po b/modules/luci-base/po/pl/base.po
index 390e489e29..63cb7bc042 100644
--- a/modules/luci-base/po/pl/base.po
+++ b/modules/luci-base/po/pl/base.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: LuCI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-20 09:40+0200\n"
-"PO-Revision-Date: 2018-05-14 20:05+0200\n"
+"PO-Revision-Date: 2018-06-10 10:05+0200\n"
"Last-Translator: Rixerx <krystian.kozak20@gmail.com>\n"
"Language-Team: Polish\n"
"Language: pl\n"
@@ -50,6 +50,9 @@ msgstr "-- dopasuj po etykiecie --"
msgid "-- match by uuid --"
msgstr "-- dopasuj po uuid --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Obciążenie 1 min.:"
@@ -162,8 +165,8 @@ msgid ""
"<br/>Note: you need to manually restart the cron service if the crontab file "
"was empty before editing."
msgstr ""
-"<br/>Uwaga: musisz ręcznie zrestartować usługę cron, jeśli plik crontab "
-"był pusty przed edycją."
+"<br/>Uwaga: musisz ręcznie zrestartować usługę cron, jeśli plik crontab był "
+"pusty przed edycjÄ…."
msgid "A43C + J43 + A43"
msgstr ""
@@ -174,9 +177,6 @@ msgstr ""
msgid "ADSL"
msgstr "ADSL"
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -205,9 +205,9 @@ msgid ""
"Linux network interfaces which can be used in conjunction with DHCP or PPP "
"to dial into the provider network."
msgstr ""
-"Mosty ATM eksponują enkapsulowaną sieć Ethernet w połączeniach AAL5 jako wirtualne "
-"interfejsy sieciowe systemu Linux, które mogą być używane w połączeniu z protokołem "
-"DHCP lub PPP w celu polÄ…czenia siÄ™ z sieciÄ… dostawcy."
+"Mosty ATM eksponują enkapsulowaną sieć Ethernet w połączeniach AAL5 jako "
+"wirtualne interfejsy sieciowe systemu Linux, które mogą być używane w "
+"połączeniu z protokołem DHCP lub PPP w celu polączenia się z siecią dostawcy."
msgid "ATM device number"
msgstr "Numer urzÄ…dzenia ATM"
@@ -215,9 +215,6 @@ msgstr "Numer urzÄ…dzenia ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
# co to takiego?
msgid "Access Concentrator"
msgstr "Koncentrator dostępowy ATM"
@@ -290,7 +287,8 @@ msgstr "Alarm"
msgid ""
"Allocate IP addresses sequentially, starting from the lowest available "
"address"
-msgstr "Przydziel sekwencyjnie adresy IP, zaczynając od najmniejszego dostępnego"
+msgstr ""
+"Przydziel sekwencyjnie adresy IP, zaczynając od najmniejszego dostępnego"
msgid "Allocate IP sequentially"
msgstr "Przydzielaj adresy IP po kolei"
@@ -311,7 +309,8 @@ msgid "Allow localhost"
msgstr "Pozwól tylko sobie (localhost)"
msgid "Allow remote hosts to connect to local SSH forwarded ports"
-msgstr "Zezwalaj zdalnym hostom na Å‚Ä…czenie siÄ™ z lokalnie przekazywanymi portami SSH"
+msgstr ""
+"Zezwalaj zdalnym hostom na Å‚Ä…czenie siÄ™ z lokalnie przekazywanymi portami SSH"
msgid "Allow root logins with password"
msgstr "Zezwól na logowanie roota przy pomocy hasła"
@@ -327,11 +326,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr "Dozwolone adresy IP"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr "Zawsze rozgłaszaj domyślny router"
@@ -382,12 +376,14 @@ msgstr ""
msgid "Announce as default router even if no public prefix is available."
msgstr ""
+"Rozgłaszaj jako domyślny router nawet jeśli publiczny prefiks nie jest "
+"dostępny."
msgid "Announced DNS domains"
-msgstr ""
+msgstr "Rozgłaszaj domeny DNS"
msgid "Announced DNS servers"
-msgstr ""
+msgstr "Rozgłaszaj serwery DNS"
msgid "Anonymous Identity"
msgstr ""
@@ -410,15 +406,20 @@ msgstr "Ustawienia anteny"
msgid "Any zone"
msgstr "Dowolna strefa"
-msgid "Apply"
-msgstr "Zatwierdź"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "Wprowadzam zmiany"
+msgid "Architecture"
+msgstr "Architektura"
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
msgstr ""
+"Przypisz część danej długości każdego publicznego prefiksu IPv6 do tego "
+"interfejsu"
msgid "Assign interfaces..."
msgstr "Przypisz interfejsy..."
@@ -426,10 +427,15 @@ msgstr "Przypisz interfejsy..."
msgid ""
"Assign prefix parts using this hexadecimal subprefix ID for this interface."
msgstr ""
+"Przypisz cześć prefiksu za pomocą szesnastkowego ID subprefiksu dla tego "
+"interfejsu"
msgid "Associated Stations"
msgstr "Połączone stacje"
+msgid "Associations"
+msgstr "Połączeni"
+
msgid "Auth Group"
msgstr ""
@@ -521,9 +527,6 @@ msgstr "Wprowadzono zły adres"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -538,6 +541,7 @@ msgstr ""
msgid "Bind only to specific interfaces rather than wildcard address."
msgstr ""
+"Powiąż tylko ze specyficznymi interfejsami, a nie z adresami wieloznacznymi."
msgid "Bind the tunnel to this interface (optional)."
msgstr ""
@@ -596,12 +600,20 @@ msgstr "Zmiany"
msgid "Changes applied."
msgstr "Zmiany zostały zastosowane."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Zmienia hasło administratora"
msgid "Channel"
msgstr "Kanał"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Sprawdź"
@@ -678,17 +690,24 @@ msgid ""
"workaround might cause interoperability issues and reduced robustness of key "
"negotiation especially in environments with heavy traffic load."
msgstr ""
-"Komplikuje atak ponownej instalacji klucza po stronie klienta, wyłączając retransmisję ramek klucza EAPOL, które są używane do instalowania kluczy. To obejście może powodować problemy z interoperacyjnością i zmniejszoną odporność kluczowych negocjacji, szczególnie w środowiskach o dużym natężeniu ruchu."
+"Komplikuje atak ponownej instalacji klucza po stronie klienta, wyłączając "
+"retransmisję ramek klucza EAPOL, które są używane do instalowania kluczy. To "
+"obejście może powodować problemy z interoperacyjnością i zmniejszoną "
+"odporność kluczowych negocjacji, szczególnie w środowiskach o dużym "
+"natężeniu ruchu."
msgid "Configuration"
msgstr "Konfiguracja"
-msgid "Configuration applied."
-msgstr "Konfiguracja została zastosowana."
-
msgid "Configuration files will be kept."
msgstr "Pliki konfiguracyjne zostanÄ… zachowane."
+msgid "Configuration has been applied."
+msgstr "Konfiguracja została zastosowana."
+
+msgid "Configuration has been rolled back!"
+msgstr "Konfiguracja została wycofana!"
+
msgid "Confirmation"
msgstr "Potwierdzenie"
@@ -701,12 +720,15 @@ msgstr "Połączony"
msgid "Connection Limit"
msgstr "Limit połączeń"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Połączenia"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Kraj"
@@ -753,6 +775,8 @@ msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
+"Własne pliki (certyfikaty, skrypty) mogą pozostać w systemie. Aby zapobiec "
+"temu, wykonaj najpierw reset do ustawień fabrycznych"
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
@@ -761,9 +785,6 @@ msgstr ""
"Dostosuj zachowanie diod <abbr title=\"Light Emitting Diode\">LED</abbr> "
"urządzenia jeśli jest to możliwe."
-msgid "DHCP Leases"
-msgstr "Dzierżawy DHCP"
-
msgid "DHCP Server"
msgstr "Serwer DHCP"
@@ -776,17 +797,14 @@ msgstr "Klient DHCP"
msgid "DHCP-Options"
msgstr "Opcje DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Dzierżawy DHCPv6"
-
msgid "DHCPv6 client"
msgstr "Klient DHCPv6"
msgid "DHCPv6-Mode"
-msgstr ""
+msgstr "Tryb DHCPv6"
msgid "DHCPv6-Service"
-msgstr ""
+msgstr "Serwis DHCPv6"
msgid "DNS"
msgstr "DNS"
@@ -801,7 +819,7 @@ msgid "DNSSEC"
msgstr ""
msgid "DNSSEC check unsigned"
-msgstr ""
+msgstr "Sprawdzanie DNSSEC bez podpisu"
msgid "DPD Idle Timeout"
msgstr ""
@@ -834,10 +852,7 @@ msgid "Default gateway"
msgstr "Brama domyślna"
msgid "Default is stateless + stateful"
-msgstr ""
-
-msgid "Default route"
-msgstr ""
+msgstr "Domyślnie jest to stateless + stateful"
msgid "Default state"
msgstr "Stan domyślny"
@@ -881,6 +896,9 @@ msgstr "UrzÄ…dzenie jest uruchamiane ponownie ..."
msgid "Device unreachable"
msgstr "UrzÄ…dzenie nieosiÄ…galne"
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostyka"
@@ -915,6 +933,9 @@ msgstr "Wyłączone (domyślnie)"
msgid "Discard upstream RFC1918 responses"
msgstr "Odrzuć wychodzące odpowiedzi RFC1918"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "PokazujÄ™ tylko paczki zawierajÄ…ce"
@@ -970,6 +991,9 @@ msgstr ""
"Nie przekazuj zapytań <abbr title=\"Domain Name System\">DNS</abbr> bez "
"nazwy <abbr title=\"Domain Name System\">DNS</abbr>'a"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Pobierz i zainstaluj pakiet"
@@ -1037,7 +1061,9 @@ msgstr "WÅ‚Ä…cz"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
-msgstr "Włącz nasłuchiwanie <abbr title=\"Internet Group Management Protocol\">IGMP</abbr>"
+msgstr ""
+"Włącz nasłuchiwanie <abbr title=\"Internet Group Management Protocol\">IGMP</"
+"abbr>"
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "WÅ‚Ä…cz <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1087,6 +1113,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "WÅ‚Ä…cz ten punkt montowania"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "WÅ‚Ä…cz ten swap"
@@ -1102,8 +1131,9 @@ msgstr "Włącz nasłuchiwanie IGMP na tym moście"
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
-msgstr "Aktywuje szybki roaming pomiędzy punktami dostępowymi, które należą "
-"do tej samej domeny"
+msgstr ""
+"Aktywuje szybki roaming pomiędzy punktami dostępowymi, które należą do tej "
+"samej domeny"
msgid "Enables the Spanning Tree Protocol on this bridge"
msgstr ""
@@ -1122,6 +1152,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Usuwanie..."
@@ -1162,13 +1198,13 @@ msgid "External R1 Key Holder List"
msgstr ""
msgid "External system log server"
-msgstr "Zewnętrzny serwer dla logów systemowych"
+msgstr "Serwer zewnętrzny dla logów systemowych"
msgid "External system log server port"
-msgstr "Port zewnętrznego serwera dla logów systemowych"
+msgstr "Port zewnętrznego serwera logów systemowych"
msgid "External system log server protocol"
-msgstr "Protokół zewnętrznego serwera dla logów systemowych"
+msgstr "Protokół zewnętrznego serwera logów systemowych"
msgid "Extra SSH command options"
msgstr ""
@@ -1182,6 +1218,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Plik"
@@ -1304,7 +1343,7 @@ msgstr "Wolna przestrzeń"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1349,7 +1388,7 @@ msgid "Global Settings"
msgstr ""
msgid "Global network options"
-msgstr ""
+msgstr "Globalne opcje sieciowe"
msgid "Go to password configuration..."
msgstr "Przejdź do konfiguracji hasła..."
@@ -1378,9 +1417,6 @@ msgstr "Rozłącz"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1443,8 +1479,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Firewall IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Status IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr "Protokół IPv4"
msgid "IPv4 address"
msgstr "Adres IPv4"
@@ -1489,25 +1525,22 @@ msgid "IPv6 Neighbours"
msgstr ""
msgid "IPv6 Settings"
-msgstr ""
+msgstr "Ustawienia IPv6"
msgid "IPv6 ULA-Prefix"
-msgstr ""
+msgstr "IPv6 Prefiks-ULA"
-msgid "IPv6 WAN Status"
-msgstr "Status WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr "Protokół IPv6"
msgid "IPv6 address"
msgstr "Adres IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
-msgstr ""
+msgstr "Wskazówka przypisania IPv6"
msgid "IPv6 assignment length"
-msgstr ""
+msgstr "Długość przydziału IPv6"
msgid "IPv6 gateway"
msgstr "Brama IPv6"
@@ -1525,7 +1558,7 @@ msgid "IPv6 routed prefix"
msgstr ""
msgid "IPv6 suffix"
-msgstr ""
+msgstr "Sufiks IPv6"
msgid "IPv6-Address"
msgstr "Adres IPv6"
@@ -1623,7 +1656,8 @@ msgid "Install"
msgstr "Instaluj"
msgid "Install iputils-traceroute6 for IPv6 traceroute"
-msgstr "Zainstaluj iputils-traceroute6 w celu skorzystania z traceroute dla iPv6"
+msgstr ""
+"Zainstaluj iputils-traceroute6 w celu skorzystania z traceroute dla iPv6"
msgid "Install package %q"
msgstr "Instaluj pakiet %q"
@@ -1784,6 +1818,7 @@ msgstr "Limit"
msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
msgstr ""
+"Ogranicz usługi DNS do podsieci interfejsów, na których obsługujemy DNS."
msgid "Limit listening to these interfaces, and loopback."
msgstr "Ogranicz nasłuchiwanie do tych interfesjów, oraz loopbacku."
@@ -1867,7 +1902,7 @@ msgid "Local IPv6 address"
msgstr "Lokalny adres IPv6"
msgid "Local Service Only"
-msgstr ""
+msgstr "Tylko serwis lokalny"
msgid "Local Startup"
msgstr "Lokalny autostart"
@@ -1888,7 +1923,7 @@ msgstr ""
msgid "Local domain suffix appended to DHCP names and hosts file entries"
msgstr ""
-"Przyrostek (suffiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts"
+"Przyrostek (sufiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts"
msgid "Local server"
msgstr "Serwer lokalny"
@@ -1958,8 +1993,8 @@ msgid ""
"Make sure to clone the root filesystem using something like the commands "
"below:"
msgstr ""
-"Upewnij się, że klonujesz główny system plików, używając czegoś podobnego "
-"do poleceń poniżej:"
+"Upewnij się, że klonujesz główny system plików, używając czegoś podobnego do "
+"poleceń poniżej:"
msgid "Manual"
msgstr ""
@@ -2088,7 +2123,7 @@ msgid "NCM"
msgstr "NCM"
msgid "NDP-Proxy"
-msgstr ""
+msgstr "Proxy NDP"
msgid "NT Domain"
msgstr ""
@@ -2096,9 +2131,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Lista serwerów NTP"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nazwa"
@@ -2178,7 +2210,7 @@ msgid "Non Pre-emtive CRC errors (CRC_P)"
msgstr ""
msgid "Non-wildcard"
-msgstr ""
+msgstr "Bez symboli wieloznacznych"
msgid "None"
msgstr "Brak"
@@ -2209,6 +2241,8 @@ msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
+"Liczba buforowanych wpisów DNS (max wynosi 10000, 0 oznacza brak pamięci "
+"podręcznej)"
msgid "OK"
msgstr "OK"
@@ -2222,6 +2256,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Zwłoka wyłączenia"
@@ -2272,12 +2309,6 @@ msgstr "Usunięto wartość"
msgid "Optional"
msgstr "Opcjonalny"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2289,6 +2320,10 @@ msgid ""
"server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') "
"for the interface."
msgstr ""
+"Opcjonalne. Dopuszczalne wartości: 'eui64', 'random', stałe wartości takie "
+"jak '::1' lub '::1:2'. Kiedy prefiks IPv6 (taki jak 'a:b:c:d::') jest "
+"odbierany z serwera delegującego, użyj sufiksa (takiego jak '::1') aby "
+"utworzyć adres IPv6 ('a:b:c:d::1') dla tego interfejsu."
msgid ""
"Optional. Base64-encoded preshared key. Adds in an additional layer of "
@@ -2581,7 +2616,7 @@ msgid "Public prefix routed to this device for distribution to clients."
msgstr ""
msgid "QMI Cellular"
-msgstr ""
+msgstr "Komórkowy QMI"
msgid "Quality"
msgstr "Jakość"
@@ -2633,15 +2668,12 @@ msgstr ""
"\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Naprawdę usunąć ten interfejs? Usunięcie nie może zostać cofnięte!\n"
-"Możesz stracić dostęp do tego urządzenia, jeśli jesteś połączony przez ten "
-"interfejs!"
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Naprawdę usunąć tę sieć bezprzewodową? Usunięcie nie może zostać cofnięte!\n"
@@ -2651,17 +2683,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "Naprawdę usunąć wszelkie zmiany?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Naprawdę wyłączyć tę sieć?\n"
-"Możesz stracić dostęp do tego urządzenia jeśli jesteś połączony przez ten "
-"interfejs!"
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Naprawdę wyłączyć interfejs \"%s\"?\n"
@@ -2755,9 +2783,6 @@ msgstr "Zażądaj adresu IPv6"
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr "Wymagaj TLS"
-
msgid "Required"
msgstr "Wymagany"
@@ -2785,6 +2810,8 @@ msgid ""
"Requires upstream supports DNSSEC; verify unsigned domain responses really "
"come from unsigned domains"
msgstr ""
+"Wymagane jest wsparcie dla DNSSEC; sprawdzanie, czy niepodpisane odpowiedzi "
+"w domenie rzeczywiście pochodzą z domen bez znaku"
msgid "Reset"
msgstr "Resetuj"
@@ -2816,6 +2843,15 @@ msgstr "Odsłoń/Ukryj hasło"
msgid "Revert"
msgstr "Przywróć"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Root"
@@ -2829,13 +2865,10 @@ msgid "Route Allowed IPs"
msgstr ""
msgid "Route type"
-msgstr ""
-
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
+msgstr "Typ trasy"
msgid "Router Advertisement-Service"
-msgstr ""
+msgstr "Serwis rozgłoszeniowy routera"
msgid "Router Password"
msgstr "Hasło routera"
@@ -2860,14 +2893,6 @@ msgstr "Sprawdź czy system plików nie zawiera błędów"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr "SNR"
@@ -2895,9 +2920,6 @@ msgstr "Zapisz"
msgid "Save & Apply"
msgstr "Zapisz i zastosuj"
-msgid "Save &#38; Apply"
-msgstr "Zapisz i zastosuj"
-
msgid "Scan"
msgstr "Skanuj"
@@ -2927,17 +2949,6 @@ msgstr "Rozdziel klientów"
msgid "Server Settings"
msgstr "Ustawienia serwera"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Nazwa serwisu"
@@ -2951,8 +2962,8 @@ msgid ""
"Set interface properties regardless of the link carrier (If set, carrier "
"sense events do not invoke hotplug handlers)."
msgstr ""
-"Ustaw właściwości interfejsu, niezależnie od operatora łącza (nie wpływa"
-" na programy operatora które ustanawiają połączenie)."
+"Ustaw właściwości interfejsu, niezależnie od operatora łącza (nie wpływa na "
+"programy operatora które ustanawiają połączenie)."
#, fuzzy
msgid "Set up Time Synchronization"
@@ -2992,7 +3003,7 @@ msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
-msgstr ""
+msgstr "Rozmiar pamięci podręcznej zapytań DNS"
msgid "Skip"
msgstr "Pomiń"
@@ -3010,7 +3021,7 @@ msgid "Software"
msgstr "Oprogramowanie"
msgid "Software VLAN"
-msgstr "VLAN programowy"
+msgstr "Programowy VLAN"
msgid "Some fields are invalid, cannot save values!"
msgstr "Wartości pewnych pól są niewłaściwe, nie mogę ich zachować!"
@@ -3030,15 +3041,9 @@ msgstr ""
"być wgrany ręcznie. Sprawdź stronę wiki, aby uzyskać instrukcję dla danego "
"urzÄ…dzenia."
-msgid "Sort"
-msgstr "Posortuj"
-
msgid "Source"
msgstr "Źródło"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Podaje katalog do którego jest podłączone urządzenie"
@@ -3080,6 +3085,9 @@ msgstr "Uruchomienie"
msgid "Start priority"
msgstr "Priorytet uruchomienia"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Autostart"
@@ -3121,10 +3129,10 @@ msgid "Submit"
msgstr "Wyślij"
msgid "Suppress logging"
-msgstr ""
+msgstr "Pomiń rejestrowanie"
msgid "Suppress logging of the routine operation of these protocols"
-msgstr ""
+msgstr "Pomiń rejestrowanie rutynowych operacji dla tych protokołów"
msgid "Swap"
msgstr ""
@@ -3247,6 +3255,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3273,9 +3291,6 @@ msgstr ""
"upewnić się, że został przesłany poprawnie.<br /> Wciśnij \"Wykonaj\" aby "
"kontynuować aktualizację."
-msgid "The following changes have been committed"
-msgstr "Następujące zmiany zostały zatwierdzone"
-
msgid "The following changes have been reverted"
msgstr "Następujące zmiany zostały odrzucone"
@@ -3346,11 +3361,6 @@ msgstr ""
"siÄ™ do urzÄ…dzenia."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3360,8 +3370,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Brak aktywnych dzierżaw."
-msgid "There are no pending changes to apply!"
-msgstr "Brak oczekujÄ…cych zmian do zastosowania!"
+msgid "There are no changes to apply."
+msgstr "Nie ma żadnych zmian do zastosowania."
msgid "There are no pending changes to revert!"
msgstr "Brak oczekujących zmian do przywrócenia!"
@@ -3391,6 +3401,9 @@ msgid ""
"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
"Name System\">DNS</abbr> servers."
msgstr ""
+"Ten plik może zawierać linie takie jak 'server=/domain/1.2.3.4' lub "
+"'server=1.2.3.4' dla specyficznych dla domeny lub pełnych serwerów <abbr "
+"title=\"Domain Name System\">DNS</abbr>"
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
@@ -3471,8 +3484,8 @@ msgid ""
"To restore configuration files, you can upload a previously generated backup "
"archive here."
msgstr ""
-"Aby przywrócić pliki konfiguracyjne, możesz tutaj przesłać wcześniej utworzoną "
-"kopiÄ™ zapasowÄ…."
+"Aby przywrócić pliki konfiguracyjne, możesz przesłać tutaj wcześniej "
+"utworzonÄ… kopiÄ™ zapasowÄ…."
msgid "Tone"
msgstr ""
@@ -3516,15 +3529,6 @@ msgstr "Interfejs tunelu"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr "Typ tunelu"
-
msgid "Tx-Power"
msgstr "Moc nadawania"
@@ -3573,6 +3577,9 @@ msgstr "Niezapisane zmiany"
msgid "Unsupported protocol type."
msgstr "Nieobsługiwany typ protokołu."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Aktualizuj listy"
@@ -3582,8 +3589,9 @@ msgid ""
"compatible firmware image)."
msgstr ""
"Prześlij tutaj obraz zgodny z funkcją sysupgrade, aby zastąpić aktualnie "
-"działające opragramowanie. Zaznacz opcję \"Zachowaj ustawienia\", aby zachować "
-"bieżącą konfigurację (wymagany obraz zgodny z bieżącym opragramowaniem)."
+"działające opragramowanie. Zaznacz opcję \"Zachowaj ustawienia\", aby "
+"zachować bieżącą konfigurację (wymagany obraz zgodny z bieżącym "
+"opragramowaniem)."
msgid "Upload archive..."
msgstr "Załaduj archiwum..."
@@ -3705,12 +3713,6 @@ msgstr "Producent"
msgid "Vendor Class to send when requesting DHCP"
msgstr "Klasa producenta do wysłania podczas żądania DHCP"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Zweryfikuj"
@@ -3739,12 +3741,8 @@ msgid ""
"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
"and ad-hoc mode) to be installed."
msgstr ""
-"Kodowanie WPA wymaga zainstalowanych modułów wpa_supplicant (tryb "
-"klienta) lub hostapd (tryb AP lub ad-hoc)"
-
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
+"Kodowanie WPA wymaga zainstalowanych modułów wpa_supplicant (tryb klienta) "
+"lub hostapd (tryb AP lub ad-hoc)"
msgid "Waiting for changes to be applied..."
msgstr "Trwa wprowadzenie zmian..."
@@ -3752,6 +3750,9 @@ msgstr "Trwa wprowadzenie zmian..."
msgid "Waiting for command to complete..."
msgstr "Trwa wykonanie polecenia..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "Oczekiwanie na zastosowanie konfiguracji… %ds"
+
msgid "Waiting for device..."
msgstr "Oczekiwanie na urzÄ…dzenie..."
@@ -3759,20 +3760,15 @@ msgid "Warning"
msgstr "Ostrzeżenie"
msgid "Warning: There are unsaved changes that will get lost on reboot!"
-msgstr "Ostrzeżenie: Istnieją niezapisane zmiany, które zostaną utracone "
-"po ponownym uruchomieniu urzÄ…dzenia!"
+msgstr ""
+"Ostrzeżenie: Istnieją niezapisane zmiany, które zostaną utracone po ponownym "
+"uruchomieniu urzÄ…dzenia!"
msgid ""
"When using a PSK, the PMK can be generated locally without inter AP "
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr "Szerokość"
@@ -3839,9 +3835,9 @@ msgid ""
"upgrade it to at least version 7 or use another browser like Firefox, Opera "
"or Safari."
msgstr ""
-"Twój Internet Explorer jest za stary, aby poprawnie wyświetlić tę stronę"
+"Twój Internet Explorer jest za stary, aby poprawnie wyświetlić tę stronę "
"zaktualizuj go do wersji co najmniej 7 lub użyj innej przeglądarki, takiej "
-"jak Firefox, Opera czy Safari".
+"jak Firefox, Opera czy Safari."
msgid "any"
msgstr "dowolny"
@@ -3855,6 +3851,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "zmostkowany"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "utwórz:"
@@ -3892,9 +3891,6 @@ msgstr "pełny-duplex"
msgid "half-duplex"
msgstr "pół-duplex"
-msgid "help"
-msgstr "pomoc"
-
msgid "hidden"
msgstr "ukryty"
@@ -3919,9 +3915,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "lokalny plik <abbr title=\"Domain Name System\">DNS</abbr>"
-msgid "minimum 1280, maximum 1480"
-msgstr "minimum 1280, maksimum 1480"
-
msgid "minutes"
msgstr "minuty"
@@ -3947,6 +3940,9 @@ msgstr "włączone"
msgid "open"
msgstr "otwarte"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3998,101 +3994,37 @@ msgstr "tak"
msgid "« Back"
msgstr "« Wróć"
-#~ msgid "Action"
-#~ msgstr "Akcja"
-
-#~ msgid "Buttons"
-#~ msgstr "Przyciski"
-
-#~ msgid "Handler"
-#~ msgstr "Uchwyt"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Maksymalny czas podtrzymania"
+#~ msgid "DHCP Leases"
+#~ msgstr "Dzierżawy DHCP"
-#~ msgid "Minimum hold time"
-#~ msgstr "Minimalny czas podtrzymania"
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Dzierżawy DHCPv6"
-#~ msgid "Path to executable which handles the button event"
+#~ 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 ""
-#~ "Ścieżka do pliku wykonywalnego, który obsługuje zdarzenie dla danego "
-#~ "przycisku"
+#~ "Naprawdę usunąć ten interfejs? Usunięcie nie może zostać cofnięte!\n"
+#~ "Możesz stracić dostęp do tego urządzenia, jeśli jesteś połączony przez "
+#~ "ten interfejs!"
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Określa zachowanie w zależności od stanu przycisku"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr ""
-#~ "Poniższa strona umożliwia konfigurację działania niestandardowych "
-#~ "przycisków"
-
-#~ msgid "Leasetime"
-#~ msgstr "Czas dzierżawy"
-
-# Wydaje mi się że brakuje litery R...
-#~ msgid "AR Support"
-#~ msgstr "Wsparcie dla ARP"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Bezprzewodowy kontroler Atheros 802.11%s"
-
-#~ msgid "Background Scan"
-#~ msgstr "Skanowanie w tle"
-
-#~ msgid "Compression"
-#~ msgstr "Kompresja"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Wyłącz zegar HW-Beacon"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Nie wysyłaj ramek probe response"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Szybkie ramki (Fast Frames)"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Maksymalna Szybkość"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Minimalna Szybkość"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Szybkość Multicast`u"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Kanały zewnętrzne"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Domena regulacji"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Rozdziel WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Statyczny WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Tryb Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Wsparcie XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
#~ msgstr ""
-#~ "Zostanie utworzona dodatkowa sieć jeśli zostawisz tą opcję niezaznaczoną."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Przyłącz do sieci: Ustawienia"
+#~ "Naprawdę wyłączyć tę sieć?\n"
+#~ "Możesz stracić dostęp do tego urządzenia jeśli jesteś połączony przez ten "
+#~ "interfejs!"
-#~ msgid "CPU"
-#~ msgstr "CPU"
+#~ msgid "Sort"
+#~ msgstr "Posortuj"
-#~ msgid "Port %d"
-#~ msgstr "Port %d"
+#~ msgid "help"
+#~ msgstr "pomoc"
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Port %d jest nietagowany w wielu VLAN`ach!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Status IPv4 WAN"
-#~ msgid "VLAN Interface"
-#~ msgstr "Interfejs VLAN"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Status WAN IPv6"
diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po
index a51d11d2a5..5fe11a0eb5 100644
--- a/modules/luci-base/po/pt-br/base.po
+++ b/modules/luci-base/po/pt-br/base.po
@@ -51,6 +51,9 @@ msgstr ""
"-- casar por <abbr title=\"Universal Unique IDentifier/Identificador Único "
"Universal\">UUID</abbr> --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Carga 1 Minuto:"
@@ -185,11 +188,6 @@ msgstr ""
"<abbr title=\"Assymetrical Digital Subscriber Line/Linha Digital Assimétrica "
"para Assinante\">ADSL</abbr>"
-msgid "AICCU (SIXXS)"
-msgstr ""
-"<abbr title=\"Automatic IPv6 Connectivity Client Utility/Utilitário Cliente "
-"de Conectividade IPv6 Automática\">AICCU (SIXXS)</abbr>"
-
msgid "ANSI T1.413"
msgstr "ANSI T1.413"
@@ -232,9 +230,6 @@ msgstr "Número do dispositivo ATM"
msgid "ATU-C System Vendor ID"
msgstr "Identificador de"
-msgid "AYIYA"
-msgstr "AYIYA"
-
msgid "Access Concentrator"
msgstr "Concentrador de Acesso"
@@ -348,13 +343,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr "Endereços IP autorizados"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"Veja também a <a href=\"https://www.sixxs.net/faq/connectivity/?"
-"faq=comparison\">Comparação de Tunelamentos</a> em SIXXS"
-
msgid "Always announce default router"
msgstr "Sempre anuncie o roteador padrão"
@@ -434,11 +422,14 @@ msgstr "configuração de antena"
msgid "Any zone"
msgstr "Qualquer zona"
-msgid "Apply"
-msgstr "Aplicar"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "Aplicar as alterações"
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -458,6 +449,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Estações associadas"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr "Grupo de Autenticação"
@@ -552,9 +546,6 @@ msgstr "Endereço especificado está incorreto!"
msgid "Band"
msgstr "Banda"
-msgid "Behind NAT"
-msgstr "Atrás da NAT"
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -631,12 +622,20 @@ msgstr "Alterações"
msgid "Changes applied."
msgstr "Alterações aplicadas."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Muda a senha do administrador para acessar este dispositivo"
msgid "Channel"
msgstr "Canal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Verificar"
@@ -719,12 +718,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configuração"
-msgid "Configuration applied."
-msgstr "Configuração aplicada."
-
msgid "Configuration files will be kept."
msgstr "Os arquivos de configuração serão mantidos."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmação"
@@ -737,12 +739,15 @@ msgstr "Conectado"
msgid "Connection Limit"
msgstr "Limite de conexão"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "A conexão para este servidor falhará quando o TLS não puder ser usado"
-
msgid "Connections"
msgstr "Conexões"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "País"
@@ -798,9 +803,6 @@ msgstr ""
"Se possível, personaliza o comportamento dos <abbr title=\"Diodo Emissor de "
"Luz\">LED</abbr>s."
-msgid "DHCP Leases"
-msgstr "Alocações do DHCP"
-
msgid "DHCP Server"
msgstr "Servidor DHCP"
@@ -813,9 +815,6 @@ msgstr "Cliente DHCP"
msgid "DHCP-Options"
msgstr "Opções de DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Alocações DHCPv6"
-
msgid "DHCPv6 client"
msgstr "Cliente DHCPv6"
@@ -873,9 +872,6 @@ msgstr "Roteador Padrão"
msgid "Default is stateless + stateful"
msgstr "O padrão é sem estado + com estado"
-msgid "Default route"
-msgstr "Rota padrão"
-
msgid "Default state"
msgstr "Estado padrão"
@@ -918,6 +914,9 @@ msgstr "O dispositivo está reiniciando..."
msgid "Device unreachable"
msgstr "Dispositivo não alcançável"
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnóstico"
@@ -953,6 +952,9 @@ msgid "Discard upstream RFC1918 responses"
msgstr ""
"Descartar respostas de servidores externos para redes privadas (RFC1918)"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Mostre somente os pacotes contendo"
@@ -1009,6 +1011,9 @@ msgstr ""
"abbr> sem o nome completo do <abbr title=\"Sistema de Nomes de Domínios"
"\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Baixe e instale o pacote"
@@ -1128,6 +1133,9 @@ msgstr "Habilita o campo DF (Não Fragmentar) dos pacotes encapsulados."
msgid "Enable this mount"
msgstr "Ativar esta montagem"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Ativar este espaço de troca (swap)"
@@ -1162,6 +1170,12 @@ msgstr "Equipamento do ponto final"
msgid "Endpoint Port"
msgstr "Porta do ponto final"
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Apagando..."
@@ -1222,6 +1236,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Arquivo"
@@ -1348,10 +1365,10 @@ msgstr "Espaço livre"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
"Mais informações sobre interfaces e parceiros WireGuard em <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgid "GHz"
msgstr "GHz"
@@ -1426,9 +1443,6 @@ msgstr ""
"Erros de Código de Erro de Cabeçalho (<abbr title=\"Header Error Code\">HEC</"
"abbr>)"
-msgid "Heartbeat"
-msgstr "Pulso de vida"
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1494,8 +1508,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Firewall para IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Estado IPv4 da WAN"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Endereço IPv4"
@@ -1547,15 +1561,12 @@ msgstr ""
"Prefixo <abbr title=\"Unique Local Address/Endereço Local Único\">ULA</abbr> "
"IPv6"
-msgid "IPv6 WAN Status"
-msgstr "Estado IPv6 da WAN"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Endereço IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr "Endereços IPv6 delegados para o ponta local do túnel (opcional)"
-
msgid "IPv6 assignment hint"
msgstr "Sugestão de atribuição IPv6"
@@ -2179,9 +2190,6 @@ msgstr "Domínio NT"
msgid "NTP server candidates"
msgstr "Candidatos a servidor NTP"
-msgid "NTP sync time-out"
-msgstr "Tempo limite da sincronia do NTP"
-
msgid "Name"
msgstr "Nome"
@@ -2307,6 +2315,9 @@ msgstr "Senha Ofuscada do Grupo"
msgid "Obfuscated Password"
msgstr "Senha Ofuscada"
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Atraso no estado de desligado"
@@ -2359,13 +2370,6 @@ msgstr "Opção removida"
msgid "Optional"
msgstr "Opcional"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-"Opcional, especifique para sobrescrever o servidor padrão (tic.sixxs.net)"
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr "Opcional, para usar quando a conta SIXXS tem mais de um túnel"
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2734,15 +2738,12 @@ msgstr ""
"\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Realmente excluir esta interface? A exclusão não pode ser desfeita!\n"
-" Você poderá perder o acesso a este dispositivo se você estiver conectado "
-"através desta interface."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Realmente excluir esta interface Wireless? A exclusão não pode ser "
@@ -2754,15 +2755,12 @@ msgid "Really reset all changes?"
msgstr "Realmente limpar todas as mudanças?"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Realmente desligar esta rede\"%s\" ?\n"
-"Você poderá perder o acesso a este dispositivo se você estiver conectado "
-"através desta interface."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Realmente desligar esta interface\"%s\" ?\n"
@@ -2856,9 +2854,6 @@ msgstr "Solicita endereço IPv6"
msgid "Request IPv6-prefix of length"
msgstr "Solicita prefixo IPv6 de tamanho"
-msgid "Require TLS"
-msgstr "Requer TLS"
-
msgid "Required"
msgstr "Necessário"
@@ -2923,6 +2918,15 @@ msgstr "Relevar/esconder senha"
msgid "Revert"
msgstr "Reverter"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Raiz"
@@ -2938,9 +2942,6 @@ msgstr "Roteie Andereços IP Autorizados"
msgid "Route type"
msgstr "Tipo de rota"
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "Prefixo roteável IPv6 para interfaces internas"
-
msgid "Router Advertisement-Service"
msgstr "Serviço de Anúncio de Roteador"
@@ -2967,16 +2968,6 @@ msgstr "Execute a verificação do sistema de arquivos "
msgid "SHA256"
msgstr "SHA256"
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-"O SIXXS suporta somente TIC. Use o 6in4 para túneis estáticos usando o "
-"protocolo IP 41 (RFC4213)"
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr "Identificador do SIXXS[/Identificador do Túnel]"
-
msgid "SNR"
msgstr "SNR"
@@ -3004,9 +2995,6 @@ msgstr "Salvar"
msgid "Save & Apply"
msgstr "Salvar & Aplicar"
-msgid "Save &#38; Apply"
-msgstr "Save &#38; Aplicar"
-
msgid "Scan"
msgstr "Procurar"
@@ -3035,19 +3023,6 @@ msgstr "Isolar Clientes"
msgid "Server Settings"
msgstr "Configurações do Servidor"
-msgid "Server password"
-msgstr "Senha do servidor"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-"Senha do servidor. Informe a senha para este túnel quando o nome do usuário "
-"contiver o identificador do túnel"
-
-msgid "Server username"
-msgstr "Usuário do servidor"
-
msgid "Service Name"
msgstr "Nome do Serviço"
@@ -3139,15 +3114,9 @@ msgstr ""
"firmware deve ser gravada manualmente. Por favor, consulte a wiki para "
"instruções específicas da instalação deste dispositivo."
-msgid "Sort"
-msgstr "Ordenar"
-
msgid "Source"
msgstr "Origem"
-msgid "Source routing"
-msgstr "Roteamento pela origem"
-
msgid "Specifies the directory the device is attached to"
msgstr "Especifica o diretório que o dispositivo está conectado"
@@ -3194,6 +3163,9 @@ msgstr "Iniciar"
msgid "Start priority"
msgstr "Prioridade de iniciação"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Iniciação"
@@ -3364,6 +3336,16 @@ msgstr ""
"O arquivo de configuração não pode ser carregado devido ao seguinte erro:"
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3389,9 +3371,6 @@ msgstr ""
"garantir a integridade dos dados. <br /> Clique em \"Proceder\" para iniciar "
"o procedimetno de gravação."
-msgid "The following changes have been committed"
-msgstr "As seguintes mudanças foram aplicadas"
-
msgid "The following changes have been reverted"
msgstr "As seguintes alterações foram revertidas"
@@ -3461,13 +3440,6 @@ msgstr ""
"computador para poder conectar novamente ao roteador."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-"O final do túnel está atrás de um NAT. Por padrão será desabilitado e "
-"somente se aplica a AYIYA"
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3477,8 +3449,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Não existem alocações ativas."
-msgid "There are no pending changes to apply!"
-msgstr "Não existem modificações pendentes para aplicar!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Não existem modificações pendentes para reverter!"
@@ -3638,15 +3610,6 @@ msgstr "Interface de Tunelamento"
msgid "Tunnel Link"
msgstr "Enlace do túnel"
-msgid "Tunnel broker protocol"
-msgstr "Protocolo do agente do túnel"
-
-msgid "Tunnel setup server"
-msgstr "Servidor de configuração do túnel"
-
-msgid "Tunnel type"
-msgstr "Tipo de túnel"
-
msgid "Tx-Power"
msgstr "Potência de transmissão"
@@ -3697,6 +3660,9 @@ msgstr "Alterações Não Salvas"
msgid "Unsupported protocol type."
msgstr "Tipo de protocolo não suportado."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Atualizar listas"
@@ -3833,12 +3799,6 @@ msgstr "Fabricante"
msgid "Vendor Class to send when requesting DHCP"
msgstr "Classe do fabricante para enviar quando requisitar o DHCP"
-msgid "Verbose"
-msgstr "Detalhado"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Habilite registros detalhados do serviço AICCU"
-
msgid "Verify"
msgstr "Verificar"
@@ -3870,18 +3830,15 @@ msgstr ""
"A cifragem WPA requer a instalação do wpa_supplicant (para modo cliente) ou "
"do hostapd (para modo AP ou ad-hoc)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Espere esta quantidade de segundos pela sincronia do NTP. Definindo como 0 "
-"desabilita a espera (opcional)"
-
msgid "Waiting for changes to be applied..."
msgstr "Esperando a aplicação das mudanças..."
msgid "Waiting for command to complete..."
msgstr "Esperando o término do comando..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr "Esperando pelo dispositivo..."
@@ -3896,12 +3853,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr "Se deve criar uma rota padrão IPv6 sobre o túnel"
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "Se deve rotear somente pacotes de prefixos delegados"
-
msgid "Width"
msgstr "Largura"
@@ -3985,6 +3936,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "em ponte"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "criar"
@@ -4022,9 +3976,6 @@ msgstr "full-duplex"
msgid "half-duplex"
msgstr "half-duplex"
-msgid "help"
-msgstr "ajuda"
-
msgid "hidden"
msgstr "ocultar"
@@ -4050,9 +4001,6 @@ msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr ""
"Arquivo local de <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
-msgid "minimum 1280, maximum 1480"
-msgstr "mínimo 1280, máximo 1480"
-
msgid "minutes"
msgstr "minutos"
@@ -4078,6 +4026,9 @@ msgstr "ligado"
msgid "open"
msgstr "aberto"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr "sobreposição"
@@ -4129,116 +4080,36 @@ msgstr "sim"
msgid "« Back"
msgstr "« Voltar"
-#~ msgid "Action"
-#~ msgstr "Ação"
-
-#~ msgid "Buttons"
-#~ msgstr "Botões"
-
-# Não sei que contexto isto está sendo usado
-#~ msgid "Handler"
-#~ msgstr "Responsável"
-
-# Desconheço o uso
-#~ msgid "Maximum hold time"
-#~ msgstr "Tempo máximo de espera"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Tempo mínimo de espera"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "Caminho para o executável que trata o evento do botão"
+#~ msgid "DHCP Leases"
+#~ msgstr "Alocações do DHCP"
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Especifica o estado do botão para ser tratado"
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Alocações DHCPv6"
-#~ msgid "This page allows the configuration of custom button actions"
+#~ 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 ""
-#~ "Esta página permite a configuração de ações personalizadas para os botões"
-
-#~ msgid "Leasetime"
-#~ msgstr "Tempo de atribuição do DHCP"
-
-#~ msgid "Optional."
-#~ msgstr "Opcional."
-
-#~ msgid "navigation Navigation"
-#~ msgstr "navegação Navegação"
-
-#~ msgid "skiplink1 Skip to navigation"
-#~ msgstr "skiplink1 Pular para a navegação"
-
-#~ msgid "skiplink2 Skip to content"
-#~ msgstr "skiplink2 Pular para o conteúdo"
-
-#~ msgid "AuthGroup"
-#~ msgstr "Grupo de Autenticação"
-
-#~ msgid "automatic"
-#~ msgstr "automático"
-
-#~ msgid "AR Support"
-#~ msgstr "Suporte AR"
+#~ "Realmente excluir esta interface? A exclusão não pode ser desfeita!\n"
+#~ " Você poderá perder o acesso a este dispositivo se você estiver conectado "
+#~ "através desta interface."
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Controlador Wireless Atheros 802.11%s"
-
-#~ msgid "Background Scan"
-#~ msgstr "Busca em Segundo Plano"
-
-#~ msgid "Compression"
-#~ msgstr "Compressão"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Desativar temporizador de Beacon de Hardware"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Não enviar respostas de exames"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Quadros Rápidos"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Taxa Máxima"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Taxa Mínima"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Taxa de Multicast"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Canais para externo"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Domínio Regulatório"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Separar WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "WDS Estático"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Modo Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Suporte a XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Uma rede adicional será criada se você deixar isto desmarcado."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Conectar à Rede: Configurações"
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Realmente desligar esta rede\"%s\" ?\n"
+#~ "Você poderá perder o acesso a este dispositivo se você estiver conectado "
+#~ "através desta interface."
-#~ msgid "CPU"
-#~ msgstr "CPU"
+#~ msgid "Sort"
+#~ msgstr "Ordenar"
-#~ msgid "Port %d"
-#~ msgstr "Porta %d"
+#~ msgid "help"
+#~ msgstr "ajuda"
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Porta %d está sem etiqueta para mútliplas VLANs!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado IPv4 da WAN"
-#~ msgid "VLAN Interface"
-#~ msgstr "Interface VLAN"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado IPv6 da WAN"
diff --git a/modules/luci-base/po/pt/base.po b/modules/luci-base/po/pt/base.po
index 843a4cac86..3d3575b38b 100644
--- a/modules/luci-base/po/pt/base.po
+++ b/modules/luci-base/po/pt/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Carga de 1 Minuto:"
@@ -177,9 +180,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -216,9 +216,6 @@ msgstr "Número de Dispositivo ATM"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Concentrador de Acesso"
@@ -328,11 +325,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -411,11 +403,14 @@ msgstr "Configuração das Antenas"
msgid "Any zone"
msgstr "Qualquer zona"
-msgid "Apply"
-msgstr "Aplicar"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "A aplicar as alterações"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -431,6 +426,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Estações Associadas"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -521,9 +519,6 @@ msgstr "Endereço mal especificado!"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -595,12 +590,20 @@ msgstr "Alterações"
msgid "Changes applied."
msgstr "Alterações aplicadas."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Altera a password de administrador para acesso ao dispositivo"
msgid "Channel"
msgstr "Canal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Verificar"
@@ -681,12 +684,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configuração"
-msgid "Configuration applied."
-msgstr "Configuração aplicada."
-
msgid "Configuration files will be kept."
msgstr "Os ficheiros de configuração serão mantidos."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmação"
@@ -699,12 +705,15 @@ msgstr "Ligado"
msgid "Connection Limit"
msgstr "Limite de Ligações"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Ligações"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "País"
@@ -758,9 +767,6 @@ msgstr ""
"Customiza o comportamento dos <abbr title=\"Diodo Emissor de Luz\">LED</"
"abbr>s, se possível."
-msgid "DHCP Leases"
-msgstr "Concessões DHCP"
-
msgid "DHCP Server"
msgstr "Servidor DHCP"
@@ -773,9 +779,6 @@ msgstr "Cliente DHCP"
msgid "DHCP-Options"
msgstr "Opções DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Concessões DHCPv6"
-
msgid "DHCPv6 client"
msgstr ""
@@ -833,9 +836,6 @@ msgstr "Gateway predefinido"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Estado predefinido"
@@ -878,6 +878,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnósticos"
@@ -912,6 +915,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "Descartar respostas RFC1918 a montante"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "Mostrar somente pacotes contendo"
@@ -966,6 +972,9 @@ msgstr ""
"Não encaminhar consultas <abbr title=\"Sistema de Nomes de Domínios\">DNS</"
"abbr> sem o nome do <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Descarregar e instalar pacote"
@@ -1082,6 +1091,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "Ativar este mount"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Ativar esta swap"
@@ -1114,6 +1126,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "A apagar..."
@@ -1175,6 +1193,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Ficheiro"
@@ -1296,7 +1317,7 @@ msgstr "Espaço livre"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1369,9 +1390,6 @@ msgstr "Suspender"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1434,8 +1452,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Firewall IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Estado WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Endereço IPv4"
@@ -1485,15 +1503,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Estado WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Endereço IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2079,9 +2094,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "Candidatos a servidor NTP"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nome"
@@ -2205,6 +2217,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Atraso do Off-State"
@@ -2256,12 +2271,6 @@ msgstr "Opção removida"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2613,15 +2622,12 @@ msgstr ""
"\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr>"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"Deseja mesmo apagar esta interface? A eliminação não poder desfeita!\n"
-"Pode perde a ligação ao dispositivo, caso esta ligado através desta "
-"interface."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"Deseja mesmo apagar esta rede? A eliminação não poder desfeita!\n"
@@ -2630,16 +2636,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "Deseja mesmo limpar todas as alterações?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"Deseja mesmo desligar esta rede?\n"
-"Pode perder o acesso ao dispositivo se estiver ligado através desta rede."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"Deseja mesmo desligar a interface \"%s\" ?\n"
@@ -2733,9 +2736,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2794,6 +2794,15 @@ msgstr "Revelar/esconder password"
msgid "Revert"
msgstr "Reverter"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2809,9 +2818,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2838,14 +2844,6 @@ msgstr "Correr uma verificação do sistema de ficheiros"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2873,9 +2871,6 @@ msgstr "Salvar"
msgid "Save & Apply"
msgstr "Salvar & Aplicar"
-msgid "Save &#38; Apply"
-msgstr "Salvar &#38; Aplicar"
-
msgid "Scan"
msgstr "Procurar"
@@ -2902,17 +2897,6 @@ msgstr "Isolar Clientes"
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Nome do Serviço"
@@ -3000,15 +2984,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr "Ordenar"
-
msgid "Source"
msgstr "Origem"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -3047,6 +3025,9 @@ msgstr "Iniciar"
msgid "Start priority"
msgstr "Prioridade de inicialização"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3203,6 +3184,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3227,9 +3218,6 @@ msgstr ""
"compare com o ficheiro original para assegurar a integração de dados.<br /> "
"Click em \"Proceder\" para iniciar o procedimento."
-msgid "The following changes have been committed"
-msgstr "As seguintes alterações foram escritas"
-
msgid "The following changes have been reverted"
msgstr "Foram recuperadas as seguintes alterações "
@@ -3300,11 +3288,6 @@ msgstr ""
"para poder ligar novamente ao router."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3314,8 +3297,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Não há concessões ativas."
-msgid "There are no pending changes to apply!"
-msgstr "Não há alterações pendentes para aplicar!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Não há alterações pendentes para reverter!"
@@ -3460,15 +3443,6 @@ msgstr "Interface de Túnel"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Potência de Tx"
@@ -3517,6 +3491,9 @@ msgstr "Alterações não Guardadas"
msgid "Unsupported protocol type."
msgstr "Tipo de protocolo não suportado."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Actualizar listas"
@@ -3641,12 +3618,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Verificar"
@@ -3678,16 +3649,15 @@ msgstr ""
"A encriptação-WPA necessita do wpa_supplicant (para modo cliente) ou do "
"hostapd (para modo AP ou ah-hoc) esteja instalado."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "A aguardar que as mudanças sejam aplicadas..."
msgid "Waiting for command to complete..."
msgstr "A aguardar que o comando termine..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3702,12 +3672,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3788,6 +3752,9 @@ msgstr "baseT"
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "criar:"
@@ -3825,9 +3792,6 @@ msgstr "full-duplex"
msgid "half-duplex"
msgstr "half-duplex"
-msgid "help"
-msgstr "ajuda"
-
msgid "hidden"
msgstr "escondido"
@@ -3853,9 +3817,6 @@ msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr ""
"Ficheiro local de <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3880,6 +3841,9 @@ msgstr "ligado"
msgid "open"
msgstr "abrir"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3931,6 +3895,58 @@ msgstr "sim"
msgid "« Back"
msgstr "« Voltar"
+#~ msgid "DHCP Leases"
+#~ msgstr "Concessões DHCP"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Concessões DHCPv6"
+
+#~ 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 ""
+#~ "Deseja mesmo apagar esta interface? A eliminação não poder desfeita!\n"
+#~ "Pode perde a ligação ao dispositivo, caso esta ligado através desta "
+#~ "interface."
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "Deseja mesmo desligar esta rede?\n"
+#~ "Pode perder o acesso ao dispositivo se estiver ligado através desta rede."
+
+#~ msgid "Sort"
+#~ msgstr "Ordenar"
+
+#~ msgid "help"
+#~ msgstr "ajuda"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado WAN IPv6"
+
+#~ msgid "Apply"
+#~ msgstr "Aplicar"
+
+#~ msgid "Applying changes"
+#~ msgstr "A aplicar as alterações"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuração aplicada."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Salvar &#38; Aplicar"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "As seguintes alterações foram escritas"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Não há alterações pendentes para aplicar!"
+
#~ msgid "Action"
#~ msgstr "Acção"
diff --git a/modules/luci-base/po/ro/base.po b/modules/luci-base/po/ro/base.po
index 748bfdbc53..2ca23e0472 100644
--- a/modules/luci-base/po/ro/base.po
+++ b/modules/luci-base/po/ro/base.po
@@ -48,6 +48,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Incarcarea in ultimul minut"
@@ -168,9 +171,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -207,9 +207,6 @@ msgstr "ATM numar echipament"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Concentrator de Access "
@@ -314,11 +311,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -397,11 +389,14 @@ msgstr "Configurarea Antenei"
msgid "Any zone"
msgstr "Orice Zona"
-msgid "Apply"
-msgstr "Aplica"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Se aplica modificarile"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -417,6 +412,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Statiile asociate"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -507,9 +505,6 @@ msgstr "Adresa specificata gresit !"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -578,12 +573,20 @@ msgstr "Modificari"
msgid "Changes applied."
msgstr "Modificari aplicate."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Schimba parola administratorului pentru accesarea dispozitivului"
msgid "Channel"
msgstr "Canal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Verificare"
@@ -656,12 +659,15 @@ msgstr ""
msgid "Configuration"
msgstr "Configurare"
-msgid "Configuration applied."
-msgstr "Configurarea aplicata."
-
msgid "Configuration files will be kept."
msgstr "Fisierele de configurare vor fi pastrate."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Confirmare"
@@ -674,12 +680,15 @@ msgstr "Conectat"
msgid "Connection Limit"
msgstr "Limita de conexiune"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Conexiuni"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Tara"
@@ -731,9 +740,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr ""
-msgid "DHCP Leases"
-msgstr "Conexiuni DHCP"
-
msgid "DHCP Server"
msgstr "Server DHCP"
@@ -746,9 +752,6 @@ msgstr ""
msgid "DHCP-Options"
msgstr "Optiuni DHCP"
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -806,9 +809,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "Stare implicita"
@@ -848,6 +848,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnosticuri"
@@ -882,6 +885,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -927,6 +933,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Descarca si instaleaza pachetul"
@@ -1037,6 +1046,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1069,6 +1081,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Stergere..."
@@ -1127,6 +1145,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fisier"
@@ -1249,7 +1270,7 @@ msgstr "Spatiu liber"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1321,9 +1342,6 @@ msgstr ""
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1381,8 +1399,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Firewall IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Statusul IPv4 pe WAN"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "Adresa IPv4"
@@ -1432,15 +1450,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "Statusul IPv6 pe WAN"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "Adresa IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2009,9 +2024,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Nume"
@@ -2135,6 +2147,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2180,12 +2195,6 @@ msgstr "Optiunea eliminata"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2537,12 +2546,12 @@ msgstr ""
"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>-"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2550,12 +2559,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2646,9 +2655,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2707,6 +2713,15 @@ msgstr "Arata / ascunde parola"
msgid "Revert"
msgstr ""
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2722,9 +2737,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2748,14 +2760,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2783,9 +2787,6 @@ msgstr "Salveaza"
msgid "Save & Apply"
msgstr "Salveaza si aplica"
-msgid "Save &#38; Apply"
-msgstr "Salveaza &#38; Aplica"
-
msgid "Scan"
msgstr "Scan"
@@ -2812,17 +2813,6 @@ msgstr ""
msgid "Server Settings"
msgstr "Setarile serverului"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "Nume serviciu"
@@ -2910,15 +2900,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
msgstr "Sursa"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2957,6 +2941,9 @@ msgstr "Start"
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Pornire"
@@ -3107,6 +3094,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3123,9 +3120,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr ""
@@ -3179,11 +3173,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3191,8 +3180,8 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
-msgstr "Nu exista modificari in asteptare de aplicat !"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Nu exista modificari in asteptare de anulat !"
@@ -3328,15 +3317,6 @@ msgstr "Interfata de tunel"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "Puterea TX"
@@ -3385,6 +3365,9 @@ msgstr "Modificari nesalvate"
msgid "Unsupported protocol type."
msgstr "Tipul de protocol neacceptat."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3509,12 +3492,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3546,16 +3523,15 @@ msgstr ""
"Criptarea WPA necesita wpa_supplicant (pentru modul client) sau hostapd "
"(pentru modul AP sau ad-hoc) instalate."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3570,12 +3546,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3649,6 +3619,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3684,9 +3657,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr "ajutor"
-
msgid "hidden"
msgstr "ascuns"
@@ -3711,9 +3681,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr ""
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3738,6 +3705,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3789,6 +3759,33 @@ msgstr "da"
msgid "« Back"
msgstr "« Inapoi"
+#~ msgid "DHCP Leases"
+#~ msgstr "Conexiuni DHCP"
+
+#~ msgid "help"
+#~ msgstr "ajutor"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Statusul IPv4 pe WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Statusul IPv6 pe WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Aplica"
+
+#~ msgid "Applying changes"
+#~ msgstr "Se aplica modificarile"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configurarea aplicata."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Salveaza &#38; Aplica"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Nu exista modificari in asteptare de aplicat !"
+
#~ msgid "Action"
#~ msgstr "Actiune"
diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po
index 35a697620e..7d167e6100 100644
--- a/modules/luci-base/po/ru/base.po
+++ b/modules/luci-base/po/ru/base.po
@@ -51,6 +51,9 @@ msgstr "-- проверка по метке --"
msgid "-- match by uuid --"
msgstr "-- проверка по uuid --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Загрузка за 1 минуту:"
@@ -177,9 +180,6 @@ msgstr "A43C + J43 + A43 + V43"
msgid "ADSL"
msgstr "ADSL"
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
msgid "ANSI T1.413"
msgstr "ANSI T1.413"
@@ -216,9 +216,6 @@ msgstr "ATM номер уÑтройÑтва"
msgid "ATU-C System Vendor ID"
msgstr "ATU-C System Vendor ID"
-msgid "AYIYA"
-msgstr "AYIYA"
-
msgid "Access Concentrator"
msgstr "Концентратор доÑтупа"
@@ -330,13 +327,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr "Разрешенные IP-адреÑа"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"Также Ñмотрите <a href=\"https://www.sixxs.net/faq/connectivity/?"
-"faq=comparison\">Tunneling Comparison</a> on SIXXS"
-
msgid "Always announce default router"
msgstr "ОбъÑвлÑÑ‚ÑŒ вÑегда, как дефолтный маршрутизатор"
@@ -417,11 +407,14 @@ msgstr "ÐаÑтройка антенн"
msgid "Any zone"
msgstr "Ð›ÑŽÐ±Ð°Ñ Ð·Ð¾Ð½Ð°"
-msgid "Apply"
-msgstr "ПринÑÑ‚ÑŒ"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "Применение изменений"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -441,6 +434,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Подключенные клиенты"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr "Группа аутентификации"
@@ -537,9 +533,6 @@ msgstr "Указан неправильный адреÑ!"
msgid "Band"
msgstr "Диапазон"
-msgid "Behind NAT"
-msgstr "За NAT-ом"
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -616,12 +609,20 @@ msgstr "ИзменениÑ"
msgid "Changes applied."
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ñ‹."
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Изменить пароль админиÑтратора Ð´Ð»Ñ Ð´Ð¾Ñтупа к уÑтройÑтву."
msgid "Channel"
msgstr "Канал"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Проверить"
@@ -710,12 +711,15 @@ msgstr ""
msgid "Configuration"
msgstr "ÐаÑтройка config файла"
-msgid "Configuration applied."
-msgstr "Изменение наÑтроек config файлов."
-
msgid "Configuration files will be kept."
msgstr "Config файлы будут Ñохранены."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Подтверждение паролÑ"
@@ -728,12 +732,15 @@ msgstr "Подключен"
msgid "Connection Limit"
msgstr "Ограничение Ñоединений"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "СвÑзь Ñ Ñервером прерываетÑÑ, когда TLS не может быть иÑпользован"
-
msgid "Connections"
msgstr "СоединениÑ"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Страна"
@@ -789,9 +796,6 @@ msgstr ""
"ÐаÑтройка Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñветодиодной индикации <abbr title=\"Светодиод\">LED</"
"abbr>s уÑтройÑтва, еÑли Ñто возможно."
-msgid "DHCP Leases"
-msgstr "Ðренды DHCP"
-
msgid "DHCP Server"
msgstr "DHCP-Ñервер"
@@ -804,9 +808,6 @@ msgstr "DHCP-клиент"
msgid "DHCP-Options"
msgstr "DHCP-ÐаÑтройки"
-msgid "DHCPv6 Leases"
-msgstr "Ðренды DHCPv6"
-
msgid "DHCPv6 client"
msgstr "DHCPv6 клиент"
@@ -864,9 +865,6 @@ msgstr "Шлюз по умолчанию"
msgid "Default is stateless + stateful"
msgstr "Значение по умолчанию - 'stateless + stateful'."
-msgid "Default route"
-msgstr "Маршрут по умолчанию"
-
msgid "Default state"
msgstr "Ðачальное ÑоÑтоÑние"
@@ -909,6 +907,9 @@ msgstr "Перезагрузка..."
msgid "Device unreachable"
msgstr "УÑтройÑтво недоÑтупно"
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "ДиагноÑтика"
@@ -943,6 +944,9 @@ msgstr "Отключено (по умолчанию)"
msgid "Discard upstream RFC1918 responses"
msgstr "ОтбраÑывать ответы внешней Ñети RFC1918."
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "ПоказываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ пакеты, Ñодержащие"
@@ -996,6 +1000,9 @@ msgstr ""
"Ðе перенаправлÑÑ‚ÑŒ <abbr title=\"Служба доменных имён\">DNS</abbr>-запроÑÑ‹ "
"без <abbr title=\"Служба доменных имён\">DNS</abbr>-имени."
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Загрузить и уÑтановить пакет"
@@ -1113,6 +1120,9 @@ msgstr "Включите флаг DF (не Фрагментировать) инÐ
msgid "Enable this mount"
msgstr "Включить Ñту<br />точку монтированиÑ"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Включить Ñтот раздел подкачки"
@@ -1147,6 +1157,12 @@ msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° ХоÑта"
msgid "Endpoint Port"
msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Порта"
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Стирание..."
@@ -1207,6 +1223,9 @@ msgstr "FT над the Air"
msgid "FT protocol"
msgstr "FT протокол"
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Файл"
@@ -1331,10 +1350,10 @@ msgstr "Свободное меÑто"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
"Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ интерфейÑах и партнерах WireGuard приведена в <a "
-"href=\"http://wireguard.io\">wireguard.io</a>."
+"href=\"http://wireguard.com\">wireguard.com</a>."
msgid "GHz"
msgstr "ГГц"
@@ -1405,9 +1424,6 @@ msgstr "ПерезапуÑтить"
msgid "Header Error Code Errors (HEC)"
msgstr "Ошибки кода ошибки заголовка (HEC)"
-msgid "Heartbeat"
-msgstr "Heartbeat"
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1467,8 +1483,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "МежÑетевой Ñкран IPv4"
-msgid "IPv4 WAN Status"
-msgstr "СоÑтоÑние IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4-адреÑ"
@@ -1518,16 +1534,12 @@ msgstr "IPv6 ÐаÑтройки"
msgid "IPv6 ULA-Prefix"
msgstr "IPv6 ULA-Prefix"
-msgid "IPv6 WAN Status"
-msgstr "СоÑтоÑние IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "IPv6-адреÑ"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-"IPv6-адреÑ, делегированный локальной конечной точке Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ (необÑзательно)."
-
msgid "IPv6 assignment hint"
msgstr "IPv6 подÑказка приÑвоениÑ"
@@ -2137,9 +2149,6 @@ msgstr "NT домен"
msgid "NTP server candidates"
msgstr "СпиÑок NTP-Ñерверов"
-msgid "NTP sync time-out"
-msgstr "NTP ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ ожиданиÑ"
-
msgid "Name"
msgstr "ИмÑ"
@@ -2263,6 +2272,9 @@ msgstr "Obfuscated Group Password"
msgid "Obfuscated Password"
msgstr "Obfuscated Password"
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "Задержка выключенного ÑоÑтоÑниÑ"
@@ -2314,16 +2326,6 @@ msgstr "ÐžÐ¿Ñ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°"
msgid "Optional"
msgstr "ÐеобÑзательно"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-"ÐеобÑзательно. Укажите, чтобы переопределить дефолтный Ñервер (tic.sixxs."
-"net)."
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-"ÐеобÑзательно. ИÑпользуетÑÑ, когда ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ SIXXS имеет более одного "
-"туннелÑ."
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2695,15 +2697,12 @@ msgstr ""
"динамичеÑкой наÑтройки узла\">DHCP</abbr>-Ñервера."
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"ДейÑтвительно удалить Ñтот интерфейÑ? Удаление не может быть отменено!\\nÐ’Ñ‹ "
-"можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, еÑли вы подключены через Ñтот "
-"интерфейÑ."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 ""
"ДейÑтвительно удалить Ñту беÑпроводную Ñеть? Удаление не может быть отменено!"
@@ -2714,18 +2713,16 @@ msgid "Really reset all changes?"
msgstr "ДейÑтвительно ÑброÑить вÑе изменениÑ?"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"ДейÑтвительно отключить Ñеть? Ð’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, "
-"еÑли вы подключены через Ñтот интерфейÑ."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
-"ДейÑтвительно отключить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\" ?\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к "
-"Ñтому уÑтройÑтву, еÑли вы подключены через Ñтот интерфейÑ."
+"ДейÑтвительно отключить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"? Ð’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому "
+"уÑтройÑтву, еÑли вы подключены через Ñтот интерфейÑ."
msgid "Really switch protocol?"
msgstr "Ð’Ñ‹ дейÑтвительно хотите изменить протокол?"
@@ -2815,9 +2812,6 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ IPv6 адреÑа"
msgid "Request IPv6-prefix of length"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ IPv6 Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ð¸Ð½Ñ‹"
-msgid "Require TLS"
-msgstr "Требовать TLS"
-
msgid "Required"
msgstr "Требовать"
@@ -2884,6 +2878,15 @@ msgstr "Показать/Ñкрыть пароль"
msgid "Revert"
msgstr "Вернуть"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Корень"
@@ -2899,9 +2902,6 @@ msgstr "Маршрут разрешенный Ð´Ð»Ñ IP адреÑов"
msgid "Route type"
msgstr "Тип маршрута"
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸ IPv6 Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов внутренней Ñети"
-
msgid "Router Advertisement-Service"
msgstr "ДоÑтупные<br />режимы работы"
@@ -2927,16 +2927,6 @@ msgstr "Проверить"
msgid "SHA256"
msgstr "SHA256"
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-"SIXXS поддерживает только TIC, Ð´Ð»Ñ ÑтатичеÑких туннелей Ñ Ð¸Ñпользованием IP-"
-"протокола 41 (RFC4213) иÑпользуетÑÑ Ð²Ð¼ÐµÑто 6in4."
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr "SIXXS-управление[/Туннель-ID]"
-
msgid "SNR"
msgstr "SNR"
@@ -2964,9 +2954,6 @@ msgstr "Сохранить"
msgid "Save & Apply"
msgstr "Сохранить и применить"
-msgid "Save &#38; Apply"
-msgstr "Сохранить и применить"
-
msgid "Scan"
msgstr "ПоиÑк"
@@ -2995,19 +2982,6 @@ msgstr "РазделÑÑ‚ÑŒ клиентов"
msgid "Server Settings"
msgstr "ÐаÑтройки Ñервера"
-msgid "Server password"
-msgstr "Пароль доÑтупа к Ñерверу"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-"Пароль Ñервера. Введите пароль из тоннелÑ, когда Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñодержит "
-"ID туннелÑ."
-
-msgid "Server username"
-msgstr "Логин доÑтупа к Ñерверу"
-
msgid "Service Name"
msgstr "Ð˜Ð¼Ñ Ñлужбы"
@@ -3098,15 +3072,9 @@ msgstr ""
"должна быть уÑтановлена вручную. ОбратитеÑÑŒ к wiki Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ñ‹Ñ… "
"инÑтрукций Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ уÑтройÑтва."
-msgid "Sort"
-msgstr "Сортировка"
-
msgid "Source"
msgstr "ИÑточник"
-msgid "Source routing"
-msgstr "Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ иÑточника"
-
msgid "Specifies the directory the device is attached to"
msgstr "Папка, к которой монтируетÑÑ Ñ€Ð°Ð·Ð´ÐµÐ» уÑтройÑтва."
@@ -3152,6 +3120,9 @@ msgstr "Старт"
msgid "Start priority"
msgstr "Приоритет"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "Загрузка"
@@ -3320,6 +3291,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr "Ðе удалоÑÑŒ загрузить config файл из-за Ñледующей ошибки:"
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3343,9 +3324,6 @@ msgstr ""
"удоÑтоверитьÑÑ Ð² целоÑтноÑти данных.<br /> Ðажмите 'Продолжить', чтобы "
"начать процедуру Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸."
-msgid "The following changes have been committed"
-msgstr "Ваши наÑтройки были применены."
-
msgid "The following changes have been reverted"
msgstr "Ваши наÑтройки были отвергнуты."
@@ -3413,13 +3391,6 @@ msgstr ""
"в завиÑимоÑти от наÑтроек."
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-"ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð° NAT, по умолчанию отключена и "
-"применÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к AYIYA."
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3429,8 +3400,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Ðет активных арендованных адреÑов."
-msgid "There are no pending changes to apply!"
-msgstr "Ðет изменений, которые можно применить!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Ðет изменений, которые можно отменить!"
@@ -3589,15 +3560,6 @@ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ"
msgid "Tunnel Link"
msgstr "СÑылка на туннель"
-msgid "Tunnel broker protocol"
-msgstr "Протокол поÑредника туннелÑ"
-
-msgid "Tunnel setup server"
-msgstr "Сервер наÑтройки туннелÑ"
-
-msgid "Tunnel type"
-msgstr "Тип туннелÑ"
-
msgid "Tx-Power"
msgstr "МощноÑÑ‚ÑŒ передатчика"
@@ -3646,6 +3608,9 @@ msgstr "ÐепринÑтые изменениÑ"
msgid "Unsupported protocol type."
msgstr "Ðеподдерживаемый тип протокола."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Обновить ÑпиÑки"
@@ -3783,12 +3748,6 @@ msgid "Vendor Class to send when requesting DHCP"
msgstr ""
"КлаÑÑ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ (Vendor class), который отправлÑÑ‚ÑŒ при DHCP-запроÑах"
-msgid "Verbose"
-msgstr "Verbose"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Verbose ведение журнала демоном aiccu"
-
msgid "Verify"
msgstr "Проверить"
@@ -3820,18 +3779,15 @@ msgstr ""
"Ðеобходимо уÑтановить wpa_supplicant (режим клиента) или hostapd (режим "
"точки доÑтупа или ad-hoc) Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ WPA."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Задать Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñинхронизации NTP, уÑтановка Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ - '0', отключает "
-"ожидание (необÑзательно)."
-
msgid "Waiting for changes to be applied..."
msgstr "Ожидание Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹..."
msgid "Waiting for command to complete..."
msgstr "Ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr "Ожидание Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑƒÑтройÑтва..."
@@ -3848,12 +3804,6 @@ msgid ""
"communications"
msgstr "При иÑпользовании PSK, PMK может быть Ñоздан локально, без AP в ÑвÑзи."
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr "Создание маршрута по умолчанию IPv6 через туннель."
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ пакетов из делегированных префикÑов."
-
msgid "Width"
msgstr "Ширина"
@@ -3936,6 +3886,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "Ñоед. моÑтом"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "Ñоздать:"
@@ -3973,9 +3926,6 @@ msgstr "полный дуплекÑ"
msgid "half-duplex"
msgstr "полудуплекÑ"
-msgid "help"
-msgstr "помощь"
-
msgid "hidden"
msgstr "Ñкрытый"
@@ -4000,9 +3950,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "Локальный <abbr title=\"Служба доменных имён\">DNS</abbr>-файл."
-msgid "minimum 1280, maximum 1480"
-msgstr "минимум 1280, макÑимум 1480"
-
msgid "minutes"
msgstr "минут(ы)"
@@ -4027,6 +3974,9 @@ msgstr "включено"
msgid "open"
msgstr "открыть"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr "overlay"
@@ -4077,3 +4027,36 @@ msgstr "да"
msgid "« Back"
msgstr "« Ðазад"
+
+#~ msgid "DHCP Leases"
+#~ msgstr "Ðренды DHCP"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Ðренды DHCPv6"
+
+#~ 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 ""
+#~ "ДейÑтвительно удалить Ñтот интерфейÑ? Удаление не может быть отменено!"
+#~ "\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, еÑли вы подключены через "
+#~ "Ñтот интерфейÑ."
+
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "ДейÑтвительно отключить Ñеть? Ð’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому "
+#~ "уÑтройÑтву, еÑли вы подключены через Ñтот интерфейÑ."
+
+#~ msgid "Sort"
+#~ msgstr "Сортировка"
+
+#~ msgid "help"
+#~ msgstr "помощь"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "СоÑтоÑние IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "СоÑтоÑние IPv6 WAN"
diff --git a/modules/luci-base/po/sk/base.po b/modules/luci-base/po/sk/base.po
index acc57792b3..dab1a7def2 100644
--- a/modules/luci-base/po/sk/base.po
+++ b/modules/luci-base/po/sk/base.po
@@ -44,6 +44,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr ""
@@ -159,9 +162,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -195,9 +195,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr ""
@@ -300,11 +297,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -383,10 +375,13 @@ msgstr ""
msgid "Any zone"
msgstr ""
-msgid "Apply"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
msgstr ""
-msgid "Applying changes"
+msgid "Architecture"
msgstr ""
msgid ""
@@ -403,6 +398,9 @@ msgstr ""
msgid "Associated Stations"
msgstr ""
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -493,9 +491,6 @@ msgstr ""
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -564,12 +559,20 @@ msgstr ""
msgid "Changes applied."
msgstr ""
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr ""
msgid "Channel"
msgstr ""
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr ""
@@ -639,10 +642,13 @@ msgstr ""
msgid "Configuration"
msgstr ""
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
msgstr ""
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
msgstr ""
msgid "Confirmation"
@@ -657,10 +663,13 @@ msgstr ""
msgid "Connection Limit"
msgstr ""
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
msgstr ""
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
msgstr ""
msgid "Country"
@@ -714,9 +723,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr ""
-msgid "DHCP Leases"
-msgstr ""
-
msgid "DHCP Server"
msgstr ""
@@ -729,9 +735,6 @@ msgstr ""
msgid "DHCP-Options"
msgstr ""
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -789,9 +792,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr ""
@@ -831,6 +831,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
@@ -863,6 +866,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -908,6 +914,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr ""
@@ -1018,6 +1027,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1050,6 +1062,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1108,6 +1126,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1229,7 +1250,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1301,9 +1322,6 @@ msgstr ""
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1359,7 +1377,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1410,15 +1428,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -1984,9 +1999,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2155,12 +2170,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2510,12 +2519,12 @@ msgid ""
msgstr ""
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2523,12 +2532,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2619,9 +2628,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2680,6 +2686,15 @@ msgstr ""
msgid "Revert"
msgstr ""
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2695,9 +2710,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2721,14 +2733,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2756,9 +2760,6 @@ msgstr ""
msgid "Save & Apply"
msgstr ""
-msgid "Save &#38; Apply"
-msgstr ""
-
msgid "Scan"
msgstr ""
@@ -2785,17 +2786,6 @@ msgstr ""
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2882,15 +2872,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
msgstr ""
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2929,6 +2913,9 @@ msgstr ""
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3079,6 +3066,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3095,9 +3092,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr ""
@@ -3151,11 +3145,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3163,7 +3152,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3298,15 +3287,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3355,6 +3335,9 @@ msgstr ""
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3479,12 +3462,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3514,16 +3491,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3538,12 +3514,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3617,6 +3587,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3652,9 +3625,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr ""
-
msgid "hidden"
msgstr ""
@@ -3679,9 +3649,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr ""
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3706,6 +3673,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
diff --git a/modules/luci-base/po/sv/base.po b/modules/luci-base/po/sv/base.po
index 632ea6f745..ecfd0bae8e 100644
--- a/modules/luci-base/po/sv/base.po
+++ b/modules/luci-base/po/sv/base.po
@@ -47,6 +47,9 @@ msgstr "-- matcha enligt märke --"
msgid "-- match by uuid --"
msgstr "-- matcha enligt uuid --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "Belastning senaste minuten:"
@@ -167,9 +170,6 @@ msgstr "A43C + J43 + A43 + V43"
msgid "ADSL"
msgstr "ADSL"
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
msgid "ANSI T1.413"
msgstr "ANSI T1.413"
@@ -203,9 +203,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr "AYIYA"
-
msgid "Access Concentrator"
msgstr ""
@@ -311,11 +308,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr "Tillåtna IP-adresser"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -394,11 +386,14 @@ msgstr "Konfiguration av antenn"
msgid "Any zone"
msgstr "NÃ¥gon zon"
-msgid "Apply"
-msgstr "Verkställ"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "Verkställer ändringar"
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -414,6 +409,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "Associerade stationer"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr "Autentiseringsgrupp"
@@ -504,9 +502,6 @@ msgstr "Fel adress angiven!"
msgid "Band"
msgstr "Band"
-msgid "Behind NAT"
-msgstr "Bakom NAT"
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -576,12 +571,20 @@ msgstr "Ändringar"
msgid "Changes applied."
msgstr "Tillämpade ändringar"
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "Ändrar administratörens lösenord för att få tillgång till enheten"
msgid "Channel"
msgstr "Kanal"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "Kontrollera"
@@ -653,12 +656,15 @@ msgstr ""
msgid "Configuration"
msgstr "Konfiguration"
-msgid "Configuration applied."
-msgstr "Konfigurationen tillämpades"
-
msgid "Configuration files will be kept."
msgstr "Konfigurationsfiler kommer att behållas."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "Bekräftelse"
@@ -671,12 +677,15 @@ msgstr "Ansluten"
msgid "Connection Limit"
msgstr "Anslutningsgräns"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "Anslutningar"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "Land"
@@ -728,9 +737,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr ""
-msgid "DHCP Leases"
-msgstr "DHCP-kontrakt"
-
msgid "DHCP Server"
msgstr "DHCP-server"
@@ -743,9 +749,6 @@ msgstr "DHCP-klient"
msgid "DHCP-Options"
msgstr "DHCP-alternativ"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6-kontrakt"
-
msgid "DHCPv6 client"
msgstr "DHCPv6-klient"
@@ -803,9 +806,6 @@ msgstr "Standard gateway"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr "Standardrutt"
-
msgid "Default state"
msgstr ""
@@ -845,6 +845,9 @@ msgstr "Enheten startar om..."
msgid "Device unreachable"
msgstr "Enheten kan inte nås"
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
@@ -879,6 +882,9 @@ msgstr "Inaktiverad (standard)"
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -928,6 +934,9 @@ msgstr ""
"Vidarebefordra inte <abbr title=\"Domain Name System\">DNS</abbr>-"
"förfrågningar utan <abbr title=\"Domain Name System\">DNS</abbr>-namn"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Ladda ner och installera paket"
@@ -1038,6 +1047,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "Aktivera den här monteringen"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "Aktivera den här swap"
@@ -1070,6 +1082,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "Raderar..."
@@ -1128,6 +1146,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "Fil"
@@ -1249,7 +1270,7 @@ msgstr "Fritt utrymme"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1321,9 +1342,6 @@ msgstr "Lägg på"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr "Hjärtslag"
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1379,7 +1397,7 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4-brandvägg"
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1430,15 +1448,12 @@ msgstr "IPv6-inställningar"
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr "IPv6-adress"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2005,9 +2020,6 @@ msgstr "NT-domän"
msgid "NTP server candidates"
msgstr "NTP-serverkandidater"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Namn"
@@ -2131,6 +2143,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2176,12 +2191,6 @@ msgstr "Alternativet togs bort"
msgid "Optional"
msgstr "Valfri"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2533,12 +2542,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr>-servern"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2546,12 +2555,12 @@ msgid "Really reset all changes?"
msgstr "Verkligen återställa alla ändringar?"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2642,9 +2651,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr "Kräv TLS"
-
msgid "Required"
msgstr "Krävs!"
@@ -2703,6 +2709,15 @@ msgstr "Visa/göm lösenord"
msgid "Revert"
msgstr "Återgå"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "Root"
@@ -2718,9 +2733,6 @@ msgstr ""
msgid "Route type"
msgstr "Typ av rutt"
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2744,14 +2756,6 @@ msgstr "Kör filsystemskontrollen"
msgid "SHA256"
msgstr "SHA256"
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr "SNR"
@@ -2779,9 +2783,6 @@ msgstr "Spara"
msgid "Save & Apply"
msgstr "Spara och Verkställ"
-msgid "Save &#38; Apply"
-msgstr "Spara &#38; Verkställ"
-
msgid "Scan"
msgstr "Skanna"
@@ -2808,17 +2809,6 @@ msgstr "Separera klienter"
msgid "Server Settings"
msgstr "Inställningar för server"
-msgid "Server password"
-msgstr "Lösenordet för servern"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr "Användarnamnet för servern"
-
msgid "Service Name"
msgstr "Namn på tjänst"
@@ -2905,15 +2895,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr "Sortera"
-
msgid "Source"
msgstr "Källa"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2952,6 +2936,9 @@ msgstr ""
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3102,6 +3089,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3118,9 +3115,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr "Följande ändringar har skickats in"
-
msgid "The following changes have been reverted"
msgstr ""
@@ -3174,11 +3168,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3186,8 +3175,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "Det finns inga aktiva kontrakt."
-msgid "There are no pending changes to apply!"
-msgstr "Det finns inga pendlande ändringar att verkställa!"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "Det finns inga pendlande ändringar att återkalla"
@@ -3325,15 +3314,6 @@ msgstr "Tunnelgränssnitt"
msgid "Tunnel Link"
msgstr "Tunnel-länk"
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr "Tunnel-typ"
-
msgid "Tx-Power"
msgstr ""
@@ -3382,6 +3362,9 @@ msgstr "Osparade ändringar"
msgid "Unsupported protocol type."
msgstr "Protokolltypen stöds inte."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "Uppdatera listor"
@@ -3506,12 +3489,6 @@ msgstr "Tillverkare"
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr "Utförlig"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Verkställ"
@@ -3541,16 +3518,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Väntar på att ändringarna ska tillämpas..."
msgid "Waiting for command to complete..."
msgstr "Väntar på att kommandot ska avsluta..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr "Väntar på enheten..."
@@ -3566,12 +3542,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr "Bredd"
@@ -3650,6 +3620,9 @@ msgstr ""
msgid "bridged"
msgstr "bryggad"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "skapa:"
@@ -3685,9 +3658,6 @@ msgstr "full-duplex"
msgid "half-duplex"
msgstr "halv-duplex"
-msgid "help"
-msgstr "hjälp"
-
msgid "hidden"
msgstr "gömd"
@@ -3712,9 +3682,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "lokal <abbr title=\"Domain Name System\">DNS</abbr>-fil"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr "minuter"
@@ -3739,6 +3706,9 @@ msgstr "på"
msgid "open"
msgstr "öppen"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3790,8 +3760,14 @@ msgstr "ja"
msgid "« Back"
msgstr "« Bakåt"
-#~ msgid "Action"
-#~ msgstr "Åtgärd"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP-kontrakt"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6-kontrakt"
+
+#~ msgid "Sort"
+#~ msgstr "Sortera"
-#~ msgid "Buttons"
-#~ msgstr "Knappar"
+#~ msgid "help"
+#~ msgstr "hjälp"
diff --git a/modules/luci-base/po/templates/base.pot b/modules/luci-base/po/templates/base.pot
index ddf2e56faa..9019e101c9 100644
--- a/modules/luci-base/po/templates/base.pot
+++ b/modules/luci-base/po/templates/base.pot
@@ -37,6 +37,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr ""
@@ -152,9 +155,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -188,9 +188,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr ""
@@ -293,11 +290,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -376,10 +368,13 @@ msgstr ""
msgid "Any zone"
msgstr ""
-msgid "Apply"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
msgstr ""
-msgid "Applying changes"
+msgid "Architecture"
msgstr ""
msgid ""
@@ -396,6 +391,9 @@ msgstr ""
msgid "Associated Stations"
msgstr ""
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -486,9 +484,6 @@ msgstr ""
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -557,12 +552,20 @@ msgstr ""
msgid "Changes applied."
msgstr ""
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr ""
msgid "Channel"
msgstr ""
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr ""
@@ -632,10 +635,13 @@ msgstr ""
msgid "Configuration"
msgstr ""
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
msgstr ""
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
msgstr ""
msgid "Confirmation"
@@ -650,10 +656,13 @@ msgstr ""
msgid "Connection Limit"
msgstr ""
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
msgstr ""
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
msgstr ""
msgid "Country"
@@ -707,9 +716,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr ""
-msgid "DHCP Leases"
-msgstr ""
-
msgid "DHCP Server"
msgstr ""
@@ -722,9 +728,6 @@ msgstr ""
msgid "DHCP-Options"
msgstr ""
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -782,9 +785,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr ""
@@ -824,6 +824,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
@@ -856,6 +859,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -901,6 +907,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr ""
@@ -1011,6 +1020,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1043,6 +1055,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1101,6 +1119,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1222,7 +1243,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1294,9 +1315,6 @@ msgstr ""
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1352,7 +1370,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1403,15 +1421,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -1977,9 +1992,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr ""
@@ -2103,6 +2115,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2148,12 +2163,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2503,12 +2512,12 @@ msgid ""
msgstr ""
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2516,12 +2525,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2612,9 +2621,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2673,6 +2679,15 @@ msgstr ""
msgid "Revert"
msgstr ""
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2688,9 +2703,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2714,14 +2726,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2749,9 +2753,6 @@ msgstr ""
msgid "Save & Apply"
msgstr ""
-msgid "Save &#38; Apply"
-msgstr ""
-
msgid "Scan"
msgstr ""
@@ -2778,17 +2779,6 @@ msgstr ""
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2875,15 +2865,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
msgstr ""
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2922,6 +2906,9 @@ msgstr ""
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3072,6 +3059,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3088,9 +3085,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr ""
@@ -3144,11 +3138,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3156,7 +3145,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3291,15 +3280,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3348,6 +3328,9 @@ msgstr ""
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3472,12 +3455,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3507,16 +3484,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3531,12 +3507,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3610,6 +3580,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3645,9 +3618,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr ""
-
msgid "hidden"
msgstr ""
@@ -3672,9 +3642,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr ""
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3699,6 +3666,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
diff --git a/modules/luci-base/po/tr/base.po b/modules/luci-base/po/tr/base.po
index 953d1e9669..82543b4a1e 100644
--- a/modules/luci-base/po/tr/base.po
+++ b/modules/luci-base/po/tr/base.po
@@ -39,12 +39,15 @@ msgid "-- custom --"
msgstr "-- özel --"
msgid "-- match by device --"
-msgstr ""
+msgstr "-- cihaza göre eşleştir --"
msgid "-- match by label --"
-msgstr ""
+msgstr "-- etikete göre eşleştir --"
msgid "-- match by uuid --"
+msgstr "-- uuid'e göre eşleştir --"
+
+msgid "-- please select --"
msgstr ""
msgid "1 Minute Load:"
@@ -54,7 +57,7 @@ msgid "15 Minute Load:"
msgstr "15 Dakikalık Yük:"
msgid "4-character hexadecimal ID"
-msgstr ""
+msgstr "4 karakterli HEX ID"
msgid "464XLAT (CLAT)"
msgstr ""
@@ -168,9 +171,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -204,9 +204,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr ""
@@ -313,11 +310,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -396,11 +388,14 @@ msgstr "Anten Yapılandırması"
msgid "Any zone"
msgstr ""
-msgid "Apply"
-msgstr "Uygula"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "DeÄŸiÅŸiklikleri uygula"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -416,6 +411,9 @@ msgstr ""
msgid "Associated Stations"
msgstr ""
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -435,7 +433,7 @@ msgid "Auto Refresh"
msgstr "Otomatik Yenileme"
msgid "Automatic"
-msgstr ""
+msgstr "Otomatik"
msgid "Automatic Homenet (HNCP)"
msgstr ""
@@ -474,7 +472,7 @@ msgid "BR / DMR / AFTR"
msgstr ""
msgid "BSSID"
-msgstr ""
+msgstr "BSSID"
msgid "Back"
msgstr "Geri"
@@ -506,9 +504,6 @@ msgstr ""
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -560,27 +555,35 @@ msgid "CA certificate; if empty it will be saved after the first connection."
msgstr ""
msgid "CPU usage (%)"
-msgstr ""
+msgstr "CPU kullanımı (%)"
msgid "Cancel"
-msgstr ""
+msgstr "Vazgeç"
msgid "Category"
-msgstr ""
+msgstr "Kategori"
msgid "Chain"
-msgstr ""
+msgstr "Zincir"
msgid "Changes"
-msgstr ""
+msgstr "DeÄŸiÅŸiklikler"
msgid "Changes applied."
msgstr ""
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr ""
msgid "Channel"
+msgstr "Kanal"
+
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
msgstr ""
msgid "Check"
@@ -652,10 +655,13 @@ msgstr ""
msgid "Configuration"
msgstr ""
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
msgstr ""
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
msgstr ""
msgid "Confirmation"
@@ -670,10 +676,13 @@ msgstr ""
msgid "Connection Limit"
msgstr ""
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
msgstr ""
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
msgstr ""
msgid "Country"
@@ -727,9 +736,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr ""
-msgid "DHCP Leases"
-msgstr ""
-
msgid "DHCP Server"
msgstr ""
@@ -742,9 +748,6 @@ msgstr ""
msgid "DHCP-Options"
msgstr ""
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -802,9 +805,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr ""
@@ -844,6 +844,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
@@ -876,6 +879,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -921,6 +927,9 @@ msgid ""
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr ""
@@ -1031,6 +1040,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1063,6 +1075,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1121,6 +1139,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1242,7 +1263,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1314,9 +1335,6 @@ msgstr ""
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1372,7 +1390,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1423,15 +1441,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -1821,10 +1836,10 @@ msgid "Logging"
msgstr ""
msgid "Login"
-msgstr ""
+msgstr "Oturum Aç"
msgid "Logout"
-msgstr ""
+msgstr "Oturumu Kapat"
msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
@@ -1997,9 +2012,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr ""
@@ -2123,6 +2135,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2168,12 +2183,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2523,12 +2532,12 @@ msgid ""
msgstr ""
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2536,12 +2545,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2632,9 +2641,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2664,13 +2670,13 @@ msgid ""
msgstr ""
msgid "Reset"
-msgstr ""
+msgstr "Sıfırla"
msgid "Reset Counters"
-msgstr ""
+msgstr "Sayaçları Sıfırla"
msgid "Reset to defaults"
-msgstr ""
+msgstr "Varsayılanlara dön"
msgid "Resolv and Hosts Files"
msgstr ""
@@ -2679,23 +2685,32 @@ msgid "Resolve file"
msgstr ""
msgid "Restart"
-msgstr ""
+msgstr "Tekrar baÅŸlat"
msgid "Restart Firewall"
msgstr ""
msgid "Restore backup"
-msgstr ""
+msgstr "Yedeklemeyi geri yükle"
msgid "Reveal/hide password"
msgstr ""
msgid "Revert"
+msgstr "Dönmek"
+
+msgid "Revert changes"
+msgstr "DeÄŸiÅŸiklikleri geri al"
+
+msgid "Revert request failed with status <code>%h</code>"
msgstr ""
-msgid "Root"
+msgid "Reverting configuration…"
msgstr ""
+msgid "Root"
+msgstr "Kök"
+
msgid "Root directory for files served via TFTP"
msgstr ""
@@ -2706,19 +2721,16 @@ msgid "Route Allowed IPs"
msgstr ""
msgid "Route type"
-msgstr ""
-
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
+msgstr "Yönlendirme Tipi"
msgid "Router Advertisement-Service"
msgstr ""
msgid "Router Password"
-msgstr ""
+msgstr "Yönlendirici Parolası"
msgid "Routes"
-msgstr ""
+msgstr "Yönlendirmeler"
msgid ""
"Routes specify over which interface and gateway a certain host or network "
@@ -2726,63 +2738,52 @@ msgid ""
msgstr ""
msgid "Run a filesystem check before mounting the device"
-msgstr ""
+msgstr "Cihazı bağlamadan önce bir dosya sistemi kontrolü yapın"
msgid "Run filesystem check"
-msgstr ""
+msgstr "Dosya sistemi kontrolünü çalıştır"
msgid "SHA256"
-msgstr ""
-
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
+msgstr "SHA256"
msgid "SNR"
-msgstr ""
+msgstr "SNR"
msgid "SSH Access"
-msgstr ""
+msgstr "SSH EriÅŸimi"
msgid "SSH server address"
-msgstr ""
+msgstr "SSH sunucu adresi"
msgid "SSH server port"
-msgstr ""
+msgstr "SSH sunucu portu"
msgid "SSH username"
-msgstr ""
+msgstr "SSH kullanıcı adı"
msgid "SSH-Keys"
msgstr ""
msgid "SSID"
-msgstr ""
+msgstr "SSID"
msgid "Save"
-msgstr ""
+msgstr "Kaydet"
msgid "Save & Apply"
-msgstr ""
-
-msgid "Save &#38; Apply"
-msgstr ""
+msgstr "Kaydet & Uygula"
msgid "Scan"
-msgstr ""
+msgstr "Tara"
msgid "Scheduled Tasks"
-msgstr ""
+msgstr "Zamanlanmış Görevler"
msgid "Section added"
-msgstr ""
+msgstr "Bölüm eklendi"
msgid "Section removed"
-msgstr ""
+msgstr "Bölüm kaldırıldı"
msgid "See \"mount\" manpage for details"
msgstr ""
@@ -2798,17 +2799,6 @@ msgstr ""
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2816,7 +2806,7 @@ msgid "Service Type"
msgstr ""
msgid "Services"
-msgstr ""
+msgstr "Servisler"
msgid ""
"Set interface properties regardless of the link carrier (If set, carrier "
@@ -2845,25 +2835,25 @@ msgid "Shutdown this network"
msgstr ""
msgid "Signal"
-msgstr ""
+msgstr "Sinyal"
msgid "Signal Attenuation (SATN)"
-msgstr ""
+msgstr "Sinyal Zayıflama (SATN)"
msgid "Signal:"
-msgstr ""
+msgstr "Sinyal:"
msgid "Size"
-msgstr ""
+msgstr "Boyut"
msgid "Size (.ipk)"
-msgstr ""
+msgstr "Boyut (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
-msgstr ""
+msgstr "Atla"
msgid "Skip to content"
msgstr ""
@@ -2875,7 +2865,7 @@ msgid "Slot time"
msgstr ""
msgid "Software"
-msgstr ""
+msgstr "Yazılım"
msgid "Software VLAN"
msgstr ""
@@ -2895,14 +2885,8 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
-msgstr ""
-
-msgid "Source routing"
-msgstr ""
+msgstr "Kaynak"
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2937,11 +2921,14 @@ msgid "Specify the secret encryption key here."
msgstr ""
msgid "Start"
-msgstr ""
+msgstr "BaÅŸlat"
msgid "Start priority"
msgstr ""
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -2967,16 +2954,16 @@ msgid ""
msgstr ""
msgid "Status"
-msgstr ""
+msgstr "Durum"
msgid "Stop"
-msgstr ""
+msgstr "Durdur"
msgid "Strict order"
msgstr ""
msgid "Submit"
-msgstr ""
+msgstr "Gönder"
msgid "Suppress logging"
msgstr ""
@@ -3019,7 +3006,7 @@ msgid "Synchronizing..."
msgstr ""
msgid "System"
-msgstr ""
+msgstr "Sistem"
msgid "System Log"
msgstr ""
@@ -3092,6 +3079,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3108,9 +3105,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr ""
@@ -3164,11 +3158,6 @@ msgid ""
msgstr ""
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3176,7 +3165,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3311,15 +3300,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3368,6 +3348,9 @@ msgstr ""
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3381,10 +3364,10 @@ msgid "Upload archive..."
msgstr ""
msgid "Uploaded File"
-msgstr ""
+msgstr "Yüklenen Dosya"
msgid "Uptime"
-msgstr ""
+msgstr "Açılma süresi"
msgid "Use <code>/etc/ethers</code>"
msgstr ""
@@ -3417,16 +3400,16 @@ msgid "Use builtin IPv6-management"
msgstr ""
msgid "Use custom DNS servers"
-msgstr ""
+msgstr "Özel DNS sunucularını kullan"
msgid "Use default gateway"
-msgstr ""
+msgstr "Varsayılan ağ geçidini kullan"
msgid "Use gateway metric"
-msgstr ""
+msgstr "Ağ geçidi metriğini kullan"
msgid "Use routing table"
-msgstr ""
+msgstr "Yönlendirme tablosunu kullan"
msgid ""
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
@@ -3437,7 +3420,7 @@ msgid ""
msgstr ""
msgid "Used"
-msgstr ""
+msgstr "Kullanılmış"
msgid "Used Key Slot"
msgstr ""
@@ -3454,7 +3437,7 @@ msgid "User key (PEM encoded)"
msgstr ""
msgid "Username"
-msgstr ""
+msgstr "Kullanıcı adı"
msgid "VC-Mux"
msgstr ""
@@ -3487,22 +3470,16 @@ msgid "VPNC (CISCO 3000 (and others) VPN)"
msgstr ""
msgid "Vendor"
-msgstr ""
+msgstr "Satıcı"
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
-msgstr ""
+msgstr "Kontrol"
msgid "Version"
-msgstr ""
+msgstr "Versiyon"
msgid "WDS"
msgstr ""
@@ -3527,21 +3504,20 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
msgid "Warning"
-msgstr ""
+msgstr "Uyarı"
msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
@@ -3551,20 +3527,14 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
-msgstr ""
+msgstr "GeniÅŸlik"
msgid "WireGuard VPN"
msgstr ""
msgid "Wireless"
-msgstr ""
+msgstr "Kablosuz"
msgid "Wireless Adapter"
msgstr ""
@@ -3627,28 +3597,31 @@ msgid "auto"
msgstr "otomatik"
msgid "baseT"
-msgstr ""
+msgstr "baseT"
msgid "bridged"
msgstr "köprülü"
-msgid "create:"
+msgid "create"
msgstr ""
+msgid "create:"
+msgstr "oluÅŸturma:"
+
msgid "creates a bridge over specified interface(s)"
msgstr ""
msgid "dB"
-msgstr ""
+msgstr "dB"
msgid "dBm"
-msgstr ""
+msgstr "dBm"
msgid "disable"
msgstr "etkin deÄŸil"
msgid "disabled"
-msgstr ""
+msgstr "devre dışı"
msgid "expired"
msgstr "sona ermiÅŸ"
@@ -3662,19 +3635,16 @@ msgid "forward"
msgstr "ileri"
msgid "full-duplex"
-msgstr ""
+msgstr "tam çift yönlü"
msgid "half-duplex"
-msgstr ""
-
-msgid "help"
-msgstr "yardım"
+msgstr "yarı çift yönlü"
msgid "hidden"
-msgstr ""
+msgstr "gizli"
msgid "hybrid mode"
-msgstr ""
+msgstr "hibrit mod"
msgid "if target is a network"
msgstr "eÄŸer hedef aÄŸsa"
@@ -3683,34 +3653,31 @@ msgid "input"
msgstr "giriÅŸ"
msgid "kB"
-msgstr ""
+msgstr "kB"
msgid "kB/s"
-msgstr ""
+msgstr "kB/s"
msgid "kbit/s"
-msgstr ""
+msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "yerel <abbr title=\"Domain Name System\">DNS</abbr> dosyası"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
-msgstr ""
+msgstr "dakika"
msgid "no"
msgstr "hayır"
msgid "no link"
-msgstr ""
+msgstr "bağlantı yok"
msgid "none"
msgstr "hiçbiri"
msgid "not present"
-msgstr ""
+msgstr "mevcut deÄŸil"
msgid "off"
msgstr "kapalı"
@@ -3719,31 +3686,34 @@ msgid "on"
msgstr "açık"
msgid "open"
+msgstr "açık"
+
+msgid "output"
msgstr ""
msgid "overlay"
-msgstr ""
+msgstr "bindirilmiÅŸ"
msgid "random"
-msgstr ""
+msgstr "rastgele"
msgid "relay mode"
-msgstr ""
+msgstr "anahtarlama modu"
msgid "routed"
msgstr "yönlendirildi"
msgid "server mode"
-msgstr ""
+msgstr "sunucu modu"
msgid "stateful-only"
msgstr ""
msgid "stateless"
-msgstr ""
+msgstr "durumsuz"
msgid "stateless + stateful"
-msgstr ""
+msgstr "durumsuz + durumlu"
msgid "tagged"
msgstr "etiketlendi"
@@ -3752,7 +3722,7 @@ msgid "time units (TUs / 1.024 ms) [1000-65535]"
msgstr ""
msgid "unknown"
-msgstr ""
+msgstr "bilinmeyen"
msgid "unlimited"
msgstr "sınırsız"
@@ -3772,6 +3742,18 @@ msgstr "evet"
msgid "« Back"
msgstr "« Geri"
+#~ msgid "Sort"
+#~ msgstr "Sıralama"
+
+#~ msgid "help"
+#~ msgstr "yardım"
+
+#~ msgid "Apply"
+#~ msgstr "Uygula"
+
+#~ msgid "Applying changes"
+#~ msgstr "DeÄŸiÅŸiklikleri uygula"
+
#~ msgid "Action"
#~ msgstr "Eylem"
diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po
index 8ead616074..b9de0273c8 100644
--- a/modules/luci-base/po/uk/base.po
+++ b/modules/luci-base/po/uk/base.po
@@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2013-12-05 19:07+0200\n"
-"Last-Translator: Dmitri <4glitch@gmail.com>\n"
+"PO-Revision-Date: 2018-06-17 23:27+0300\n"
+"Last-Translator: Yurii <yuripet@gmail.com>\n"
"Language-Team: none\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
@@ -10,19 +10,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
msgid "%.1f dB"
-msgstr ""
+msgstr "%.1f дБ"
msgid "%s is untagged in multiple VLANs!"
-msgstr ""
+msgstr "%s є непозначеним у декількох VLAN!"
msgid "(%d minute window, %d second interval)"
-msgstr "(%d-хвилинне вікно, %d-Ñекундний інтервал)"
+msgstr "(вікно - %d хвилин, інтервал - %d Ñекунд)"
msgid "(%s available)"
-msgstr "(%s доÑтупно)"
+msgstr "(доÑтупно %s)"
msgid "(empty)"
msgstr "(пуÑто)"
@@ -34,19 +33,22 @@ msgid "-- Additional Field --"
msgstr "-- Додаткові Ð¿Ð¾Ð»Ñ --"
msgid "-- Please choose --"
-msgstr "-- Виберіть --"
+msgstr "-- Оберіть --"
msgid "-- custom --"
msgstr "-- нетипово --"
msgid "-- match by device --"
-msgstr ""
+msgstr "-- відповідно приÑтрою --"
msgid "-- match by label --"
-msgstr ""
+msgstr "-- відповідно мітці --"
msgid "-- match by uuid --"
-msgstr ""
+msgstr "-- відповідно UUID --"
+
+msgid "-- please select --"
+msgstr "-- виберіть --"
msgid "1 Minute Load:"
msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 1 хвилину:"
@@ -55,34 +57,35 @@ msgid "15 Minute Load:"
msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 15 хвилин:"
msgid "4-character hexadecimal ID"
-msgstr ""
+msgstr "4-Ñимв. шіÑтнадцÑтковий ID"
msgid "464XLAT (CLAT)"
-msgstr ""
+msgstr "464XLAT (CLAT)"
msgid "5 Minute Load:"
msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 5 хвилин:"
msgid "6-octet identifier as a hex string - no colons"
msgstr ""
+"6-октетний ідентифікатор у виглÑді шіÑтнадцÑткового Ñ€Ñдка – без двокрапок"
msgid "802.11r Fast Transition"
-msgstr ""
+msgstr "Швидкий перехід 802.11r"
msgid "802.11w Association SA Query maximum timeout"
-msgstr ""
+msgstr "МакÑимальний тайм-аут запиту аÑоціації 802.11w"
msgid "802.11w Association SA Query retry timeout"
-msgstr ""
+msgstr "Тайм-аут Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ аÑоціації 802.11w"
msgid "802.11w Management Frame Protection"
-msgstr ""
+msgstr "ЗахиÑÑ‚ кадрів ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ 802.11w"
msgid "802.11w maximum timeout"
-msgstr ""
+msgstr "МакÑимальний тайм-аут 802.11w"
msgid "802.11w retry timeout"
-msgstr ""
+msgstr "Тайм-аут Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ 802.11w"
msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
msgstr ""
@@ -104,7 +107,7 @@ msgid ""
"order of the resolvfile"
msgstr ""
"<abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
-"Ñервери будуть опитані у порÑдку, визначеному файлом resolvfile"
+"Ñервери буде опитано в порÑдку, визначеному файлом <em>resolvfile</em>"
msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr ""
@@ -131,11 +134,11 @@ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 6\">IPv6</abbr>-шлюз"
msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
-msgstr ""
+msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 6\">IPv6</abbr>-ÑÑƒÑ„Ñ–ÐºÑ (hex)"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
msgstr ""
-"ÐаÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ <abbr title=\"Light Emitting Diode — Ñвітлодіод\">LED</abbr>"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ <abbr title=\"Light Emitting Diode — Ñвітлодіод\">LED</abbr>"
msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
msgstr "Ðазва <abbr title=\"Light Emitting Diode — Ñвітлодіод\">LED</abbr>"
@@ -146,33 +149,35 @@ msgstr ""
"abbr>-адреÑа"
msgid "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
-msgstr ""
+msgstr "<abbr title=\"Унікальний ідентифікатор DHCP\">DUID</abbr>"
msgid ""
"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
"Protocol\">DHCP</abbr> leases"
msgstr ""
-"<abbr title=\"МакÑимум\">Max.</abbr> оренд <abbr title=\"Dynamic Host "
+"<abbr title=\"МакÑимум\">МакÑ.</abbr> оренд <abbr title=\"Dynamic Host "
"Configuration Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>"
msgid ""
"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
"Domain Name System\">EDNS0</abbr> packet size"
msgstr ""
-"<abbr title=\"МакÑимум\">Max.</abbr> розмір пакета <abbr title=\"Extension "
-"Mechanisms for Domain Name System — Механізми розширень Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ñ— ÑиÑтеми "
-"імен\">EDNS0</abbr>"
+"<abbr title=\"МакÑимальний\">МакÑ.</abbr> розмір пакета <abbr title="
+"\"Extension Mechanisms for Domain Name System — Механізми розширень Ð´Ð»Ñ "
+"доменної ÑиÑтеми імен\">EDNS0</abbr>"
msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
-msgstr "<abbr title=\"МакÑимум\">Max.</abbr> одночаÑних запитів"
+msgstr "<abbr title=\"МакÑимум\">МакÑ.</abbr> одночаÑних запитів"
msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
-msgstr "<abbr title='Парний: %s / Груповий: %s'>%s - %s</abbr>"
+msgstr "<abbr title='Парний: %s / Груповий: %s'>%s – %s</abbr>"
msgid ""
"<br/>Note: you need to manually restart the cron service if the crontab file "
"was empty before editing."
msgstr ""
+"<br/>Примітка: Ñкщо перед редагуваннÑм, файл crontab був порожній, вам "
+"потрібно вручну перезапуÑтити Ñлужби cron."
msgid "A43C + J43 + A43"
msgstr ""
@@ -183,9 +188,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -194,10 +196,12 @@ msgstr ""
"<abbr title=\"Access Point Name — Ñимволічна назва точки доÑтупу\">APN</abbr>"
msgid "ARP retry threshold"
-msgstr "Поріг повтору ARP"
+msgstr "Поріг Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ ARP"
msgid "ATM (Asynchronous Transfer Mode)"
msgstr ""
+"<abbr title=\"Asynchronous Transfer Mode — аÑинхронний режим передаваннÑ"
+"\">ATM</abbr>"
msgid "ATM Bridges"
msgstr "ATM-моÑти"
@@ -217,7 +221,7 @@ msgid ""
"Linux network interfaces which can be used in conjunction with DHCP or PPP "
"to dial into the provider network."
msgstr ""
-"ATM-моÑти виÑтавлÑÑŽÑ‚ÑŒ інкапÑульований Ethernet у з'єднаннÑÑ… AAL5 Ñк "
+"ATM-моÑти виÑтавлÑÑŽÑ‚ÑŒ інкапÑульований Ethernet у з’єднаннÑÑ… AAL5 Ñк "
"віртуальні мережеві інтерфейÑи Linux, котрі можуть викориÑтовуватиÑÑ Ð² "
"поєднанні з DHCP або PPP Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі провайдера."
@@ -227,9 +231,6 @@ msgstr "Ðомер ATM-приÑтрою"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "Концентратор доÑтупу"
@@ -273,7 +274,7 @@ msgid "Additional Hosts files"
msgstr "Додаткові файли hosts"
msgid "Additional servers file"
-msgstr ""
+msgstr "Додаткові файли servers"
msgid "Address"
msgstr "ÐдреÑа"
@@ -288,7 +289,7 @@ msgid "Advanced Settings"
msgstr "Додаткові параметри"
msgid "Aggregate Transmit Power(ACTATP)"
-msgstr ""
+msgstr "Сумарна потужніÑÑ‚ÑŒ передаваннÑ"
msgid "Alert"
msgstr "Тривога"
@@ -296,10 +297,10 @@ msgstr "Тривога"
msgid ""
"Allocate IP addresses sequentially, starting from the lowest available "
"address"
-msgstr ""
+msgstr "ВиділÑти IP-адреÑи поÑлідовно, починаючи з найнижчої доÑтупної адреÑи"
msgid "Allocate IP sequentially"
-msgstr ""
+msgstr "ВиділÑти IP поÑлідовно"
msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
msgstr ""
@@ -310,7 +311,7 @@ msgid "Allow all except listed"
msgstr "Дозволити вÑÑ–, крім зазначених"
msgid "Allow legacy 802.11b rates"
-msgstr ""
+msgstr "Дозволити заÑтарілі швидкоÑÑ‚Ñ– 802.11b"
msgid "Allow listed only"
msgstr "Дозволити тільки зазначені"
@@ -320,7 +321,8 @@ msgstr "Дозволити локальний вузол"
msgid "Allow remote hosts to connect to local SSH forwarded ports"
msgstr ""
-"Дозволити віддаленим вузлам Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ локальних SSH-ÑпрÑмованих портів"
+"Дозволити віддаленим вузлам Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ локальних переÑпрÑмованих портів "
+"SSH"
msgid "Allow root logins with password"
msgstr "Дозволити root-вхід із паролем"
@@ -331,19 +333,14 @@ msgstr "Дозволити кориÑтувачеві <em>root</em> вхід у
msgid ""
"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
msgstr ""
-"Дозволити відповіді від клієнта на Ñервер у діапазоні 127.0.0.0/8, "
+"Дозволити виÑхідні відповіді від клієнта на Ñервер у діапазоні 127.0.0.0/8, "
"наприклад, Ð´Ð»Ñ RBL-поÑлуг"
msgid "Allowed IPs"
-msgstr ""
-
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
+msgstr "Дозволено IP-адреÑи"
msgid "Always announce default router"
-msgstr ""
+msgstr "Завжди оголошувати типовим маршрутизатором"
msgid "Annex"
msgstr ""
@@ -392,21 +389,23 @@ msgstr ""
msgid "Announce as default router even if no public prefix is available."
msgstr ""
+"Оголошувати типовим маршрутизатором, навіть Ñкщо немає доÑтупного Ñпільного "
+"префікÑа."
msgid "Announced DNS domains"
-msgstr ""
+msgstr "Оголошено DNS-домени"
msgid "Announced DNS servers"
-msgstr ""
+msgstr "Оголошено DNS-Ñервери"
msgid "Anonymous Identity"
-msgstr ""
+msgstr "Ðнонімне поÑвідченнÑ"
msgid "Anonymous Mount"
-msgstr ""
+msgstr "Ðнонімне монтуваннÑ"
msgid "Anonymous Swap"
-msgstr ""
+msgstr "Ðнонімний Ñвоп"
msgid "Antenna 1"
msgstr "Ðнтена 1"
@@ -420,15 +419,20 @@ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð°Ð½Ñ‚ÐµÐ½Ð¸"
msgid "Any zone"
msgstr "Будь-Ñка зона"
-msgid "Apply"
-msgstr "ЗаÑтоÑувати"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° запиту на заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ñ– ÑтатуÑом <code>%h</code>"
+
+msgid "Apply unchecked"
+msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ позначено"
-msgid "Applying changes"
-msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½"
+msgid "Architecture"
+msgstr "Ðрхітектура"
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
msgstr ""
+"Призначати чаÑтину заданої довжини до кожного публічного IPv6-префікÑа цього "
+"інтерфейÑу"
msgid "Assign interfaces..."
msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñів..."
@@ -436,18 +440,23 @@ msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñів..."
msgid ""
"Assign prefix parts using this hexadecimal subprefix ID for this interface."
msgstr ""
+"Призначати Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу чаÑтину префікÑа, викориÑтовуючи цей "
+"шіÑтнадцÑтковий ID ÑубпрефікÑа."
msgid "Associated Stations"
-msgstr "Приєднані Ñтанції"
+msgstr "Приєднано Ñтанції"
+
+msgid "Associations"
+msgstr "З’єднань"
msgid "Auth Group"
-msgstr ""
+msgstr "Група автентифікації"
msgid "Authentication"
msgstr "ÐвтентифікаціÑ"
msgid "Authentication Type"
-msgstr ""
+msgstr "Тип автентифікації"
msgid "Authoritative"
msgstr "Ðадійний"
@@ -459,25 +468,26 @@ msgid "Auto Refresh"
msgstr "Ðвтоматичне оновленнÑ"
msgid "Automatic"
-msgstr ""
+msgstr "Ðвтоматично"
msgid "Automatic Homenet (HNCP)"
-msgstr ""
+msgstr "Ðвтоматично Homenet (HNCP)"
msgid "Automatically check filesystem for errors before mounting"
msgstr ""
+"Ðвтоматично перевірÑти файлову ÑиÑтему на наÑвніÑÑ‚ÑŒ помилок перед монтуваннÑм"
msgid "Automatically mount filesystems on hotplug"
-msgstr ""
+msgstr "Ðвтоматично монтувати файлові ÑиÑтеми при оперативниму підключенні"
msgid "Automatically mount swap on hotplug"
-msgstr ""
+msgstr "Ðвтоматично монтувати Ñвоп при оперативниму підключенні"
msgid "Automount Filesystem"
-msgstr ""
+msgstr "ÐÐ²Ñ‚Ð¾Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¤Ð¡"
msgid "Automount Swap"
-msgstr ""
+msgstr "ÐÐ²Ñ‚Ð¾Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñвоп"
msgid "Available"
msgstr "ДоÑтупно"
@@ -516,7 +526,7 @@ msgid "Back to scan results"
msgstr "ПовернутиÑÑ Ð´Ð¾ результатів ÑкануваннÑ"
msgid "Backup / Flash Firmware"
-msgstr "Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ / ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
+msgstr "Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ / Прошивка мікропрограми"
msgid "Backup / Restore"
msgstr "Резервне копіюваннÑ/відновленнÑ"
@@ -525,13 +535,10 @@ msgid "Backup file list"
msgstr "СпиÑок файлів резервних копій"
msgid "Bad address specified!"
-msgstr "Вказана неправильна адреÑа!"
+msgstr "Вказано неправильну адреÑу!"
msgid "Band"
-msgstr ""
-
-msgid "Behind NAT"
-msgstr ""
+msgstr "Група"
msgid ""
"Below is the determined list of files to backup. It consists of changed "
@@ -543,16 +550,16 @@ msgstr ""
"базових файлів, та файлів за кориÑтувацькими шаблонами резервного копіюваннÑ."
msgid "Bind interface"
-msgstr ""
+msgstr "Прив’Ñзка інтерфейÑу"
msgid "Bind only to specific interfaces rather than wildcard address."
-msgstr ""
+msgstr "Прив’Ñзка тільки до певних інтерфейÑів, а не шаблонної адреÑи."
msgid "Bind the tunnel to this interface (optional)."
-msgstr ""
+msgstr "Прив’Ñзка тунелю до цього інтерфейÑу (за бажаннÑ)."
msgid "Bitrate"
-msgstr "ШвидкіÑÑ‚ÑŒ передачі даних"
+msgstr "ШвидкіÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"
msgid "Bogus NX Domain Override"
msgstr "Відкидати підробки NX-домену"
@@ -561,7 +568,7 @@ msgid "Bridge"
msgstr "МіÑÑ‚"
msgid "Bridge interfaces"
-msgstr "Об'єднати інтерфейÑи в міÑÑ‚"
+msgstr "Об’єднати інтерфейÑи в міÑÑ‚"
msgid "Bridge unit number"
msgstr "Ðомер моÑта"
@@ -582,9 +589,12 @@ msgid ""
"Build/distribution specific feed definitions. This file will NOT be "
"preserved in any sysupgrade."
msgstr ""
+"Специфічні Ð´Ð»Ñ Ð·Ð±Ñ–Ñ€ÐºÐ¸/Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð². Цей файл ÐЕ БУДЕ "
+"збережено при будь-Ñкому оновленні ÑиÑтеми."
msgid "CA certificate; if empty it will be saved after the first connection."
msgstr ""
+"Сертифікат CA; Ñкщо порожньо, його буде збережено піÑÐ»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ підключеннÑ."
msgid "CPU usage (%)"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¦ÐŸ, %"
@@ -593,7 +603,7 @@ msgid "Cancel"
msgstr "СкаÑувати"
msgid "Category"
-msgstr ""
+msgstr "КатегоріÑ"
msgid "Chain"
msgstr "Ланцюжок"
@@ -604,20 +614,30 @@ msgstr "Зміни"
msgid "Changes applied."
msgstr "Зміни заÑтоÑовано."
+msgid "Changes have been reverted."
+msgstr "Зміни було ÑкаÑовано."
+
msgid "Changes the administrator password for accessing the device"
msgstr "Зміна Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора Ð´Ð»Ñ Ð´Ð¾Ñтупу до приÑтрою"
msgid "Channel"
msgstr "Канал"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+"Канал %d не доÑтупний у %s регулÑторному домені й був автоматично "
+"Ñкоригований на %d."
+
msgid "Check"
msgstr "Перевірити"
msgid "Check filesystems before mount"
-msgstr ""
+msgstr "Перевірити файлову ÑиÑтему перед монтуваннÑм"
msgid "Check this option to delete the existing networks from this radio."
-msgstr ""
+msgstr "Позначте цей параметр, щоб видалити Ñ–Ñнуючі мережі з цього радіо."
msgid "Checksum"
msgstr "Контрольна Ñума"
@@ -644,7 +664,7 @@ msgid "Cipher"
msgstr "Шифр"
msgid "Cisco UDP encapsulation"
-msgstr ""
+msgstr "ІнкапÑулÑÑ†Ñ–Ñ UDP Cisco"
msgid ""
"Click \"Generate archive\" to download a tar archive of the current "
@@ -652,8 +672,8 @@ msgid ""
"\"Perform reset\" (only possible with squashfs images)."
msgstr ""
"ÐатиÑніть кнопку \"Створити архів\", щоб завантажити tar-архів поточних "
-"файлів конфігурації. Ð”Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸ до Ñ—Ñ— початкового Ñтану, "
-"натиÑніть кнопку \"Відновити\" (можливе тільки з образами SquashFS)."
+"файлів конфігурації. Ð”Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ñ–ÐºÑ€Ð¾Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ до Ñ—Ñ— початкового Ñтану "
+"натиÑніть кнопку \"Відновити\" (можливо тільки з образами SquashFS)."
msgid "Client"
msgstr "Клієнт"
@@ -665,8 +685,8 @@ msgid ""
"Close inactive connection after the given amount of seconds, use 0 to "
"persist connection"
msgstr ""
-"Закривати неактивні з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ інтервалу чаÑу (Ñекунди). Ð”Ð»Ñ "
-"ÑƒÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ… з'єднань викориÑтовуйте 0"
+"Закривати неактивні Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ інтервалу чаÑу (Ñекунди). Ð”Ð»Ñ "
+"ÑƒÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ… з’єднань викориÑтовуйте 0"
msgid "Close list..."
msgstr "Згорнути ÑпиÑок..."
@@ -686,15 +706,22 @@ msgid ""
"workaround might cause interoperability issues and reduced robustness of key "
"negotiation especially in environments with heavy traffic load."
msgstr ""
+"УÑкладнює атаки перевÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° на Ñтороні клієнта, відключаючи "
+"ретранÑлÑцію кадрів EAPOL-Key, що викориÑтовуютьÑÑ Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð². "
+"Може викликати проблеми ÑуміÑноÑÑ‚Ñ– та Ð·Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ ÑтійкоÑÑ‚Ñ– ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°, "
+"оÑобливо в Ñередовищах з великою завантаженіÑÑ‚ÑŽ трафіку."
msgid "Configuration"
msgstr "КонфігураціÑ"
-msgid "Configuration applied."
-msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð·Ð°ÑтоÑована."
-
msgid "Configuration files will be kept."
-msgstr "Конфігураційні файли будуть збережені."
+msgstr "Конфігураційні файли буде збережено."
+
+msgid "Configuration has been applied."
+msgstr "Конфігурацію заÑтоÑовано."
+
+msgid "Configuration has been rolled back!"
+msgstr "Конфігурацію було відкочено!"
msgid "Confirmation"
msgstr "ПідтвердженнÑ"
@@ -703,17 +730,24 @@ msgid "Connect"
msgstr "Підключити"
msgid "Connected"
-msgstr "Підключений"
+msgstr "Підключено"
msgid "Connection Limit"
msgstr "Гранична кількіÑÑ‚ÑŒ підключень"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "ПідключеннÑ"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+"ПіÑÐ»Ñ Ð·Ð°ÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½ конфігурації не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ доÑтуп до "
+"приÑтрою. Вам, можливо, знадобитиÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ðµ підключеннÑ, Ñкщо ви змінили "
+"Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ–, такі Ñк IP-адреÑа або облікові дані безпеки бездротової "
+"мережі."
+
msgid "Country"
msgstr "Країна"
@@ -745,31 +779,32 @@ msgid "Custom Interface"
msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "Custom delegated IPv6-prefix"
-msgstr ""
+msgstr "КориÑтувацький делегований Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ IPv6"
msgid ""
"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
"sysupgrade."
msgstr ""
+"КориÑтувацькі Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², наприклад, приватних. Цей файл може бути "
+"збережено при оновленні ÑиÑтеми."
msgid "Custom feeds"
-msgstr ""
+msgstr "КориÑтувацькі канали"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
+"КориÑтувацькі файли (Ñертифікати, Ñкрипти) можуть залишитиÑÑ Ð² ÑиÑтемі. Щоб "
+"запобігти цьому, Ñпочатку виконайте ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð´Ð¾ заводÑьких налаштувань."
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
-"ÐаÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ¸ <abbr title=\"Light Emitting Diode — Ñвітлодіод"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ¸ <abbr title=\"Light Emitting Diode — Ñвітлодіод"
"\">LED</abbr>, Ñкщо це можливо."
-msgid "DHCP Leases"
-msgstr "Оренди DHCP"
-
msgid "DHCP Server"
msgstr "Сервер DHCP"
@@ -782,53 +817,50 @@ msgstr "Клієнт DHCP"
msgid "DHCP-Options"
msgstr "Параметри DHCP"
-msgid "DHCPv6 Leases"
-msgstr "Оренди DHCPv6"
-
msgid "DHCPv6 client"
-msgstr ""
+msgstr "Клієнт DHCPv6"
msgid "DHCPv6-Mode"
-msgstr ""
+msgstr "Режим DHCPv6"
msgid "DHCPv6-Service"
-msgstr ""
+msgstr "Служба DHCPv6"
msgid "DNS"
msgstr "DNS"
msgid "DNS forwardings"
-msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ DNS-запитів"
+msgstr "ПереÑпрÑмовуваннÑ<br />запитів DNS"
msgid "DNS-Label / FQDN"
-msgstr ""
+msgstr "DNS-мітка / FQDN"
msgid "DNSSEC"
msgstr ""
msgid "DNSSEC check unsigned"
-msgstr ""
+msgstr "Перевірка непідпиÑаного DNSSEC"
msgid "DPD Idle Timeout"
-msgstr ""
+msgstr "Тайм-аут проÑтою DPD"
msgid "DS-Lite AFTR address"
-msgstr ""
+msgstr "AFTR-адреÑа DS-Lite"
msgid "DSL"
-msgstr ""
+msgstr "DSL"
msgid "DSL Status"
-msgstr ""
+msgstr "Стан DSL"
msgid "DSL line mode"
-msgstr ""
+msgstr "Режим лінії DSL"
msgid "DUID"
msgstr "DUID"
msgid "Data Rate"
-msgstr ""
+msgstr "Швидк. передаваннÑ"
msgid "Debug"
msgstr "ЗневаджуваннÑ"
@@ -840,10 +872,7 @@ msgid "Default gateway"
msgstr "Типовий шлюз"
msgid "Default is stateless + stateful"
-msgstr ""
-
-msgid "Default route"
-msgstr ""
+msgstr "Типовим Ñ” БЕЗ та ЗІ збереженнÑм Ñтану"
msgid "Default state"
msgstr "Типовий Ñтан"
@@ -882,16 +911,19 @@ msgid "Device Configuration"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою"
msgid "Device is rebooting..."
-msgstr ""
+msgstr "ПриÑтрій перезавантажуєтьÑÑ..."
msgid "Device unreachable"
-msgstr ""
+msgstr "ПриÑтрій недоÑÑжний"
+
+msgid "Device unreachable!"
+msgstr "ПриÑтрій недоÑÑжний!"
msgid "Diagnostics"
msgstr "ДіагноÑтика"
msgid "Dial number"
-msgstr ""
+msgstr "Ðабір номера"
msgid "Directory"
msgstr "Каталог"
@@ -907,22 +939,25 @@ msgstr ""
"динамічної конфігурації вузла\">DHCP</abbr> Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу."
msgid "Disable DNS setup"
-msgstr "Вимкнути наÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ DNS"
+msgstr "Вимкнути Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ DNS"
msgid "Disable Encryption"
-msgstr ""
+msgstr "Вимкнути шифруваннÑ"
msgid "Disabled"
msgstr "Вимкнено"
msgid "Disabled (default)"
-msgstr ""
+msgstr "Вимкнено (типово)"
msgid "Discard upstream RFC1918 responses"
-msgstr "Відкидати RFC1918-відповіді від клієнта на Ñервер"
+msgstr "Відкидати виÑхідні RFC1918-відповіді"
+
+msgid "Dismiss"
+msgstr "Відхилити"
msgid "Displaying only packages containing"
-msgstr "Показані тільки непорожні пакети"
+msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ непорожніх пакетів"
msgid "Distance Optimization"
msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð° відÑтанню"
@@ -931,7 +966,7 @@ msgid "Distance to farthest network member in meters."
msgstr "ВідÑтань до найвіддаленішого вузла мережі в метрах."
msgid "Distribution feeds"
-msgstr ""
+msgstr "Канали поширеннÑ"
msgid "Diversity"
msgstr "РізновидніÑÑ‚ÑŒ"
@@ -944,20 +979,22 @@ msgid ""
msgstr ""
"Dnsmasq ÑвлÑÑ” Ñобою комбінований <abbr title=\"Dynamic Host Configuration "
"Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-Ñервер Ñ– "
-"<abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
-"транÑпортер Ð´Ð»Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ñ–Ð² <abbr title=\"Network Address Translation — "
-"Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ (транÑлÑціÑ) мережевих адреÑ\">NAT</abbr>"
+"<abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-прокÑÑ– "
+"Ð´Ð»Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ñ–Ð² <abbr title=\"Network Address Translation — Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ "
+"(транÑлÑціÑ) мережевих адреÑ\">NAT</abbr>"
msgid "Do not cache negative replies, e.g. for not existing domains"
msgstr "Ðе кешувати негативні відповіді, наприклад, за неіÑнуючих доменів"
msgid "Do not forward requests that cannot be answered by public name servers"
msgstr ""
-"Ðе ÑпрÑмовувати запити, Ñкі не можуть бути оброблені публічними Ñерверами "
+"Ðе переÑпрÑмовувати запити, Ñкі не може бути оброблено публічними Ñерверами "
"імен"
msgid "Do not forward reverse lookups for local networks"
-msgstr "Ðе ÑпрÑмовувати зворотний переглÑд Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… мереж"
+msgstr ""
+"Ðе переÑпрÑмовувати зворотні <abbr title=\"Domain Name System — ÑиÑтема "
+"доменних імен\">DNS</abbr>-запити Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… мереж"
msgid "Domain required"
msgstr "Потрібен домен"
@@ -966,16 +1003,19 @@ msgid "Domain whitelist"
msgstr "\"Білий ÑпиÑок\" доменів"
msgid "Don't Fragment"
-msgstr ""
+msgstr "Ðе фрагментувати"
msgid ""
"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
msgstr ""
-"Ðе переÑилати <abbr title=\"Domain Name System — ÑиÑтема доменних імен"
+"Ðе переÑпрÑмовувати <abbr title=\"Domain Name System — ÑиÑтема доменних імен"
"\">DNS</abbr>-запити без <abbr title=\"Domain Name System — ÑиÑтема доменних "
"імен\">DNS</abbr>-імені"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Завантажити та інÑталювати пакети"
@@ -983,7 +1023,7 @@ msgid "Download backup"
msgstr "Завантажити резервну копію"
msgid "Downstream SNR offset"
-msgstr ""
+msgstr "Ðизхідний зÑув SNR"
msgid "Dropbear Instance"
msgstr "Ð ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Dropbear"
@@ -1014,7 +1054,7 @@ msgstr ""
"обÑлуговуватиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ клієнти, Ñкі мають Ñтатичні оренди."
msgid "EA-bits length"
-msgstr ""
+msgstr "Довжина EA-бітів"
msgid "EAP-Method"
msgstr "EAP-Метод"
@@ -1026,6 +1066,8 @@ msgid ""
"Edit the raw configuration data above to fix any error and hit \"Save\" to "
"reload the page."
msgstr ""
+"Щоб виправити ÑкуÑÑŒ помилку, відредагуйте вихідні дані конфігурації вище Ñ– "
+"натиÑніть \"Зберегти\", щоб перезавантажити Ñторінку."
msgid "Edit this interface"
msgstr "Редагувати цей інтерфейÑ"
@@ -1043,6 +1085,8 @@ msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
+"Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ <abbr title=\"Internet Group Management Protocol"
+"\">IGMP</abbr>"
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1051,19 +1095,19 @@ msgid "Enable HE.net dynamic endpoint update"
msgstr "Увімкнути динамічне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ñ— точки HE.net"
msgid "Enable IPv6 negotiation"
-msgstr ""
+msgstr "Увімкнути ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ IPv6"
msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Увімкнути ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ IPv6 Ð´Ð»Ñ PPP-з'єднань"
+msgstr "Увімкнути ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ IPv6 Ð´Ð»Ñ PPP-з’єднань"
msgid "Enable Jumbo Frame passthrough"
msgstr "ПропуÑкати Jumbo-фрейми"
msgid "Enable NTP client"
-msgstr "Увімкнути NTP-клієнт"
+msgstr "Увімкнути клієнта NTP"
msgid "Enable Single DES"
-msgstr ""
+msgstr "Увімкнути Single DES"
msgid "Enable TFTP server"
msgstr "Увімкнути TFTP-Ñервер"
@@ -1072,28 +1116,31 @@ msgid "Enable VLAN functionality"
msgstr "Увімкнути підтримку VLAN"
msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
-msgstr ""
+msgstr "Увімкнути кнопку WPS, потребує WPA(2)-PSK"
msgid "Enable key reinstallation (KRACK) countermeasures"
-msgstr ""
+msgstr "Увімкнути протидію<br />перевÑтановленню ключів (KRACK)"
msgid "Enable learning and aging"
msgstr "Увімкнути learning та aging"
msgid "Enable mirroring of incoming packets"
-msgstr ""
+msgstr "Увімкнути Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… пакетів"
msgid "Enable mirroring of outgoing packets"
-msgstr ""
+msgstr "Увімкнути Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… пакетів"
msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
-msgstr ""
+msgstr "Увімкнути прапорець DF (Don't Fragment) Ð´Ð»Ñ Ñ–Ð½ÐºÐ°Ð¿Ñульованих пакетів."
msgid "Enable this mount"
msgstr "Увімкнути це монтуваннÑ"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
-msgstr "Увімкнути це довантаженнÑ"
+msgstr "Увімкнути цей Ñвоп"
msgid "Enable/Disable"
msgstr "Увімкнено/Вимкнено"
@@ -1102,16 +1149,18 @@ msgid "Enabled"
msgstr "Увімкнено"
msgid "Enables IGMP snooping on this bridge"
-msgstr ""
+msgstr "Вмикає відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ IGMP на цьому моÑту"
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
msgstr ""
+"Вмикає швидкий роумінг між точками доÑтупу, що належать до одного Ñ– того ж "
+"домену мобільноÑÑ‚Ñ–"
msgid "Enables the Spanning Tree Protocol on this bridge"
msgstr ""
-"Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому моÑту"
+"Вмикає <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому моÑту"
msgid "Encapsulation mode"
msgstr "Режим інкапÑулÑції"
@@ -1120,9 +1169,15 @@ msgid "Encryption"
msgstr "ШифруваннÑ"
msgid "Endpoint Host"
-msgstr ""
+msgstr "ХоÑÑ‚ кінцевої точки"
msgid "Endpoint Port"
+msgstr "Порт кінцевої точки"
+
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
msgstr ""
msgid "Erasing..."
@@ -1132,22 +1187,22 @@ msgid "Error"
msgstr "Помилка"
msgid "Errored seconds (ES)"
-msgstr ""
+msgstr "Секунд з помилками (<abbr title=\"Errored seconds\">ES</abbr>)"
msgid "Ethernet Adapter"
-msgstr "Ðдаптер Ethernet"
+msgstr "Ethernet-адаптер"
msgid "Ethernet Switch"
msgstr "Ethernet-комутатор"
msgid "Exclude interfaces"
-msgstr ""
+msgstr "Виключити інтерфейÑи"
msgid "Expand hosts"
msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð²"
msgid "Expires"
-msgstr "ДійÑний ще"
+msgstr "Збігає за"
#, fuzzy
msgid ""
@@ -1155,13 +1210,13 @@ msgid ""
msgstr "Термін оренди адреÑ, мінімум 2 хвилини (<code>2m</code>)."
msgid "External"
-msgstr ""
+msgstr "Зовнішнє"
msgid "External R0 Key Holder List"
-msgstr ""
+msgstr "Зовнішній ÑпиÑок влаÑників ключів R0"
msgid "External R1 Key Holder List"
-msgstr ""
+msgstr "Зовнішній ÑпиÑок влаÑників ключів R1"
msgid "External system log server"
msgstr "Зовнішній Ñервер ÑиÑтемного журналу"
@@ -1170,25 +1225,28 @@ msgid "External system log server port"
msgstr "Порт зовнішнього Ñервера ÑиÑтемного журналу"
msgid "External system log server protocol"
-msgstr ""
+msgstr "Протокол зовнішнього Ñервера ÑиÑтемного журналу"
msgid "Extra SSH command options"
-msgstr ""
+msgstr "Додаткові параметри команд SSH"
msgid "FT over DS"
-msgstr ""
+msgstr "FT через DS"
msgid "FT over the Air"
-msgstr ""
+msgstr "FT через повітрÑ"
msgid "FT protocol"
-msgstr ""
+msgstr "Протокол FT"
+
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr "Ðе вдалоÑÑ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¸Ñ‚Ð¸ заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° протÑзі %d Ñ, очікуємо відкату…"
msgid "File"
msgstr "Файл"
msgid "Filename of the boot image advertised to clients"
-msgstr "І'Ð¼Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ образу, що оголошуєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°Ð¼"
+msgstr "Ð†â€™Ð¼Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ образу, що оголошуєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°Ð¼"
msgid "Filesystem"
msgstr "Файлова ÑиÑтема"
@@ -1206,6 +1264,8 @@ msgid ""
"Find all currently attached filesystems and swap and replace configuration "
"with defaults based on what was detected"
msgstr ""
+"Знайти вÑÑ– файлові ÑиÑтеми та Ñвопи, Ñкі наразі підключено Ñ– замінити "
+"конфігурацію типовою на підÑтаві того, що було виÑвлено"
msgid "Find and join network"
msgstr "Знайти мережу й приєднатиÑÑ"
@@ -1220,37 +1280,37 @@ msgid "Firewall"
msgstr "Брандмауер"
msgid "Firewall Mark"
-msgstr ""
+msgstr "Позначка брандмауера"
msgid "Firewall Settings"
-msgstr "ÐаÑтройки брандмауера"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð°"
msgid "Firewall Status"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð°"
+msgstr "Стан брандмауера"
msgid "Firmware File"
-msgstr ""
+msgstr "Файл мікропрограми"
msgid "Firmware Version"
-msgstr "ВерÑÑ–Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
+msgstr "ВерÑÑ–Ñ Ð¼Ñ–ÐºÑ€Ð¾Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸"
msgid "Fixed source port for outbound DNS queries"
msgstr "ФікÑований порт Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… DNS-запитів"
msgid "Flash Firmware"
-msgstr "Заливаємо прошивку"
+msgstr "Прошиваємо мікропрограму"
msgid "Flash image..."
-msgstr "Відвантажити образ..."
+msgstr "Прошити образ..."
msgid "Flash new firmware image"
-msgstr "Залити новий образ прошивки"
+msgstr "Прошити новий образ мікропрограми"
msgid "Flash operations"
-msgstr "Операції заливаннÑ"
+msgstr "Операції прошиваннÑ"
msgid "Flashing..."
-msgstr "Заливаємо..."
+msgstr "Прошиваємо..."
msgid "Force"
msgstr "ПримуÑово"
@@ -1268,28 +1328,28 @@ msgid "Force TKIP and CCMP (AES)"
msgstr "ПримуÑово TKIP та CCMP (AES)"
msgid "Force link"
-msgstr ""
+msgstr "ПримуÑове з’єднаннÑ"
msgid "Force use of NAT-T"
-msgstr ""
+msgstr "ПримуÑово викориÑтовувати NAT-T"
msgid "Form token mismatch"
-msgstr ""
+msgstr "ÐеузгодженіÑÑ‚ÑŒ маркера форми"
msgid "Forward DHCP traffic"
-msgstr "СпрÑмовувати DHCP-трафік"
+msgstr "ПереÑпрÑмовувати DHCP-трафік"
msgid "Forward Error Correction Seconds (FECS)"
-msgstr ""
+msgstr "Секунди прÑмого ÐºÐ¾Ñ€Ð¸Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº (FECS)"
msgid "Forward broadcast traffic"
-msgstr "СпрÑмовувати широкомовний трафік"
+msgstr "ПереÑпрÑмовувати широкомовний трафік"
msgid "Forward mesh peer traffic"
-msgstr ""
+msgstr "ПереÑпрÑмовувати одноранговий трафік"
msgid "Forwarding mode"
-msgstr "Режим ÑпрÑмовуваннÑ"
+msgstr "Режим переÑпрÑмовуваннÑ"
msgid "Fragmentation Threshold"
msgstr "Поріг фрагментації"
@@ -1305,8 +1365,10 @@ msgstr "Вільне міÑце"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
+"Більш детальна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ інтерфейÑи та вузли WireGuard на <a href="
+"\"http://wireguard.com\">wireguard.com</a>."
msgid "GHz"
msgstr "ГГц"
@@ -1321,19 +1383,19 @@ msgid "Gateway ports"
msgstr "Порти шлюзу"
msgid "General Settings"
-msgstr "Загальні наÑтройки"
+msgstr "Загальні параметри"
msgid "General Setup"
-msgstr "Загальні наÑтройки"
+msgstr "Загальні налаштуваннÑ"
msgid "General options for opkg"
-msgstr ""
+msgstr "Загальні параметри OPKG"
msgid "Generate Config"
-msgstr ""
+msgstr "Cтворити конфігурацію"
msgid "Generate PMK locally"
-msgstr ""
+msgstr "Генерувати PMK локально"
msgid "Generate archive"
msgstr "Cтворити архів"
@@ -1345,10 +1407,10 @@ msgid "Given password confirmation did not match, password not changed!"
msgstr "ОÑкільки пароль Ñ– Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ Ñпівпадають, то пароль не змінено!"
msgid "Global Settings"
-msgstr ""
+msgstr "Загальні параметри"
msgid "Global network options"
-msgstr ""
+msgstr "Глобальні параметри мережі"
msgid "Go to password configuration..."
msgstr "Перейти до конфігурації паролÑ..."
@@ -1357,19 +1419,19 @@ msgid "Go to relevant configuration page"
msgstr "Перейти до відповідної Ñторінки конфігурації"
msgid "Group Password"
-msgstr ""
+msgstr "Пароль групи"
msgid "Guest"
-msgstr ""
+msgstr "ГіÑÑ‚ÑŒ"
msgid "HE.net password"
msgstr "Пароль HE.net"
msgid "HE.net username"
-msgstr ""
+msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача HE.net"
msgid "HT mode (802.11n)"
-msgstr ""
+msgstr "Режим HT (802.11n)"
msgid "Hang Up"
msgstr "Призупинити"
@@ -1377,14 +1439,11 @@ msgstr "Призупинити"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
msgstr ""
-"Тут ви можете наÑтроїти оÑновні параметри виглÑду вашого приÑтрою, такі Ñк "
+"Тут ви можете налаштувати оÑновні параметри виглÑду вашого приÑтрою, такі Ñк "
"назва (ім’Ñ) вузла або чаÑовий поÑÑ."
msgid ""
@@ -1403,7 +1462,7 @@ msgstr ""
"розширеної Ñлужби поÑлуг\">ESSID</abbr>"
msgid "Host"
-msgstr ""
+msgstr "Вузол"
msgid "Host entries"
msgstr "ЗапиÑи вузлів"
@@ -1415,10 +1474,10 @@ msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
msgstr "<abbr title=\"Internet Protocol Address\">IP</abbr> вузла або мережа"
msgid "Hostname"
-msgstr "Ðазва (ім'Ñ) вузла"
+msgstr "Ðазва (ім’Ñ) вузла"
msgid "Hostname to send when requesting DHCP"
-msgstr "Ім'Ñ Ð²ÑƒÐ·Ð»Ð° Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ запиті DHCP"
+msgstr "Ð†Ð¼â€™Ñ Ð²ÑƒÐ·Ð»Ð° Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ запиті DHCP"
msgid "Hostnames"
msgstr "Імена вузлів"
@@ -1430,7 +1489,7 @@ msgid "IKE DH Group"
msgstr ""
msgid "IP Addresses"
-msgstr ""
+msgstr "ÐдреÑи IP"
msgid "IP address"
msgstr "IP-адреÑа"
@@ -1441,8 +1500,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "Брандмауер IPv4"
-msgid "IPv4 WAN Status"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr "ВиÑхідне Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ IPv4"
msgid "IPv4 address"
msgstr "ÐдреÑа IPv4"
@@ -1451,7 +1510,7 @@ msgid "IPv4 and IPv6"
msgstr "IPv4 та IPv6"
msgid "IPv4 assignment length"
-msgstr ""
+msgstr "Довжина приÑÐ²Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ IPv4"
msgid "IPv4 broadcast"
msgstr "Широкомовний IPv4"
@@ -1484,28 +1543,27 @@ msgid "IPv6 Firewall"
msgstr "Брандмауер IPv6"
msgid "IPv6 Neighbours"
-msgstr ""
+msgstr "СуÑіди IPv6"
msgid "IPv6 Settings"
-msgstr ""
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ IPv6"
msgid "IPv6 ULA-Prefix"
msgstr ""
+"<abbr title=\"Unique Local Address — унікальна локальна адреÑа\">ULA</abbr>-"
+"Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ IPv6"
-msgid "IPv6 WAN Status"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr "ВиÑхідне Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ IPv6"
msgid "IPv6 address"
msgstr "ÐдреÑа IPv6"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
-msgstr ""
+msgstr "ÐатÑк Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ IPv6"
msgid "IPv6 assignment length"
-msgstr ""
+msgstr "Довжина Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ IPv6"
msgid "IPv6 gateway"
msgstr "Шлюз IPv6"
@@ -1520,10 +1578,10 @@ msgid "IPv6 prefix length"
msgstr "Довжина префікÑа IPv6"
msgid "IPv6 routed prefix"
-msgstr ""
+msgstr "ÐадіÑланий Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ IPv6"
msgid "IPv6 suffix"
-msgstr ""
+msgstr "Ð¡ÑƒÑ„Ñ–ÐºÑ IPv6"
msgid "IPv6-Address"
msgstr "IPv6-адреÑа"
@@ -1541,13 +1599,13 @@ msgid "IPv6-over-IPv4 (6to4)"
msgstr "IPv6 через IPv4 (6to4)"
msgid "Identity"
-msgstr "ІдентичніÑÑ‚ÑŒ"
+msgstr "ПоÑвідченнÑ"
msgid "If checked, 1DES is enabled"
-msgstr ""
+msgstr "Якщо позначено, 1DES увімкнено"
msgid "If checked, encryption is disabled"
-msgstr ""
+msgstr "Якщо позначено, ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾"
msgid ""
"If specified, mount the device by its UUID instead of a fixed device node"
@@ -1559,11 +1617,11 @@ msgid ""
"If specified, mount the device by the partition label instead of a fixed "
"device node"
msgstr ""
-"Якщо обрано, монтувати приÑтрій за назвою його розділу заміÑÑ‚ÑŒ фікÑованого "
+"Якщо обрано, монтувати приÑтрій за міткою його розділу заміÑÑ‚ÑŒ фікÑованого "
"вузла приÑтрою"
msgid "If unchecked, no default route is configured"
-msgstr "Якщо не позначено, типовий маршрут не наÑтроєно"
+msgstr "Якщо не позначено, типовий маршрут не налаштовано"
msgid "If unchecked, the advertised DNS server addresses are ignored"
msgstr "Якщо не позначено, оголошувані адреÑи DNS-Ñерверів ігноруютьÑÑ"
@@ -1575,15 +1633,15 @@ msgid ""
"slow process as the swap-device cannot be accessed with the high datarates "
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-"Якщо фізичної пам'ÑÑ‚Ñ– недоÑтатньо, невикориÑтовувані дані можуть тимчаÑово "
+"Якщо фізичної пам’ÑÑ‚Ñ– недоÑтатньо, невикориÑтовувані дані можуть тимчаÑово "
"витіÑнÑтиÑÑ Ð½Ð° Ñвоп-приÑтрій, у результаті чого збільшуєтьÑÑ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ "
-"кориÑної оперативної пам'ÑÑ‚Ñ– (<abbr title=\"Random Access Memory\">RAM</"
+"кориÑної оперативної пам’ÑÑ‚Ñ– (<abbr title=\"Random Access Memory\">RAM</"
"abbr>). Майте на увазі, що Ñвопінг даних Ñ” дуже повільним процеÑом, оÑкільки "
"Ñвоп-приÑтрої не можуть бути доÑтупні з такою виÑокою швидкіÑÑ‚ÑŽ, Ñк <abbr "
"title=\"Random Access Memory\">RAM</abbr>."
msgid "Ignore <code>/etc/hosts</code>"
-msgstr ""
+msgstr "Ігнорувати<code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ігнорувати интерфейÑ"
@@ -1601,6 +1659,9 @@ msgid ""
"In order to prevent unauthorized access to the system, your request has been "
"blocked. Click \"Continue »\" below to return to the previous page."
msgstr ""
+"Щоб запобігти неÑанкціонованому доÑтупу до ÑиÑтеми, ваш запит було "
+"заблоковано. ÐатиÑніть \"Продовжити »\" нижче, щоб повернутиÑÑ Ð´Ð¾ "
+"попередньої Ñторінки."
msgid "Inactivity timeout"
msgstr "Тайм-аут бездіÑльноÑÑ‚Ñ–"
@@ -1630,13 +1691,13 @@ msgid "Install protocol extensions..."
msgstr "ІнÑталÑÑ†Ñ–Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½ÑŒ протоколу..."
msgid "Installed packages"
-msgstr "ІнÑтальовані пакети"
+msgstr "ІнÑтальовано пакети"
msgid "Interface"
msgstr "ІнтерфейÑ"
msgid "Interface %q device auto-migrated from %q to %q."
-msgstr ""
+msgstr "ПриÑтрій інтерфейÑу %q автоматичного мігрував із %q на %q."
msgid "Interface Configuration"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу"
@@ -1651,10 +1712,10 @@ msgid "Interface is shutting down..."
msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÑƒÑ” роботу..."
msgid "Interface name"
-msgstr ""
+msgstr "Ð†Ð¼â€™Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу"
msgid "Interface not present or not connected yet."
-msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ñ–Ð´Ñутній або ще не підключений."
+msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ñ–Ð´Ñутній або його ще не підключено."
msgid "Interface reconnected"
msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾"
@@ -1685,14 +1746,13 @@ msgid "Invalid username and/or password! Please try again."
msgstr "ÐеприпуÑтиме Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача та/або пароль! Спробуйте ще раз."
msgid "Isolate Clients"
-msgstr ""
+msgstr "Ізолювати клієнтів"
-#, fuzzy
msgid ""
"It appears that you are trying to flash an image that does not fit into the "
"flash memory, please verify the image file!"
msgstr ""
-"Схоже, що ви намагаєтеÑÑ Ð·Ð°Ð»Ð¸Ñ‚Ð¸ образ, Ñкий не вміщаєтьÑÑ Ñƒ флеш-пам'ÑÑ‚ÑŒ! "
+"Схоже, що ви намагаєтеÑÑ Ð¿Ñ€Ð¾ÑˆÐ¸Ñ‚Ð¸ образ, Ñкий не вміщаєтьÑÑ Ð´Ð¾ флеш-пам’ÑÑ‚Ñ–! "
"Перевірте файл образу!"
msgid "JavaScript required!"
@@ -1705,10 +1765,10 @@ msgid "Join Network: Wireless Scan"
msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі: Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð´Ñ€Ð¾Ñ‚Ð¾Ð²Ð¸Ñ… мереж"
msgid "Joining Network: %q"
-msgstr ""
+msgstr "ÐŸÑ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ мережі: %q"
msgid "Keep settings"
-msgstr "Зберегти наÑтройки"
+msgstr "Зберегти налаштуваннÑ"
msgid "Kernel Log"
msgstr "Журнал Ñдра"
@@ -1750,13 +1810,13 @@ msgid "Language and Style"
msgstr "Мова та Ñтиль"
msgid "Latency"
-msgstr ""
+msgstr "Затримка"
msgid "Leaf"
-msgstr ""
+msgstr "ЛиÑÑ‚"
msgid "Lease time"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸"
msgid "Lease validity time"
msgstr "Ð§Ð°Ñ Ñ‡Ð¸Ð½Ð½Ð¾ÑÑ‚Ñ– оренди"
@@ -1781,9 +1841,11 @@ msgstr "Межа"
msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
msgstr ""
+"Обмежувати Ñлужбу DNS інтерфейÑами підмереж, на Ñких ми обÑлуговуємо DNS."
msgid "Limit listening to these interfaces, and loopback."
msgstr ""
+"ОбмежитиÑÑ Ð¿Ñ€Ð¾ÑлуховуваннÑм цих інтерфейÑів Ñ– повернутиÑÑ Ð´Ð¾ початку циклу."
msgid "Line Attenuation (LATN)"
msgstr ""
@@ -1798,14 +1860,14 @@ msgid "Line Uptime"
msgstr ""
msgid "Link On"
-msgstr "Зв'Ñзок вÑтановлено"
+msgstr "Зв’Ñзок вÑтановлено"
msgid ""
"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
"requests to"
msgstr ""
-"СпиÑок <abbr title=\"Domain Name System\">DNS</abbr>-Ñерверів, до Ñких "
-"переÑилати запити"
+"СпиÑок <abbr title=\"Domain Name System\">DNS</abbr>-Ñерверів Ð´Ð»Ñ "
+"переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð²"
msgid ""
"List of R0KHs in the same Mobility Domain. <br />Format: MAC-address,NAS-"
@@ -1814,6 +1876,13 @@ msgid ""
"from the R0KH that the STA used during the Initial Mobility Domain "
"Association."
msgstr ""
+"СпиÑок влаÑників ключів R0 у тому ж домені мобільноÑÑ‚Ñ–. <br />Формат: MAC-"
+"адреÑа,NAS-ідентифікатор,128-бітний ключ у виглÑді шіÑтнадцÑткового Ñ€Ñдка. "
+"<br />Цей ÑпиÑок викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ <abbr title="
+"\"ідентифікатор влаÑника ключа R0\">R0KH-ID</abbr> (NAS-ідентифікатор) на "
+"MAC-адреÑи Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ запиті ключа PMK-R1 від <abbr title=\"влаÑник "
+"ключа R0\">R0KH</abbr>, Ñк Ñтанції, що була викориÑтана під Ñ‡Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— "
+"аÑоціації домену мобільноÑÑ‚Ñ–."
msgid ""
"List of R1KHs in the same Mobility Domain. <br />Format: MAC-address,R1KH-ID "
@@ -1822,21 +1891,30 @@ msgid ""
"R0KH. This is also the list of authorized R1KHs in the MD that can request "
"PMK-R1 keys."
msgstr ""
+"СпиÑок влаÑників ключів R1 у тому ж домені мобільноÑÑ‚Ñ–. <br />Формат: MAC-"
+"адреÑа,<abbr title=\"ідентифікатор влаÑника ключа R1\">R1KH-ID</abbr> у "
+"формі 6 октетів з двокрапками,128-бітний ключ у виглÑді шіÑтнадцÑткового "
+"Ñ€Ñдка. <br />Цей ÑпиÑок викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ <abbr title="
+"\"ідентифікатор влаÑника ключа R1\">R1KH-ID</abbr> на MAC-адреÑи Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
+"при передаванні ключа PMK-R1 від <abbr title=\"влаÑник ключа R0\">R0KH</"
+"abbr>. Це також ÑпиÑок авторизованих <abbr title=\"влаÑник ключа R1\">R1KH</"
+"abbr> у формі <abbr title=\"Message Digest — дайджеÑÑ‚ повідомленнÑ\">MD</"
+"abbr>, Ñкі можуть запитувати ключі PMK-R1."
msgid "List of SSH key files for auth"
msgstr ""
msgid "List of domains to allow RFC1918 responses for"
-msgstr "СпиÑок доменів, Ð´Ð»Ñ Ñких дозволені RFC1918-відповіді"
+msgstr "СпиÑок доменів, Ð´Ð»Ñ Ñких дозволено RFC1918-відповіді"
msgid "List of hosts that supply bogus NX domain results"
msgstr "СпиÑок доменів, Ñкі підтримують результати підробки NX-доменів"
msgid "Listen Interfaces"
-msgstr ""
+msgstr "ІнтерфейÑи проÑлуховуваннÑ"
msgid "Listen Port"
-msgstr ""
+msgstr "Порти проÑлуховуваннÑ"
msgid "Listen only on the given interface or, if unspecified, on all"
msgstr ""
@@ -1865,7 +1943,7 @@ msgid "Local IPv6 address"
msgstr "Локальна адреÑа IPv6"
msgid "Local Service Only"
-msgstr ""
+msgstr "Тільки локальна Ñлужба"
msgid "Local Startup"
msgstr "Локальний запуÑк"
@@ -1876,13 +1954,13 @@ msgstr "МіÑцевий чаÑ"
msgid "Local domain"
msgstr "Локальний домен"
-#, fuzzy
msgid ""
"Local domain specification. Names matching this domain are never forwarded "
"and are resolved from DHCP or hosts files only"
msgstr ""
-"Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… доменів. Імена, зіÑтавлені цьому домену, ніколи не "
-"ÑпрÑмовуютьÑÑ Ñ– виділÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ через DHCP або файли hosts"
+"Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домену. Імена, Ñкі зіÑтавлено цьому домену, ніколи "
+"не переÑилаютьÑÑ Ñ– вирізнÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з файлу DHCP (/etc/config/dhcp) або "
+"файлу hosts (/etc/hosts)"
msgid "Local domain suffix appended to DHCP names and hosts file entries"
msgstr ""
@@ -1896,7 +1974,7 @@ msgid ""
"Localise hostname depending on the requesting subnet if multiple IPs are "
"available"
msgstr ""
-"Локалізувати ім'Ñ Ñ…Ð¾Ñта залежно від запитуючої підмережі, Ñкщо доÑтупні "
+"Локалізувати Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта залежно від запитуючої підмережі, Ñкщо доÑтупно "
"кілька IP-адреÑ"
msgid "Localise queries"
@@ -1924,7 +2002,7 @@ msgid "Loss of Signal Seconds (LOSS)"
msgstr ""
msgid "Lowest leased address as offset from the network address."
-msgstr "Ðайнижча орендована адреÑа"
+msgstr "Ðайнижча орендована адреÑа."
msgid "MAC-Address"
msgstr "MAC-адреÑа"
@@ -1988,34 +2066,34 @@ msgid "Mbit/s"
msgstr "Мбіт/Ñ"
msgid "Memory"
-msgstr "Пам'ÑÑ‚ÑŒ"
+msgstr "Пам’ÑÑ‚ÑŒ"
msgid "Memory usage (%)"
-msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'ÑÑ‚Ñ–, %"
+msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ–, %"
msgid "Mesh Id"
-msgstr ""
+msgstr "Mesh Id"
msgid "Metric"
msgstr "Метрика"
msgid "Mirror monitor port"
-msgstr ""
+msgstr "Дзеркало порту диÑпетчера"
msgid "Mirror source port"
-msgstr ""
+msgstr "Дзеркало вихідного порту"
msgid "Missing protocol extension for proto %q"
msgstr "ВідÑутні Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ %q"
msgid "Mobility Domain"
-msgstr ""
+msgstr "Домен мобільноÑÑ‚Ñ–"
msgid "Mode"
msgstr "Режим"
msgid "Model"
-msgstr ""
+msgstr "Модель"
msgid "Modem device"
msgstr "Модем"
@@ -2024,7 +2102,7 @@ msgid "Modem init timeout"
msgstr "Тайм-аут ініціалізації модему"
msgid "Monitor"
-msgstr "Монітор"
+msgstr "ДиÑпетчер"
msgid "Mount Entry"
msgstr "Вхід монтуваннÑ"
@@ -2036,20 +2114,20 @@ msgid "Mount Points"
msgstr "Точки монтуваннÑ"
msgid "Mount Points - Mount Entry"
-msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ - ЗапиÑи монтуваннÑ"
+msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ â€“ ЗапиÑи монтуваннÑ"
msgid "Mount Points - Swap Entry"
-msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ - Вхід довантаженнÑ"
+msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ â€“ Вхід Ñвопу"
msgid ""
"Mount Points define at which point a memory device will be attached to the "
"filesystem"
msgstr ""
-"Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‚ÑŒ, до Ñкої точки приÑтрою пам'ÑÑ‚Ñ– буде прикріплена "
-"файлова ÑиÑтема"
+"Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‚ÑŒ, до Ñкої точки приÑтрою пам’ÑÑ‚Ñ– буде прикріплено "
+"файлову ÑиÑтему"
msgid "Mount filesystems not specifically configured"
-msgstr ""
+msgstr "Монтувати не конкретно налаштовані файлові ÑиÑтеми"
msgid "Mount options"
msgstr "Опції монтуваннÑ"
@@ -2058,10 +2136,10 @@ msgid "Mount point"
msgstr "Точка монтуваннÑ"
msgid "Mount swap not specifically configured"
-msgstr ""
+msgstr "Монтувати не конкретно налаштований Ñвоп"
msgid "Mounted file systems"
-msgstr "Змонтовані файлові ÑиÑтеми"
+msgstr "Змонтовано файлові ÑиÑтеми"
msgid "Move down"
msgstr "Вниз"
@@ -2091,19 +2169,16 @@ msgid "NT Domain"
msgstr ""
msgid "NTP server candidates"
-msgstr "Кандидати Ð´Ð»Ñ Ñинхронізації NTP-Ñервера"
-
-msgid "NTP sync time-out"
-msgstr ""
+msgstr "Кандидати Ð´Ð»Ñ Ñинхронізації Ñервера NTP"
msgid "Name"
-msgstr "Ім'Ñ"
+msgstr "Ім’Ñ"
msgid "Name of the new interface"
-msgstr "Ім'Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ інтерфейÑу"
+msgstr "Ð†Ð¼â€™Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ інтерфейÑу"
msgid "Name of the new network"
-msgstr "Ðазва (ім'Ñ) нової мережі"
+msgstr "Ðазва (ім’Ñ) нової мережі"
msgid "Navigation"
msgstr "ÐавігаціÑ"
@@ -2127,7 +2202,7 @@ msgid "Next »"
msgstr "ÐаÑтупний »"
msgid "No DHCP Server configured for this interface"
-msgstr "Ðемає DHCP-Ñервера, наÑтроєного Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу"
+msgstr "Ðемає DHCP-Ñервера, налаштованого Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу"
msgid "No NAT-T"
msgstr ""
@@ -2145,10 +2220,10 @@ msgid "No negative cache"
msgstr "ÐÑ–Ñких негативних кешувань"
msgid "No network configured on this device"
-msgstr "Ðа цьому приÑтрої нема наÑтроєної мережі"
+msgstr "Ðа цьому приÑтрої немає налаштованої мережі"
msgid "No network name specified"
-msgstr "Ім'Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– не визначене"
+msgstr "Ð†Ð¼â€™Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– не визначено"
msgid "No package lists available"
msgstr "Ðемає доÑтупних ÑпиÑків пакетів"
@@ -2160,22 +2235,22 @@ msgid "No rules in this chain"
msgstr "У цьму ланцюжку нема правил"
msgid "No zone assigned"
-msgstr "Зона не призначена"
+msgstr "Зону не призначено"
msgid "Noise"
msgstr "Шум"
msgid "Noise Margin (SNR)"
-msgstr ""
+msgstr "Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñигнал/шум"
msgid "Noise:"
msgstr "Шум:"
msgid "Non Pre-emtive CRC errors (CRC_P)"
-msgstr ""
+msgstr "Ðе запобіжні помилки CRC (CRC_P)"
msgid "Non-wildcard"
-msgstr ""
+msgstr "Без шаблону заміни"
msgid "None"
msgstr "Жоден"
@@ -2187,16 +2262,16 @@ msgid "Not Found"
msgstr "Ðе знайдено"
msgid "Not associated"
-msgstr "Ðе пов'Ñзаний"
+msgstr "Ðе пов’Ñзаний"
msgid "Not connected"
msgstr "Ðе підключено"
msgid "Note: Configuration files will be erased."
-msgstr "Примітка: конфігураційні файли будуть видалені."
+msgstr "Примітка: конфігураційні файли буде видалено."
msgid "Note: interface name length"
-msgstr ""
+msgstr "Примітка: довжина імені інтерфейÑу"
msgid "Notice"
msgstr "ПопередженнÑ"
@@ -2205,7 +2280,7 @@ msgid "Nslookup"
msgstr "DNS-запит"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
-msgstr ""
+msgstr "КількіÑÑ‚ÑŒ кешованих запиÑів DNS (макÑ. - 10000, 0 - без кешуваннÑ)"
msgid "OK"
msgstr "OK"
@@ -2214,10 +2289,13 @@ msgid "OPKG-Configuration"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ OPKG"
msgid "Obfuscated Group Password"
-msgstr ""
+msgstr "ОбфуÑований груповий пароль"
msgid "Obfuscated Password"
-msgstr ""
+msgstr "ОбфуÑований пароль"
+
+msgid "Obtain IPv6-Address"
+msgstr "Отримати IPv6-адреÑу"
msgid "Off-State Delay"
msgstr "Затримка Off-State"
@@ -2230,18 +2308,18 @@ msgid ""
"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
"<samp>eth0.1</samp>)."
msgstr ""
-"Ðа цій Ñторінці ви можете наÑтроїти мережеві інтерфейÑи. Ви можете "
-"об'єднатиати кілька інтерфейÑів моÑтом, відзначивши поле \"Об'єднати "
-"інтерфейÑи в міÑÑ‚\" та ввівши імена кількох мережевих інтерфейÑів, розділені "
-"пробілами. Також ви можете викориÑтовувати <abbr title=\"Virtual Local Area "
-"Network — віртуальна локальна комп'ютерна мережа\">VLAN</abbr>-Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
+"Ðа цій Ñторінці ви можете налаштувати мережеві інтерфейÑи. Ви можете "
+"об’єднати кілька інтерфейÑів моÑтом, відзначивши поле \"Об’єднати інтерфейÑи "
+"в міÑÑ‚\" та ввівши імена кількох мережевих інтерфейÑів, розділені пробілами. "
+"Також ви можете викориÑтовувати <abbr title=\"Virtual Local Area Network — "
+"віртуальна локальна комп’ютерна мережа\">VLAN</abbr>-Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
"<samp>ІÐТЕРФЕЙС.ÐОМЕР_VLAN</samp> (наприклад, <samp>eth0.1</samp>)."
msgid "On-State Delay"
msgstr "Затримка On-State"
msgid "One of hostname or mac address must be specified!"
-msgstr "Має бути вказане одне з двох - ім'Ñ Ð²ÑƒÐ·Ð»Ð° або ÐœÐС-адреÑа!"
+msgstr "Має бути зазначено одне з двох – Ñ–Ð¼â€™Ñ Ð²ÑƒÐ·Ð»Ð° або ÐœÐС-адреÑа!"
msgid "One or more fields contain invalid values!"
msgstr "Одне або декілька полів міÑÑ‚ÑÑ‚ÑŒ неприпуÑтимі значеннÑ!"
@@ -2250,7 +2328,7 @@ msgid "One or more invalid/required values on tab"
msgstr ""
msgid "One or more required fields have no value!"
-msgstr "Одне або декілька обов'Ñзкових полів не мають значень!"
+msgstr "Одне або декілька обов’Ñзкових полів не мають значень!"
msgid "Open list..."
msgstr "Відкрити ÑпиÑок..."
@@ -2259,7 +2337,7 @@ msgid "OpenConnect (CISCO AnyConnect)"
msgstr ""
msgid "Operating frequency"
-msgstr ""
+msgstr "Робоча чаÑтота"
msgid "Option changed"
msgstr "ÐžÐ¿Ñ†Ñ–Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð°"
@@ -2268,18 +2346,14 @@ msgid "Option removed"
msgstr "ÐžÐ¿Ñ†Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð°"
msgid "Optional"
-msgstr ""
-
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
+msgstr "Ðеобов’Ñзково"
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
msgstr ""
+"Ðеобов’Ñзково. 32-бітна мітка Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… зашифрованих пакетів. Введіть "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² шіÑтнадцÑтковому форматі, починаючи з <code>0x</code>."
msgid ""
"Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or "
@@ -2287,25 +2361,33 @@ msgid ""
"server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') "
"for the interface."
msgstr ""
+"Ðеобов’Ñзково. ПрипуÑтимі значеннÑ: 'eui64', 'random' чи фікÑоване значеннÑ, "
+"наприклад '::1' або '::1:2'. Якщо Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ IPv6 (наприклад, 'a:b:c:d::') "
+"отримано від Ñервера делегуваннÑ, Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ IPv6-адреÑи інтерфейÑу "
+"(наприклад, 'a:b:c:d::1') викориÑтовуйте ÑÑƒÑ„Ñ–ÐºÑ ('::1')."
msgid ""
"Optional. Base64-encoded preshared key. Adds in an additional layer of "
"symmetric-key cryptography for post-quantum resistance."
msgstr ""
+"Ðеобов’Ñзково. Заздалегідь уÑтановлений Base64-кодований Ñпільний ключ. "
+"Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾ Ñ€Ñ–Ð²Ð½Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð· Ñиметричним ключем Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚-"
+"квантової ÑтійкоÑÑ‚Ñ–."
msgid "Optional. Create routes for Allowed IPs for this peer."
-msgstr ""
+msgstr "Ðеобов’Ñзково. Створити Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вузла маршрути Ð´Ð»Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ… IP."
msgid ""
"Optional. Host of peer. Names are resolved prior to bringing up the "
"interface."
-msgstr ""
+msgstr "Ðеобов’Ñзково. ХоÑÑ‚ вузла. Імена буде виділено до піднÑÑ‚Ñ‚Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу"
msgid "Optional. Maximum Transmission Unit of tunnel interface."
msgstr ""
+"Ðеобов’Ñзково. МакÑимальний блок передаваних даних тунельного інтерфейÑу."
msgid "Optional. Port of peer."
-msgstr ""
+msgstr "Ðеобов’Ñзково. Порт вузла."
msgid ""
"Optional. Seconds between keep alive messages. Default is 0 (disabled). "
@@ -2314,6 +2396,8 @@ msgstr ""
msgid "Optional. UDP port used for outgoing and incoming packets."
msgstr ""
+"Ðеобов’Ñзково. UDP-порт, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… та вхідних "
+"пакетів."
msgid "Options"
msgstr "Опції"
@@ -2328,7 +2412,7 @@ msgid "Outbound:"
msgstr "Вихідний:"
msgid "Output Interface"
-msgstr ""
+msgstr "Вихідний інтерфейÑ"
msgid "Override MAC address"
msgstr "Перевизначити MAC-адреÑу"
@@ -2337,13 +2421,13 @@ msgid "Override MTU"
msgstr "Перевизначити MTU"
msgid "Override TOS"
-msgstr ""
+msgstr "Перевизначити TOS"
msgid "Override TTL"
-msgstr ""
+msgstr "Перевизначити TTL"
msgid "Override default interface name"
-msgstr ""
+msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ імені інтерфейÑу"
msgid "Override the gateway in DHCP responses"
msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑˆÐ»ÑŽÐ·Ñƒ у відповідÑÑ… DHCP"
@@ -2369,7 +2453,7 @@ msgid "PAP/CHAP password"
msgstr "Пароль PAP/CHAP"
msgid "PAP/CHAP username"
-msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PAP/CHAP"
+msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PAP/CHAP"
msgid "PID"
msgstr "<abbr title=\"Process Identifier — Ідентифікатор процеÑу\">PID</abbr>"
@@ -2380,7 +2464,7 @@ msgstr ""
"номер\">>PIN</abbr>"
msgid "PMK R1 Push"
-msgstr ""
+msgstr "ÐŸÑ€Ð¾ÑˆÑ‚Ð¾Ð²Ñ…ÑƒÐ²Ð°Ð½Ñ PMK R1"
msgid "PPP"
msgstr "PPP"
@@ -2434,13 +2518,13 @@ msgid "Password of Private Key"
msgstr "Пароль закритого ключа"
msgid "Password of inner Private Key"
-msgstr ""
+msgstr "Пароль внутрішнього закритого ключа"
msgid "Password successfully changed!"
msgstr "Пароль уÑпішно змінено!"
msgid "Password2"
-msgstr ""
+msgstr "Пароль2"
msgid "Path to CA-Certificate"
msgstr "ШлÑÑ… до центру Ñертифікції"
@@ -2452,25 +2536,25 @@ msgid "Path to Private Key"
msgstr "ШлÑÑ… до закритого ключа"
msgid "Path to inner CA-Certificate"
-msgstr ""
+msgstr "ШлÑÑ… до внутрішнього CA-Ñертифікату"
msgid "Path to inner Client-Certificate"
-msgstr ""
+msgstr "ШлÑÑ… до внутрішнього Ñертифікату клієнта"
msgid "Path to inner Private Key"
-msgstr ""
+msgstr "ШлÑÑ… до внутрішнього закритого ключа"
msgid "Peak:"
msgstr "Пік:"
msgid "Peer IP address to assign"
-msgstr ""
+msgstr "Запит IP-адреÑи призначеннÑ"
msgid "Peers"
-msgstr ""
+msgstr "Піри"
msgid "Perfect Forward Secrecy"
-msgstr ""
+msgstr "Perfect Forward Secrecy"
msgid "Perform reboot"
msgstr "Виконати перезавантаженнÑ"
@@ -2479,7 +2563,7 @@ msgid "Perform reset"
msgstr "Відновити"
msgid "Persistent Keep Alive"
-msgstr ""
+msgstr "Завжди тримати ввімкненим"
msgid "Phy Rate:"
msgstr "Фізична швидкіÑÑ‚ÑŒ:"
@@ -2494,7 +2578,7 @@ msgid "Pkts."
msgstr "пакетів"
msgid "Please enter your username and password."
-msgstr "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ– пароль"
+msgstr "Введіть Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ– пароль."
msgid "Policy"
msgstr "Політика"
@@ -2503,25 +2587,25 @@ msgid "Port"
msgstr "Порт"
msgid "Port status:"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ñ€Ñ‚Ñƒ:"
+msgstr "Стан порту:"
msgid "Power Management Mode"
-msgstr ""
+msgstr "Режим ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñм"
msgid "Pre-emtive CRC errors (CRCP_P)"
-msgstr ""
+msgstr "Попереджувати помилки CRC (CRCP_P)"
msgid "Prefer LTE"
-msgstr ""
+msgstr "Переважно LTE"
msgid "Prefer UMTS"
-msgstr ""
+msgstr "Переважно UMTS"
msgid "Prefix Delegated"
-msgstr ""
+msgstr "Делеговано префікÑ"
msgid "Preshared Key"
-msgstr ""
+msgstr "Заздалегідь уÑтановлений Ñпільний ключ"
msgid ""
"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
@@ -2531,10 +2615,10 @@ msgstr ""
"пакета LCP, викориÑтовуйте 0, щоб ігнорувати невдачі"
msgid "Prevent listening on these interfaces."
-msgstr ""
+msgstr "Перешкоджати проÑлуховуванню цих інтерфейÑів."
msgid "Prevents client-to-client communication"
-msgstr "Запобігає зв'Ñзкам клієнт-клієнт"
+msgstr "Перешкоджати Ñпілкуванню клієнт-клієнт"
msgid "Prism2/2.5/3 802.11b Wireless Controller"
msgstr "Бездротовий 802.11b контролер Prism2/2.5/3"
@@ -2567,10 +2651,10 @@ msgid "Protocol support is not installed"
msgstr "Підтримка протоколу не інÑтальована"
msgid "Provide NTP server"
-msgstr "Забезпечувати NTP-Ñервер"
+msgstr "Забезпечувати Ñервер NTP"
msgid "Provide new network"
-msgstr "ПоÑтачити нову мережу"
+msgstr "Укажіть нову мережу"
msgid "Pseudo Ad-Hoc (ahdemo)"
msgstr "ПÑевдо Ad-Hoc (ahdemo)"
@@ -2588,10 +2672,10 @@ msgid "Quality"
msgstr "ЯкіÑÑ‚ÑŒ"
msgid "R0 Key Lifetime"
-msgstr ""
+msgstr "ТриваліÑÑ‚ÑŒ Ð¶Ð¸Ñ‚Ñ‚Ñ ÐºÐ»ÑŽÑ‡Ð° R0"
msgid "R1 Key Holder"
-msgstr ""
+msgstr "ВлаÑник ключа R1"
msgid "RFC3947 NAT-T mode"
msgstr ""
@@ -2630,45 +2714,37 @@ msgid ""
"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
"Configuration Protocol\">DHCP</abbr>-Server"
msgstr ""
-"Читати <code>/etc/ethers</code> Ð´Ð»Ñ Ð½Ð°ÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ <abbr title=\"Dynamic Host "
+"Читати <code>/etc/ethers</code> Ð´Ð»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ <abbr title=\"Dynamic Host "
"Configuration Protocol — Протокол динамічної конфігурації вузла\">DHCP</"
"abbr>-Ñервера"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"ДійÑно видалити цей інтерфейÑ? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\n"
-"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цей "
-"інтерфейÑ."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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 "ДійÑно Ñкинути вÑÑ– зміни?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"ДійÑно вимкнути мережу?\n"
-"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цю "
-"мережу."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
-"ДійÑно вимкнути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"?\n"
-"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цей "
-"інтерфейÑ."
+"ДійÑно вимкнути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"? Ви можете втратити доÑтуп до цього "
+"приÑтрою, Ñкщо Ð²Ð°Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾ через цей інтерфейÑ."
msgid "Really switch protocol?"
msgstr "ДійÑно змінити протокол?"
@@ -2689,10 +2765,10 @@ msgid "Realtime Wireless"
msgstr "Бездротові мережі у реальному чаÑÑ–"
msgid "Reassociation Deadline"
-msgstr ""
+msgstr "Кінцевий термін реаÑÑоціації"
msgid "Rebind protection"
-msgstr "ЗахиÑÑ‚ від переприв'Ñзки"
+msgstr "ЗахиÑÑ‚ від переприв’Ñзки"
msgid "Reboot"
msgstr "ПерезавантаженнÑ"
@@ -2704,7 +2780,7 @@ msgid "Reboots the operating system of your device"
msgstr "Перезавантажити операційну ÑиÑтему вашого приÑтрою"
msgid "Receive"
-msgstr "Прийом"
+msgstr "ПрийманнÑ"
msgid "Receiver Antenna"
msgstr "Ðнтена приймача"
@@ -2752,25 +2828,22 @@ msgid "Replace wireless configuration"
msgstr "Замінити конфігурацію бездротової мережі"
msgid "Request IPv6-address"
-msgstr ""
+msgstr "Запит IPv6-адреÑи"
msgid "Request IPv6-prefix of length"
-msgstr ""
-
-msgid "Require TLS"
-msgstr ""
+msgstr "Запит довжини IPv6-префікÑу"
msgid "Required"
-msgstr ""
+msgstr "Потрібно"
msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
msgstr "Потрібно Ð´Ð»Ñ Ð´ÐµÑких провайдерів, наприклад, Charter із DOCSIS 3"
msgid "Required. Base64-encoded private key for this interface."
-msgstr ""
+msgstr "Потрібно. Base64-закодований закритий ключ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу."
msgid "Required. Base64-encoded public key of peer."
-msgstr ""
+msgstr "Потрібно. Base64-закодований публічний ключ вузла."
msgid ""
"Required. IP addresses and prefixes that this peer is allowed to use inside "
@@ -2782,6 +2855,8 @@ msgid ""
"Requires the 'full' version of wpad/hostapd and support from the wifi driver "
"<br />(as of Feb 2017: ath9k and ath10k, in LEDE also mwlwifi and mt76)"
msgstr ""
+"Потребує \"повної\" верÑÑ–Ñ— wpad/hostapd та підтримки драйвером WiFi <br /"
+">(Ñтаном на лютий 2017 року: ath9k та ath10k, у LEDE також mwlwifi та mt76)"
msgid ""
"Requires upstream supports DNSSEC; verify unsigned domain responses really "
@@ -2816,8 +2891,17 @@ msgid "Reveal/hide password"
msgstr "Показати/приховати пароль"
msgid "Revert"
+msgstr "СкаÑувати"
+
+msgid "Revert changes"
msgstr "СкаÑувати зміни"
+msgid "Revert request failed with status <code>%h</code>"
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° запиту на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ñ– ÑтатуÑом <code>%h</code>"
+
+msgid "Reverting configuration…"
+msgstr "Відкат конфігурації…"
+
msgid "Root"
msgstr "Корінь"
@@ -2825,19 +2909,16 @@ msgid "Root directory for files served via TFTP"
msgstr "Кореневий каталог Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² TFTP"
msgid "Root preparation"
-msgstr ""
+msgstr "Підготовка Root"
msgid "Route Allowed IPs"
-msgstr ""
+msgstr "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ… IP-адреÑ"
msgid "Route type"
-msgstr ""
-
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
+msgstr "Тип маршруту"
msgid "Router Advertisement-Service"
-msgstr ""
+msgstr "Служба оголошень маршрутизатора"
msgid "Router Password"
msgstr "Пароль маршрутизатора"
@@ -2861,14 +2942,6 @@ msgstr "Виконати перевірку файлової ÑиÑтеми"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2896,9 +2969,6 @@ msgstr "Зберегти"
msgid "Save & Apply"
msgstr "Зберегти Ñ– заÑтоÑувати"
-msgid "Save &#38; Apply"
-msgstr "Зберегти Ñ– заÑтоÑувати"
-
msgid "Scan"
msgstr "Сканувати"
@@ -2912,7 +2982,7 @@ msgid "Section removed"
msgstr "Ð¡ÐµÐºÑ†Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð°"
msgid "See \"mount\" manpage for details"
-msgstr "Подробиці див. на Ñторінці керівництва \"mount\""
+msgstr "Подробиці дивиÑÑŒ на Ñторінці керівництва \"mount\""
msgid ""
"Send LCP echo requests at the given interval in seconds, only effective in "
@@ -2925,21 +2995,10 @@ msgid "Separate Clients"
msgstr "РозділÑти клієнтів"
msgid "Server Settings"
-msgstr "ÐаÑтройки Ñервера"
-
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера"
msgid "Service Name"
-msgstr "Ðазва (ім'Ñ) ÑервіÑу"
+msgstr "Ðазва (ім’Ñ) ÑервіÑу"
msgid "Service Type"
msgstr "Тип ÑервіÑу"
@@ -2951,13 +3010,14 @@ msgid ""
"Set interface properties regardless of the link carrier (If set, carrier "
"sense events do not invoke hotplug handlers)."
msgstr ""
+"ВлаÑтивоÑÑ‚Ñ– інтерфейÑу вÑтановлюютьÑÑ Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ð¾ від каналу зв’Ñзку (Ñкщо "
+"позначено, обробник Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ викликаєтьÑÑ Ð¿Ñ€Ð¸ змінах)."
-#, fuzzy
msgid "Set up Time Synchronization"
-msgstr "ÐаÑтройки Ñинхронізації чаÑу"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації чаÑу"
msgid "Setup DHCP Server"
-msgstr "ÐаÑтройки DHCP-Ñервера"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ DHCP-Ñервера"
msgid "Severely Errored Seconds (SES)"
msgstr ""
@@ -2990,7 +3050,7 @@ msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
-msgstr ""
+msgstr "Розмір кешу запитів DNS"
msgid "Skip"
msgstr "ПропуÑтити"
@@ -3014,7 +3074,7 @@ msgid "Some fields are invalid, cannot save values!"
msgstr "ДеÑкі Ð¿Ð¾Ð»Ñ Ñ” неприпуÑтимими, неможливо зберегти значеннÑ!"
msgid "Sorry, the object you requested was not found."
-msgstr "Ðа жаль, об'єкт, Ñкий ви проÑили, не знайдено."
+msgstr "Ðа жаль, об’єкт, Ñкий ви проÑили, не знайдено."
msgid "Sorry, the server encountered an unexpected error."
msgstr "Ðа жаль, на Ñервері ÑталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка."
@@ -3024,19 +3084,13 @@ msgid ""
"flashed manually. Please refer to the wiki for device specific install "
"instructions."
msgstr ""
-"Ðа жаль, автоматичне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑиÑтеми не підтримуєтьÑÑ. Ðовий образ "
-"прошивки повинен бути залитий вручну. ЗвернітьÑÑ Ð´Ð¾ Wiki за інÑтрукцією з "
-"інÑталÑції Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ приÑтрою."
-
-msgid "Sort"
-msgstr "СортуваннÑ"
+"Ðа жаль, Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑиÑтеми не підтримуєтьÑÑ. Ðовий образ мікропрограми Ñлід "
+"прошити вручну. ЗвернітьÑÑ Ð´Ð¾ Wiki за інÑтрукцією з інÑталÑції Ð´Ð»Ñ "
+"конкретного приÑтрою."
msgid "Source"
msgstr "Джерело"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "Визначає каталог, до Ñкого приєднаний приÑтрій"
@@ -3079,6 +3133,9 @@ msgstr "ЗапуÑтити"
msgid "Start priority"
msgstr "Стартовий пріоритет"
+msgid "Starting configuration apply…"
+msgstr "ЗаÑтоÑовуєтьÑÑ Ñтартова конфігураціÑ…"
+
msgid "Startup"
msgstr "ЗапуÑк"
@@ -3095,7 +3152,7 @@ msgid "Static Routes"
msgstr "Статичні маршрути"
msgid "Static address"
-msgstr "Статичні адреÑи"
+msgstr "Статична адреÑа"
msgid ""
"Static leases are used to assign fixed IP addresses and symbolic hostnames "
@@ -3108,7 +3165,7 @@ msgstr ""
"орендою."
msgid "Status"
-msgstr "СтатуÑ"
+msgstr "Стан"
msgid "Stop"
msgstr "Зупинити"
@@ -3120,16 +3177,16 @@ msgid "Submit"
msgstr "ÐадіÑлати"
msgid "Suppress logging"
-msgstr ""
+msgstr "Блокувати журналюваннÑ"
msgid "Suppress logging of the routine operation of these protocols"
-msgstr ""
+msgstr "Блокувати Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ звичайної роботи цих протоколів"
msgid "Swap"
-msgstr ""
+msgstr "Своп"
msgid "Swap Entry"
-msgstr "Вхід довантаженнÑ"
+msgstr "Вхід Ñвоп"
msgid "Switch"
msgstr "Комутатор"
@@ -3143,12 +3200,14 @@ msgstr "Комутатор %q (%s)"
msgid ""
"Switch %q has an unknown topology - the VLAN settings might not be accurate."
msgstr ""
+"Комутатор %q має невідому топологію – параметри VLAN можуть бути "
+"неправильними."
msgid "Switch Port Mask"
-msgstr ""
+msgstr "МаÑка портів комутатора"
msgid "Switch VLAN"
-msgstr ""
+msgstr "VLAN комутатора"
msgid "Switch protocol"
msgstr "Протокол комутатора"
@@ -3175,7 +3234,7 @@ msgid "TCP:"
msgstr "TCP:"
msgid "TFTP Settings"
-msgstr "ÐаÑтройки TFTP"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ TFTP"
msgid "TFTP server root"
msgstr "Корінь TFTP-Ñервера"
@@ -3206,11 +3265,11 @@ msgid ""
"multi-SSID capable). Per network settings like encryption or operation mode "
"are grouped in the <em>Interface Configuration</em>."
msgstr ""
-"Розділ <em>ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою</em> охоплює фізичні параметри радіо-"
-"апаратних заÑобів, такі, Ñк канал, потужніÑÑ‚ÑŒ передавача або вибір антени, "
-"Ñкі Ñ” Ñпільними Ð´Ð»Ñ Ð²ÑÑ–Ñ… визначених бездротових мереж (Ñкщо радіо-апаратні "
-"заÑоби здатні підтримувати кілька SSID). Параметри окремих мереж, такі, Ñк "
-"ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ режим роботи, згруповані в розділі <em>ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ "
+"Розділ <em>ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою</em> охоплює фізичні параметри апаратних "
+"радіо-заÑобів, такі, Ñк канал, потужніÑÑ‚ÑŒ передавача або вибір антени, Ñкі Ñ” "
+"Ñпільними Ð´Ð»Ñ Ð²ÑÑ–Ñ… визначених бездротових мереж (Ñкщо апаратні радіо-заÑоби "
+"здатні підтримувати кілька SSID). Параметри окремих мереж, такі, Ñк "
+"ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ режим роботи, згруповано в розділі <em>ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ "
"інтерфейÑу</em>."
msgid ""
@@ -3218,7 +3277,7 @@ msgid ""
"component for working wireless configuration!"
msgstr ""
"Пакет <em>libiwinfo-lua</em> не інÑтальований. Щоб мати можливіÑÑ‚ÑŒ "
-"наÑтроювати безпровідні мережі, Ñлід інÑталювати цей компонент!"
+"налаштувати безпровідні мережі, Ñлід інÑталювати цей компонент!"
msgid ""
"The HE.net endpoint update configuration changed, you must now use the plain "
@@ -3232,29 +3291,46 @@ msgstr ""
msgid ""
"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
msgstr ""
-"Призначений провайдеру IPv6-префікÑ, зазвичай закінчуєтьÑÑ Ð½Ð° <code>::</code>"
+"Призначений провайдером IPv6-префікÑ, зазвичай закінчуєтьÑÑ Ð½Ð° <code>::</"
+"code>"
msgid ""
"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
"code> and <code>_</code>"
msgstr ""
-"Дозволені Ñимволи: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> та "
+"Дозволено Ñимволи: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> та "
"<code>_</code>"
msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+"ПриÑтрій недоÑÑжний протÑгом %d Ñекунд піÑÐ»Ñ Ð·Ð°ÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑŽÑ‡Ð¸Ñ… змін, що "
+"призвело до Ð²Ñ–Ð´ÐºÐ¾Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— з міркувань безпеки. Проте, Ñкщо ви "
+"впевнені, що зміни конфігурації Ñ” правильними, заÑтоÑуйте неперевірену "
+"конфігурацію. Крім того, ви можете відхилити це Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° "
+"відредагувати зміни, перш ніж намагатиÑÑŒ заÑтоÑувати Ñ—Ñ… знову, або ж "
+"ÑкаÑувати вÑÑ– очікуючі зміни, щоб зберегти поточну робочу конфігурацію."
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
-msgstr "Файл приÑтрою пам'ÑÑ‚Ñ– або розділу (наприклад, <code>/dev/sda1</code>)"
+msgstr "Файл приÑтрою пам’ÑÑ‚Ñ– або розділу (наприклад, <code>/dev/sda1</code>)"
msgid ""
"The filesystem that was used to format the memory (<abbr title=\"for example"
"\">e.g.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></"
"samp>)"
msgstr ""
-"Файлова ÑиÑтема, Ñка викориÑтовуватиметьÑÑ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'ÑÑ‚Ñ– "
+"Файлова ÑиÑтема, Ñка викориÑтовуватиметьÑÑ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ– "
"(наприклад, <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></"
"samp>)"
@@ -3263,29 +3339,26 @@ msgid ""
"compare them with the original file to ensure data integrity.<br /> Click "
"\"Proceed\" below to start the flash procedure."
msgstr ""
-"Образ завантажено. Ðижче наведено контрольну Ñуму Ñ– розмір файлу. ПорівнÑйте "
-"Ñ—Ñ… з вихідним файлом Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»Ñ–ÑноÑÑ‚Ñ– даних.<br /> ÐатиÑніть "
-"\"Продовжити\", щоб розпочати процедуру Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸."
-
-msgid "The following changes have been committed"
-msgstr "Ðижче наведені зміни були заÑтоÑовані"
+"Образ завантажено. Ðижче наведено контрольну Ñуму та розмір файлу. "
+"ПорівнÑйте Ñ—Ñ… з вихідним файлом, шоб переконатиÑÑ Ð² ціліÑноÑÑ‚Ñ– даних.<br /> "
+"ÐатиÑніть \"Продовжити\", щоб розпочати процедуру прошиваннÑ."
msgid "The following changes have been reverted"
-msgstr "Ðижче наведені зміни були ÑкаÑовані"
+msgstr "Ðаведені нижче зміни було ÑкаÑовано"
msgid "The following rules are currently active on this system."
-msgstr "У даний Ñ‡Ð°Ñ Ñƒ цій ÑиÑтемі активні такі правила."
+msgstr "Ðаразі в цій ÑиÑтемі активні такі правила."
msgid "The given network name is not unique"
-msgstr "Задане мережеве ім'Ñ Ð½Ðµ Ñ” унікальним"
+msgstr "Задане мережеве Ñ–Ð¼â€™Ñ Ð½Ðµ Ñ” унікальним"
#, fuzzy
msgid ""
"The hardware is not multi-SSID capable and the existing configuration will "
"be replaced if you proceed."
msgstr ""
-"ÐžÐ±Ð»Ð°Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ підтримує мульти-SSID Ñ–, Ñкщо ви продовжите, Ñ–Ñнуюча "
-"ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ замінена."
+"ÐžÐ±Ð»Ð°Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ підтримує мульти-SSID Ñ–, Ñкщо ви продовжите, Ñ–Ñнуючу "
+"конфігурацію буде замінено."
msgid ""
"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
@@ -3306,12 +3379,12 @@ msgid ""
"segments. Often there is by default one Uplink port for a connection to the "
"next greater network like the internet and other ports for a local network."
msgstr ""
-"Мережеві порти вашого приÑтрою можуть бути об'єднані у декілька <abbr title="
-"\"Virtual Local Area Network — віртуальна локальна комп'ютерна мережа"
-"\">VLAN</abbr>, у Ñких комп'ютери можуть напрÑму ÑпілкуватиÑÑ Ð¾Ð´Ð¸Ð½ з одним. "
-"<abbr title=\"Virtual Local Area Network — віртуальна локальна комп'ютерна "
+"Мережеві порти вашого приÑтрою може бути об’єднано у декілька <abbr title="
+"\"Virtual Local Area Network — віртуальна локальна комп’ютерна мережа"
+"\">VLAN</abbr>, у Ñких комп’ютери можуть напрÑму ÑпілкуватиÑÑ Ð¾Ð´Ð¸Ð½ з одним. "
+"<abbr title=\"Virtual Local Area Network — віртуальна локальна комп’ютерна "
"мережа\">VLAN</abbr> чаÑто викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– на окремі "
-"Ñегменти. Зазвичай один виcхідний порт викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· "
+"Ñегменти. Зазвичай один виcхідний порт викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· "
"більшою мережею, такою наприклад, Ñк Інтернет, а інші порти — Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ñ— "
"мережі."
@@ -3337,13 +3410,8 @@ msgid ""
msgstr ""
"СиÑтема перепрошиваєтьÑÑ.<br /> <strong>ÐЕ ВИМИКÐЙТЕ ЖИВЛЕÐÐЯ ПРИСТРОЮ!</"
"strong><br /> Зачекайте кілька хвилин перед тим, Ñк пробувати знову "
-"з'єднатиÑÑ. Залежно від ваших наÑтройок, можливо, вам треба буде оновити "
-"адреÑу вашого комп'ютера, щоб знову отримати доÑтуп до приÑтрою."
-
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
+"під’єднатиÑÑ. Залежно від налаштувань, можливо, треба буде оновити адреÑу "
+"вашого комп’ютера, щоб знову отримати доÑтуп до приÑтрою."
msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
@@ -3355,11 +3423,11 @@ msgstr ""
msgid "There are no active leases."
msgstr "Ðктивних оренд немає."
-msgid "There are no pending changes to apply!"
-msgstr "Ðемає жодних змін до заÑтоÑуваннÑ!"
+msgid "There are no changes to apply."
+msgstr "Ðемає жодних змін до заÑтоÑуваннÑ."
msgid "There are no pending changes to revert!"
-msgstr "Ðемає жодних змін до ÑкаÑуваннÑ!"
+msgstr "Ðемає жодних очікуючих змін до ÑкаÑуваннÑ!"
msgid "There are no pending changes!"
msgstr "Ðемає жодних очікуючих змін!"
@@ -3386,6 +3454,9 @@ msgid ""
"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
"Name System\">DNS</abbr> servers."
msgstr ""
+"Цей файл може міÑтити такі Ñ€Ñдки, Ñк 'server=/domain/1.2.3.4' або "
+"'server=1.2.3.4' Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½-орієнтованих або повних виÑхідних <abbr title="
+"\"Domain Name System\">DNS</abbr>-Ñерверів."
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
@@ -3400,6 +3471,8 @@ msgid ""
"This is either the \"Update Key\" configured for the tunnel or the account "
"password if no update key has been configured"
msgstr ""
+"Це або \"Update Key\", Ñконфігурований Ð´Ð»Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŽ, або пароль облікового "
+"запиÑу, Ñкщо ключ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ налаштовано"
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
@@ -3412,8 +3485,8 @@ msgid ""
"This is the local endpoint address assigned by the tunnel broker, it usually "
"ends with <code>...:2/64</code>"
msgstr ""
-"Це локальна адреÑа кінцевої точки, приÑвоєна тунельним брокером, зазвичай "
-"закінчуєтьÑÑ Ð½Ð° <code>...:2/64</code>"
+"Це локальна адреÑа кінцевої точки, Ñку приÑвоєно тунельним брокером, вона "
+"зазвичай закінчуєтьÑÑ Ð½Ð° <code>…:2/64</code>"
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@@ -3423,11 +3496,13 @@ msgstr ""
"динамічної конфігурації вузла\">DHCP</abbr> у локальній мережі"
msgid "This is the plain username for logging into the account"
-msgstr ""
+msgstr "Це звичайне Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ до облікового запиÑу"
msgid ""
"This is the prefix routed to you by the tunnel broker for use by clients"
msgstr ""
+"Це префікÑ, що надÑилаєтьÑÑ Ð´Ð¾ Ð²Ð°Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŒÐ½Ð¸Ð¼ брокером Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ "
+"клієнтами"
msgid "This is the system crontab in which scheduled tasks can be defined."
msgstr ""
@@ -3437,15 +3512,13 @@ msgstr ""
msgid ""
"This is usually the address of the nearest PoP operated by the tunnel broker"
msgstr ""
-"Зазвичай, це адреÑа найближчої точки приÑутноÑÑ‚Ñ–, що управлÑєтьÑÑ Ñ‚ÑƒÐ½ÐµÐ»Ð½Ð¸Ð¼ "
+"Зазвичай, це адреÑа найближчої точки приÑутноÑÑ‚Ñ–, що управлÑєтьÑÑ Ñ‚ÑƒÐ½ÐµÐ»ÑŒÐ½Ð¸Ð¼ "
"брокером"
msgid ""
"This list gives an overview over currently running system processes and "
"their status."
-msgstr ""
-"У цьому ÑпиÑку наведені працюючі на даний момент ÑиÑтемні процеÑи та Ñ—Ñ… "
-"ÑтатуÑ."
+msgstr "У цьому ÑпиÑку наведено працюючі наразі ÑиÑтемні процеÑи та Ñ—Ñ… Ñтан."
msgid "This page gives an overview over currently active network connections."
msgstr "Ð¦Ñ Ñторінка надає оглÑд поточних активних мережних підключень."
@@ -3457,7 +3530,7 @@ msgid "Time Synchronization"
msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу"
msgid "Time Synchronization is not configured yet."
-msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу не наÑтроєна."
+msgstr "Синхронізацію чаÑу не налаштовано."
msgid "Timezone"
msgstr "ЧаÑовий поÑÑ"
@@ -3470,7 +3543,7 @@ msgstr ""
"архів резервної копії."
msgid "Tone"
-msgstr ""
+msgstr "Тоновий"
msgid "Total Available"
msgstr "УÑього доÑтупно"
@@ -3488,7 +3561,7 @@ msgid "Transmission Rate"
msgstr "ШвидкіÑÑ‚ÑŒ передаваннÑ"
msgid "Transmit"
-msgstr "Передача"
+msgstr "ПередаваннÑ"
msgid "Transmit Power"
msgstr "ПотужніÑÑ‚ÑŒ передавача"
@@ -3509,16 +3582,7 @@ msgid "Tunnel Interface"
msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŽ"
msgid "Tunnel Link"
-msgstr ""
-
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
+msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŽ"
msgid "Tx-Power"
msgstr "ПотужніÑÑ‚ÑŒ передавача"
@@ -3539,7 +3603,7 @@ msgid "USB Device"
msgstr "USB-приÑтрій"
msgid "USB Ports"
-msgstr ""
+msgstr "USB-порт"
msgid "UUID"
msgstr "UUID"
@@ -3548,7 +3612,7 @@ msgid "Unable to dispatch"
msgstr "Ðе вдалоÑÑ Ð¾Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ñ‚Ð¸ запит"
msgid "Unavailable Seconds (UAS)"
-msgstr ""
+msgstr "ÐедоÑтупні Ñекунди (<abbr title=\"Unavailable Seconds\">UAS</abbr>)"
msgid "Unknown"
msgstr "Ðевідомо"
@@ -3560,7 +3624,7 @@ msgid "Unmanaged"
msgstr "Ðекерований"
msgid "Unmount"
-msgstr ""
+msgstr "Демонтувати"
msgid "Unsaved Changes"
msgstr "Ðезбережені зміни"
@@ -3568,17 +3632,20 @@ msgstr "Ðезбережені зміни"
msgid "Unsupported protocol type."
msgstr "Ðепідтримуваний тип протоколу."
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
-msgstr "Оновити ÑпиÑки..."
+msgstr "Оновити ÑпиÑки"
msgid ""
"Upload a sysupgrade-compatible image here to replace the running firmware. "
"Check \"Keep settings\" to retain the current configuration (requires a "
"compatible firmware image)."
msgstr ""
-"Відвантажити sysupgrade-ÑуміÑний образ, щоб замінити поточну прошивку. Ð”Ð»Ñ "
-"Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— конфігурації вÑтановіть прапорець \"Зберегти наÑтройки"
-"\" (потрібен ÑуміÑний образ прошивки)."
+"Відвантажити sysupgrade-ÑуміÑний образ, щоб замінити поточну мікропрограму. "
+"Ð”Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— конфігурації вÑтановіть прапорець \"Зберегти "
+"налаштуваннÑ\" (потрібен ÑуміÑний образ мікропрограми)."
msgid "Upload archive..."
msgstr "Відвантажити архів..."
@@ -3608,16 +3675,16 @@ msgid "Use TTL on tunnel interface"
msgstr "ВикориÑтовувати на тунельному інтерфейÑÑ– TTL"
msgid "Use as external overlay (/overlay)"
-msgstr ""
+msgstr "ВикориÑтовувати Ñк зовнішній оверлей (/overlay)"
msgid "Use as root filesystem (/)"
-msgstr ""
+msgstr "ВикориÑтовувати Ñк кореневу файлову ÑиÑтему (/)"
msgid "Use broadcast flag"
msgstr "ВикориÑтовувати прапорець широкомовноÑÑ‚Ñ–"
msgid "Use builtin IPv6-management"
-msgstr ""
+msgstr "ВикориÑтовувати вбудоване ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ IPv6"
msgid "Use custom DNS servers"
msgstr "ВикориÑтовувати оÑобливі DNS-Ñервери"
@@ -3640,8 +3707,8 @@ msgid ""
msgstr ""
"ВикориÑтовуйте кнопку <em>Додати</em>, щоб додати новий Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸. "
"<em>MAC-адреÑа</em> ідентифікує вузол, <em>IPv4-адреÑа</em> визначає "
-"фікÑовану адреÑу, Ñка буде викориÑтовуватиÑÑ, а <em>Ðазва (ім'Ñ) вузла</em> "
-"призначає Ñимволічне ім'Ñ Ð²ÑƒÐ·Ð»Ð°."
+"фікÑовану адреÑу, Ñка буде викориÑтовуватиÑÑ, а <em>Ðазва (ім’Ñ) вузла</em> "
+"призначає Ñимволічне Ñ–Ð¼â€™Ñ Ð²ÑƒÐ·Ð»Ð°."
msgid "Used"
msgstr "ВикориÑтано"
@@ -3653,21 +3720,24 @@ msgid ""
"Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not "
"needed with normal WPA(2)-PSK."
msgstr ""
+"ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´Ð²Ð¾Ñ… різних цілей: RADIUS NAS ID Ñ– 802.11r <abbr title="
+"\"ідентифікатор влаÑника ключа R0\">R0KH-ID</abbr>. Ðе потрібно за "
+"звичайного WPA(2)-PSK."
msgid "User certificate (PEM encoded)"
-msgstr ""
+msgstr "Сертифікат кориÑтувача (PEM-кодований)"
msgid "User key (PEM encoded)"
-msgstr ""
+msgstr "Ключ кориÑтувача (PEM-кодований)"
msgid "Username"
-msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
+msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "VC-Mux"
msgstr "VC-Mux"
msgid "VDSL"
-msgstr ""
+msgstr "VDSL"
msgid "VLANs on %q"
msgstr "VLAN на %q"
@@ -3676,35 +3746,29 @@ msgid "VLANs on %q (%s)"
msgstr "VLAN на %q (%s)"
msgid "VPN Local address"
-msgstr ""
+msgstr "Локальна адреÑа VPN"
msgid "VPN Local port"
-msgstr ""
+msgstr "Локальний порт VPN"
msgid "VPN Server"
msgstr "VPN-Ñервер"
msgid "VPN Server port"
-msgstr ""
+msgstr "Порт VPN-Ñервера"
msgid "VPN Server's certificate SHA1 hash"
-msgstr ""
+msgstr "SHA1-геш Ñертифіката VPN-Ñервера"
msgid "VPNC (CISCO 3000 (and others) VPN)"
-msgstr ""
+msgstr "VPNC (CISCO 3000 (та інш.) VPN)"
msgid "Vendor"
-msgstr ""
+msgstr "ПоÑтачальник"
msgid "Vendor Class to send when requesting DHCP"
msgstr "ÐšÐ»Ð°Ñ Ð¿Ð¾Ñтачальника Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ при запиті DHCP"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "Перевірте"
@@ -3724,7 +3788,7 @@ msgid "WEP passphrase"
msgstr "Парольна фраза WEP"
msgid "WMM Mode"
-msgstr "Режим WMM"
+msgstr "Режим <abbr title=\"Wi-Fi Multimedia\">WMM</abbr>"
msgid "WPA passphrase"
msgstr "Парольна фраза WPA"
@@ -3736,41 +3800,36 @@ msgstr ""
"WPA-ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” інÑталÑції <em>wpa_supplicant</em> (Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ "
"клієнта) або <em>hostapd</em> (Ð´Ð»Ñ Ð¢Ð¾Ñ‡ÐºÐ¸ доÑтупу та режиму ad-hoc)."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "Очікуємо, доки зміни наберуть чинноÑÑ‚Ñ–..."
msgid "Waiting for command to complete..."
msgstr "Очікуємо Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "Чекаємо на заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ—â€¦ %d c"
+
msgid "Waiting for device..."
-msgstr ""
+msgstr "Очікуємо приÑтрій..."
msgid "Warning"
msgstr "ЗаÑтереженнÑ"
msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
+"ЗаÑтереженнÑ: Є незбережені зміни, Ñкі буде втрачено при перезавантаженні!"
msgid ""
"When using a PSK, the PMK can be generated locally without inter AP "
"communications"
msgstr ""
-
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
+"При викориÑтанні PSK, PMK може бути Ñтворений локально без взаємодії між AP"
msgid "Width"
-msgstr ""
+msgstr "Ширина"
msgid "WireGuard VPN"
-msgstr ""
+msgstr "WireGuard VPN"
msgid "Wireless"
msgstr "Бездротові мережі"
@@ -3788,19 +3847,19 @@ msgid "Wireless Security"
msgstr "Безпека бездротової мережі"
msgid "Wireless is disabled or not associated"
-msgstr "Бездротову мережу вимкнено або не пов'Ñзано"
+msgstr "Бездротову мережу вимкнено або не пов’Ñзано"
msgid "Wireless is restarting..."
msgstr "Бездротова мережа перезапуÑкаєтьÑÑ..."
msgid "Wireless network is disabled"
-msgstr "Бездротова мережа вимкнена"
+msgstr "Бездротову мережу вимкнено"
msgid "Wireless network is enabled"
-msgstr "Бездротова мережа ввімкнена"
+msgstr "Бездротову мережу ввімкнено"
msgid "Wireless restarted"
-msgstr "Бездротова мережа перезапущена"
+msgstr "Бездротову мережу перезапущено"
msgid "Wireless shut down"
msgstr "Бездротова мережа припинила роботу"
@@ -3809,7 +3868,7 @@ msgid "Write received DNS requests to syslog"
msgstr "ЗапиÑувати отримані DNS-запити до ÑиÑтемного журналу"
msgid "Write system log to file"
-msgstr ""
+msgstr "ЗапиÑувати cиÑтемний журнал до файлу"
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
@@ -3824,14 +3883,17 @@ msgstr ""
msgid ""
"You must enable JavaScript in your browser or LuCI will not work properly."
msgstr ""
-"Ви повинні увімкнути JavaScript у вашому браузері, або LuCI не буде "
-"працювати належним чином."
+"Вам Ñлід увімкнути JavaScript у вашому браузері, або LuCI не буде працювати "
+"належним чином."
msgid ""
"Your Internet Explorer is too old to display this page correctly. Please "
"upgrade it to at least version 7 or use another browser like Firefox, Opera "
"or Safari."
msgstr ""
+"Ваш Internet Explorer занадто Ñтарий, щоб правильно відобразити цю Ñторінку. "
+"Поновіть його, принаймні, до верÑÑ–Ñ— 7 або ÑкориÑтайтеÑÑŒ іншим браузером, "
+"таким Ñк Firefox, Opera або Safari."
msgid "any"
msgstr "будь-Ñкий"
@@ -3843,13 +3905,16 @@ msgid "baseT"
msgstr "baseT"
msgid "bridged"
-msgstr "зв'Ñзано"
+msgstr "зв’Ñзано"
+
+msgid "create"
+msgstr "Ñтворити"
msgid "create:"
msgstr "Ñтворити:"
msgid "creates a bridge over specified interface(s)"
-msgstr "Створити міÑÑ‚ через вказаний інтерфейÑ(и)"
+msgstr "Створює міÑÑ‚ через зазначені інтерфейÑи"
msgid "dB"
msgstr "дБ"
@@ -3861,7 +3926,7 @@ msgid "disable"
msgstr "вимкнено"
msgid "disabled"
-msgstr ""
+msgstr "вимкнено"
msgid "expired"
msgstr "минув"
@@ -3874,7 +3939,7 @@ msgstr ""
"Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-оренди"
msgid "forward"
-msgstr "переÑлати"
+msgstr "переÑпрÑмувати"
msgid "full-duplex"
msgstr "повний дуплекÑ"
@@ -3882,14 +3947,11 @@ msgstr "повний дуплекÑ"
msgid "half-duplex"
msgstr "напівдуплекÑ"
-msgid "help"
-msgstr "довідка"
-
msgid "hidden"
msgstr "прихований"
msgid "hybrid mode"
-msgstr ""
+msgstr "гібридний режим"
msgid "if target is a network"
msgstr "Ñкщо мета — мережа"
@@ -3911,23 +3973,20 @@ msgstr ""
"Локальний <abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</"
"abbr>-файл"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
-msgstr ""
+msgstr "хв."
msgid "no"
msgstr "ні"
msgid "no link"
-msgstr "нема з'єднаннÑ"
+msgstr "нема з’єднаннÑ"
msgid "none"
msgstr "нема нічого"
msgid "not present"
-msgstr ""
+msgstr "не приÑутній"
msgid "off"
msgstr "вимкнено"
@@ -3938,35 +3997,38 @@ msgstr "увімкнено"
msgid "open"
msgstr "відкрита"
+msgid "output"
+msgstr "вихід"
+
msgid "overlay"
-msgstr ""
+msgstr "оверлей"
msgid "random"
-msgstr ""
+msgstr "випадковий"
msgid "relay mode"
-msgstr ""
+msgstr "режим реле"
msgid "routed"
msgstr "ÑпрÑмовано"
msgid "server mode"
-msgstr ""
+msgstr "режим Ñервера"
msgid "stateful-only"
-msgstr ""
+msgstr "тільки ЗІ збереженнÑм Ñтану"
msgid "stateless"
-msgstr ""
+msgstr "БЕЗ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñтану"
msgid "stateless + stateful"
-msgstr ""
+msgstr "БЕЗ та ЗІ збереженнÑм Ñтану"
msgid "tagged"
-msgstr "з позначкою"
+msgstr "позначено"
msgid "time units (TUs / 1.024 ms) [1000-65535]"
-msgstr ""
+msgstr "одиниці чаÑу (TUs / 1.024 ms) [1000-65535]"
msgid "unknown"
msgstr "невідомий"
@@ -3978,10 +4040,10 @@ msgid "unspecified"
msgstr "не визначено"
msgid "unspecified -or- create:"
-msgstr "не визначено -або- Ñтворити"
+msgstr "не визначено -або- Ñтворити:"
msgid "untagged"
-msgstr "без позначки"
+msgstr "не позначено"
msgid "yes"
msgstr "так"
@@ -3989,95 +4051,30 @@ msgstr "так"
msgid "« Back"
msgstr "« Ðазад"
-#~ msgid "Action"
-#~ msgstr "ДіÑ"
-
-#~ msgid "Buttons"
-#~ msgstr "Кнопки"
-
-#~ msgid "Handler"
-#~ msgstr "Обробник"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "МакÑимальний Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Мінімальний Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "ШлÑÑ… до програми, Ñка оброблÑÑ” натиÑÐºÐ°Ð½Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Визначає Ñтан кнопки Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸"
+#~ msgid "DHCP Leases"
+#~ msgstr "Оренди DHCP"
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr "Ð¦Ñ Ñторінка дозволÑÑ” наÑтроїти нетипові дії кнопки"
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "Оренди DHCPv6"
-#~ msgid "Leasetime"
-#~ msgstr "Ð§Ð°Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸"
+#~ 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 "AR Support"
-#~ msgstr "Підтримка AR"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Бездротовий 802.11%s контролер Atheros"
-
-#~ msgid "Background Scan"
-#~ msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ фоновому режимі"
-
-#~ msgid "Compression"
-#~ msgstr "СтиÑненнÑ"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Вимкнути таймер HW-Beacon"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Ðе надÑилати відповіді на зондуваннÑ"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Швидкі фрейми"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "МакÑимальна швидкіÑÑ‚ÑŒ"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Мінімальна швидкіÑÑ‚ÑŒ"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "ШвидкіÑÑ‚ÑŒ багатоадреÑного потоку"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Зовнішні канали"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "РегулÑтивний домен"
-
-#~ msgid "Separate WDS"
-#~ msgstr "РозділÑти WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Статичний WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Режим Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Підтримка XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Якщо ви залишите це невибраним, буде Ñтворена додаткова мережа."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі: ÐаÑтройки"
-
-#~ msgid "CPU"
-#~ msgstr "ЦП"
-
-#~ msgid "Port %d"
-#~ msgstr "Порт %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Порт %d нетегований у кількох VLAN-ах!"
-
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN-інтерфейÑ"
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "ДійÑно вимкнути мережу? Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо "
+#~ "Ð²Ð°Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾ через цю мережу."
+
+#~ msgid "Sort"
+#~ msgstr "СортуваннÑ"
+
+#~ msgid "help"
+#~ msgstr "довідка"
diff --git a/modules/luci-base/po/vi/base.po b/modules/luci-base/po/vi/base.po
index 888fc92bfe..cfd6caa5c4 100644
--- a/modules/luci-base/po/vi/base.po
+++ b/modules/luci-base/po/vi/base.po
@@ -49,6 +49,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr ""
@@ -166,9 +169,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -202,9 +202,6 @@ msgstr ""
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr ""
@@ -307,11 +304,6 @@ msgstr ""
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -390,11 +382,14 @@ msgstr ""
msgid "Any zone"
msgstr ""
-msgid "Apply"
-msgstr "Ãp dụng"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
-msgid "Applying changes"
-msgstr "Tiến hành thay đổi"
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -410,6 +405,9 @@ msgstr ""
msgid "Associated Stations"
msgstr ""
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -500,9 +498,6 @@ msgstr ""
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -571,12 +566,20 @@ msgstr "Thay đổi"
msgid "Changes applied."
msgstr "Thay đổi đã áp dụng"
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr ""
msgid "Channel"
msgstr "Kênh"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr ""
@@ -646,10 +649,13 @@ msgstr ""
msgid "Configuration"
msgstr "Cấu hình"
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
msgstr ""
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
msgstr ""
msgid "Confirmation"
@@ -664,10 +670,13 @@ msgstr ""
msgid "Connection Limit"
msgstr "Giới hạn kết nối"
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
msgstr ""
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
msgstr ""
msgid "Country"
@@ -723,9 +732,6 @@ msgstr ""
"Tùy chỉnh chế độ của thiết bị <abbr title=\"Light Emitting Diode\">LED</"
"abbr>s nếu có thể."
-msgid "DHCP Leases"
-msgstr ""
-
msgid "DHCP Server"
msgstr ""
@@ -738,9 +744,6 @@ msgstr ""
msgid "DHCP-Options"
msgstr "Tùy chá»n DHCP"
-msgid "DHCPv6 Leases"
-msgstr ""
-
msgid "DHCPv6 client"
msgstr ""
@@ -798,9 +801,6 @@ msgstr ""
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr ""
@@ -840,6 +840,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
@@ -872,6 +875,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr ""
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr ""
@@ -923,6 +929,9 @@ msgstr ""
"Don&amp;#39;t chuyển tiếp <abbr title=\"Hệ thống tên miá»n\">DNS</abbr>-Yêu "
"cầu không cần <abbr title=\"Hệ thống tên miá»n\">DNS</abbr>-Tên"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "Tải và cài đặt gói"
@@ -1036,6 +1045,9 @@ msgstr ""
msgid "Enable this mount"
msgstr ""
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr ""
@@ -1068,6 +1080,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr ""
@@ -1126,6 +1144,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr ""
@@ -1247,7 +1268,7 @@ msgstr ""
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1319,9 +1340,6 @@ msgstr "Hang Up"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1379,7 +1397,7 @@ msgstr ""
msgid "IPv4 Firewall"
msgstr ""
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
msgstr ""
msgid "IPv4 address"
@@ -1430,15 +1448,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
msgstr ""
msgid "IPv6 address"
msgstr ""
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2014,9 +2029,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr ""
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "Tên"
@@ -2140,6 +2152,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr ""
@@ -2191,12 +2206,6 @@ msgstr ""
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2548,12 +2557,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr>-Server"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"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!\\nYou "
+"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 ""
@@ -2561,12 +2570,12 @@ msgid "Really reset all changes?"
msgstr ""
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
@@ -2657,9 +2666,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2718,6 +2724,15 @@ msgstr ""
msgid "Revert"
msgstr "Revert"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr ""
@@ -2733,9 +2748,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2761,14 +2773,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2796,9 +2800,6 @@ msgstr "LÆ°u"
msgid "Save & Apply"
msgstr "Lưu & áp dụng "
-msgid "Save &#38; Apply"
-msgstr ""
-
msgid "Scan"
msgstr "Scan"
@@ -2825,17 +2826,6 @@ msgstr "Cô lập đối tượng"
msgid "Server Settings"
msgstr ""
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr ""
@@ -2922,15 +2912,9 @@ msgid ""
"instructions."
msgstr ""
-msgid "Sort"
-msgstr ""
-
msgid "Source"
msgstr "Nguồn"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr ""
@@ -2969,6 +2953,9 @@ msgstr "Bắt đầu "
msgid "Start priority"
msgstr "Bắt đầu ưu tiên"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr ""
@@ -3119,6 +3106,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3139,9 +3136,6 @@ msgid ""
"\"Proceed\" below to start the flash procedure."
msgstr ""
-msgid "The following changes have been committed"
-msgstr ""
-
msgid "The following changes have been reverted"
msgstr "Những thay đối sau đây đã được để trở vỠtình trạng cũ. "
@@ -3199,11 +3193,6 @@ msgstr ""
"máy tính để tiếp cận thiết bị một lần nữa, phụ thuộc vào cài đặt của bạn. "
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3213,7 +3202,7 @@ msgstr ""
msgid "There are no active leases."
msgstr ""
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
msgstr ""
msgid "There are no pending changes to revert!"
@@ -3353,15 +3342,6 @@ msgstr ""
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr ""
@@ -3410,6 +3390,9 @@ msgstr "Thay đổi không lưu"
msgid "Unsupported protocol type."
msgstr ""
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr ""
@@ -3534,12 +3517,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr ""
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr ""
@@ -3569,16 +3546,15 @@ msgid ""
"and ad-hoc mode) to be installed."
msgstr ""
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3593,12 +3569,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3676,6 +3646,9 @@ msgstr ""
msgid "bridged"
msgstr ""
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr ""
@@ -3713,9 +3686,6 @@ msgstr ""
msgid "half-duplex"
msgstr ""
-msgid "help"
-msgstr ""
-
msgid "hidden"
msgstr ""
@@ -3740,9 +3710,6 @@ msgstr ""
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "Tập tin <abbr title=\"Domain Name System\">DNS</abbr> địa phương"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3767,6 +3734,9 @@ msgstr ""
msgid "open"
msgstr ""
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3818,6 +3788,12 @@ msgstr ""
msgid "« Back"
msgstr ""
+#~ msgid "Apply"
+#~ msgstr "Ãp dụng"
+
+#~ msgid "Applying changes"
+#~ msgstr "Tiến hành thay đổi"
+
#~ msgid "Action"
#~ msgstr "Action"
diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po
index df6ce8b746..9490022f55 100644
--- a/modules/luci-base/po/zh-cn/base.po
+++ b/modules/luci-base/po/zh-cn/base.po
@@ -39,6 +39,9 @@ msgstr "-- æ ¹æ®æ ‡ç­¾åŒ¹é… --"
msgid "-- match by uuid --"
msgstr "-- æ ¹æ® UUID åŒ¹é… --"
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "1 分钟负载:"
@@ -162,9 +165,6 @@ msgstr "A43C + J43 + A43 + V43"
msgid "ADSL"
msgstr "ADSL"
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
msgid "ANSI T1.413"
msgstr "ANSI T1.413"
@@ -200,9 +200,6 @@ msgstr "ATM 设备å·ç "
msgid "ATU-C System Vendor ID"
msgstr "ATU-C 系统供应商 ID"
-msgid "AYIYA"
-msgstr "AYIYA"
-
msgid "Access Concentrator"
msgstr "接入集中器"
@@ -305,13 +302,6 @@ msgstr "å…许 127.0.0.0/8 回环范围内的上行å“应,例如:RBL æœåŠ¡"
msgid "Allowed IPs"
msgstr "å…许的 IP"
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"也请查看 SIXXS 上的<a href=\"https://www.sixxs.net/faq/connectivity/?"
-"faq=comparison\">隧é“对比</a>"
-
msgid "Always announce default router"
msgstr "总是通告默认路由"
@@ -390,11 +380,14 @@ msgstr "天线é…ç½®"
msgid "Any zone"
msgstr "ä»»æ„区域"
-msgid "Apply"
-msgstr "应用"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr "åº”ç”¨è¯·æ±‚å¤±è´¥ï¼ŒçŠ¶æ€ <code>%h</code>"
+
+msgid "Apply unchecked"
+msgstr "应用未选中"
-msgid "Applying changes"
-msgstr "正在应用更改"
+msgid "Architecture"
+msgstr "架构"
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -410,6 +403,9 @@ msgstr "将此åå…­è¿›åˆ¶å­ ID å‰ç¼€åˆ†é…给此接å£"
msgid "Associated Stations"
msgstr "已连接站点"
+msgid "Associations"
+msgstr "å…³è”æ•°"
+
msgid "Auth Group"
msgstr "认è¯ç»„"
@@ -500,9 +496,6 @@ msgstr "指定了错误的地å€ï¼"
msgid "Band"
msgstr "频宽"
-msgid "Behind NAT"
-msgstr "在 NAT 网络内"
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -571,7 +564,10 @@ msgid "Changes"
msgstr "修改数"
msgid "Changes applied."
-msgstr "更改已应用"
+msgstr "更改已应用。"
+
+msgid "Changes have been reverted."
+msgstr "更改已å–消。"
msgid "Changes the administrator password for accessing the device"
msgstr "修改访问设备的管ç†å‘˜å¯†ç "
@@ -579,6 +575,11 @@ msgstr "修改访问设备的管ç†å‘˜å¯†ç "
msgid "Channel"
msgstr "ä¿¡é“"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr "ä¿¡é“ %d 在 %s 监管区域内ä¸å¯ç”¨å¹¶å·²è‡ªåŠ¨è°ƒæ•´åˆ° %d。"
+
msgid "Check"
msgstr "检查"
@@ -655,12 +656,15 @@ msgstr ""
msgid "Configuration"
msgstr "é…ç½®"
-msgid "Configuration applied."
-msgstr "é…置已应用。"
-
msgid "Configuration files will be kept."
msgstr "é…置文件将被ä¿ç•™ã€‚"
+msgid "Configuration has been applied."
+msgstr "é…置已应用。"
+
+msgid "Configuration has been rolled back!"
+msgstr "é…置已回滚ï¼"
+
msgid "Confirmation"
msgstr "确认密ç "
@@ -673,12 +677,17 @@ msgstr "已连接"
msgid "Connection Limit"
msgstr "连接数é™åˆ¶"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "当 TLS ä¸å¯ç”¨æ—¶ï¼Œä¸ŽæœåŠ¡å™¨è¿žæŽ¥å¤±è´¥"
-
msgid "Connections"
msgstr "连接"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+"应用é…置更改åŽï¼Œæ— æ³•é‡æ–°èŽ·å¾—对设备的访问æƒé™ã€‚如果您修改了网络相关设置如 IP "
+"地å€æˆ–无线安全è¯ä¹¦ï¼Œåˆ™å¯èƒ½éœ€è¦é‡æ–°è¿žæŽ¥ã€‚"
+
msgid "Country"
msgstr "国家"
@@ -731,9 +740,6 @@ msgid ""
"\">LED</abbr>s if possible."
msgstr "自定义此设备的 <abbr title=\"Light Emitting Diode\">LED</abbr> 行为。"
-msgid "DHCP Leases"
-msgstr "DHCP 分é…"
-
msgid "DHCP Server"
msgstr "DHCP æœåŠ¡å™¨"
@@ -746,9 +752,6 @@ msgstr "DHCP 客户端"
msgid "DHCP-Options"
msgstr "DHCP 选项"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6 分é…"
-
msgid "DHCPv6 client"
msgstr "DHCPv6 客户端"
@@ -806,9 +809,6 @@ msgstr "默认网关"
msgid "Default is stateless + stateful"
msgstr "默认是无状æ€çš„ + 有状æ€çš„"
-msgid "Default route"
-msgstr "默认路由"
-
msgid "Default state"
msgstr "默认状æ€"
@@ -850,6 +850,9 @@ msgstr "设备正在é‡å¯..."
msgid "Device unreachable"
msgstr "无法连接到设备"
+msgid "Device unreachable!"
+msgstr "无法连接到设备ï¼"
+
msgid "Diagnostics"
msgstr "网络诊断"
@@ -884,6 +887,9 @@ msgstr "ç¦ç”¨ï¼ˆé»˜è®¤ï¼‰"
msgid "Discard upstream RFC1918 responses"
msgstr "丢弃 RFC1918 上行å“应数æ®"
+msgid "Dismiss"
+msgstr "解除"
+
msgid "Displaying only packages containing"
msgstr "åªæ˜¾ç¤ºæœ‰å†…容的软件包"
@@ -933,6 +939,9 @@ msgid ""
msgstr ""
"ä¸è½¬å‘没有 <abbr title=\"Domain Name System\">DNS</abbr> å称的解æžè¯·æ±‚"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "下载并安装软件包"
@@ -997,6 +1006,7 @@ msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
+"å¯ç”¨ <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> 窥探"
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "å¼€å¯ <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1046,6 +1056,9 @@ msgstr "å¯ç”¨åŽæŠ¥æ–‡çš„ DF(ç¦æ­¢åˆ†ç‰‡ï¼‰æ ‡å¿—。"
msgid "Enable this mount"
msgstr "å¯ç”¨æ­¤æŒ‚载点"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "å¯ç”¨æ­¤ swap 分区"
@@ -1056,7 +1069,7 @@ msgid "Enabled"
msgstr "å¯ç”¨"
msgid "Enables IGMP snooping on this bridge"
-msgstr ""
+msgstr "在此桥接上å¯ç”¨ IGMP 窥探"
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
@@ -1078,6 +1091,12 @@ msgstr "端点主机"
msgid "Endpoint Port"
msgstr "端点端å£"
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "擦除中..."
@@ -1136,6 +1155,9 @@ msgstr ""
msgid "FT protocol"
msgstr "FT åè®®"
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr "在 %d 秒内确认应用失败,等待回滚..."
+
msgid "File"
msgstr "文件"
@@ -1257,10 +1279,10 @@ msgstr "空闲空间"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
-"有关 WireGuard 接å£å’Œ Peer 的更多信æ¯ï¼š<a href=\"http://wireguard.io"
-"\">wireguard.io</a>。"
+"有关 WireGuard 接å£å’Œ Peer 的更多信æ¯ï¼š<a href=\"http://wireguard.com"
+"\">wireguard.com</a>。"
msgid "GHz"
msgstr "GHz"
@@ -1331,9 +1353,6 @@ msgstr "挂起"
msgid "Header Error Code Errors (HEC)"
msgstr "请求头错误代ç é”™è¯¯ï¼ˆHEC)"
-msgid "Heartbeat"
-msgstr "心跳"
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1389,8 +1408,8 @@ msgstr "IPv4"
msgid "IPv4 Firewall"
msgstr "IPv4 防ç«å¢™"
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN 状æ€"
+msgid "IPv4 Upstream"
+msgstr "IPv4 上游"
msgid "IPv4 address"
msgstr "IPv4 地å€"
@@ -1440,15 +1459,12 @@ msgstr "IPv6 设置"
msgid "IPv6 ULA-Prefix"
msgstr "IPv6 ULA å‰ç¼€"
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN 状æ€"
+msgid "IPv6 Upstream"
+msgstr "IPv6 上游"
msgid "IPv6 address"
msgstr "IPv6 地å€"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr "绑定到隧é“本端的 IPv6 地å€ï¼ˆå¯é€‰ï¼‰"
-
msgid "IPv6 assignment hint"
msgstr "IPv6 分é…æ示"
@@ -2030,9 +2046,6 @@ msgstr "NT 域"
msgid "NTP server candidates"
msgstr "候选 NTP æœåŠ¡å™¨"
-msgid "NTP sync time-out"
-msgstr "NTP åŒæ­¥è¶…æ—¶"
-
msgid "Name"
msgstr "å称"
@@ -2156,6 +2169,9 @@ msgstr "混淆组密ç "
msgid "Obfuscated Password"
msgstr "混淆密ç "
+msgid "Obtain IPv6-Address"
+msgstr "èŽ·å– IPv6 地å€"
+
msgid "Off-State Delay"
msgstr "关闭时间"
@@ -2205,12 +2221,6 @@ msgstr "移除的选项"
msgid "Optional"
msgstr "å¯é€‰"
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr "å¯é€‰ï¼Œè®¾ç½®è¿™ä¸ªé€‰é¡¹ä¼šè¦†ç›–默认æœåŠ¡å™¨ï¼ˆtic.sixxs.net)"
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr "å¯é€‰ï¼Œå¦‚果您的 SIXXS è´¦å·æ‹¥æœ‰ä¸€ä¸ªä»¥ä¸Šçš„隧é“请设置此项"
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2568,13 +2578,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr> æœåŠ¡å™¨"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"确定è¦åˆ é™¤æ­¤æŽ¥å£ï¼Ÿåˆ é™¤æ“作无法撤销ï¼\\n删除此接å£ï¼Œå¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼"
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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删除此无线网络,å¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®"
@@ -2584,14 +2593,12 @@ msgid "Really reset all changes?"
msgstr "确定è¦æ”¾å¼ƒæ‰€æœ‰æ›´æ”¹ï¼Ÿ"
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"确定è¦å…³é—­æ­¤ç½‘络?\\n如果您正在使用此接å£è¿žæŽ¥è·¯ç”±å™¨ï¼Œå…³é—­æ­¤ç½‘络å¯èƒ½å¯¼è‡´è¿žæŽ¥æ–­"
-"å¼€ï¼"
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"确定è¦å…³é—­æŽ¥å£ \"%s\"?\\n如果您正在使用此接å£è¿žæŽ¥è·¯ç”±å™¨ï¼Œå…³é—­æ­¤ç½‘络å¯èƒ½å¯¼è‡´"
@@ -2684,9 +2691,6 @@ msgstr "请求 IPv6 地å€"
msgid "Request IPv6-prefix of length"
msgstr "请求指定长度的 IPv6 å‰ç¼€"
-msgid "Require TLS"
-msgstr "必须使用 TLS"
-
msgid "Required"
msgstr "å¿…é¡»"
@@ -2747,7 +2751,16 @@ msgid "Reveal/hide password"
msgstr "显示/éšè— 密ç "
msgid "Revert"
-msgstr "放弃"
+msgstr "æ¢å¤"
+
+msgid "Revert changes"
+msgstr "æ¢å¤æ›´æ”¹"
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr "æ¢å¤è¯·æ±‚å¤±è´¥ï¼ŒçŠ¶æ€ <code>%h</code>"
+
+msgid "Reverting configuration…"
+msgstr "正在æ¢å¤é…ç½®..."
msgid "Root"
msgstr "Root"
@@ -2764,9 +2777,6 @@ msgstr "路由å…许的 IP"
msgid "Route type"
msgstr "路由类型"
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "下行接å£çš„路由 IPv6 å‰ç¼€"
-
msgid "Router Advertisement-Service"
msgstr "路由通告æœåŠ¡"
@@ -2790,14 +2800,6 @@ msgstr "文件系统检查"
msgid "SHA256"
msgstr "SHA256"
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr "SIXXS ä»…æ”¯æŒ TIC,对于使用 IP åè®® 41(RFC4213)的é™æ€éš§é“,使用 6in4"
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr "SIXXS-handle[/Tunnel-ID]"
-
msgid "SNR"
msgstr "SNR"
@@ -2823,10 +2825,7 @@ msgid "Save"
msgstr "ä¿å­˜"
msgid "Save & Apply"
-msgstr "ä¿å­˜&应用"
-
-msgid "Save &#38; Apply"
-msgstr "ä¿å­˜&#38;应用"
+msgstr "ä¿å­˜å¹¶åº”用"
msgid "Scan"
msgstr "扫æ"
@@ -2854,17 +2853,6 @@ msgstr "隔离客户端"
msgid "Server Settings"
msgstr "æœåŠ¡å™¨è®¾ç½®"
-msgid "Server password"
-msgstr "æœåŠ¡å™¨å¯†ç "
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr "æœåŠ¡å™¨å¯†ç ï¼Œå¦‚果用户å包å«éš§é“ ID 则在此填写隧é“自己的密ç "
-
-msgid "Server username"
-msgstr "æœåŠ¡å™¨ç”¨æˆ·å"
-
msgid "Service Name"
msgstr "æœåŠ¡å"
@@ -2955,15 +2943,9 @@ msgstr ""
"抱歉,您的设备暂ä¸æ”¯æŒ sysupgrade å‡çº§ï¼Œéœ€æ‰‹åŠ¨æ›´æ–°å›ºä»¶ã€‚请å‚考 Wiki 中关于此"
"设备的固件更新说明。"
-msgid "Sort"
-msgstr "排åº"
-
msgid "Source"
msgstr "æºåœ°å€"
-msgid "Source routing"
-msgstr "æºè·¯ç”±"
-
msgid "Specifies the directory the device is attached to"
msgstr "指定设备的挂载目录"
@@ -3002,6 +2984,9 @@ msgstr "开始"
msgid "Start priority"
msgstr "å¯åŠ¨ä¼˜å…ˆçº§"
+msgid "Starting configuration apply…"
+msgstr "开始应用é…ç½®..."
+
msgid "Startup"
msgstr "å¯åŠ¨é¡¹"
@@ -3159,6 +3144,19 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr "由于以下错误,é…置文件无法被加载:"
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+"åœ¨åº”ç”¨æŒ‚èµ·çš„æ›´æ”¹åŽ %d 秒内无法到达该设备,出于安全原因导致é…置回滚。如果您认"
+"为é…置更改ä»ç„¶æ­£ç¡®ï¼Œè¯·æ‰§è¡Œæœªé€‰ä¸­çš„é…置应用。或者您å¯ä»¥åœ¨å°è¯•å†æ¬¡åº”用之å‰è§£é™¤"
+"此警告并编辑更改,或者还原所有未完æˆçš„更改以ä¿æŒå½“å‰æ­£åœ¨å·¥ä½œçš„é…置状æ€ã€‚"
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr "存储器或分区的设备文件,(例如:<code>/dev/sda1</code>)"
@@ -3179,9 +3177,6 @@ msgstr ""
"固件已上传,请注æ„核对文件大å°å’Œæ ¡éªŒå€¼ï¼<br />点击下é¢çš„“继续â€å¼€å§‹åˆ·å†™ï¼Œåˆ·æ–°"
"过程中切勿断电ï¼"
-msgid "The following changes have been committed"
-msgstr "以下更改已æ交"
-
msgid "The following changes have been reverted"
msgstr "以下更改已放弃"
@@ -3241,11 +3236,6 @@ msgstr ""
"é’ŸåŽå³å¯å°è¯•é‡æ–°è¿žæŽ¥åˆ°è·¯ç”±ã€‚您å¯èƒ½éœ€è¦æ›´æ”¹è®¡ç®—机的 IP 地å€ä»¥é‡æ–°è¿žæŽ¥ã€‚"
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr "隧é“端点在 NAT 之åŽï¼Œé»˜è®¤ä¸ºç¦ç”¨ï¼Œä»…适用于 AYIYA"
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr "ä¸æ”¯æŒæ‰€ä¸Šä¼ çš„映åƒæ–‡ä»¶æ ¼å¼ï¼Œè¯·é€‰æ‹©é€‚åˆå½“å‰å¹³å°çš„通用映åƒæ–‡ä»¶ã€‚"
@@ -3253,8 +3243,8 @@ msgstr "ä¸æ”¯æŒæ‰€ä¸Šä¼ çš„映åƒæ–‡ä»¶æ ¼å¼ï¼Œè¯·é€‰æ‹©é€‚åˆå½“å‰å¹³å°çš„
msgid "There are no active leases."
msgstr "没有已分é…的租约。"
-msgid "There are no pending changes to apply!"
-msgstr "没有待生效的更改ï¼"
+msgid "There are no changes to apply."
+msgstr "没有待生效的更改。"
msgid "There are no pending changes to revert!"
msgstr "没有å¯æ”¾å¼ƒçš„更改ï¼"
@@ -3394,15 +3384,6 @@ msgstr "隧é“接å£"
msgid "Tunnel Link"
msgstr "隧é“链接"
-msgid "Tunnel broker protocol"
-msgstr "隧é“åè®®"
-
-msgid "Tunnel setup server"
-msgstr "隧é“é…ç½®æœåŠ¡å™¨"
-
-msgid "Tunnel type"
-msgstr "隧é“类型"
-
msgid "Tx-Power"
msgstr "传输功率"
@@ -3451,6 +3432,9 @@ msgstr "未ä¿å­˜çš„é…ç½®"
msgid "Unsupported protocol type."
msgstr "ä¸æ”¯æŒçš„å议类型"
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "刷新列表"
@@ -3582,12 +3566,6 @@ msgstr "Vendor"
msgid "Vendor Class to send when requesting DHCP"
msgstr "请求 DHCP æ—¶å‘é€çš„ Vendor Class 选项"
-msgid "Verbose"
-msgstr "详细"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Aiccu 守护程åºè¯¦ç»†æ—¥å¿—"
-
msgid "Verify"
msgstr "验è¯"
@@ -3619,16 +3597,15 @@ msgstr ""
"WPA 加密需è¦å®‰è£… wpa_supplicant(客户端模å¼ï¼‰æˆ–安装 hostapd(接入点 APã€ç‚¹å¯¹"
"点 Ad-Hoc 模å¼ï¼‰ã€‚"
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr "NTP åŒæ­¥å‰çš„等待时间,设置为 0 表示ä¸ç­‰å¾…(å¯é€‰ï¼‰"
-
msgid "Waiting for changes to be applied..."
msgstr "正在应用更改..."
msgid "Waiting for command to complete..."
msgstr "等待命令执行完æˆ..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "等待应用é…ç½®... %d 秒"
+
msgid "Waiting for device..."
msgstr "等待设备..."
@@ -3643,12 +3620,6 @@ msgid ""
"communications"
msgstr "当使用 PSK 时,PMK å¯ä»¥åœ¨æ²¡æœ‰ AP 间通信的情况下在本地生æˆ"
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr "是å¦æ·»åŠ ä¸€æ¡é€šå‘隧é“çš„ IPv6 默认路由"
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "是å¦ä»…路由æ¥è‡ªåˆ†å‘å‰ç¼€çš„æ•°æ®åŒ…"
-
msgid "Width"
msgstr "频宽"
@@ -3726,6 +3697,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "桥接的"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "创建:"
@@ -3763,9 +3737,6 @@ msgstr "å…¨åŒå·¥"
msgid "half-duplex"
msgstr "åŠåŒå·¥"
-msgid "help"
-msgstr "帮助"
-
msgid "hidden"
msgstr "éšè—"
@@ -3790,9 +3761,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "本地 <abbr title=\"Domain Name Syste\">DNS</abbr> 解æžæ–‡ä»¶"
-msgid "minimum 1280, maximum 1480"
-msgstr "最å°å€¼ 1280,最大值 1480"
-
msgid "minutes"
msgstr "分钟"
@@ -3817,11 +3785,14 @@ msgstr "å¼€"
msgid "open"
msgstr "开放å¼"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr "覆盖"
msgid "random"
-msgstr ""
+msgstr "éšæœº"
msgid "relay mode"
msgstr "中继模å¼"
@@ -3868,119 +3839,34 @@ msgstr "是"
msgid "« Back"
msgstr "« åŽé€€"
-#~ msgid "Action"
-#~ msgstr "动作"
-
-#~ msgid "Buttons"
-#~ msgstr "按键"
-
-#~ msgid "Handler"
-#~ msgstr "处ç†ç¨‹åº"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "最大æŒç»­æ—¶é—´"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "最低æŒç»­æ—¶é—´"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "处ç†æŒ‰é”®åŠ¨ä½œçš„å¯æ‰§è¡Œæ–‡ä»¶è·¯å¾„"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "指定è¦å¤„ç†çš„按键状æ€"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr "自定义按键动作。"
-
-#~ msgid "Leasetime"
-#~ msgstr "租用时间"
-
-#~ msgid "Optional."
-#~ msgstr "å¯é€‰ã€‚"
-
-#~ msgid "navigation Navigation"
-#~ msgstr "导航"
-
-#~ msgid "skiplink1 Skip to navigation"
-#~ msgstr "skiplink1 跳转到导航"
-
-#~ msgid "skiplink2 Skip to content"
-#~ msgstr "skiplink2 跳到内容"
-
-#~ msgid "AuthGroup"
-#~ msgstr "认è¯ç»„"
-
-#~ msgid "automatic"
-#~ msgstr "自动"
-
-#~ msgid "AR Support"
-#~ msgstr "AR 支æŒ"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Qualcomm/Atheros 802.11%s 无线控制器"
-
-#~ msgid "Background Scan"
-#~ msgstr "åŽå°æœç´¢"
-
-#~ msgid "Compression"
-#~ msgstr "压缩"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "åœç”¨ HW-Beacon 计时器"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "ä¸å›žé€æŽ¢æµ‹å“应"
-
-#~ msgid "Fast Frames"
-#~ msgstr "快速帧"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "最高速率"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "最低速率"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "多播速率"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "户外频é“"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "无线网络国家区域"
-
-#~ msgid "Separate WDS"
-#~ msgstr "隔离 WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "é™æ€ WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Turbo 模å¼"
-
-#~ msgid "XR Support"
-#~ msgstr "XR 支æŒ"
-
-#~ msgid "Required. Public key of peer."
-#~ msgstr "必须,Peer 的公钥。"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP 分é…"
-#~ msgid "An additional network will be created if you leave this checked."
-#~ msgstr "如果选中此å¤é€‰æ¡†ï¼Œåˆ™ä¼šåˆ›å»ºä¸€ä¸ªé™„加网络。"
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6 分é…"
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "å–消选中将会å¦å¤–创建一个新网络,而ä¸ä¼šè¦†ç›–当å‰ç½‘络设置"
+#~ 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 ""
+#~ "确定è¦åˆ é™¤æ­¤æŽ¥å£ï¼Ÿåˆ é™¤æ“作无法撤销ï¼\\n删除此接å£ï¼Œå¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±"
+#~ "器ï¼"
-#~ msgid "Join Network: Settings"
-#~ msgstr "加入网络:设置"
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "确定è¦å…³é—­æ­¤ç½‘络?\\n如果您正在使用此接å£è¿žæŽ¥è·¯ç”±å™¨ï¼Œå…³é—­æ­¤ç½‘络å¯èƒ½å¯¼è‡´è¿ž"
+#~ "接断开ï¼"
-#~ msgid "CPU"
-#~ msgstr "CPU"
+#~ msgid "Sort"
+#~ msgstr "排åº"
-#~ msgid "Port %d"
-#~ msgstr "ç«¯å£ %d"
+#~ msgid "help"
+#~ msgstr "帮助"
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "ç«¯å£ %d 在多个 VLAN 中å‡æœªæ ‡è®°ï¼"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN 状æ€"
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN 接å£"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN 状æ€"
diff --git a/modules/luci-base/po/zh-tw/base.po b/modules/luci-base/po/zh-tw/base.po
index edc5207bd9..c0e54a5c21 100644
--- a/modules/luci-base/po/zh-tw/base.po
+++ b/modules/luci-base/po/zh-tw/base.po
@@ -47,6 +47,9 @@ msgstr ""
msgid "-- match by uuid --"
msgstr ""
+msgid "-- please select --"
+msgstr ""
+
msgid "1 Minute Load:"
msgstr "1分é˜è² è¼‰"
@@ -167,9 +170,6 @@ msgstr ""
msgid "ADSL"
msgstr ""
-msgid "AICCU (SIXXS)"
-msgstr ""
-
msgid "ANSI T1.413"
msgstr ""
@@ -205,9 +205,6 @@ msgstr "ATMè£ç½®è™Ÿç¢¼"
msgid "ATU-C System Vendor ID"
msgstr ""
-msgid "AYIYA"
-msgstr ""
-
msgid "Access Concentrator"
msgstr "接入集線器"
@@ -310,11 +307,6 @@ msgstr "å…許127.0.0.0/8範åœå…§çš„上游回應,例如:RBLæœå‹™"
msgid "Allowed IPs"
msgstr ""
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
msgid "Always announce default router"
msgstr ""
@@ -393,11 +385,14 @@ msgstr "天線設定"
msgid "Any zone"
msgstr "ä»»æ„å€åŸŸ"
-msgid "Apply"
-msgstr "套用"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
-msgid "Applying changes"
-msgstr "正在套用變更"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
msgid ""
"Assign a part of given length of every public IPv6-prefix to this interface"
@@ -413,6 +408,9 @@ msgstr ""
msgid "Associated Stations"
msgstr "已連接站點"
+msgid "Associations"
+msgstr ""
+
msgid "Auth Group"
msgstr ""
@@ -503,9 +501,6 @@ msgstr "指定了錯誤的ä½ç½®ï¼"
msgid "Band"
msgstr ""
-msgid "Behind NAT"
-msgstr ""
-
msgid ""
"Below is the determined list of files to backup. It consists of changed "
"configuration files marked by opkg, essential base files and the user "
@@ -576,12 +571,20 @@ msgstr "待修改"
msgid "Changes applied."
msgstr "修改已套用"
+msgid "Changes have been reverted."
+msgstr ""
+
msgid "Changes the administrator password for accessing the device"
msgstr "修改管ç†å“¡å¯†ç¢¼"
msgid "Channel"
msgstr "é »é“"
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
msgid "Check"
msgstr "檢查"
@@ -657,12 +660,15 @@ msgstr ""
msgid "Configuration"
msgstr "設定"
-msgid "Configuration applied."
-msgstr "啟用設定"
-
msgid "Configuration files will be kept."
msgstr "設定檔將被存檔"
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
msgid "Confirmation"
msgstr "å†ç¢ºèª"
@@ -675,12 +681,15 @@ msgstr "已連線"
msgid "Connection Limit"
msgstr "連線é™åˆ¶"
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
msgid "Connections"
msgstr "連線數"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
msgid "Country"
msgstr "國別"
@@ -734,9 +743,6 @@ msgstr ""
"如果å¯ä»¥çš„話,自定這個設備的動作 <abbr title=\"Light Emitting Diode\">LED</"
"abbr>s ."
-msgid "DHCP Leases"
-msgstr "DHCP的釋放週期"
-
msgid "DHCP Server"
msgstr "DHCP伺æœå™¨"
@@ -749,9 +755,6 @@ msgstr "DHCP用戶端"
msgid "DHCP-Options"
msgstr "DHCPé¸é …"
-msgid "DHCPv6 Leases"
-msgstr "DHCPv6版釋放時間週期"
-
msgid "DHCPv6 client"
msgstr ""
@@ -809,9 +812,6 @@ msgstr "é è¨­åŒé“器"
msgid "Default is stateless + stateful"
msgstr ""
-msgid "Default route"
-msgstr ""
-
msgid "Default state"
msgstr "é è¨­ç‹€æ…‹"
@@ -853,6 +853,9 @@ msgstr ""
msgid "Device unreachable"
msgstr ""
+msgid "Device unreachable!"
+msgstr ""
+
msgid "Diagnostics"
msgstr "診斷"
@@ -886,6 +889,9 @@ msgstr ""
msgid "Discard upstream RFC1918 responses"
msgstr "丟棄上游RFC1918 虛擬IP網路的回應"
+msgid "Dismiss"
+msgstr ""
+
msgid "Displaying only packages containing"
msgstr "僅顯示內å«çš„軟體"
@@ -936,6 +942,9 @@ msgstr ""
"若沒 <abbr title=\"Domain Name System\">DNS</abbr>-å稱的話,ä¸è¦è½‰ç™¼ <abbr "
"title=\"Domain Name System\">DNS</abbr>-請求"
+msgid "Down"
+msgstr ""
+
msgid "Download and install package"
msgstr "下載並安è£è»Ÿé«”包"
@@ -1048,6 +1057,9 @@ msgstr ""
msgid "Enable this mount"
msgstr "啟用掛載點"
+msgid "Enable this network"
+msgstr ""
+
msgid "Enable this swap"
msgstr "啟用swap功能"
@@ -1080,6 +1092,12 @@ msgstr ""
msgid "Endpoint Port"
msgstr ""
+msgid "Enter custom value"
+msgstr ""
+
+msgid "Enter custom values"
+msgstr ""
+
msgid "Erasing..."
msgstr "刪除中..."
@@ -1139,6 +1157,9 @@ msgstr ""
msgid "FT protocol"
msgstr ""
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
msgid "File"
msgstr "檔案"
@@ -1260,7 +1281,7 @@ msgstr "剩餘空間"
msgid ""
"Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
msgstr ""
msgid "GHz"
@@ -1332,9 +1353,6 @@ msgstr "æ–·ç·š"
msgid "Header Error Code Errors (HEC)"
msgstr ""
-msgid "Heartbeat"
-msgstr ""
-
msgid ""
"Here you can configure the basic aspects of your device like its hostname or "
"the timezone."
@@ -1390,8 +1408,8 @@ msgstr "IPv4版"
msgid "IPv4 Firewall"
msgstr "IPv4防ç«ç‰†"
-msgid "IPv4 WAN Status"
-msgstr "IPv4寬頻連線狀態"
+msgid "IPv4 Upstream"
+msgstr ""
msgid "IPv4 address"
msgstr "IPv4ä½å€"
@@ -1441,15 +1459,12 @@ msgstr ""
msgid "IPv6 ULA-Prefix"
msgstr ""
-msgid "IPv6 WAN Status"
-msgstr "IPv6寬頻連線狀態"
+msgid "IPv6 Upstream"
+msgstr ""
msgid "IPv6 address"
msgstr "IPv6ä½å€"
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
msgid "IPv6 assignment hint"
msgstr ""
@@ -2021,9 +2036,6 @@ msgstr ""
msgid "NTP server candidates"
msgstr "NTP伺æœå™¨å‚™é¸"
-msgid "NTP sync time-out"
-msgstr ""
-
msgid "Name"
msgstr "å稱"
@@ -2147,6 +2159,9 @@ msgstr ""
msgid "Obfuscated Password"
msgstr ""
+msgid "Obtain IPv6-Address"
+msgstr ""
+
msgid "Off-State Delay"
msgstr "關閉狀態延é²"
@@ -2196,12 +2211,6 @@ msgstr "é¸é …已移除"
msgid "Optional"
msgstr ""
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
msgid ""
"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
"starting with <code>0x</code>."
@@ -2553,14 +2562,12 @@ msgstr ""
"Configuration Protocol\">DHCP</abbr>-伺æœå™¨"
msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface"
msgstr ""
-"真的è¦åˆªé™¤é€™ä»‹é¢?無法復元刪除!\n"
-"å‡å¦‚您è¦é€éŽé€™å€‹ä»‹é¢é€£ç·šæ‚¨å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"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"
@@ -2569,16 +2576,13 @@ msgstr ""
msgid "Really reset all changes?"
msgstr "確定è¦é‡ç½®å›žå¾©åŽŸå» ?"
-#, fuzzy
msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
-"connected via this interface."
+"Really shut down network? You might lose access to this device if you are "
+"connected via this interface"
msgstr ""
-"真的è¦åˆªé™¤é€™å€‹ç¶²è·¯ ?\n"
-"å‡å¦‚您是é€éŽé€™å€‹ä»‹é¢é€£ç·šæ‚¨å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"? You might lose access to this device if "
"you are connected via this interface."
msgstr ""
"真的è¦é—œé–‰é€™å€‹ä»‹é¢ \"%s\" ?!\n"
@@ -2671,9 +2675,6 @@ msgstr ""
msgid "Request IPv6-prefix of length"
msgstr ""
-msgid "Require TLS"
-msgstr ""
-
msgid "Required"
msgstr ""
@@ -2732,6 +2733,15 @@ msgstr "明示/éš±è— å¯†ç¢¼"
msgid "Revert"
msgstr "回溯"
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
msgid "Root"
msgstr "æ ¹"
@@ -2747,9 +2757,6 @@ msgstr ""
msgid "Route type"
msgstr ""
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
msgid "Router Advertisement-Service"
msgstr ""
@@ -2773,14 +2780,6 @@ msgstr "執行系統檢查"
msgid "SHA256"
msgstr ""
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
msgid "SNR"
msgstr ""
@@ -2808,9 +2807,6 @@ msgstr "ä¿å­˜"
msgid "Save & Apply"
msgstr "ä¿å­˜ä¸¦å•Ÿç”¨"
-msgid "Save &#38; Apply"
-msgstr "ä¿å­˜ &#38; 啟用"
-
msgid "Scan"
msgstr "掃æ"
@@ -2837,17 +2833,6 @@ msgstr "分隔用戶端"
msgid "Server Settings"
msgstr "伺æœå™¨è¨­å®šå€¼"
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
msgid "Service Name"
msgstr "æœå‹™å稱"
@@ -2937,15 +2922,9 @@ msgstr ""
"抱歉, 沒有sysupgrade支æ´å‡ºç¾, 新版韌體映åƒæª”必須手動更新. 請回歸wiki找尋特定"
"設備安è£æŒ‡å¼•."
-msgid "Sort"
-msgstr "分類"
-
msgid "Source"
msgstr "來æº"
-msgid "Source routing"
-msgstr ""
-
msgid "Specifies the directory the device is attached to"
msgstr "指定這個設備被附掛到那個目錄"
@@ -2984,6 +2963,9 @@ msgstr "啟用"
msgid "Start priority"
msgstr "啟用優先權順åº"
+msgid "Starting configuration apply…"
+msgstr ""
+
msgid "Startup"
msgstr "å•Ÿå‹•"
@@ -3145,6 +3127,16 @@ msgid "The configuration file could not be loaded due to the following error:"
msgstr ""
msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
+msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgstr ""
@@ -3167,9 +3159,6 @@ msgstr ""
"è¦åˆ·çš„映åƒæª”已上傳.下é¢æ˜¯é€™å€‹æ ¡é©—碼和檔案大å°è©³åˆ—, 用原始檔比å°å®ƒé–€ä»¥ç¢ºä¿è³‡æ–™"
"完整性.<br />按下é¢çš„\"繼續\"便å¯ä»¥é–‹å•Ÿæ›´æ–°æµç¨‹."
-msgid "The following changes have been committed"
-msgstr "接下來的修改已經被承諾"
-
msgid "The following changes have been reverted"
msgstr "接下來的修改已經被回復"
@@ -3231,11 +3220,6 @@ msgstr ""
"è¦æ›´æ–°æ‚¨é›»è…¦çš„ä½å€ä»¥ä¾¿å†é€£è¨­å‚™, 端看您的設定. "
msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
-msgid ""
"The uploaded image file does not contain a supported format. Make sure that "
"you choose the generic image format for your platform."
msgstr ""
@@ -3244,8 +3228,8 @@ msgstr ""
msgid "There are no active leases."
msgstr "租賃尚未啟動."
-msgid "There are no pending changes to apply!"
-msgstr "å°šç„¡è½å€™çš„修改被採用"
+msgid "There are no changes to apply."
+msgstr ""
msgid "There are no pending changes to revert!"
msgstr "å°šç„¡è½å€™çš„修改被復元!"
@@ -3385,15 +3369,6 @@ msgstr "通é“介é¢"
msgid "Tunnel Link"
msgstr ""
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
msgid "Tx-Power"
msgstr "傳é€-功率"
@@ -3442,6 +3417,9 @@ msgstr "尚未存檔的修改"
msgid "Unsupported protocol type."
msgstr "ä¸æ”¯æ´çš„å”定型態"
+msgid "Up"
+msgstr ""
+
msgid "Update lists"
msgstr "上傳清單"
@@ -3571,12 +3549,6 @@ msgstr ""
msgid "Vendor Class to send when requesting DHCP"
msgstr "當請求DHCPå°åŒ…時è¦å‚³é€çš„製造商類別碼"
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
msgid "Verify"
msgstr "確èª"
@@ -3608,16 +3580,15 @@ msgstr ""
"WPA-åŠ å¯†éœ€è¦ wpa_supplican(終端模å¼)或者hostapd熱點(å°AP或者是 ad-hoc模å¼)å·²"
"被安è£."
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
msgid "Waiting for changes to be applied..."
msgstr "等待修改被啟用..."
msgid "Waiting for command to complete..."
msgstr "等待完整性指令..."
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
msgid "Waiting for device..."
msgstr ""
@@ -3632,12 +3603,6 @@ msgid ""
"communications"
msgstr ""
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
msgid "Width"
msgstr ""
@@ -3713,6 +3678,9 @@ msgstr "baseT"
msgid "bridged"
msgstr "已橋接"
+msgid "create"
+msgstr ""
+
msgid "create:"
msgstr "建立:"
@@ -3750,9 +3718,6 @@ msgstr "全雙工"
msgid "half-duplex"
msgstr "åŠé›™å·¥"
-msgid "help"
-msgstr "幫助"
-
msgid "hidden"
msgstr "éš±è—"
@@ -3777,9 +3742,6 @@ msgstr "kbit/s"
msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
msgstr "本地<abbr title=\"Domain Name System\">DNS</abbr> 檔案"
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
msgid "minutes"
msgstr ""
@@ -3804,6 +3766,9 @@ msgstr "é–‹å•Ÿ"
msgid "open"
msgstr "打開"
+msgid "output"
+msgstr ""
+
msgid "overlay"
msgstr ""
@@ -3855,6 +3820,57 @@ msgstr "是的"
msgid "« Back"
msgstr "« 倒退"
+#~ msgid "DHCP Leases"
+#~ msgstr "DHCP的釋放週期"
+
+#~ msgid "DHCPv6 Leases"
+#~ msgstr "DHCPv6版釋放時間週期"
+
+#~ 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 ""
+#~ "真的è¦åˆªé™¤é€™ä»‹é¢?無法復元刪除!\n"
+#~ "å‡å¦‚您è¦é€éŽé€™å€‹ä»‹é¢é€£ç·šæ‚¨å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
+
+#, fuzzy
+#~ msgid ""
+#~ "Really shut down network? You might lose access to this device if you are "
+#~ "connected via this interface."
+#~ msgstr ""
+#~ "真的è¦åˆªé™¤é€™å€‹ç¶²è·¯ ?\n"
+#~ "å‡å¦‚您是é€éŽé€™å€‹ä»‹é¢é€£ç·šæ‚¨å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
+
+#~ msgid "Sort"
+#~ msgstr "分類"
+
+#~ msgid "help"
+#~ msgstr "幫助"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4寬頻連線狀態"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6寬頻連線狀態"
+
+#~ msgid "Apply"
+#~ msgstr "套用"
+
+#~ msgid "Applying changes"
+#~ msgstr "正在套用變更"
+
+#~ msgid "Configuration applied."
+#~ msgstr "啟用設定"
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "ä¿å­˜ &#38; 啟用"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "接下來的修改已經被承諾"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "å°šç„¡è½å€™çš„修改被採用"
+
#~ msgid "Action"
#~ msgstr "動作"
diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
index a26d3d14e1..e04a964dd7 100644
--- a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
+++ b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
@@ -43,6 +43,9 @@ function index()
end)
if has_wifi then
+ page = entry({"admin", "network", "wireless_assoclist"}, call("wifi_assoclist"), nil)
+ page.leaf = true
+
page = entry({"admin", "network", "wireless_join"}, post("wifi_join"), nil)
page.leaf = true
@@ -372,6 +375,13 @@ function wifi_shutdown(wnet)
wifi_reconnect_shutdown(true, wnet)
end
+function wifi_assoclist()
+ local s = require "luci.tools.status"
+
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(s.wifi_assoclist())
+end
+
function lease_status()
local s = require "luci.tools.status"
diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
index 6fcd66f441..0c19893cf8 100644
--- a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
+++ b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
@@ -74,7 +74,7 @@ function action_packages()
local out, err
-- Display
- local display = luci.http.formvalue("display") or "installed"
+ local display = luci.http.formvalue("display") or "available"
-- Letter
local letter = string.byte(luci.http.formvalue("letter") or "A", 1)
diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
index 38e5de7b39..5c630bb5ce 100644
--- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
+++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
@@ -351,7 +351,6 @@ if has_firewall then
fwzone.template = "cbi/firewall_zonelist"
fwzone.network = arg[1]
- fwzone.rmempty = false
function fwzone.cfgvalue(self, section)
self.iface = section
@@ -360,22 +359,16 @@ if has_firewall then
end
function fwzone.write(self, section, value)
- local zone = fw:get_zone(value)
-
- if not zone and value == '-' then
- value = m:formvalue(self:cbid(section) .. ".newzone")
- if value and #value > 0 then
- zone = fw:add_zone(value)
- else
- fw:del_network(section)
- end
- end
-
+ local zone = fw:get_zone(value) or fw:add_zone(value)
if zone then
fw:del_network(section)
zone:add_network(section)
end
end
+
+ function fwzone.remove(self, section)
+ fw:del_network(section)
+ end
end
diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
index b52dff13ac..3e46628d3f 100644
--- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
+++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
@@ -260,7 +260,7 @@ m.uci:foreach("network", "switch",
end
- local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID", "<div id='portstatus-%s'></div>" % switch_name)
+ local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID")
local mx_vid = has_vlan4k and 4094 or (num_vlans - 1)
vid.rmempty = false
@@ -333,7 +333,7 @@ m.uci:foreach("network", "switch",
local _, pt
for _, pt in ipairs(topo.ports) do
- local po = s:option(ListValue, tostring(pt.num), pt.label, '<div id="portstatus-%s-%d"></div>' %{ switch_name, pt.num })
+ local po = s:option(ListValue, tostring(pt.num), pt.label)
po:value("", translate("off"))
diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
index cacaa25958..d51a72aba1 100644
--- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
+++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
@@ -390,22 +390,16 @@ network.novirtual = true
function network.write(self, section, value)
local i = nw:get_interface(section)
if i then
- if value == '-' then
- value = m:formvalue(self:cbid(section) .. ".newnet")
- if value and #value > 0 then
- local n = nw:add_network(value, {proto="none"})
- if n then n:add_interface(i) end
- else
- local n = i:get_network()
- if n then n:del_interface(i) end
- end
- else
- local v
- for _, v in ipairs(i:get_networks()) do
- v:del_interface(i)
- end
- for v in ut.imatch(value) do
- local n = nw:get_network(v)
+ local _, net, old, new = nil, nil, {}, {}
+
+ for _, net in ipairs(i:get_networks()) do
+ old[net:name()] = true
+ end
+
+ for net in ut.imatch(value) do
+ new[net] = true
+ if not old[net] then
+ local n = nw:get_network(net) or nw:add_network(net, { proto = "none" })
if n then
if not n:is_empty() then
n:set("type", "bridge")
@@ -414,6 +408,15 @@ function network.write(self, section, value)
end
end
end
+
+ for net, _ in pairs(old) do
+ if not new[net] then
+ local n = nw:get_network(net)
+ if n then
+ n:del_interface(i)
+ end
+ end
+ end
end
end
diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
index 8277deb2f6..e8a3058826 100644
--- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
+++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
@@ -94,14 +94,9 @@ function newnet.parse(self, section)
local net, zone
if has_firewall then
- local zval = fwzone:formvalue(section)
- zone = fw:get_zone(zval)
-
- if not zone and zval == '-' then
- zval = m:formvalue(fwzone:cbid(section) .. ".newzone")
- if zval and #zval > 0 then
- zone = fw:add_zone(zval)
- end
+ local value = fwzone:formvalue(section)
+ if value and #value > 0 then
+ zone = fw:get_zone(value) or fw:add_zone(value)
end
end
diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua
index 493a735bde..6c1c1235c5 100644
--- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua
+++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua
@@ -104,16 +104,17 @@ end
keys = s2:option(TextValue, "_data", "")
keys.wrap = "off"
keys.rows = 3
-keys.rmempty = false
function keys.cfgvalue()
return fs.readfile("/etc/dropbear/authorized_keys") or ""
end
function keys.write(self, section, value)
- if value then
- fs.writefile("/etc/dropbear/authorized_keys", value:gsub("\r\n", "\n"))
- end
+ return fs.writefile("/etc/dropbear/authorized_keys", value:gsub("\r\n", "\n"))
+end
+
+function keys.remove(self, section, value)
+ return fs.writefile("/etc/dropbear/authorized_keys", "")
end
end
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
index f4adb26069..5607e59dfb 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
@@ -61,55 +61,54 @@ local route_host = luci.config.diag and luci.config.diag.route or "dev.openwrt.o
<div class="cbi-map">
<h2 name="content"><%:Diagnostics%></h2>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<legend><%:Network Utilities%></legend>
- <br />
-
- <div style="width:30%; float:left">
- <input style="margin: 5px 0" type="text" value="<%=ping_host%>" name="ping" /><br />
- <% if has_ping6 then %>
- <select name="ping_proto" style="width:auto">
- <option value="" selected="selected"><%:IPv4%></option>
- <option value="6"><%:IPv6%></option>
- </select>
- <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" />
- <% else %>
- <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" />
- <% end %>
+ <div class="table">
+ <div class="tr">
+ <div class="td left">
+ <input style="margin: 5px 0" type="text" value="<%=ping_host%>" name="ping" /><br />
+ <% if has_ping6 then %>
+ <select name="ping_proto" style="width:auto">
+ <option value="" selected="selected"><%:IPv4%></option>
+ <option value="6"><%:IPv6%></option>
+ </select>
+ <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" />
+ <% else %>
+ <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" />
+ <% end %>
+ </div>
+
+ <div class="td left">
+ <input style="margin: 5px 0" type="text" value="<%=route_host%>" name="traceroute" /><br />
+ <% if has_traceroute6 then %>
+ <select name="traceroute_proto" style="width:auto">
+ <option value="" selected="selected"><%:IPv4%></option>
+ <option value="6"><%:IPv6%></option>
+ </select>
+ <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" />
+ <% else %>
+ <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" />
+ <% end %>
+ <% if not has_traceroute6 then %>
+ <p>&#160;</p>
+ <p><%:Install iputils-traceroute6 for IPv6 traceroute%></p>
+ <% end %>
+ </div>
+
+ <div class="td left">
+ <input style="margin: 5px 0" type="text" value="<%=dns_host%>" name="nslookup" /><br />
+ <input type="button" value="<%:Nslookup%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" />
+ </div>
+ </div>
</div>
-
- <div style="width:33%; float:left">
- <input style="margin: 5px 0" type="text" value="<%=route_host%>" name="traceroute" /><br />
- <% if has_traceroute6 then %>
- <select name="traceroute_proto" style="width:auto">
- <option value="" selected="selected"><%:IPv4%></option>
- <option value="6"><%:IPv6%></option>
- </select>
- <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" />
- <% else %>
- <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" />
- <% end %>
- <% if not has_traceroute6 then %>
- <p>&#160;</p>
- <p><%:Install iputils-traceroute6 for IPv6 traceroute%></p>
- <% end %>
- </div>
-
- <div style="width:33%; float:left;">
- <input style="margin: 5px 0" type="text" value="<%=dns_host%>" name="nslookup" /><br />
- <input type="button" value="<%:Nslookup%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" />
- </div>
-
- <br style="clear:both" /><br />
-
- </fieldset>
+ </div>
</div>
- <fieldset class="cbi-section" style="display:none">
- <legend id="diag-rc-legend"><%:Collecting data...%></legend>
+ <div class="cbi-section" style="display:none">
+ <strong id="diag-rc-legend"></strong>
<span id="diag-rc-output"></span>
- </fieldset>
+ </div>
</form>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
index 2512a35b3c..473e2275ce 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
@@ -33,7 +33,7 @@
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript">//<![CDATA[
function iface_shutdown(id, reconnect) {
- if (!reconnect && !confirm(String.format('<%_Really shutdown interface "%s" ?\nYou might lose access to this device if you are connected via this interface.%>', id)))
+ if (!reconnect && !confirm(<%=luci.http.write_json(translate('Really shutdown interface "%s"? You might lose access to this device if you are connected via this interface.'))%>.format(id)))
return;
var d = document.getElementById(id + '-ifc-description');
@@ -67,7 +67,7 @@
}
function iface_delete(id) {
- if (!confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>'))
+ if (!confirm(<%=luci.http.write_json(translate('Really delete this interface? The deletion cannot be undone! You might lose access to this device if you are connected via this interface'))%>))
return;
(new XHR()).post('<%=url('admin/network/iface_delete')%>/' + id, { token: '<%=token%>' },
@@ -141,8 +141,8 @@
}
html += String.format(
- '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
- '<strong><%:TX%></strong>: %.2mB (%d <%:Pkts.%>)<br />',
+ '<strong><%:RX%>:</strong> %.2mB (%d <%:Pkts.%>)<br />' +
+ '<strong><%:TX%>:</strong> %.2mB (%d <%:Pkts.%>)<br />',
ifc.rx_bytes, ifc.rx_packets,
ifc.tx_bytes, ifc.tx_packets
);
@@ -164,7 +164,7 @@
ifc.ip6addrs[i]
);
}
-
+
if (ifc.ip6prefix)
{
html += String.format('<strong><%:IPv6-PD%>:</strong> %s<br />', ifc.ip6prefix);
@@ -209,46 +209,43 @@
</fieldset>
<div class="cbi-map">
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<legend><%:Interface Overview%></legend>
- <table class="cbi-section-table" style="margin:10px; empty-cells:hide">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Network%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Status%></th>
- <th class="cbi-section-table-cell"><%:Actions%></th>
- </tr>
- <%
- for i, net in ipairs(netlist) do
- local z = net[3]
- local c = z and z:get_color() or "#EEEEEE"
- local t = z and translate("Part of zone %q" % z:name()) or translate("No zone assigned")
- %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=i % 2 + 1%>">
- <td class="cbi-value-field" style="padding:3px">
- <div class="ifacebox">
- <div class="ifacebox-head" style="background-color:<%=c%>" title="<%=pcdata(t)%>">
- <strong><%=net[1]:upper()%></strong>
- </div>
- <div class="ifacebox-body" id="<%=net[1]%>-ifc-devices">
- <img src="<%=resource%>/icons/ethernet_disabled.png" style="width:16px; height:16px" /><br />
- <small>?</small>
+ <div class="cbi-section-node">
+ <div class="table">
+ <%
+ for i, net in ipairs(netlist) do
+ local z = net[3]
+ local c = z and z:get_color() or "#EEEEEE"
+ local t = z and translate("Part of zone %q" % z:name()) or translate("No zone assigned")
+ %>
+ <div class="tr cbi-rowstyle-<%=i % 2 + 1%>">
+ <div class="td col-3 center middle">
+ <div class="ifacebox">
+ <div class="ifacebox-head" style="background-color:<%=c%>" title="<%=pcdata(t)%>">
+ <strong><%=net[1]:upper()%></strong>
+ </div>
+ <div class="ifacebox-body" id="<%=net[1]%>-ifc-devices">
+ <img src="<%=resource%>/icons/ethernet_disabled.png" style="width:16px; height:16px" /><br />
+ <small>?</small>
+ </div>
</div>
</div>
- </td>
- <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=net[1]%>-ifc-description">
- <em><%:Collecting data...%></em>
- </td>
- <td style="width:420px">
- <input type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" />
- <input type="button" class="cbi-button cbi-button-reset" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" />
- <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
- <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
- </td>
- </tr>
- <% end %>
- </table>
+ <div class="td col-5 left" id="<%=net[1]%>-ifc-description">
+ <em><%:Collecting data...%></em>
+ </div>
+ <div class="td cbi-section-actions">
+ <input type="button" class="cbi-button cbi-button-neutral" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" />
+ <input type="button" class="cbi-button cbi-button-neutral" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" />
+ <input type="button" class="cbi-button cbi-button-action important" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
+ <input type="button" class="cbi-button cbi-button-negative" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
+ </div>
+ </div>
+ <% end %>
+ </div>
+ </div>
<input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=url("admin/network/iface_add")%>'" />
- </fieldset>
+ </div>
</div>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
index b15dd13f39..9c5173dae2 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
@@ -6,29 +6,18 @@
{
if (ifc && (ifc = ifc[0]))
{
- var html = '';
+ var s = document.getElementById('<%=self.option%>-ifc-status'),
+ img = s.querySelector('img'),
+ info = s.querySelector('span'),
+ html = '<strong><%:Device%>:</strong> %h<br />'.format(ifc.ifname);
- var s = document.getElementById('<%=self.option%>-ifc-signal');
- if (s)
- s.innerHTML = String.format(
- '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px" />' +
- '<br /><small>%s</small>',
- ifc.type, ifc.is_up ? '' : '_disabled',
- ifc.name
- );
-
- var d = document.getElementById('<%=self.option%>-ifc-description');
- if (d && ifc.ifname)
+ if (ifc.ifname)
{
if (ifc.is_up)
- {
html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
- }
if (ifc.macaddr)
- {
html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr);
- }
html += String.format(
'<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
@@ -38,50 +27,40 @@
);
if (ifc.ipaddrs && ifc.ipaddrs.length)
- {
for (var i = 0; i < ifc.ipaddrs.length; i++)
html += String.format(
'<strong><%:IPv4%>:</strong> %s<br />',
ifc.ipaddrs[i]
);
- }
if (ifc.ip6addrs && ifc.ip6addrs.length)
- {
for (var i = 0; i < ifc.ip6addrs.length; i++)
html += String.format(
'<strong><%:IPv6%>:</strong> %s<br />',
ifc.ip6addrs[i]
);
- }
-
+
if (ifc.ip6prefix)
- {
html += String.format('<strong><%:IPv6-PD%>:</strong> %s<br />', ifc.ip6prefix);
- }
- d.innerHTML = html;
+ info.innerHTML = html;
}
- else if (d)
+ else
{
- d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
+ info.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
}
+
+ img.src = '<%=resource%>/icons/%s%s.png'.format(ifc.type, ifc.is_up ? '' : '_disabled');
}
}
);
//]]></script>
-<table>
- <tr class="cbi-section-table">
- <td></td>
- <td class="cbi-value-field" style="min-width:16px; padding:3px; text-align:center" id="<%=self.option%>-ifc-signal">
- <img src="<%=resource%>/icons/ethernet_disabled.png" style="width:16px; height:16px" /><br />
- <small>?</small>
- </td>
- <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-ifc-description">
- <em><%:Collecting data...%></em>
- </td>
- </tr>
-</table>
+<span class="ifacebadge large" id="<%=self.option%>-ifc-status">
+ <img src="<%=resource%>/icons/ethernet_disabled.png" />
+ <span>
+ <em><%:Collecting data...%></em>
+ </span>
+</span>
<%+cbi/valuefooter%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
index 28a37dcd98..8fbbdc9477 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
@@ -1,29 +1,13 @@
<script type="text/javascript">//<![CDATA[
- function duid2mac(duid) {
- // DUID-LLT / Ethernet
- if (duid.length === 28 && duid.substr(0, 8) === '00010001')
- return duid.substr(16).replace(/(..)(?=..)/g, '$1:').toUpperCase();
-
- // DUID-LL / Ethernet
- if (duid.length === 20 && duid.substr(0, 8) === '00030001')
- return duid.substr(8).replace(/(..)(?=..)/g, '$1:').toUpperCase();
-
- return null;
- }
-
- var hosts = <%=luci.http.write_json(luci.sys.net.host_hints())%>;
-
XHR.poll(5, '<%=url('admin/network/dhcplease_status')%>', null,
function(x, st)
{
var tb = document.getElementById('lease_status_table');
if (st && st[0] && tb)
{
- /* clear all rows */
- while( tb.rows.length > 1 )
- tb.deleteRow(1);
+ var rows = [];
- for( var i = 0; i < st[0].length; i++ )
+ for (var i = 0; i < st[0].length; i++)
{
var timestr;
@@ -34,24 +18,15 @@
else
timestr = String.format('%t', st[0][i].expires);
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
- tr.insertCell(-1).innerHTML = st[0][i].hostname ? st[0][i].hostname : '?';
- tr.insertCell(-1).innerHTML = st[0][i].ipaddr;
- tr.insertCell(-1).innerHTML = st[0][i].macaddr;
- tr.insertCell(-1).innerHTML = timestr;
+ rows.push([
+ st[0][i].hostname || '?',
+ st[0][i].ipaddr,
+ st[0][i].macaddr,
+ timestr
+ ]);
}
- if( tb.rows.length == 1 )
- {
- var tr = tb.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 4;
- td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
- }
+ cbi_update_table(tb, rows, '<em><%:There are no active leases.%></em>');
}
var tb6 = document.getElementById('lease6_status_table');
@@ -59,11 +34,9 @@
{
tb6.parentNode.style.display = 'block';
- /* clear all rows */
- while( tb6.rows.length > 1 )
- tb6.deleteRow(1);
+ var rows = [];
- for( var i = 0; i < st[1].length; i++ )
+ for (var i = 0; i < st[1].length; i++)
{
var timestr;
@@ -74,66 +47,49 @@
else
timestr = String.format('%t', st[1][i].expires);
- var tr = tb6.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
- var host = hosts[duid2mac(st[1][i].duid)];
- if (!st[1][i].hostname)
- tr.insertCell(-1).innerHTML =
- (host && (host.name || host.ipv4 || host.ipv6))
- ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">? (%h)</div>'.format(host.name || host.ipv4 || host.ipv6)
- : '?';
- else
- tr.insertCell(-1).innerHTML =
- (host && host.name && st[1][i].hostname != host.name)
- ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">%h (%h)</div>'.format(st[1][i].hostname, host.name)
- : st[1][i].hostname;
+ var name = st[1][i].hostname,
+ hint = st[1][i].host_hint;
- tr.insertCell(-1).innerHTML = st[1][i].ip6addr;
- tr.insertCell(-1).innerHTML = st[1][i].duid;
- tr.insertCell(-1).innerHTML = timestr;
+ rows.push([
+ hint ? '%h (%h)'.format(name || '?', hint) : (name || '?'),
+ st[1][i].ip6addr,
+ st[1][i].duid,
+ timestr
+ ]);
}
- if( tb6.rows.length == 1 )
- {
- var tr = tb6.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 4;
- td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
- }
+ cbi_update_table(tb6, rows, '<em><%:There are no active leases.%></em>');
}
}
);
//]]></script>
-<fieldset class="cbi-section">
- <legend><%:Active DHCP Leases%></legend>
- <table class="cbi-section-table" id="lease_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Hostname%></th>
- <th class="cbi-section-table-cell"><%:IPv4-Address%></th>
- <th class="cbi-section-table-cell"><%:MAC-Address%></th>
- <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="4"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
-</fieldset>
-
-<fieldset class="cbi-section" style="display:none">
- <legend><%:Active DHCPv6 Leases%></legend>
- <table class="cbi-section-table" id="lease6_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Host%></th>
- <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
- <th class="cbi-section-table-cell"><%:DUID%></th>
- <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="4"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
-</fieldset>
+<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-mod-admin-full/luasrc/view/admin_network/switch_status.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
index 96fbffdb02..68f0bbc9d4 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
@@ -1,21 +1,39 @@
<script type="text/javascript">//<![CDATA[
- var switches = [ '<%=table.concat(self.switches, "', '")%>' ];
+ var switches = [ '<%=table.concat(self.switches, "', '")%>' ],
+ tables = document.querySelectorAll('.cbi-section-table');
+
+ function add_status_row(table) {
+ var first_row = table.querySelector('.cbi-section-table-row');
+ if (first_row.classList.contains('port-status'))
+ return first_row;
+
+ var status_row = first_row.parentNode.insertBefore(
+ E('div', { 'class': first_row.className }), first_row);
+
+ first_row.querySelectorAll('.td').forEach(function(td) {
+ status_row.appendChild(td.cloneNode(false));
+ status_row.lastElementChild.removeAttribute('data-title');
+ });
+
+ status_row.firstElementChild.innerHTML = '<%:Port status:%>';
+ status_row.classList.add('port-status') ;
+
+ return status_row;
+ }
+
XHR.poll(5, '<%=url('admin/network/switch_status')%>/' + switches.join(','), null,
function(x, st)
{
for (var i = 0; i < switches.length; i++)
{
var ports = st[switches[i]];
- var th0 = document.getElementById('portstatus-' + switches[i]);
+ var tr = add_status_row(tables[i]);
- if (th0 && ports && ports.length)
+ if (tr && ports && ports.length)
{
- if (!th0.innerHTML)
- th0.innerHTML = '<%:Port status:%>';
-
for (var j = 0; j < ports.length; j++)
{
- var th = document.getElementById('portstatus-' + switches[i] + '-' + j);
+ var th = tr.querySelector('[data-name="%d"]'.format(j));
if (!th)
continue;
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_assoclist.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_assoclist.htm
new file mode 100644
index 0000000000..b6f84c0607
--- /dev/null
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/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/network/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-mod-admin-full/luasrc/view/admin_network/wifi_join.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
index 3533c6fa4d..9b93942c88 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
@@ -90,25 +90,43 @@
<h2 name="content"><%:Join Network: Wireless Scan%></h2>
<div class="cbi-map">
- <fieldset class="cbi-section">
- <table class="cbi-section-table" style="empty-cells:hide">
+ <div class="cbi-section">
+ <div class="table">
+ <div class="tr table-titles">
+ <div class="th col-1 center"><%:Signal%></div>
+ <div class="th col-5 left"><%:SSID%></div>
+ <div class="th col-2 center"><%:Channel%></div>
+ <div class="th col-2 left"><%:Mode%></div>
+ <div class="th col-3 left"><%:BSSID%></div>
+ <div class="th col-2 left"><%:Encryption%></div>
+ <div class="th cbi-section-actions">&#160;</div>
+ </div>
+
<!-- scan list -->
<% for i, net in ipairs(scanlist(3)) do net.encryption = net.encryption or { } %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
- <td class="cbi-value-field" style="width:16px; padding:3px">
+ <div class="tr cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
+ <div class="td col-1 center">
<abbr title="<%:Signal%>: <%=net.signal%> <%:dB%> / <%:Quality%>: <%=net.quality%>/<%=net.quality_max%>">
<img src="<%=guess_wifi_signal(net)%>" /><br />
<small><%=percent_wifi_signal(net)%>%</small>
</abbr>
- </td>
- <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px">
- <big><strong><%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%></strong></big><br />
- <strong>Channel:</strong> <%=net.channel%> |
- <strong>Mode:</strong> <%=net.mode%> |
- <strong>BSSID:</strong> <%=net.bssid%> |
- <strong>Encryption:</strong> <%=format_wifi_encryption(net.encryption)%>
- </td>
- <td class="cbi-value-field" style="width:40px">
+ </div>
+ <div class="td col-5 left" data-title="<%:SSID%>">
+ <strong><%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%></strong>
+ </div>
+ <div class="td col-2 center" data-title="<%:Channel%>">
+ <%=net.channel%>
+ </div>
+ <div class="td col-2 left" data-title="<%:Mode%>">
+ <%=net.mode%>
+ </div>
+ <div class="td col-3 left" data-title="<%:BSSID%>">
+ <%=net.bssid%>
+ </div>
+ <div class="td col-2 left" data-title="<%:Encryption%>">
+ <%=format_wifi_encryption(net.encryption)%>
+ </div>
+ <div class="td cbi-section-actions">
<form action="<%=url('admin/network/wireless_join')%>" method="post">
<input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
@@ -126,23 +144,23 @@
<input type="hidden" name="clbridge" value="<%=iw.type == "wl" and 1 or 0%>" />
- <input class="cbi-button cbi-button-apply" type="submit" value="<%:Join Network%>" />
+ <input class="cbi-button cbi-button-action important" type="submit" value="<%:Join Network%>" />
</form>
- </td>
- </tr>
+ </div>
+ </div>
<% end %>
<!-- /scan list -->
- </table>
- </fieldset>
+ </div>
+ </div>
</div>
<div class="cbi-page-actions right">
<form class="inline" action="<%=url("admin/network/wireless")%>" method="get">
- <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>" />
+ <input class="cbi-button cbi-button-neutral" type="submit" value="<%:Back to overview%>" />
</form>
<form class="inline" action="<%=url('admin/network/wireless_join')%>" method="post">
<input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
- <input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>" />
+ <input class="cbi-button cbi-button-action" type="submit" value="<%:Repeat scan%>" />
</form>
</div>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
index 4465095ff2..b9602785f4 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
@@ -101,9 +101,9 @@
<%+header%>
<% if not has_iwinfo then %>
- <div class="errorbox">
- <strong><%:Package libiwinfo required!%></strong><br />
- <%_The <em>libiwinfo-lua</em> package is not installed. You must install this component for working wireless configuration!%>
+ <div class="alert-message warning">
+ <h4><%:Package libiwinfo required!%></h4>
+ <p><%_The <em>libiwinfo-lua</em> package is not installed. You must install this component for working wireless configuration!%></p>
</div>
<% end %>
@@ -113,32 +113,10 @@
var is_reconnecting = false;
- function nowrap(s) {
- return s.replace(/ /g, '&#160;');
- }
-
- 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;
- }
-
function wifi_shutdown(id, toggle) {
var reconnect = (toggle.getAttribute('active') == 'false');
- if (!reconnect && !confirm(String.format('<%:Really shut down network?\nYou might lose access to this device if you are connected via this interface.%>')))
+ if (!reconnect && !confirm(<%=luci.http.write_json(translate('Really shut down network? You might lose access to this device if you are connected via this interface'))%>))
return;
is_reconnecting = true;
@@ -176,7 +154,7 @@
}
function wifi_delete(id) {
- if (!confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>'))
+ if (!confirm(<%=luci.http.write_json(translate('Really delete this wireless network? The deletion cannot be undone! You might lose access to this device if you are connected via this network.'))%>))
return;
(new XHR()).post('<%=url('admin/network/wireless_delete')%>/' + id, { token: '<%=token%>' },
@@ -193,20 +171,25 @@
{
if (st)
{
- var assoctable = document.getElementById('iw-assoclist');
- if (assoctable)
- while (assoctable.rows.length > 1)
- assoctable.rows[1].parentNode.removeChild(assoctable.rows[1]);
-
- var devup = { };
var rowstyle = 1;
+ var radiostate = { };
+
+ st.forEach(function(s) {
+ var r = radiostate[wifidevs[s.id]] || (radiostate[wifidevs[s.id]] = {});
+
+ s.is_assoc = (s.bssid && s.bssid != '00:00:00:00:00:00' && s.channel && s.mode != 'Unknown' && !s.disabled);
+
+ r.up = r.up || s.is_assoc;
+ r.channel = r.channel || s.channel;
+ r.bitrate = r.bitrate || s.bitrate;
+ r.frequency = r.frequency || s.frequency;
+ });
for( var i = 0; i < st.length; i++ )
{
var iw = st[i];
- var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && iw.mode != 'Unknown' && !iw.disabled);
var p = iw.quality;
- var q = is_assoc ? p : -1;
+ var q = iw.is_assoc ? p : -1;
var icon;
if (q < 0)
@@ -222,9 +205,6 @@
else
icon = "<%=resource%>/icons/signal-75-100.png";
- if (!devup[wifidevs[iw.id]])
- devup[wifidevs[iw.id]] = is_assoc;
-
var sig = document.getElementById(iw.id + '-iw-signal');
if (sig)
sig.innerHTML = String.format(
@@ -237,13 +217,13 @@
{
if (!iw.disabled)
{
- toggle.className = 'cbi-button cbi-button-reset';
+ toggle.className = 'cbi-button cbi-button-neutral';
toggle.value = '<%:Disable%>';
toggle.title = '<%:Shutdown this network%>';
}
else
{
- toggle.className = 'cbi-button cbi-button-reload';
+ toggle.className = 'cbi-button cbi-button-neutral';
toggle.value = '<%:Enable%>';
toggle.title = '<%:Activate this network%>';
}
@@ -254,7 +234,7 @@
var info = document.getElementById(iw.id + '-iw-status');
if (info)
{
- if (is_assoc)
+ if (iw.is_assoc)
info.innerHTML = String.format(
'<strong><%:SSID%>:</strong> %h | ' +
'<strong><%:Mode%>:</strong> %s<br />' +
@@ -274,99 +254,23 @@
: '<em><%:Wireless is disabled or not associated%></em>'
);
}
-
- var dev = document.getElementById(wifidevs[iw.id] + '-iw-devinfo');
- if (dev)
- {
- if (is_assoc)
- dev.innerHTML = String.format(
- '<strong><%:Channel%>:</strong> %s (%s <%:GHz%>) | ' +
- '<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%>',
- iw.channel ? iw.channel : '?',
- iw.frequency ? iw.frequency : '?',
- iw.bitrate ? iw.bitrate : '?'
- );
- else
- dev.innerHTML = '';
- }
-
- if (assoctable)
- {
- var assoclist = [ ];
- for( var bssid in iw.assoclist )
- {
- assoclist.push(iw.assoclist[bssid]);
- assoclist[assoclist.length-1].bssid = bssid;
- }
-
- assoclist.sort(function(a, b) { a.bssid < b.bssid });
-
- for( var j = 0; j < assoclist.length; j++ )
- {
- var tr = assoctable.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + rowstyle;
-
- var icon;
- var q = (-1 * (assoclist[j].noise - assoclist[j].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";
-
- tr.insertCell(-1).innerHTML = String.format(
- '<span class="ifacebadge" title="%q"><img src="<%=resource%>/icons/wifi.png" /> %h</span>',
- iw.device.name, iw.ifname
- );
-
- tr.insertCell(-1).innerHTML = nowrap(String.format('%h', iw.ssid ? iw.ssid : '?'));
- tr.insertCell(-1).innerHTML = assoclist[j].bssid;
-
- var host = hosts[assoclist[j].bssid];
- if (host)
- tr.insertCell(-1).innerHTML = String.format(
- '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis">%s</div>',
- ((host.name && (host.ipv4 || host.ipv6))
- ? '%h (%s)'.format(host.name, host.ipv4 || host.ipv6)
- : '%h'.format(host.name || host.ipv4 || host.ipv6)).nobr()
- );
- else
- tr.insertCell(-1).innerHTML = '?';
-
- tr.insertCell(-1).innerHTML = String.format(
- '<span class="ifacebadge" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%> / <%:SNR%>: %d"><img src="%s" /> %d / %d <%:dBm%></span>',
- assoclist[j].signal, assoclist[j].noise, assoclist[j].signal - assoclist[j].noise,
- icon,
- assoclist[j].signal, assoclist[j].noise
- );
-
- tr.insertCell(-1).innerHTML = nowrap(wifirate(assoclist[j], true)) + '<br />' + nowrap(wifirate(assoclist[j], false));
-
- rowstyle = (rowstyle == 1) ? 2 : 1;
- }
- }
}
- if (assoctable && assoctable.rows.length == 1)
- {
- var tr = assoctable.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 8;
- td.innerHTML = '<br /><em><%:No information available%></em>';
- }
-
- for (var dev in devup)
+ for (var dev in radiostate)
{
var img = document.getElementById(dev + '-iw-upstate');
if (img)
- img.src = '<%=resource%>/icons/wifi_big' + (devup[dev] ? '' : '_disabled') + '.png';
+ img.src = '<%=resource%>/icons/wifi' + (radiostate[dev].up ? '' : '_disabled') + '.png';
+
+ var stat = document.getElementById(dev + '-iw-devinfo');
+ if (stat)
+ stat.innerHTML = String.format(
+ '<strong><%:Channel%>:</strong> %s (%s <%:GHz%>) | ' +
+ '<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%>',
+ radiostate[dev].channel ? radiostate[dev].channel : '?',
+ radiostate[dev].frequency ? radiostate[dev].frequency : '?',
+ radiostate[dev].bitrate ? radiostate[dev].bitrate : '?'
+ );
}
}
}
@@ -375,92 +279,76 @@
<h2 name="content"><%:Wireless Overview%></h2>
-<fieldset class="cbi-section" style="display:none">
+<div class="cbi-section" style="display:none">
<legend><%:Reconnecting interface%></legend>
<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
<span id="iw-rc-status"><%:Waiting for changes to be applied...%></span>
-</fieldset>
+</div>
-<div class="cbi-map">
+<div id="cbi-wireless-overview" class="cbi-map">
<% for _, dev in ipairs(devices) do local nets = dev:get_wifinets() %>
<!-- device <%=dev:name()%> -->
- <fieldset class="cbi-section">
- <table class="cbi-section-table" style="margin:10px; empty-cells:hide">
+ <div class="cbi-section-node">
+ <div class="table">
<!-- physical device -->
- <tr>
- <td style="width:34px"><img src="<%=resource%>/icons/wifi_big_disabled.png" style="float:left; margin-right:10px" id="<%=dev:name()%>-iw-upstate" /></td>
- <td colspan="2" style="text-align:left">
- <big><strong><%=guess_wifi_hw(dev)%> (<%=dev:name()%>)</strong></big><br />
+ <div class="tr">
+ <div class="td col-2 center">
+ <span class="ifacebadge"><img src="<%=resource%>/icons/wifi_disabled.png" id="<%=dev:name()%>-iw-upstate" /> <%=dev:name()%></span>
+ </div>
+ <div class="td col-7 left">
+ <big><strong><%=guess_wifi_hw(dev)%></strong></big><br />
<span id="<%=dev:name()%>-iw-devinfo"></span>
- </td>
- <td style="width:310px;text-align:right">
+ </div>
+ <div class="td cbi-section-actions">
<form action="<%=url('admin/network/wireless_join')%>" method="post" class="inline">
<input type="hidden" name="device" value="<%=dev:name()%>" />
<input type="hidden" name="token" value="<%=token%>" />
- <input type="submit" class="cbi-button cbi-button-find" style="width:100px" title="<%:Find and join network%>" value="<%:Scan%>" />
+ <input type="submit" class="cbi-button cbi-button-action" title="<%:Find and join network%>" value="<%:Scan%>" />
</form>
<form action="<%=url('admin/network/wireless_add')%>" method="post" class="inline">
<input type="hidden" name="device" value="<%=dev:name()%>" />
<input type="hidden" name="token" value="<%=token%>" />
- <input type="submit" class="cbi-button cbi-button-add" style="width:100px" title="<%:Provide new network%>" value="<%:Add%>" />
+ <input type="submit" class="cbi-button cbi-button-add" title="<%:Provide new network%>" value="<%:Add%>" />
</form>
- </td>
- </tr>
+ </div>
+ </div>
<!-- /physical device -->
<!-- network list -->
<% if #nets > 0 then %>
<% for i, net in ipairs(nets) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
- <td></td>
- <td class="cbi-value-field" style="vertical-align:middle; padding:3px" id="<%=net:id()%>-iw-signal">
+ <div class="tr cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
+ <div class="td col-2 center" id="<%=net:id()%>-iw-signal">
<span class="ifacebadge" title="<%:Not associated%>"><img src="<%=resource%>/icons/signal-none.png" /> 0%</span>
- </td>
- <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=net:id()%>-iw-status">
+ </div>
+ <div class="td col-7 left" id="<%=net:id()%>-iw-status">
<em><%:Collecting data...%></em>
- </td>
- <td class="cbi-value-field" style="width:310px;text-align:right">
- <input id="<%=net:id()%>-iw-toggle" type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="wifi_shutdown('<%=net:id()%>', this)" title="<%:Delete this network%>" value="<%:Enable%>" />
- <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=net:adminlink()%>'" title="<%:Edit this network%>" value="<%:Edit%>" />
- <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="wifi_delete('<%=net:id()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
- </td>
- </tr>
+ </div>
+ <div class="td cbi-section-actions">
+ <input id="<%=net:id()%>-iw-toggle" type="button" class="cbi-button cbi-button-neutral" onclick="wifi_shutdown('<%=net:id()%>', this)" title="<%:Enable this network%>" value="<%:Enable%>" />
+ <input type="button" class="cbi-button cbi-button-action important" onclick="location.href='<%=net:adminlink()%>'" title="<%:Edit this network%>" value="<%:Edit%>" />
+ <input type="button" class="cbi-button cbi-button-negative" onclick="wifi_delete('<%=net:id()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
+ </div>
+ </div>
<% end %>
<% else %>
- <tr class="cbi-section-table-row cbi-rowstyle-2">
- <td></td>
- <td colspan="3" class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px">
+ <div class="tr cbi-rowstyle-2">
+ <div class="td left">
<em><%:No network configured on this device%></em>
- </td>
- </tr>
+ </div>
+ </div>
<% end %>
<!-- /network list -->
- </table>
- </fieldset>
+ </div>
+ </div>
<!-- /device <%=dev:name()%> -->
<% end %>
<h2><%:Associated Stations%></h2>
- <fieldset class="cbi-section">
- <table class="cbi-section-table valign-middle" style="margin:10px" id="iw-assoclist">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"></th>
- <th class="cbi-section-table-cell"><%:SSID%></th>
- <th class="cbi-section-table-cell"><%:MAC-Address%></th>
- <th class="cbi-section-table-cell"><%:Host%></th>
- <th class="cbi-section-table-cell"><%:Signal%> / <%:Noise%></th>
- <th class="cbi-section-table-cell"><%:RX Rate%> / <%:TX Rate%></th>
- </tr>
- <tr class="cbi-section-table-row cbi-rowstyle-2">
- <td class="cbi-value-field" colspan="6">
- <em><%:Collecting data...%></em>
- </td>
- </tr>
- </table>
- </fieldset>
+ <%+admin_network/wifi_assoclist%>
</div>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
index 04687f38e7..85468252e9 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
@@ -62,17 +62,17 @@
);
//]]></script>
-<table>
- <tr class="cbi-section-table">
- <td></td>
- <td class="cbi-value-field" style="width:16px; padding:3px" id="<%=self.option%>-iw-signal">
+<div class="table">
+ <div class="tr cbi-section-table">
+ <div class="td"></div>
+ <div class="td cbi-value-field" style="width:16px; padding:3px" id="<%=self.option%>-iw-signal">
<img src="<%=resource%>/icons/signal-none.png" title="<%:Not associated%>" /><br />
<small>0%</small>
- </td>
- <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-iw-description">
+ </div>
+ <div class="td cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-iw-description">
<em><%:Collecting data...%></em>
- </td>
- </tr>
-</table>
+ </div>
+ </div>
+</div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
index 33bbee7843..b7594bfd45 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
@@ -202,18 +202,13 @@
data_rx_peak = Math.max(data_rx_peak, data_rx[i]);
data_tx_peak = Math.max(data_tx_peak, data_tx[i]);
- if (i > 0)
- {
- data_rx_avg = (data_rx_avg + data_rx[i]) / 2;
- data_tx_avg = (data_tx_avg + data_tx[i]) / 2;
- }
- else
- {
- data_rx_avg = data_rx[i];
- data_tx_avg = data_tx[i];
- }
+ data_rx_avg += data_rx[i];
+ data_tx_avg += data_tx[i];
}
+ data_rx_avg = (data_rx_avg / Math.max(data_rx.length, 1));
+ data_tx_avg = (data_tx_avg / Math.max(data_tx.length, 1));
+
/* remember current timestamp, calculate horizontal scale */
data_stamp = data[data.length-1][TIME];
data_scale = height / (data_max * 1.1);
@@ -258,6 +253,8 @@
label_tx_peak.innerHTML = bandwidth_label(data_tx_peak, true);
}
);
+
+ XHR.run();
}
}, 1000
);
@@ -275,27 +272,27 @@
<div style="text-align:right"><small id="scale">-</small></div>
<br />
-<table style="width:100%; table-layout:fixed" cellspacing="5">
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Inbound:%></strong></td>
- <td id="rx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Inbound:%></strong></div>
+ <div class="td" id="rx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="rx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="rx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="rx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
- </tr>
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Outbound:%></strong></td>
- <td id="tx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="rx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
+ </div>
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Outbound:%></strong></div>
+ <div class="td" id="tx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="tx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="tx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="tx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
- </tr>
-</table>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="tx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
+ </div>
+</div>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
index b7ebc41451..ae8a6bb7ce 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
@@ -139,8 +139,8 @@
{
var conn = json.connections;
- while (conn_table.rows.length > 1)
- conn_table.rows[0].parentNode.deleteRow(-1);
+ while (conn_table.firstElementChild !== conn_table.lastElementChild)
+ conn_table.removeChild(conn_table.lastElementChild);
var lookup_queue = [ ];
@@ -153,13 +153,10 @@
{
var c = conn[i];
- if ((c.src == '127.0.0.1' && c.dst == '127.0.0.1')
- || (c.src == '::1' && c.dst == '::1'))
+ if ((c.src == '127.0.0.1' && c.dst == '127.0.0.1') ||
+ (c.src == '::1' && c.dst == '::1'))
continue;
- var tr = conn_table.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2));
-
if (!dns_cache[c.src])
lookup_queue.push(c.src);
@@ -169,14 +166,13 @@
var src = dns_cache[c.src] || (c.layer3 == 'ipv6' ? '[' + c.src + ']' : c.src);
var dst = dns_cache[c.dst] || (c.layer3 == 'ipv6' ? '[' + c.dst + ']' : c.dst);
- tr.insertCell(-1).innerHTML = c.layer3.toUpperCase();
- tr.insertCell(-1).innerHTML = c.layer4.toUpperCase();
- tr.insertCell(-1).innerHTML = String.format('%s:%d', src, c.sport);
- tr.insertCell(-1).innerHTML = String.format('%s:%d', dst, c.dport);
-
- var traf = tr.insertCell(-1);
- traf.style.whiteSpace = 'nowrap';
- traf.innerHTML = String.format('%1024.2mB (%d <%:Pkts.%>)', c.bytes, c.packets);
+ conn_table.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(1 + (i % 2)), [
+ E('<div class="td">', c.layer3.toUpperCase()),
+ E('<div class="td">', c.layer4.toUpperCase()),
+ E('<div class="td">', [ src, ':', c.sport ]),
+ E('<div class="td">', [ dst, ':', c.dport ]),
+ E('<div class="td" style="white-space:nowrap">', '%1024.2mB (%d <%:Pkts.%>)'.format(c.bytes, c.packets)),
+ ]));
}
if (lookup_queue.length > 0)
@@ -308,6 +304,8 @@
label_otr_peak.innerHTML = Math.floor(data_otr_peak);
}
);
+
+ XHR.run();
}
}, 1000
);
@@ -324,52 +322,52 @@
<div style="text-align:right"><small id="scale">-</small></div>
<br />
- <table style="width:100%; table-layout:fixed" cellspacing="5">
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:UDP:%></strong></td>
- <td id="lb_udp_cur">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="lb_udp_avg">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="lb_udp_peak">0</td>
- </tr>
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:TCP:%></strong></td>
- <td id="lb_tcp_cur">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="lb_tcp_avg">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="lb_tcp_peak">0</td>
- </tr>
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Other:%></strong></td>
- <td id="lb_otr_cur">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="lb_otr_avg">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="lb_otr_peak">0</td>
- </tr>
- </table>
+ <div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:UDP:%></strong></div>
+ <div class="td" id="lb_udp_cur">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="lb_udp_avg">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="lb_udp_peak">0</div>
+ </div>
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:TCP:%></strong></div>
+ <div class="td" id="lb_tcp_cur">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="lb_tcp_avg">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="lb_tcp_peak">0</div>
+ </div>
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Other:%></strong></div>
+ <div class="td" id="lb_otr_cur">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="lb_otr_avg">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="lb_otr_peak">0</div>
+ </div>
+ </div>
<br />
<div class="cbi-section-node">
- <table class="cbi-section-table" id="connections">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Network%></th>
- <th class="cbi-section-table-cell"><%:Protocol%></th>
- <th class="cbi-section-table-cell"><%:Source%></th>
- <th class="cbi-section-table-cell"><%:Destination%></th>
- <th class="cbi-section-table-cell"><%:Transfer%></th>
- </tr>
-
- <tr><td colspan="5"><em><%:Collecting data...%></em></td></tr>
- </table>
+ <div class="table cbi-section-table" id="connections">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Network%></div>
+ <div class="th cbi-section-table-cell"><%:Protocol%></div>
+ <div class="th cbi-section-table-cell"><%:Source%></div>
+ <div class="th cbi-section-table-cell"><%:Destination%></div>
+ <div class="th cbi-section-table-cell"><%:Transfer%></div>
+ </div>
+
+ <div class="tr"><div class="td" colspan="5"><em><%:Collecting data...%></em></div></div>
+ </div>
</div>
</fieldset>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
index 5e6e494ad6..9aee30b5f9 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
@@ -6,6 +6,7 @@
<%
local fs = require "nixio.fs"
+ local ipc = require "luci.ip"
local util = require "luci.util"
local stat = require "luci.tools.status"
local ver = require "luci.version"
@@ -52,12 +53,12 @@
swap = swapinfo,
connmax = conn_max,
conncount = conn_count,
- leases = stat.dhcp_leases(),
- leases6 = stat.dhcp6_leases(),
wifinets = stat.wifi_networks()
}
if wan then
+ local dev = wan:get_interface()
+ local link = dev and ipc.link(dev:name())
rv.wan = {
ipaddr = wan:ipaddr(),
gwaddr = wan:gwaddr(),
@@ -66,12 +67,19 @@
expires = wan:expires(),
uptime = wan:uptime(),
proto = wan:proto(),
+ i18n = wan:get_i18n(),
ifname = wan:ifname(),
- link = wan:adminlink()
+ link = wan:adminlink(),
+ mac = dev and dev:mac(),
+ type = dev and dev:type(),
+ name = dev and dev:get_i18n(),
+ ether = link and link.type == 1
}
end
if wan6 then
+ local dev = wan6:get_interface()
+ local link = dev and ipc.link(dev:name())
rv.wan6 = {
ip6addr = wan6:ip6addr(),
gw6addr = wan6:gw6addr(),
@@ -79,8 +87,13 @@
ip6prefix = wan6:ip6prefix(),
uptime = wan6:uptime(),
proto = wan6:proto(),
+ i18n = wan6:get_i18n(),
ifname = wan6:ifname(),
- link = wan6:adminlink()
+ link = wan6:adminlink(),
+ mac = dev and dev:mac(),
+ type = dev and dev:type(),
+ name = dev and dev:get_i18n(),
+ ether = link and link.type == 1
}
end
@@ -96,11 +109,6 @@
luci.http.write_json(rv)
return
- elseif luci.http.formvalue("hosts") == "1" then
- luci.http.prepare_content("application/json")
- luci.http.write_json(luci.sys.net.host_hints())
-
- return
end
-%>
@@ -115,7 +123,7 @@
var pc = Math.floor((100 / mn) * vn);
return String.format(
- '<div style="width:200px; position:relative; border:1px solid #999999">' +
+ '<div style="width:100%%; max-width:200px; position:relative; border:1px solid #999999">' +
'<div style="background-color:#CCCCCC; width:%d%%; height:15px">' +
'<div style="position:absolute; left:0; top:0; text-align:center; width:100%%; color:#000000">' +
'<small>%s / %s (%d%%)</small>' +
@@ -125,172 +133,92 @@
);
}
- 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%>';
- }
+ function labelList(items, offset) {
+ var rv = [ ];
- return s;
- }
+ for (var i = offset || 0; i < items.length; i += 2) {
+ var label = items[i],
+ value = items[i+1];
+
+ if (value === undefined || value === null)
+ continue;
- function duid2mac(duid) {
- // DUID-LLT / Ethernet
- if (duid.length === 28 && duid.substr(0, 8) === '00010001')
- return duid.substr(16).replace(/(..)(?=..)/g, '$1:').toUpperCase();
+ if (label)
+ rv.push(E('strong', [label, ': ']));
- // DUID-LL / Ethernet
- if (duid.length === 20 && duid.substr(0, 8) === '00030001')
- return duid.substr(8).replace(/(..)(?=..)/g, '$1:').toUpperCase();
+ rv.push(value, E('br'));
+ }
- return null;
+ return rv;
}
- var npoll = 1;
- var hosts = <%=luci.http.write_json(luci.sys.net.host_hints())%>;
+ function renderBox(title, active, childs) {
+ childs = childs || [];
+ childs.unshift(E('span', labelList(arguments, 3)));
- function updateHosts() {
- XHR.get('<%=REQUEST_URI%>', { hosts: 1 }, function(x, data) {
- hosts = data;
- });
+ return E('div', { class: 'ifacebox' }, [
+ E('div', { class: 'ifacebox-head center ' + (active ? 'active' : '') },
+ E('strong', title)),
+ E('div', { class: 'ifacebox-body left' }, childs)
+ ]);
+ }
+
+ function renderBadge(icon, title) {
+ return E('span', { class: 'ifacebadge' }, [
+ E('img', { src: icon, title: title || '' }),
+ E('span', labelList(arguments, 2))
+ ]);
}
XHR.poll(5, '<%=REQUEST_URI%>', { status: 1 },
function(x, info)
{
- if (!(npoll++ % 5))
- updateHosts();
-
- var si = document.getElementById('wan4_i');
- var ss = document.getElementById('wan4_s');
- var ifc = info.wan;
-
- if (ifc && ifc.ifname && ifc.proto != 'none')
- {
- var s = String.format(
- '<strong><%:Type%>: </strong>%s<br />' +
- '<strong><%:Address%>: </strong>%s<br />' +
- '<strong><%:Netmask%>: </strong>%s<br />' +
- '<strong><%:Gateway%>: </strong>%s<br />',
- ifc.proto,
- (ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0',
- (ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255',
- (ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0'
- );
-
- for (var i = 0; i < ifc.dns.length; i++)
- {
- s += String.format(
- '<strong><%:DNS%> %d: </strong>%s<br />',
- i + 1, ifc.dns[i]
- );
- }
-
- if (ifc.expires > -1)
- {
- s += String.format(
- '<strong><%:Expires%>: </strong>%t<br />',
- ifc.expires
- );
- }
-
- if (ifc.uptime > 0)
- {
- s += String.format(
- '<strong><%:Connected%>: </strong>%t<br />',
- ifc.uptime
- );
- }
-
- ss.innerHTML = String.format('<small>%s</small>', s);
- si.innerHTML = String.format(
- '<img src="<%=resource%>/icons/ethernet.png" />' +
- '<br /><small><a href="%s">%s</a></small>',
- ifc.link, ifc.ifname
- );
- }
- else
- {
- si.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
- ss.innerHTML = '<em><%:Not connected%></em>';
- }
+ var us = document.getElementById('upstream_status_table');
+
+ while (us.lastElementChild)
+ us.removeChild(us.lastElementChild);
+
+ var ifc = info.wan || {};
+
+ us.appendChild(renderBox(
+ '<%:IPv4 Upstream%>',
+ (ifc.ifname && ifc.proto != 'none'),
+ [ E('div', {}, renderBadge(
+ '<%=resource%>/icons/%s.png'.format((ifc && ifc.type) ? ifc.type : 'ethernet_disabled'), null,
+ '<%:Device%>', ifc ? (ifc.name || ifc.ifname || '-') : '-',
+ '<%:MAC-Address%>', (ifc && ifc.ether) ? ifc.mac : null)) ],
+ '<%:Protocol%>', ifc.i18n || E('em', '<%:Not connected%>'),
+ '<%:Address%>', (ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0',
+ '<%:Netmask%>', (ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255',
+ '<%:Gateway%>', (ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0',
+ '<%:DNS%> 1', (ifc.dns) ? ifc.dns[0] : null,
+ '<%:DNS%> 2', (ifc.dns) ? ifc.dns[1] : null,
+ '<%:DNS%> 3', (ifc.dns) ? ifc.dns[2] : null,
+ '<%:DNS%> 4', (ifc.dns) ? ifc.dns[3] : null,
+ '<%:DNS%> 5', (ifc.dns) ? ifc.dns[4] : null,
+ '<%:Expires%>', (ifc.expires > -1) ? '%t'.format(ifc.expires) : null,
+ '<%:Connected%>', (ifc.uptime > 0) ? '%t'.format(ifc.uptime) : null));
<% if has_ipv6 then %>
- var si6 = document.getElementById('wan6_i');
- var ss6 = document.getElementById('wan6_s');
- var ifc6 = info.wan6;
-
- if (ifc6 && ifc6.ifname && ifc6.proto != 'none')
- {
- var s = String.format(
- '<strong><%:Type%>: </strong>%s%s<br />',
- ifc6.proto, (ifc6.ip6prefix) ? '-pd' : ''
- );
-
- if (!ifc6.ip6prefix)
- {
- s += String.format(
- '<strong><%:Address%>: </strong>%s<br />',
- (ifc6.ip6addr) ? ifc6.ip6addr : '::'
- );
- }
- else
- {
- s += String.format(
- '<strong><%:Prefix Delegated%>: </strong>%s<br />',
- ifc6.ip6prefix
- );
- if (ifc6.ip6addr)
- {
- s += String.format(
- '<strong><%:Address%>: </strong>%s<br />',
- ifc6.ip6addr
- );
- }
- }
-
- s += String.format(
- '<strong><%:Gateway%>: </strong>%s<br />',
- (ifc6.gw6addr) ? ifc6.gw6addr : '::'
- );
-
- for (var i = 0; i < ifc6.dns.length; i++)
- {
- s += String.format(
- '<strong><%:DNS%> %d: </strong>%s<br />',
- i + 1, ifc6.dns[i]
- );
- }
-
- if (ifc6.uptime > 0)
- {
- s += String.format(
- '<strong><%:Connected%>: </strong>%t<br />',
- ifc6.uptime
- );
- }
-
- ss6.innerHTML = String.format('<small>%s</small>', s);
- si6.innerHTML = String.format(
- '<img src="<%=resource%>/icons/ethernet.png" />' +
- '<br /><small><a href="%s">%s</a></small>',
- ifc6.link, ifc6.ifname
- );
- }
- else
- {
- si6.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
- ss6.innerHTML = '<em><%:Not connected%></em>';
- }
+ var ifc6 = info.wan6 || {};
+
+ us.appendChild(renderBox(
+ '<%:IPv6 Upstream%>',
+ (ifc6.ifname && ifc6.proto != 'none'),
+ [ E('div', {}, renderBadge(
+ '<%=resource%>/icons/%s.png'.format(ifc6.type || 'ethernet_disabled'), null,
+ '<%:Device%>', ifc6 ? (ifc6.name || ifc6.ifname || '-') : '-',
+ '<%:MAC-Address%>', (ifc6 && ifc6.ether) ? ifc6.mac : null)) ],
+ '<%:Protocol%>', ifc6.i18n ? (ifc6.i18n + (ifc6.proto === 'dhcp' && ifc6.ip6prefix ? '-PD' : '')) : E('em', '<%:Not connected%>'),
+ '<%:Prefix Delegated%>', ifc6.ip6prefix,
+ '<%:Address%>', (ifc6.ip6prefix) ? (ifc6.ip6addr || null) : (ifc6.ipaddr || '::'),
+ '<%:Gateway%>', (ifc6.gw6addr) ? ifc6.gw6addr : '::',
+ '<%:DNS%> 1', (ifc6.dns) ? ifc6.dns[0] : null,
+ '<%:DNS%> 2', (ifc6.dns) ? ifc6.dns[1] : null,
+ '<%:DNS%> 3', (ifc6.dns) ? ifc6.dns[2] : null,
+ '<%:DNS%> 4', (ifc6.dns) ? ifc6.dns[3] : null,
+ '<%:DNS%> 5', (ifc6.dns) ? ifc6.dns[4] : null,
+ '<%:Connected%>', (ifc6.uptime > 0) ? '%t'.format(ifc6.uptime) : null));
<% end %>
<% if has_dsl then %>
@@ -353,122 +281,18 @@
);
<% end %>
- <% if has_dhcp then %>
- var ls = document.getElementById('lease_status_table');
- if (ls)
- {
- /* clear all rows */
- while( ls.rows.length > 1 )
- ls.rows[0].parentNode.deleteRow(1);
-
- for( var i = 0; i < info.leases.length; i++ )
- {
- var timestr;
-
- if (info.leases[i].expires === false)
- timestr = '<em><%:unlimited%></em>';
- else if (info.leases[i].expires <= 0)
- timestr = '<em><%:expired%></em>';
- else
- timestr = String.format('%t', info.leases[i].expires);
-
- var tr = ls.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
- tr.insertCell(-1).innerHTML = info.leases[i].hostname ? info.leases[i].hostname : '?';
- tr.insertCell(-1).innerHTML = info.leases[i].ipaddr;
- tr.insertCell(-1).innerHTML = info.leases[i].macaddr;
- tr.insertCell(-1).innerHTML = timestr;
- }
-
- if( ls.rows.length == 1 )
- {
- var tr = ls.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 4;
- td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
- }
- }
-
- var ls6 = document.getElementById('lease6_status_table');
- if (ls6 && info.leases6)
- {
- ls6.parentNode.style.display = 'block';
-
- /* clear all rows */
- while( ls6.rows.length > 1 )
- ls6.rows[0].parentNode.deleteRow(1);
-
- for( var i = 0; i < info.leases6.length; i++ )
- {
- var timestr;
-
- if (info.leases6[i].expires === false)
- timestr = '<em><%:unlimited%></em>';
- else if (info.leases6[i].expires <= 0)
- timestr = '<em><%:expired%></em>';
- else
- timestr = String.format('%t', info.leases6[i].expires);
-
- var tr = ls6.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
- var host = hosts[duid2mac(info.leases6[i].duid)];
- if (!info.leases6[i].hostname)
- tr.insertCell(-1).innerHTML =
- (host && (host.name || host.ipv4 || host.ipv6))
- ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">? (%h)</div>'.format(host.name || host.ipv4 || host.ipv6)
- : '?';
- else
- tr.insertCell(-1).innerHTML =
- (host && host.name && info.leases6[i].hostname != host.name)
- ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">%h (%h)</div>'.format(info.leases6[i].hostname, host.name)
- : info.leases6[i].hostname;
-
- tr.insertCell(-1).innerHTML = info.leases6[i].ip6addr;
- tr.insertCell(-1).innerHTML = info.leases6[i].duid;
- tr.insertCell(-1).innerHTML = timestr;
- }
-
- if( ls6.rows.length == 1 )
- {
- var tr = ls6.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 4;
- td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
- }
- }
- <% end %>
-
<% if has_wifi then %>
- var assoclist = [ ];
-
var ws = document.getElementById('wifi_status_table');
if (ws)
{
- var wsbody = ws.rows[0].parentNode;
- while (ws.rows.length > 0)
- wsbody.deleteRow(0);
+ while (ws.lastElementChild)
+ ws.removeChild(ws.lastElementChild);
for (var didx = 0; didx < info.wifinets.length; didx++)
{
var dev = info.wifinets[didx];
-
- var tr = wsbody.insertRow(-1);
- var td;
-
- td = tr.insertCell(-1);
- td.width = "33%";
- td.innerHTML = dev.name;
- td.style.verticalAlign = "top";
-
- td = tr.insertCell(-1);
-
- var s = '';
+ var net0 = (dev.networks && dev.networks[0]) ? dev.networks[0] : {};
+ var vifs = [];
for (var nidx = 0; nidx < dev.networks.length; nidx++)
{
@@ -489,135 +313,27 @@
else
icon = "<%=resource%>/icons/signal-75-100.png";
- s += String.format(
- '<table><tr><td style="text-align:center; width:32px; padding:3px">' +
- '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />' +
- '<br /><small>%d%%</small>' +
- '</td><td style="text-align:left; padding:3px"><small>' +
- '<strong><%:SSID%>:</strong> <a href="%s">%h</a><br />' +
- '<strong><%:Mode%>:</strong> %s<br />' +
- '<strong><%:Channel%>:</strong> %d (%.3f <%:GHz%>)<br />' +
- '<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%><br />',
- icon, net.signal, net.noise,
- net.quality,
- net.link, net.ssid || '?',
- net.mode,
- net.channel, net.frequency,
- net.bitrate || '?'
- );
-
- if (is_assoc)
- {
- s += String.format(
- '<strong><%:BSSID%>:</strong> %s<br />' +
- '<strong><%:Encryption%>:</strong> %s',
- net.bssid || '?',
- net.encryption
- );
- }
- else
- {
- s += '<em><%:Wireless is disabled or not associated%></em>';
- }
-
- s += '</small></td></tr></table>';
-
- for (var bssid in net.assoclist)
- {
- var bss = net.assoclist[bssid];
-
- bss.bssid = bssid;
- bss.link = net.link;
- bss.name = net.name;
- bss.ifname = net.ifname;
- bss.radio = dev.name;
-
- assoclist.push(bss);
- }
+ vifs.push(renderBadge(
+ icon,
+ '<%:Signal%>: %d dBm / <%:Quality%>: %d%%'.format(net.signal, net.quality),
+ '<%:SSID%>', E('a', { href: net.link }, [ net.ssid || '?' ]),
+ '<%:Mode%>', net.mode,
+ '<%:BSSID%>', is_assoc ? (net.bssid || '-') : null,
+ '<%:Encryption%>', is_assoc ? net.encryption : null,
+ '<%:Associations%>', is_assoc ? (net.num_assoc || '-') : null,
+ null, is_assoc ? null : E('em', '<%:Wireless is disabled or not associated%>')));
}
- if (!s)
- s = '<em><%:No information available%></em>';
-
- td.innerHTML = s;
- }
- }
-
- var ac = document.getElementById('wifi_assoc_table');
- if (ac)
- {
- /* clear all rows */
- while( ac.rows.length > 1 )
- ac.rows[0].parentNode.deleteRow(1);
-
- assoclist.sort(function(a, b) {
- return (a.name == b.name)
- ? (a.bssid < b.bssid)
- : (a.name > b.name )
- ;
- });
-
- for( var i = 0; i < assoclist.length; i++ )
- {
- var tr = ac.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2));
-
- var icon;
- var q = (-1 * (assoclist[i].noise - assoclist[i].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";
-
- tr.insertCell(-1).innerHTML = String.format(
- '<span class="ifacebadge" title="%q"><img src="<%=resource%>/icons/wifi.png" /> %h</span>',
- assoclist[i].radio, assoclist[i].ifname
- );
-
- tr.insertCell(-1).innerHTML = String.format(
- '<a href="%s">%s</a>',
- assoclist[i].link,
- '%h'.format(assoclist[i].name).nobr()
- );
-
- tr.insertCell(-1).innerHTML = assoclist[i].bssid;
-
- var host = hosts[assoclist[i].bssid];
- if (host)
- tr.insertCell(-1).innerHTML = String.format(
- '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis">%s</div>',
- ((host.name && (host.ipv4 || host.ipv6))
- ? '%h (%s)'.format(host.name, host.ipv4 || host.ipv6)
- : '%h'.format(host.name || host.ipv4 || host.ipv6)).nobr()
- );
- else
- tr.insertCell(-1).innerHTML = '?';
-
- tr.insertCell(-1).innerHTML = String.format(
- '<span class="ifacebadge" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%> / <%:SNR%>: %d"><img src="%s" /> %d / %d <%:dBm%></span>',
- assoclist[i].signal, assoclist[i].noise, assoclist[i].signal - assoclist[i].noise,
- icon,
- assoclist[i].signal, assoclist[i].noise
- );
-
- tr.insertCell(-1).innerHTML = wifirate(assoclist[i], true).nobr() + '<br />' + wifirate(assoclist[i], false).nobr();
+ ws.appendChild(renderBox(
+ dev.device, dev.up || net0.up,
+ [ E('div', vifs) ],
+ '<%:Type%>', dev.name.replace(/^Generic | Wireless Controller .+$/g, ''),
+ '<%:Channel%>', net0.channel ? '%d (%.3f <%:GHz%>)'.format(net0.channel, net0.frequency) : '-',
+ '<%:Bitrate%>', net0.bitrate ? '%d <%:Mbit/s%>'.format(net0.bitrate) : '-'));
}
- if (ac.rows.length == 1)
- {
- var tr = ac.rows[0].parentNode.insertRow(-1);
- tr.className = 'cbi-section-table-row';
-
- var td = tr.insertCell(-1);
- td.colSpan = 7;
- td.innerHTML = '<br /><em><%:No information available%></em>';
- }
+ if (!ws.lastElementChild)
+ ws.appendChild(E('<em><%:No information available%></em>'));
}
<% end %>
@@ -676,140 +392,97 @@
<h2 name="content"><%:Status%></h2>
-<fieldset class="cbi-section">
- <legend><%:System%></legend>
+<div class="cbi-section">
+ <h3><%:System%></h3>
- <table width="100%" cellspacing="10">
- <tr><td width="33%"><%:Hostname%></td><td><%=luci.sys.hostname() or "?"%></td></tr>
- <tr><td width="33%"><%:Model%></td><td><%=pcdata(boardinfo.model or boardinfo.system or "?")%></td></tr>
- <tr><td width="33%"><%:Firmware Version%></td><td>
+ <div class="table" width="100%">
+ <div class="tr"><div class="td left" width="33%"><%:Hostname%></div><div class="td left"><%=luci.sys.hostname() or "?"%></div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Model%></div><div class="td left"><%=pcdata(boardinfo.model or "?")%></div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Architecture%></div><div class="td left"><%=pcdata(boardinfo.system or "?")%></div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Firmware Version%></div><div class="td left">
<%=pcdata(ver.distname)%> <%=pcdata(ver.distversion)%> /
<%=pcdata(ver.luciname)%> (<%=pcdata(ver.luciversion)%>)
- </td></tr>
- <tr><td width="33%"><%:Kernel Version%></td><td><%=unameinfo.release or "?"%></td></tr>
- <tr><td width="33%"><%:Local Time%></td><td id="localtime">-</td></tr>
- <tr><td width="33%"><%:Uptime%></td><td id="uptime">-</td></tr>
- <tr><td width="33%"><%:Load Average%></td><td id="loadavg">-</td></tr>
- </table>
-</fieldset>
-
-<fieldset class="cbi-section">
- <legend><%:Memory%></legend>
-
- <table width="100%" cellspacing="10">
- <tr><td width="33%"><%:Total Available%></td><td id="memtotal">-</td></tr>
- <tr><td width="33%"><%:Free%></td><td id="memfree">-</td></tr>
- <tr><td width="33%"><%:Buffered%></td><td id="membuff">-</td></tr>
- </table>
-</fieldset>
+ </div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Kernel Version%></div><div class="td left"><%=unameinfo.release or "?"%></div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Local Time%></div><div class="td left" id="localtime">-</div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Uptime%></div><div class="td left" id="uptime">-</div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Load Average%></div><div class="td left" id="loadavg">-</div></div>
+ </div>
+</div>
+
+<div class="cbi-section">
+ <h3><%:Memory%></h3>
+
+ <div class="table" width="100%">
+ <div class="tr"><div class="td left" width="33%"><%:Total Available%></div><div class="td left" id="memtotal">-</div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Free%></div><div class="td left" id="memfree">-</div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Buffered%></div><div class="td left" id="membuff">-</div></div>
+ </div>
+</div>
<% if swapinfo.total > 0 then %>
-<fieldset class="cbi-section">
- <legend><%:Swap%></legend>
-
- <table width="100%" cellspacing="10">
- <tr><td width="33%"><%:Total Available%></td><td id="swaptotal">-</td></tr>
- <tr><td width="33%"><%:Free%></td><td id="swapfree">-</td></tr>
- </table>
-</fieldset>
+<div class="cbi-section">
+ <h3><%:Swap%></h3>
+
+ <div class="table" width="100%">
+ <div class="tr"><div class="td left" width="33%"><%:Total Available%></div><div class="td left" id="swaptotal">-</div></div>
+ <div class="tr"><div class="td left" width="33%"><%:Free%></div><div class="td left" id="swapfree">-</div></div>
+ </div>
+</div>
<% end %>
-<fieldset class="cbi-section">
- <legend><%:Network%></legend>
-
- <table width="100%" cellspacing="10">
- <tr><td width="33%" style="vertical-align:top"><%:IPv4 WAN Status%></td><td>
- <table><tr>
- <td id="wan4_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td>
- <td id="wan4_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td>
- </tr></table>
- </td></tr>
- <% if has_ipv6 then %>
- <tr><td width="33%" style="vertical-align:top"><%:IPv6 WAN Status%></td><td>
- <table><tr>
- <td id="wan6_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td>
- <td id="wan6_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td>
- </tr></table>
- </td></tr>
- <% end %>
- <tr><td width="33%"><%:Active Connections%></td><td id="conns">-</td></tr>
- </table>
-</fieldset>
-
-<% if has_dhcp then %>
-<fieldset class="cbi-section">
- <legend><%:DHCP Leases%></legend>
-
- <table class="cbi-section-table" id="lease_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Hostname%></th>
- <th class="cbi-section-table-cell"><%:IPv4-Address%></th>
- <th class="cbi-section-table-cell"><%:MAC-Address%></th>
- <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="4"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
-</fieldset>
-
-<fieldset class="cbi-section" style="display:none">
- <legend><%:DHCPv6 Leases%></legend>
-
- <table class="cbi-section-table" id="lease6_status_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Host%></th>
- <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
- <th class="cbi-section-table-cell"><%:DUID%></th>
- <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="4"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
-</fieldset>
-<% end %>
+<div class="cbi-section">
+ <h3><%:Network%></h3>
+
+ <div id="upstream_status_table" class="network-status-table">
+ <em><%:Collecting data...%></em>
+ </div>
+
+ <div class="table" width="100%">
+ <div class="tr"><div class="td left" width="33%"><%:Active Connections%></div><div class="td left" id="conns">-</div></div>
+ </div>
+</div>
+
+<%
+ if has_dhcp then
+ include("admin_network/lease_status")
+ end
+%>
<% if has_dsl then %>
-<fieldset class="cbi-section">
- <legend><%:DSL%></legend>
- <table width="100%" cellspacing="10">
- <tr><td width="33%" style="vertical-align:top"><%:DSL Status%></td><td>
- <table><tr>
- <td id="dsl_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td>
- <td id="dsl_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td>
- </tr></table>
- </td></tr>
- </table>
-</fieldset>
+<div class="cbi-section">
+ <h3><%:DSL%></h3>
+
+ <div class="table" width="100%">
+ <div class="tr">
+ <div class="td left" width="33%" style="vertical-align:top"><%:DSL Status%></div>
+ <div class="td">
+ <div class="table">
+ <div class="tr">
+ <div class="td" id="dsl_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></div>
+ <div class="td left" id="dsl_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
<% end %>
<% if has_wifi then %>
-<fieldset class="cbi-section">
- <legend><%:Wireless%></legend>
-
- <table id="wifi_status_table" width="100%" cellspacing="10">
- <tr><td><em><%:Collecting data...%></em></td></tr>
- </table>
-</fieldset>
-
-<fieldset class="cbi-section">
- <legend><%:Associated Stations%></legend>
-
- <table class="cbi-section-table valign-middle" id="wifi_assoc_table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell">&#160;</th>
- <th class="cbi-section-table-cell"><%:Network%></th>
- <th class="cbi-section-table-cell"><%:MAC-Address%></th>
- <th class="cbi-section-table-cell"><%:Host%></th>
- <th class="cbi-section-table-cell"><%:Signal%> / <%:Noise%></th>
- <th class="cbi-section-table-cell"><%:RX Rate%> / <%:TX Rate%></th>
- </tr>
- <tr class="cbi-section-table-row">
- <td colspan="6"><em><br /><%:Collecting data...%></em></td>
- </tr>
- </table>
-</fieldset>
+<div class="cbi-section">
+ <h3><%:Wireless%></h3>
+
+ <div id="wifi_status_table" class="network-status-table">
+ <em><%:Collecting data...%></em>
+ </div>
+</div>
+
+<div class="cbi-section">
+ <h3><%:Associated Stations%></h3>
+
+ <%+admin_network/wifi_assoclist%>
+</div>
<% end %>
<%-
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
index 3f4b83b80b..5d544ca60b 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
@@ -62,6 +62,7 @@
<%+header%>
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<style type="text/css">
span:target {
color: blue;
@@ -70,7 +71,6 @@
</style>
<h2 name="content"><%:Firewall Status%></h2>
-<br />
<% if has_ip6tables then %>
<ul class="cbi-tabmenu">
@@ -88,69 +88,69 @@
<input type="submit" class="cbi-button" name="restart" value="<%:Restart Firewall%>" />
</form>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<% for _, tbl in ipairs(tables) do chaincnt = 0 %>
<h3><%:Table%>: <%=tbl%></h3>
- <table class="cbi-section-table" style="font-size:90%">
- <% for _, chain in ipairs(ipt:chains(tbl)) do
- rowcnt = 0
- chaincnt = chaincnt + 1
- chaininfo = ipt:chain(tbl, chain)
- %>
- <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
- <th class="cbi-section-table-cell" style="text-align:left" colspan="11">
- <br /><span id="rule_<%=tbl:lower()%>_<%=chain%>">
- <%:Chain%> <em><%=chain%></em>
- (<%- if chaininfo.policy then -%>
- <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
- <%- else -%>
- <%:References%>: <%=chaininfo.references-%>
- <%- end -%>)</span>
- </th>
- </tr>
- <tr class="cbi-section-table-descr">
- <th class="cbi-section-table-cell"><%:Pkts.%></th>
- <th class="cbi-section-table-cell"><%:Traffic%></th>
- <th class="cbi-section-table-cell"><%:Target%></th>
- <th class="cbi-section-table-cell"><%:Prot.%></th>
- <th class="cbi-section-table-cell"><%:In%></th>
- <th class="cbi-section-table-cell"><%:Out%></th>
- <th class="cbi-section-table-cell"><%:Source%></th>
- <th class="cbi-section-table-cell"><%:Destination%></th>
- <th class="cbi-section-table-cell" style="width:30%"><%:Options%></th>
- </tr>
-
- <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
- <td><%=rule.packets%></td>
- <td style="white-space: nowrap"><%=wba.byte_format(rule.bytes)%></td>
- <td><%=rule.target and link_target(tbl, rule.target) or "-"%></td>
- <td><%=rule.protocol%></td>
- <td><%=link_iface(rule.inputif)%></td>
- <td><%=link_iface(rule.outputif)%></td>
- <td><%=rule.source%></td>
- <td><%=rule.destination%></td>
- <td style="width:30%"><small><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></small></td>
- </tr>
- <% end %>
-
- <% if rowcnt == 1 then %>
- <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
- <td colspan="9"><em><%:No rules in this chain%></em></td>
- </tr>
- <% end %>
- <% end %>
-
- <% if chaincnt == 0 then %>
- <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
- <td colspan="9"><em><%:No chains in this table%></em></td>
- </tr>
- <% end %>
- </table>
+
+ <% for _, chain in ipairs(ipt:chains(tbl)) do
+ rowcnt = 0
+ chaincnt = chaincnt + 1
+ chaininfo = ipt:chain(tbl, chain)
+ %>
+ <h4 id="rule_<%=tbl:lower()%>_<%=chain%>">
+ <%:Chain%> <em><%=chain%></em>
+ (<%- if chaininfo.policy then -%>
+ <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
+ <%- else -%>
+ <%:References%>: <%=chaininfo.references-%>
+ <%- end -%>)
+ </h4>
+
+ <div class="cbi-section-node">
+ <div class="table" style="font-size:90%">
+ <div class="tr table-titles cbi-rowstyle-<%=rowstyle()%>">
+ <div class="th hide-xs"><%:Pkts.%></div>
+ <div class="th nowrap"><%:Traffic%></div>
+ <div class="th col-5"><%:Target%></div>
+ <div class="th"><%:Prot.%></div>
+ <div class="th"><%:In%></div>
+ <div class="th"><%:Out%></div>
+ <div class="th"><%:Source%></div>
+ <div class="th"><%:Destination%></div>
+ <div class="th col-9 hide-xs"><%:Options%></div>
+ </div>
+
+ <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
+ <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+ <div class="td"><%=rule.packets%></div>
+ <div class="td nowrap"><%=wba.byte_format(rule.bytes)%></div>
+ <div class="td col-5"><%=rule.target and link_target(tbl, rule.target) or "-"%></div>
+ <div class="td"><%=rule.protocol%></div>
+ <div class="td"><%=link_iface(rule.inputif)%></div>
+ <div class="td"><%=link_iface(rule.outputif)%></div>
+ <div class="td"><%=rule.source%></div>
+ <div class="td"><%=rule.destination%></div>
+ <div class="td col-9 hide-xs"><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></div>
+ </div>
+ <% end %>
+
+ <% if rowcnt == 1 then %>
+ <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+ <div class="td" colspan="9"><em><%:No rules in this chain%></em></div>
+ </div>
+ <% end %>
+ </div>
+ </div>
+ <% end %>
+
+ <% if chaincnt == 0 then %>
+ <em><%:No chains in this table%></em>
+ <% end %>
+
<br /><br />
<% end %>
- </fieldset>
+ </div>
</div>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
index 97a2f5ed59..dc7d927de8 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
@@ -237,6 +237,8 @@
label_15_peak.innerHTML = (data_15_peak / 100).toFixed(2);
}
);
+
+ XHR.run();
}
}, 1000
);
@@ -248,37 +250,37 @@
<div style="text-align:right"><small id="scale">-</small></div>
<br />
-<table style="width:100%; table-layout:fixed" cellspacing="5">
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff0000; white-space:nowrap"><%:1 Minute Load:%></strong></td>
- <td id="lb_load01_cur">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="lb_load01_avg">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="lb_load01_peak">0</td>
- </tr>
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff6600; white-space:nowrap"><%:5 Minute Load:%></strong></td>
- <td id="lb_load05_cur">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="lb_load05_avg">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="lb_load05_peak">0</td>
- </tr>
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ffaa00; white-space:nowrap"><%:15 Minute Load:%></strong></td>
- <td id="lb_load15_cur">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="lb_load15_avg">0</td>
-
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="lb_load15_peak">0</td>
- </tr>
-</table>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff0000; white-space:nowrap"><%:1 Minute Load:%></strong></div>
+ <div class="td" id="lb_load01_cur">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="lb_load01_avg">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="lb_load01_peak">0</div>
+ </div>
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff6600; white-space:nowrap"><%:5 Minute Load:%></strong></div>
+ <div class="td" id="lb_load05_cur">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="lb_load05_avg">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="lb_load05_peak">0</div>
+ </div>
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ffaa00; white-space:nowrap"><%:15 Minute Load:%></strong></div>
+ <div class="td" id="lb_load15_cur">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="lb_load15_avg">0</div>
+
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="lb_load15_peak">0</div>
+ </div>
+</div>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
index f474c71568..9ed37939fe 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
@@ -32,130 +32,125 @@
<%+header%>
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
<div class="cbi-map" id="cbi-network">
<h2 name="content"><%:Routes%></h2>
<div class="cbi-map-descr"><%:The following rules are currently active on this system.%></div>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<legend>ARP</legend>
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Address%></th>
- <th class="cbi-section-table-cell"><%_<abbr title="Media Access Control">MAC</abbr>-Address%></th>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- </tr>
+ <div class="table">
+ <div class="tr table-titles">
+ <div class="th"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Address%></div>
+ <div class="th"><%_<abbr title="Media Access Control">MAC</abbr>-Address%></div>
+ <div class="th"><%:Interface%></div>
+ </div>
<%
for _, v in ipairs(ip.neighbors({ family = 4 })) do
if v.mac then
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
- <td class="cbi-value-field"><%=v.dest%></td>
- <td class="cbi-value-field"><%=v.mac%></td>
- <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
- </tr>
+ <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+ <div class="td"><%=v.dest%></div>
+ <div class="td"><%=v.mac%></div>
+ <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></div>
+ </div>
<%
style = not style
end
end
%>
- </table>
+ </div>
</div>
- </fieldset>
- <br />
+ </div>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<legend><%_Active <abbr title="Internet Protocol Version 4">IPv4</abbr>-Routes%></legend>
-
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Network%></th>
- <th class="cbi-section-table-cell"><%:Target%></th>
- <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Gateway%></th>
- <th class="cbi-section-table-cell"><%:Metric%></th>
- <th class="cbi-section-table-cell"><%:Table%></th>
- </tr>
+ <div class="table">
+ <div class="tr table-titles">
+ <div class="th"><%:Network%></div>
+ <div class="th"><%:Target%></div>
+ <div class="th"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Gateway%></div>
+ <div class="th"><%:Metric%></div>
+ <div class="th"><%:Table%></div>
+ </div>
<% for _, v in ipairs(ip.routes({ family = 4, type = 1 })) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
- <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or v.dev%></td>
- <td class="cbi-value-field"><%=v.dest%></td>
- <td class="cbi-value-field"><%=v.gw%></td>
- <td class="cbi-value-field"><%=v.metric or 0%></td>
- <td class="cbi-value-field"><%=rtn[v.table] or v.table%></td>
- </tr>
+ <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+ <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or v.dev%></div>
+ <div class="td"><%=v.dest%></div>
+ <div class="td"><%=v.gw or "-"%></div>
+ <div class="td"><%=v.metric or 0%></div>
+ <div class="td"><%=rtn[v.table] or v.table%></div>
+ </div>
<% style = not style end %>
- </table>
+ </div>
</div>
- </fieldset>
- <br />
+ </div>
<%
if nixio.fs.access("/proc/net/ipv6_route") then
style = true
%>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<legend><%_Active <abbr title="Internet Protocol Version 6">IPv6</abbr>-Routes%></legend>
-
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Network%></th>
- <th class="cbi-section-table-cell"><%:Target%></th>
- <th class="cbi-section-table-cell"><%:Source%></th>
- <th class="cbi-section-table-cell"><%:Metric%></th>
- <th class="cbi-section-table-cell"><%:Table%></th>
- </tr>
+ <div class="table">
+ <div class="tr table-titles">
+ <div class="th"><%:Network%></div>
+ <div class="th"><%:Target%></div>
+ <div class="th"><%:Source%></div>
+ <div class="th"><%:Metric%></div>
+ <div class="th"><%:Table%></div>
+ </div>
<%
for _, v in ipairs(ip.routes({ family = 6, type = 1 })) do
if v.dest and not v.dest:is6linklocal() then
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
- <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
- <td class="cbi-value-field"><%=v.dest%></td>
- <td class="cbi-value-field"><%=v.from%></td>
- <td class="cbi-value-field"><%=v.metric or 0%></td>
- <td class="cbi-value-field"><%=rtn[v.table] or v.table%></td>
- </tr>
+ <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+ <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></div>
+ <div class="td"><%=v.dest%></div>
+ <div class="td"><%=v.from%></div>
+ <div class="td"><%=v.metric or 0%></div>
+ <div class="td"><%=rtn[v.table] or v.table%></div>
+ </div>
<%
style = not style
end
end
%>
- </table>
+ </div>
</div>
- </fieldset>
- <br />
+ </div>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<legend><%:IPv6 Neighbours%></legend>
-
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
- <th class="cbi-section-table-cell"><%:MAC-Address%></th>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- </tr>
+ <div class="table">
+ <div class="tr table-titles">
+ <div class="th"><%:IPv6-Address%></div>
+ <div class="th"><%:MAC-Address%></div>
+ <div class="th"><%:Interface%></div>
+ </div>
<%
for _, v in ipairs(ip.neighbors({ family = 6 })) do
if v.dest and not v.dest:is6linklocal() and v.mac then
%>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
- <td class="cbi-value-field"><%=v.dest%></td>
- <td class="cbi-value-field"><%=v.mac%></td>
- <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
- </tr>
+ <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+ <div class="td"><%=v.dest%></div>
+ <div class="td"><%=v.mac%></div>
+ <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></div>
+ </div>
<%
style = not style
end
end
%>
- </table>
+ </div>
</div>
- </fieldset>
- <br />
+ </div>
<% end %>
</div>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
index aa658ff0cb..1806f4a6c8 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
@@ -276,7 +276,7 @@
function wireless_label(dbm, noise)
{
if (noise)
- return String.format("%d <%:dBm%> (SNR %d <%:dBm%>)", noise_floor + dbm - 255, dbm - noise);
+ return String.format("%d <%:dBm%> (SNR %d <%:dB%>)", noise_floor + dbm - 255, dbm - noise);
else
return String.format("%d <%:dBm%>", noise_floor + dbm - 255);
}
@@ -308,6 +308,8 @@
label_rate_peak.innerHTML = rate_label(data_rate_peak);
}
);
+
+ XHR.run();
}
}, 1000
);
@@ -325,28 +327,28 @@
<div style="text-align:right"><small id="scale">-</small></div>
<br />
-<table style="width:100%; table-layout:fixed" cellspacing="5">
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Signal:%></strong></td>
- <td id="rssi_bw_cur">0 <%:dBm%></td>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Signal:%></strong></div>
+ <div class="td" id="rssi_bw_cur">0 <%:dBm%></div>
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="rssi_bw_avg">0 <%:dBm%></td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="rssi_bw_avg">0 <%:dBm%></div>
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="rssi_bw_peak">0 <%:dBm%></td>
- </tr>
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Noise:%></strong></td>
- <td id="noise_bw_cur">0 <%:dBm%></td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="rssi_bw_peak">0 <%:dBm%></div>
+ </div>
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Noise:%></strong></div>
+ <div class="td" id="noise_bw_cur">0 <%:dBm%></div>
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="noise_bw_avg">0 <%:dBm%></td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="noise_bw_avg">0 <%:dBm%></div>
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="noise_bw_peak">0 <%:dBm%></td>
- </tr>
-</table>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="noise_bw_peak">0 <%:dBm%></div>
+ </div>
+</div>
<br />
@@ -354,17 +356,17 @@
<div style="text-align:right"><small id="scale2">-</small></div>
<br />
-<table style="width:100%; table-layout:fixed" cellspacing="5">
- <tr>
- <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Phy Rate:%></strong></td>
- <td id="rate_bw_cur">0 MBit/s</td>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+ <div class="tr">
+ <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Phy Rate:%></strong></div>
+ <div class="td" id="rate_bw_cur">0 MBit/s</div>
- <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
- <td id="rate_bw_avg">0 MBit/s</td>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+ <div class="td" id="rate_bw_avg">0 MBit/s</div>
- <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
- <td id="rate_bw_peak">0 MBit/s</td>
- </tr>
-</table>
+ <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+ <div class="td" id="rate_bw_peak">0 MBit/s</div>
+ </div>
+</div>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm b/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
index b32ef78263..9eec012547 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
@@ -13,84 +13,78 @@
<li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/backupfiles"><%:Configuration%></a></li>
</ul>
-<fieldset class="cbi-section">
-
- <fieldset class="cbi-section">
- <legend><%:Backup / Restore%></legend>
- <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
- <div class="cbi-section-node">
- <form class="inline" method="post" action="<%=url('admin/system/flashops/backup')%>">
- <input type="hidden" name="token" value="<%=token%>" />
- <div class="cbi-value<% if not reset_avail then %> cbi-value-last<% end %>">
- <label class="cbi-value-title" for="image"><%:Download backup%>:</label>
- <div class="cbi-value-field">
- <input class="cbi-button cbi-button-apply" type="submit" name="backup" value="<%:Generate archive%>" />
- </div>
- </div>
- </form>
- <% if reset_avail then %>
- <form class="inline" method="post" action="<%=url('admin/system/flashops/reset')%>">
- <input type="hidden" name="token" value="<%=token%>" />
- <div class="cbi-value cbi-value-last">
- <label class="cbi-value-title"><%:Reset to defaults%>:</label>
- <div class="cbi-value-field">
- <input onclick="return confirm('<%:Really reset all changes?%>')" class="cbi-button cbi-button-reset" type="submit" name="reset" value="<%:Perform reset%>" />
- </div>
- </div>
- </form>
- <% end %>
- </div>
- <br />
- <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
- <div class="cbi-section-node">
- <form class="inline" method="post" action="<%=url('admin/system/flashops/restore')%>" enctype="multipart/form-data">
- <div class="cbi-value cbi-value-last">
- <label class="cbi-value-title" for="archive"><%:Restore backup%>:</label>
- <div class="cbi-value-field">
- <input type="hidden" name="token" value="<%=token%>" />
- <input type="file" name="archive" id="archive" />
- <input type="submit" class="cbi-button cbi-input-apply" name="restore" value="<%:Upload archive...%>" />
- </div>
+<div class="cbi-section">
+ <legend><%:Backup / Restore%></legend>
+ <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
+ <div class="cbi-section-node">
+ <form class="inline" method="post" action="<%=url('admin/system/flashops/backup')%>">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <div class="cbi-value<% if not reset_avail then %> cbi-value-last<% end %>">
+ <label class="cbi-value-title" for="image"><%:Download backup%>:</label>
+ <div class="cbi-value-field">
+ <input class="cbi-button cbi-button-action important" type="submit" name="backup" value="<%:Generate archive%>" />
</div>
- </form>
- </div>
+ </div>
+ </form>
<% if reset_avail then %>
- <div class="alert-message warning"><%:Custom files (certificates, scripts) may remain on the system. To prevent this, perform a factory-reset first.%></div>
+ <form class="inline" method="post" action="<%=url('admin/system/flashops/reset')%>">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <div class="cbi-value cbi-value-last">
+ <label class="cbi-value-title"><%:Reset to defaults%>:</label>
+ <div class="cbi-value-field">
+ <input onclick="return confirm('<%:Really reset all changes?%>')" class="cbi-button cbi-button-reset" type="submit" name="reset" value="<%:Perform reset%>" />
+ </div>
+ </div>
+ </form>
<% end %>
- </fieldset>
-
+ </div>
<br />
+ <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
+ <div class="cbi-section-node">
+ <form class="inline" method="post" action="<%=url('admin/system/flashops/restore')%>" enctype="multipart/form-data">
+ <div class="cbi-value cbi-value-last">
+ <label class="cbi-value-title" for="archive"><%:Restore backup%>:</label>
+ <div class="cbi-value-field">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="file" name="archive" id="archive" />
+ <input type="submit" class="cbi-button cbi-button-action important" name="restore" value="<%:Upload archive...%>" />
+ </div>
+ </div>
+ </form>
+ </div>
+ <% if reset_avail then %>
+ <div class="alert-message warning"><%:Custom files (certificates, scripts) may remain on the system. To prevent this, perform a factory-reset first.%></div>
+ <% end %>
+</div>
- <fieldset class="cbi-section">
- <legend><%:Flash new firmware image%></legend>
- <% if upgrade_avail then %>
- <form method="post" action="<%=url('admin/system/flashops/sysupgrade')%>" enctype="multipart/form-data">
- <input type="hidden" name="token" value="<%=token%>" />
- <div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires a compatible firmware image).%></div>
- <div class="cbi-section-node">
- <div class="cbi-value">
- <label class="cbi-value-title" for="keep"><%:Keep settings%>:</label>
- <div class="cbi-value-field">
- <input type="checkbox" name="keep" id="keep" checked="checked" />
- </div>
+<div class="cbi-section">
+ <legend><%:Flash new firmware image%></legend>
+ <% if upgrade_avail then %>
+ <form method="post" action="<%=url('admin/system/flashops/sysupgrade')%>" enctype="multipart/form-data">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires a compatible firmware image).%></div>
+ <div class="cbi-section-node">
+ <div class="cbi-value">
+ <label class="cbi-value-title" for="keep"><%:Keep settings%>:</label>
+ <div class="cbi-value-field">
+ <input type="checkbox" name="keep" id="keep" checked="checked" />
</div>
- <div class="cbi-value cbi-value-last<% if image_invalid then %> cbi-value-error<% end %>">
- <label class="cbi-value-title" for="image"><%:Image%>:</label>
- <div class="cbi-value-field">
- <input type="file" name="image" id="image" />
- <input type="submit" class="cbi-button cbi-input-apply" value="<%:Flash image...%>" />
- </div>
+ </div>
+ <div class="cbi-value cbi-value-last<% if image_invalid then %> cbi-value-error<% end %>">
+ <label class="cbi-value-title" for="image"><%:Image%>:</label>
+ <div class="cbi-value-field">
+ <input type="file" name="image" id="image" />
+ <input type="submit" class="cbi-button cbi-button-action important" value="<%:Flash image...%>" />
</div>
</div>
- <% if image_invalid then %>
- <div class="cbi-section-error"><%:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform. %></div>
- <% end %>
- </form>
- <% else %>
- <div class="cbi-section-descr"><%:Sorry, there is no sysupgrade support present; a new firmware image must be flashed manually. Please refer to the wiki for device specific install instructions.%></div>
- <% end %>
- </fieldset>
-
-</fieldset>
+ </div>
+ <% if image_invalid then %>
+ <div class="cbi-section-error"><%:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform. %></div>
+ <% end %>
+ </form>
+ <% else %>
+ <div class="cbi-section-descr"><%:Sorry, there is no sysupgrade support present; a new firmware image must be flashed manually. Please refer to the wiki for device specific install instructions.%></div>
+ <% end %>
+</div>
<%+footer%>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm b/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
index 88e0fffd9c..ef13a91672 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
@@ -44,6 +44,8 @@ end
<%+header%>
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
<h2 name="content"><%:Software%></h2>
<div class="cbi-map">
@@ -57,8 +59,8 @@ end
<input type="hidden" name="exec" value="1" />
<input type="hidden" name="token" value="<%=token%>" />
- <fieldset class="cbi-section">
- <fieldset class="cbi-section-node">
+ <div class="cbi-section">
+ <div class="cbi-section-node">
<% if (install and next(install)) or (remove and next(remove)) or update or upgrade then %>
<div class="cbi-value">
<% if #stdout > 0 then %><pre><%=pcdata(stdout)%></pre><% end %>
@@ -91,18 +93,18 @@ end
<div style="background-color:#F08080; border-right:1px solid #000000; height:100%; width:<%=used_perc%>%">&#160;</div>
</div>
</div>
- </fieldset>
+ </div>
<br />
- <fieldset class="cbi-section-node">
+ <div class="cbi-section-node">
<input type="hidden" name="display" value="<%=pcdata(display)%>" />
<div class="cbi-value">
<label class="cbi-value-title"><%:Download and install package%>:</label>
<div class="cbi-value-field">
<input type="text" name="url" size="30" value="" />
- <input class="cbi-button cbi-input-save" type="submit" name="go" value="<%:OK%>" />
+ <input class="cbi-button cbi-button-save" type="submit" name="go" value="<%:OK%>" />
</div>
</div>
@@ -110,11 +112,11 @@ end
<label class="cbi-value-title"><%:Filter%>:</label>
<div class="cbi-value-field">
<input type="text" name="query" size="20" value="<%=pcdata(query)%>" />
- <input type="submit" class="cbi-button cbi-input-find" name="search" value="<%:Find package%>" />
+ <input type="submit" class="cbi-button cbi-button-action" name="search" value="<%:Find package%>" />
</div>
</div>
- </fieldset>
- </fieldset>
+ </div>
+ </div>
</form>
@@ -122,90 +124,90 @@ end
<ul class="cbi-tabmenu">
- <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&amp;query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
<li class="cbi-tab<% if display ~= "available" then %>-disabled<% end %>"><a href="?display=available&amp;query=<%=pcdata(query)%>"><%:Available packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
+ <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&amp;query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
</ul>
<% if display ~= "available" then %>
- <fieldset class="cbi-section">
- <table class="cbi-section-table" style="width:100%">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
- </tr>
- <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
- <td style="text-align:left; width:10%">
- <form method="post" class="inline" action="<%=REQUEST_URI%>">
- <input type="hidden" name="exec" value="1" />
- <input type="hidden" name="token" value="<%=token%>" />
- <input type="hidden" name="remove" value="<%=pcdata(n)%>" />
- <a onclick="window.confirm('<%:Remove%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" href="#"><%:Remove%></a>
- </form>
- </td>
- <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
- <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
- </tr>
- <% end) %>
- <% if empty then %>
- <tr class="cbi-section-table-row">
- <td style="text-align:left">&#160;</td>
- <td style="text-align:left"><em><%:none%></em></td>
- <td style="text-align:left"><em><%:none%></em></td>
- </tr>
- <% end %>
- </table>
- </fieldset>
+ <div class="cbi-section">
+ <div class="cbi-section-node">
+ <div class="table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th left"><%:Package name%></div>
+ <div class="th left"><%:Version%></div>
+ <div class="th cbi-section-actions">&#160;</div>
+ </div>
+ <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %>
+ <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+ <div class="td left"><%=luci.util.pcdata(n)%></div>
+ <div class="td left"><%=luci.util.pcdata(v)%></div>
+ <div class="td cbi-section-actions">
+ <form method="post" class="inline" action="<%=REQUEST_URI%>">
+ <input type="hidden" name="exec" value="1" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="remove" value="<%=pcdata(n)%>" />
+ <input class="cbi-button cbi-button-remove" type="submit" onclick="window.confirm('<%:Remove%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" value="<%:Remove%>" />
+ </form>
+ </div>
+ </div>
+ <% end) %>
+ <% if empty then %>
+ <div class="tr cbi-section-table-row">
+ <div class="td left">&#160;</div>
+ <div class="td left"><em><%:none%></em></div>
+ <div class="td left"><em><%:none%></em></div>
+ </div>
+ <% end %>
+ </div>
+ </div>
+ </div>
<% else %>
- <fieldset class="cbi-section">
+ <div class="cbi-section">
<% if not querypat then %>
- <ul class="cbi-tabmenu">
+ <ul class="cbi-tabmenu" style="flex-wrap:wrap">
<% local i; for i = 65, 90 do %>
<li class="cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href="?display=available&amp;letter=<%=string.char(i)%>"><%=string.char(i)%></a></li>
<% end %>
<li class="cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href="?display=available&amp;letter=%23">#</a></li>
</ul>
- <div class="cbi-section-node">
<% end %>
- <table class="cbi-section-table" style="width:100%">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
- <th class="cbi-section-table-cell" style="text-align:right"><%:Size (.ipk)%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Description%></th>
- </tr>
- <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
- <td style="text-align:left; width:10%">
- <form method="post" class="inline" action="<%=REQUEST_URI%>">
- <input type="hidden" name="exec" value="1" />
- <input type="hidden" name="token" value="<%=token%>" />
- <input type="hidden" name="install" value="<%=pcdata(n)%>" />
- <a onclick="window.confirm('<%:Install%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" href="#"><%:Install%></a>
- </form>
- </td>
- <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
- <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
- <td style="text-align:right"><%=luci.util.pcdata(s)%></td>
- <td style="text-align:left"><%=luci.util.pcdata(d)%></td>
- </tr>
- <% end) %>
- <% if empty then %>
- <tr class="cbi-section-table-row">
- <td style="text-align:left">&#160;</td>
- <td style="text-align:left"><em><%:none%></em></td>
- <td style="text-align:left"><em><%:none%></em></td>
- <td style="text-align:right"><em><%:none%></em></td>
- <td style="text-align:left"><em><%:none%></em></td>
- </tr>
- <% end %>
- </table>
- <% if not querypat then %>
+ <div class="cbi-section-node cbi-section-node-tabbed">
+ <div class="table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th col-2 left"><%:Package name%></div>
+ <div class="th col-2 left"><%:Version%></div>
+ <div class="th col-1 center"><%:Size (.ipk)%></div>
+ <div class="th col-10 left"><%:Description%></div>
+ <div class="th cbi-section-actions">&#160;</div>
+ </div>
+ <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %>
+ <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+ <div class="td col-2 left"><%=luci.util.pcdata(n)%></div>
+ <div class="td col-2 left"><%=luci.util.pcdata(v)%></div>
+ <div class="td col-1 center"><%=luci.util.pcdata(s)%></div>
+ <div class="td col-10 left"><%=luci.util.pcdata(d)%></div>
+ <div class="td cbi-section-actions">
+ <form method="post" class="inline" action="<%=REQUEST_URI%>">
+ <input type="hidden" name="exec" value="1" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="install" value="<%=pcdata(n)%>" />
+ <input class="cbi-button cbi-button-apply" type="submit" onclick="window.confirm('<%:Install%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" value="<%:Install%>" />
+ </form>
+ </div>
+ </div>
+ <% end) %>
+ <% if empty then %>
+ <div class="tr">
+ <div class="td left">&#160;</div>
+ <div class="td left"><em><%:none%></em></div>
+ <div class="td left"><em><%:none%></em></div>
+ <div class="td right"><em><%:none%></em></div>
+ <div class="td left"><em><%:none%></em></div>
+ </div>
+ <% end %>
+ </div>
</div>
- <% end %>
- </fieldset>
+ </div>
<% end %>
</div>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm b/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
index c9551804d2..6ec2b310d2 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
@@ -7,7 +7,6 @@
<%+header%>
<h2 name="content"><%:Reboot%></h2>
-<br />
<p><%:Reboots the operating system of your device%></p>
@@ -49,7 +48,7 @@
}
//]]></script>
-<input class="cbi-button cbi-button-apply" type="button" value="<%:Perform reboot%>" onclick="reboot(this)" />
+<input class="cbi-button cbi-button-action important" type="button" value="<%:Perform reboot%>" onclick="reboot(this)" />
<p class="alert-message" style="display:none">
<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm b/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
index 4ed4f0a10f..e05ccdece3 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
@@ -4,7 +4,7 @@
-%>
<% export("uci_changelog", function(changes) -%>
-<fieldset class="cbi-section">
+<div class="cbi-section">
<strong><%:Legend:%></strong>
<div class="uci-change-legend">
<div class="uci-change-legend-label"><ins>&#160;</ins> <%:Section added%></div>
@@ -32,9 +32,11 @@
ret[#ret+1] = "<br />%s.%s.%s+=<strong>%s</strong>"
%{ r, s, o, util.pcdata(v[i]) }
end
- else
+ elseif v ~= "" then
ret[#ret+1] = "<br />%s.%s.%s=<strong>%s</strong>"
%{ r, s, o, util.pcdata(v) }
+ else
+ ret[#ret+1] = "<br /><del>%s.%s.<strong>%s</strong></del>" %{ r, s, o }
end
end
end
@@ -57,7 +59,7 @@
ret[#ret+1] = "%s.%s.%s+=<strong>%s</strong><br />"
%{ r, s, o, util.pcdata(v[i]) }
end
-
+
else
ret[#ret+1] = "%s.%s.%s=<strong>%s</strong><br />"
%{ r, s, o, util.pcdata(v) }
@@ -75,5 +77,5 @@
write(table.concat(ret))
%></div>
-</fieldset>
+</div>
<%- end) %>
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm b/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
index 9e9ce2be2a..6282244757 100644
--- a/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
+++ b/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
@@ -27,21 +27,17 @@
<div class="cbi-page-actions">
<% if redir_url then %>
- <div style="float:left">
- <form class="inline" method="get" action="<%=luci.util.pcdata(redir_url)%>">
- <input class="cbi-button cbi-button-link" style="float:left; margin:0" type="submit" value="<%:Back%>" />
- </form>
- </div>
+ <form method="get" action="<%=luci.util.pcdata(redir_url)%>">
+ <input class="cbi-button cbi-button-link" type="submit" value="<%:Back%>" />
+ </form>
<% end %>
- <div style="text-align:right">
- <input class="cbi-button cbi-button-save" type="button" id="apply_button" value="<%:Save & Apply%>" onclick="uci_apply(true); this.blur()" />
- <form class="inline" method="post" action="<%=controller%>/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>
+ <input class="cbi-button cbi-button-save" type="button" id="apply_button" value="<%:Save & Apply%>" onclick="uci_apply(true); this.blur()" />
+ <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-mod-freifunk/luasrc/view/freifunk/contact.htm b/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
index 1add595c6c..dca35376cb 100644
--- a/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
+++ b/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
@@ -31,33 +31,33 @@ end
<fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
<legend><%:Operator%></legend>
- <table cellspacing="10" width="100%" style="text-align:left">
- <tr><th width="33%"><%:Nickname%>:</th><td><%=nickname%></td></tr>
- <tr><th width="33%"><%:Realname%>:</th><td><%=name%></td></tr>
- <tr><th width="33%"><%:Homepage%>:</th><td>
+ <div class="table" cellspacing="10" width="100%" style="text-align:left">
+ <div class="tr"><div class="th" width="33%"><%:Nickname%>:</div><div class="td"><%=nickname%></div></div>
+ <div class="tr"><div class="th" width="33%"><%:Realname%>:</div><div class="td"><%=name%></div></div>
+ <div class="tr"><div class="th" width="33%"><%:Homepage%>:</div><div class="td">
<% for k, v in ipairs(homepage) do %>
<a href="<%=v%>"><%=v%></a><br />
<% end %>
- </td></tr>
- <tr><th width="33%"><%:E-Mail%>:</th><td><a href="mailto:<%=mail%>"><%=mail%></a></td></tr>
- <tr><th width="33%"><%:Phone%>:</th><td><%=phone%></td></tr>
- </table>
+ </div></div>
+ <div class="tr"><div class="th" width="33%"><%:E-Mail%>:</div><div class="td"><a href="mailto:<%=mail%>"><%=mail%></a></div></div>
+ <div class="tr"><div class="th" width="33%"><%:Phone%>:</div><div class="td"><%=phone%></div></div>
+ </div>
</fieldset>
<fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
<legend><%:Location%></legend>
- <table cellspacing="10" width="100%" style="text-align:left">
- <tr><th width="33%"><%:Location%>:</th><td><%=location%></td></tr>
- <tr><th width="33%"><%:Coordinates%>:</th><td><%=lat%> <%=lon%> (<a href="<%=pcdata(luci.dispatcher.build_url("freifunk/map"))%>"><%:Show on map%>)</a></td></tr>
- </table>
+ <div class="table" cellspacing="10" width="100%" style="text-align:left">
+ <div class="tr"><div class="th" width="33%"><%:Location%>:</div><div class="td"><%=location%></div></div>
+ <div class="tr"><div class="th" width="33%"><%:Coordinates%>:</div><div class="td"><%=lat%> <%=lon%> (<a href="<%=pcdata(luci.dispatcher.build_url("freifunk/map"))%>"><%:Show on map%>)</a></div></div>
+ </div>
</fieldset>
<% if note then %>
<fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
<legend><%:Notice%></legend>
- <table cellspacing="10" width="100%" style="text-align:left">
- <tr><td><%=note%></td></tr>
- </table>
+ <div class="table" cellspacing="10" width="100%" style="text-align:left">
+ <div class="tr"><div class="td"><%=note%></div></div>
+ </div>
</fieldset>
<%end%>
diff --git a/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm b/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
index 1dc1d8b0d1..a56e4826a9 100644
--- a/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
+++ b/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
@@ -238,25 +238,25 @@ end
<h2><%:Wireless Overview%></h2>
<% if not has_iwinfo then %>
- <div class="errorbox">
- <strong><%:Package libiwinfo required!%></strong><br />
- <%_The <em>libiwinfo</em> package is not installed. You must install this component for working wireless configuration!%>
+ <div class="alert-message warning">
+ <h4><%:Package libiwinfo required!%></h4>
+ <p><%_The <em>libiwinfo</em> package is not installed. You must install this component for working wireless configuration!%></p>
</div>
<% end %>
<div class="cbi-section">
<div class="cbi-section-node">
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Signal%></th>
- <th class="cbi-section-table-cell"><%:Bitrate%></th>
- <th class="cbi-section-table-cell"><%:SSID%></th>
- <th class="cbi-section-table-cell"><%:BSSID%></th>
- <th class="cbi-section-table-cell"><%:Channel%></th>
- <th class="cbi-section-table-cell"><%:Mode%></th>
- <th class="cbi-section-table-cell"><%:TX%>-<%:Power%></th>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Signal%></div>
+ <div class="th cbi-section-table-cell"><%:Bitrate%></div>
+ <div class="th cbi-section-table-cell"><%:SSID%></div>
+ <div class="th cbi-section-table-cell"><%:BSSID%></div>
+ <div class="th cbi-section-table-cell"><%:Channel%></div>
+ <div class="th cbi-section-table-cell"><%:Mode%></div>
+ <div class="th cbi-section-table-cell"><%:TX%>-<%:Power%></div>
+ <div class="th cbi-section-table-cell"><%:Interface%></div>
+ </div>
<%
for _, dev in ipairs(devices) do
local net
@@ -301,20 +301,20 @@ end
end
local interface = net.iwinfo.ifname or "N/A"
%>
- <tr class="cbi-section-table-row cbi-rowstyle-1">
- <td class="cbi-value-field" id="<%=net:ifname()%>-signal"><%=signal_string%></td>
- <td class="cbi-value-field" id="<%=net:ifname()%>-bitrate"><%=bitrate%></td>
- <td class="cbi-value-field" id="<%=net:ifname()%>-ssid"><%=ssid%></td>
- <td class="cbi-value-field" id="<%=net:ifname()%>-bssid"><%=bssid%></td>
- <td class="cbi-value-field" id="<%=net:ifname()%>-channel"><%=chan%></td>
- <td class="cbi-value-field" id="<%=net:ifname()%>-mode"><%=mode%></td>
- <td class="cbi-value-field" id="<%=net:ifname()%>-txpower"><%=txpwr%></td>
- <td class="cbi-value-field"><%=interface%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-1">
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-signal"><%=signal_string%></div>
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-bitrate"><%=bitrate%></div>
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-ssid"><%=ssid%></div>
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-bssid"><%=bssid%></div>
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-channel"><%=chan%></div>
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-mode"><%=mode%></div>
+ <div class="td cbi-value-field" id="<%=net:ifname()%>-txpower"><%=txpwr%></div>
+ <div class="td cbi-value-field"><%=interface%></div>
+ </div>
<% end
end
end %>
- </table>
+ </div>
</div>
</div>
</div>
@@ -328,35 +328,35 @@ end
<% if not def4 and not def6 then %>
<%:No default routes known.%>
<%else%>
- <table class="cbi-section-table">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell"><%:Network%></th>
- <th class="cbi-section-table-cell"><%:Interface%></th>
- <th class="cbi-section-table-cell"><%:Gateway%></th>
- <th class="cbi-section-table-cell"><%:Metric%></th>
- </tr>
+ <div class="table cbi-section-table">
+ <div class="tr cbi-section-table-titles">
+ <div class="th cbi-section-table-cell"><%:Network%></div>
+ <div class="th cbi-section-table-cell"><%:Interface%></div>
+ <div class="th cbi-section-table-cell"><%:Gateway%></div>
+ <div class="th cbi-section-table-cell"><%:Metric%></div>
+ </div>
<% if def4 then %>
- <tr class="cbi-section-table-row cbi-rowstyle-1">
- <td class="cbi-value-field" id="v4dst"><%=def4.dest%></td>
- <td class="cbi-value-field" id="v4dev"><%=def4.dev%></td>
- <td class="cbi-value-field" id="v4gw"><%=def4.gateway%></td>
- <td class="cbi-value-field" id="v4metr"><%=def4.metr%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-1">
+ <div class="td cbi-value-field" id="v4dst"><%=def4.dest%></div>
+ <div class="td cbi-value-field" id="v4dev"><%=def4.dev%></div>
+ <div class="td cbi-value-field" id="v4gw"><%=def4.gateway%></div>
+ <div class="td cbi-value-field" id="v4metr"><%=def4.metr%></div>
+ </div>
<% end
if def6 then %>
- <tr class="cbi-section-table-row cbi-rowstyle-2">
- <td class="cbi-value-field" id="v6dst"><%=def6.dest%></td>
- <td class="cbi-value-field" id="v6dev"><%=def6.dev%></td>
- <td class="cbi-value-field" id="v6gw"><%=def6.gateway%></td>
- <td class="cbi-value-field" id="v6metr"><%=def6.metr%></td>
- </tr>
+ <div class="tr cbi-section-table-row cbi-rowstyle-2">
+ <div class="td cbi-value-field" id="v6dst"><%=def6.dest%></div>
+ <div class="td cbi-value-field" id="v6dev"><%=def6.dev%></div>
+ <div class="td cbi-value-field" id="v6gw"><%=def6.gateway%></div>
+ <div class="td cbi-value-field" id="v6metr"><%=def6.metr%></div>
+ </div>
<% end %>
- </table>
+ </div>
<% end %>
</div>
</div>
diff --git a/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua b/protocols/luci-proto-3g/luasrc/model/network/proto_3g.lua
index e0d7fd3e21..b2454838f9 100644
--- a/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua
+++ b/protocols/luci-proto-3g/luasrc/model/network/proto_3g.lua
@@ -1,17 +1,17 @@
--- Copyright 2015 Paul Oranje <por@xs4all.nl>
--- Licensed to the public under GPLv2
+-- Copyright 2018 Florian Eckert <fe@dev.tdt.de>
+-- Licensed to the public under the Apache License 2.0.
local netmod = luci.model.network
local interface = luci.model.network.interface
-local proto = netmod:register_protocol("aiccu")
+local proto = netmod:register_protocol("3g")
function proto.get_i18n(self)
- return luci.i18n.translate("AICCU (SIXXS)")
+ return luci.i18n.translate("UMTS/GPRS/EV-DO")
end
function proto.ifname(self)
- return "aiccu-" .. self.sid
+ return "3g-" .. self.sid
end
function proto.get_interface(self)
@@ -19,11 +19,11 @@ function proto.get_interface(self)
end
function proto.is_installed(self)
- return nixio.fs.access("/lib/netifd/proto/aiccu.sh")
+ return nixio.fs.access("/lib/netifd/proto/3g.sh")
end
function proto.opkg_package(self)
- return "aiccu"
+ return "comgt"
end
function proto.is_floating(self)
@@ -46,4 +46,4 @@ function proto.contains_interface(self, ifname)
end
end
-netmod:register_pattern_virtual("^aiccu%-%w")
+netmod:register_pattern_virtual("^3g%-%w")
diff --git a/protocols/luci-proto-ipv6/Makefile b/protocols/luci-proto-ipv6/Makefile
index 761ee2f9f5..b28c8d5895 100644
--- a/protocols/luci-proto-ipv6/Makefile
+++ b/protocols/luci-proto-ipv6/Makefile
@@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
-LUCI_TITLE:=Support for DHCPv6/6in4/6to4/6rd/DS-Lite/aiccu
+LUCI_TITLE:=Support for DHCPv6/6in4/6to4/6rd/DS-Lite
LUCI_DEPENDS:=
PKG_LICENSE:=Apache-2.0
diff --git a/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua b/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
deleted file mode 100644
index 7b5e6043cc..0000000000
--- a/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
+++ /dev/null
@@ -1,136 +0,0 @@
--- Copyright 2015 Paul Oranje <por@xs4all.nl>
--- Licensed to the public under the Apache License 2.0.
-
-local map, section, net = ...
-
--- config read by /lib/netifd/proto/aiccu.sh
-local username, password, protocol, server, tunnelid, ip6prefix, requiretls, nat, heartbeat,
- verbose, ntpsynctimeout, ip6addr, sourcerouting, defaultroute
-
--- generic parameters
-local metric, ttl, mtu
-
-
-username = section:taboption("general", Value, "username",
- translate("Server username"),
- translate("SIXXS-handle[/Tunnel-ID]"))
-username.datatype = "string"
-
-password = section:taboption("general", Value, "password",
- translate("Server password"),
- translate("Server password, enter the specific password of the tunnel when the username contains the tunnel ID"))
-password.datatype = "string"
-password.password = true
-
-
---[[ SIXXS supports only TIC as tunnel broker protocol, no use setting it.
-protocol = section:taboption("general", ListValue, "protocol",
- translate("Tunnel broker protocol"),
- translate("SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) use 6in4 instead"))
-
-protocol:value("tic", "TIC")
-protocol:value("tsp", "TSP")
-protocol:value("l2tp", "L2TP")
-protocol.default = "tic"
-protocol.optional = true
---]]
-
-
-server = section:taboption("general", Value, "server",
- translate("Tunnel setup server"),
- translate("Optional, specify to override default server (tic.sixxs.net)"))
-server.datatype = "host(0)"
-server.optional = true
-
-
-tunnelid = section:taboption("general", Value, "tunnelid",
- translate("Tunnel ID"),
- translate("Optional, use when the SIXXS account has more than one tunnel"))
-tunnelid.datatype = "string"
-tunnelid.optional = true
-
-
-local ip6prefix = section:taboption("general", Value, "ip6prefix",
- translate("IPv6 prefix"),
- translate("Routed IPv6 prefix for downstream interfaces"))
-ip6prefix.datatype = "ip6addr"
-ip6prefix.optional = true
-
-
-heartbeat = s:taboption("general", ListValue, "heartbeat",
- translate("Tunnel type"),
- translate("Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison\">Tunneling Comparison</a> on SIXXS"))
-heartbeat:value("0", translate("AYIYA"))
-heartbeat:value("1", translate("Heartbeat"))
-heartbeat.default = "0"
-
-
-nat = section:taboption("general", Flag, "nat",
- translate("Behind NAT"),
- translate("The tunnel end-point is behind NAT, defaults to disabled and only applies to AYIYA"))
-nat.optional = true
-nat.default = nat.disabled
-
-
-requiretls = section:taboption("general", Flag, "requiretls",
- translate("Require TLS"),
- translate("Connection to server fails when TLS cannot be used"))
-requiretls.optional = true
-requiretls.default = requiretls.disabled
-
-
-verbose = section:taboption("advanced", Flag, "verbose",
- translate("Verbose"),
- translate("Verbose logging by aiccu daemon"))
-verbose.optional = true
-verbose.default = verbose.disabled
-
-
-ntpsynctimeout = section:taboption("advanced", Value, "ntpsynctimeout",
- translate("NTP sync time-out"),
- translate("Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"))
-ntpsynctimeout.datatype = "uinteger"
-ntpsynctimeout.placeholder = "90"
-ntpsynctimeout.optional = true
-
-
-ip6addr = section:taboption("advanced", Value, "ip6addr",
- translate("Local IPv6 address"),
- translate("IPv6 address delegated to the local tunnel endpoint (optional)"))
-ip6addr.datatype = "ip6addr"
-ip6addr.optional = true
-
-
-defaultroute = section:taboption("advanced", Flag, "defaultroute",
- translate("Default route"),
- translate("Whether to create an IPv6 default route over the tunnel"))
-defaultroute.default = defaultroute.enabled
-defaultroute.optional = true
-
-
-sourcerouting = section:taboption("advanced", Flag, "sourcerouting",
- translate("Source routing"),
- translate("Whether to route only packets from delegated prefixes"))
-sourcerouting.default = sourcerouting.enabled
-sourcerouting.optional = true
-
-
-metric = section:taboption("advanced", Value, "metric",
- translate("Use gateway metric"))
-metric.datatype = "uinteger"
-metric.placeholder = "0"
-metric:depends("defaultroute", defaultroute.enabled)
-
-
-ttl = section:taboption("advanced", Value, "ttl",
- translate("Use TTL on tunnel interface"))
-ttl.datatype = "range(1,255)"
-ttl.placeholder = "64"
-
-
-mtu = section:taboption("advanced", Value, "mtu",
- translate("Use MTU on tunnel interface"),
- translate("minimum 1280, maximum 1480"))
-mtu.datatype = "range(1280,1480)"
-mtu.placeholder = "1280"
-
diff --git a/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua b/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
index 1bcbd4808a..3afb7de4f5 100644
--- a/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
+++ b/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
@@ -4,7 +4,7 @@
local netmod = luci.model.network
local _, p
-for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) do
+for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "l2tp", "pppossh"}) do
local proto = netmod:register_protocol(p)
@@ -13,8 +13,6 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) d
return luci.i18n.translate("PPP")
elseif p == "pptp" then
return luci.i18n.translate("PPtP")
- elseif p == "3g" then
- return luci.i18n.translate("UMTS/GPRS/EV-DO")
elseif p == "pppoe" then
return luci.i18n.translate("PPPoE")
elseif p == "pppoa" then
@@ -33,8 +31,6 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) d
function proto.opkg_package(self)
if p == "ppp" then
return p
- elseif p == "3g" then
- return "comgt"
elseif p == "pptp" then
return "ppp-mod-pptp"
elseif p == "pppoe" then
@@ -55,8 +51,6 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) d
return (nixio.fs.glob("/usr/lib/pppd/*/rp-pppoe.so")() ~= nil)
elseif p == "pptp" then
return (nixio.fs.glob("/usr/lib/pppd/*/pptp.so")() ~= nil)
- elseif p == "3g" then
- return nixio.fs.access("/lib/netifd/proto/3g.sh")
elseif p == "l2tp" then
return nixio.fs.access("/lib/netifd/proto/l2tp.sh")
elseif p == "pppossh" then
diff --git a/protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua b/protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua
index 46a8f49d97..056f6a6e76 100644
--- a/protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua
+++ b/protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua
@@ -89,7 +89,7 @@ peers = map:section(
"wireguard_" .. ifname,
translate("Peers"),
translate("Further information about WireGuard interfaces and peers " ..
- "at <a href=\"http://wireguard.io\">wireguard.io</a>.")
+ "at <a href=\"http://wireguard.com\">wireguard.com</a>.")
)
peers.template = "cbi/tsection"
peers.anonymous = true
diff --git a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
index 8d0c434a98..b1f1f6b5ed 100644
--- a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
+++ b/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
@@ -25,7 +25,8 @@ body {
h1, h2, h3, h4, h5, h6, p, pre, a, abbr, acronym, code, del, em, img, q, s,
small, strike, strong, sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset,
-form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td {
+form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td,
+.table, .tbody, .tfoot, .thead, .tr, .th, .td {
margin: 0;
padding: 0;
border: 0;
@@ -112,8 +113,6 @@ option,
textarea {
font-size: 100%;
margin: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
box-sizing: border-box;
vertical-align: baseline;
*vertical-align: middle;
@@ -146,8 +145,6 @@ input[type="submit"][disabled] {
input[type="search"] {
-webkit-appearance: textfield;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
box-sizing: content-box;
}
@@ -218,7 +215,8 @@ a:hover {
* ---------------------------------------------------------------------------------------- */
p,
.cbi-map-descr,
-.cbi-section-descr {
+.cbi-section-descr,
+.table .tr.cbi-section-table-descr .th {
font-size: 13px;
font-weight: normal;
line-height: 18px;
@@ -232,7 +230,7 @@ p small {
h1,
h2,
-h3,
+h3, legend,
h4,
h5,
h6 {
@@ -268,14 +266,14 @@ h2 small {
font-size: 14px;
}
-h3,
+h3, legend,
h4,
h5,
h6 {
line-height: 36px;
}
-h3 {
+h3, legend {
font-size: 18px;
}
@@ -375,8 +373,6 @@ code, pre {
padding: 0 3px 2px;
font-family: Monaco, Andale Mono, Courier New, monospace;
font-size: 12px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
border-radius: 3px;
}
@@ -395,8 +391,6 @@ pre {
font-size: 12px;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
border-radius: 3px;
white-space: pre;
white-space: pre-wrap;
@@ -437,7 +431,6 @@ form .clearfix,
form .cbi-value {
margin-bottom: 18px;
zoom: 1;
- overflow: hidden;
}
form .clearfix:before, form .clearfix:after,
@@ -484,6 +477,7 @@ input[type=checkbox], input[type=radio] {
input,
textarea,
select,
+.cbi-dropdown,
.uneditable-input {
display: inline-block;
width: 210px;
@@ -493,9 +487,14 @@ select,
line-height: 18px;
color: #808080;
border: 1px solid #ccc;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
border-radius: 3px;
+ box-sizing: border-box;
+}
+
+.cbi-dropdown {
+ min-width: 210px;
+ max-width: 400px;
+ width: auto;
}
select {
@@ -521,8 +520,6 @@ input[type=file] {
padding: initial;
border: initial;
line-height: initial;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
box-shadow: none;
width: auto !important;
}
@@ -547,12 +544,17 @@ textarea {
height: auto;
}
+.td > input[type=text],
+.td > input[type=password],
+.td > select,
+.td > .cbi-dropdown {
+ width: 100%;
+}
+
.uneditable-input {
background-color: #ffffff;
display: block;
border-color: #eee;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
cursor: not-allowed;
}
@@ -566,27 +568,17 @@ textarea {
}
input, textarea {
- -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
- -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
- -o-transition: border linear 0.2s, box-shadow linear 0.2s;
transition: border linear 0.2s, box-shadow linear 0.2s;
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
}
input:focus, textarea:focus {
outline: 0;
border-color: rgba(82, 168, 236, 0.8);
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
- -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
}
input[type=file]:focus, input[type=checkbox]:focus, select:focus {
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
box-shadow: none;
outline: 1px dotted #666;
}
@@ -602,8 +594,6 @@ form .clearfix.error input, form .clearfix.error textarea {
form .clearfix.error input:focus, form .clearfix.error textarea:focus {
border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
box-shadow: 0 0 6px #f8b9b7;
}
@@ -624,8 +614,6 @@ form .clearfix.warning input, form .clearfix.warning textarea {
form .clearfix.warning input:focus, form .clearfix.warning textarea:focus {
border-color: #be9a3f;
- -webkit-box-shadow: 0 0 6px #e5d6b1;
- -moz-box-shadow: 0 0 6px #e5d6b1;
box-shadow: 0 0 6px #e5d6b1;
}
@@ -646,8 +634,6 @@ form .clearfix.success input, form .clearfix.success textarea {
form .clearfix.success input:focus, form .clearfix.success textarea:focus {
border-color: #458845;
- -webkit-box-shadow: 0 0 6px #9acc9a;
- -moz-box-shadow: 0 0 6px #9acc9a;
box-shadow: 0 0 6px #9acc9a;
}
@@ -667,14 +653,32 @@ textarea[readonly] {
border-color: #ddd;
}
+.cbi-optionals,
+.cbi-section-create {
+ padding: 0 0 10px 10px;
+}
+
+.cbi-section-create {
+ margin: -3px;
+ display: inline-flex;
+ align-items: center;
+}
+
+.cbi-section-create > * {
+ margin: 3px;
+ flex: 1 1 auto;
+}
+
+.cbi-section-create > * > input {
+ width: 100%;
+}
+
.actions,
.cbi-page-actions {
background: #f5f5f5;
margin-bottom: 18px;
- padding: 17px 20px 18px 150px;
+ padding: 17px 20px 18px 17px;
border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 3px 3px;
- -moz-border-radius: 0 0 3px 3px;
border-radius: 0 0 3px 3px;
text-align: right;
}
@@ -719,36 +723,57 @@ textarea[readonly] {
* Tables.less
* Tables for, you guessed it, tabular data
* ---------------------------------------- */
-table {
+.tr { display: table-row; }
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
+.table {
+ display: table;
width: 100%;
margin-bottom: 18px;
padding: 0;
font-size: 13px;
border-collapse: collapse;
+ position: relative;
}
-table th, table td {
+.table .th, .table .td {
+ display: table-cell;
+ vertical-align: middle; /* Fixme */
padding: 10px 10px 9px;
line-height: 18px;
text-align: left;
}
-table th {
+.table .th {
padding-top: 9px;
font-weight: bold;
vertical-align: middle;
}
-table td {
+.table .td {
vertical-align: top;
border-top: 1px solid #ddd;
}
-table tbody th {
+.table .tbody .th {
border-top: 1px solid #ddd;
vertical-align: top;
}
+.tr.placeholder {
+ height: calc(3em + 20px);
+}
+
+.tr.placeholder > .td {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-align: center;
+ line-height: 3em;
+}
+
/* Patterns.less
* Repeatable UI elements outside the base styles provided from the scaffolding
* ---------------------------------------------------------------------------- */
@@ -797,18 +822,8 @@ header p {
header .fill {
background-color: #222;
- background-color: #222222;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));
- background-image: -moz-linear-gradient(top, #333333, #222222);
- background-image: -ms-linear-gradient(top, #333333, #222222);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));
- background-image: -webkit-linear-gradient(top, #333333, #222222);
- background-image: -o-linear-gradient(top, #333333, #222222);
background-image: linear-gradient(to bottom, #333333, #222222);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
padding: 0 5px;
}
@@ -914,14 +929,7 @@ header div > ul .dropdown-menu li a:hover,
.nav .dropdown-menu li a:hover {
background-color: #191919;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));
- background-image: -moz-linear-gradient(top, #292929, #191919);
- background-image: -ms-linear-gradient(top, #292929, #191919);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));
- background-image: -webkit-linear-gradient(top, #292929, #191919);
- background-image: -o-linear-gradient(top, #292929, #191919);
background-image: linear-gradient(to bottom, #292929, #191919);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);
color: #ffffff;
}
@@ -960,9 +968,6 @@ a.menu:after, .dropdown-toggle:after {
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 4px solid #ffffff;
- filter: alpha(opacity=50);
- -khtml-opacity: 0.5;
- -moz-opacity: 0.5;
opacity: 0.5;
}
@@ -984,14 +989,8 @@ a.menu:after, .dropdown-toggle:after {
border-color: rgba(0, 0, 0, 0.2);
border-style: solid;
border-width: 0 1px 1px;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
border-radius: 0 0 6px 6px;
- -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
background-clip: padding-box;
}
@@ -1025,18 +1024,9 @@ header .dropdown-menu a.hover,
.dropdown-menu a.hover {
background-color: #dddddd;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));
- background-image: -moz-linear-gradient(top, #eeeeee, #dddddd);
- background-image: -ms-linear-gradient(top, #eeeeee, #dddddd);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));
- background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd);
- background-image: -o-linear-gradient(top, #eeeeee, #dddddd);
background-image: linear-gradient(to bottom, #eeeeee, #dddddd);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);
color: #404040;
text-decoration: none;
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
}
@@ -1129,8 +1119,6 @@ header .dropdown-menu a.hover,
margin-right: 2px;
line-height: 34px;
border: 1px solid transparent;
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
border-radius: 4px 4px 0 0;
}
@@ -1155,8 +1143,6 @@ header .dropdown-menu a.hover,
.cbi-tabmenu .menu-dropdown, .cbi-tabmenu .dropdown-menu {
top: 35px;
border-width: 1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px 6px;
border-radius: 0 6px 6px 6px;
}
@@ -1191,20 +1177,9 @@ header .dropdown-menu a.hover,
margin: 0 0 18px;
background-color: #f5f5f5;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));
- background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));
- background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
background-image: linear-gradient(to bottom, #ffffff, #f5f5f5);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
border: 1px solid #ddd;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
border-radius: 3px;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
box-shadow: inset 0 1px 0 #ffffff;
}
@@ -1258,14 +1233,7 @@ footer {
.alert-message.error {
background-color: #c43c35;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
border-color: #c43c35 #c43c35 #882a25;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -1274,14 +1242,7 @@ footer {
.btn.success, .alert-message.success {
background-color: #57a957;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -ms-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
background-image: linear-gradient(to bottom, #62c462, #57a957);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
border-color: #57a957 #57a957 #3d773d;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -1290,14 +1251,7 @@ footer {
.btn.info, .alert-message.info {
background-color: #339bb9;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
border-color: #339bb9 #339bb9 #22697d;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -1309,13 +1263,7 @@ footer {
display: inline-block;
background-color: #e6e6e6;
background-repeat: no-repeat;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
padding: 5px 14px 6px;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
color: #333;
@@ -1323,11 +1271,7 @@ footer {
line-height: normal;
border: 1px solid #ccc;
border-bottom-color: #bbb;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
@@ -1342,192 +1286,289 @@ footer {
outline: 1px dotted #666;
}
-.btn.primary,
-.cbi-page-actions .cbi-button-apply,
-.cbi-page-actions .cbi-button-save,
-.cbi-page-actions .cbi-button-reset {
- color: #ffffff;
- padding: 5px 14px 6px;
- background-color: #0064cd;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
- background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
- background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
- background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
- background-image: -o-linear-gradient(top, #049cdb, #0064cd);
- background-image: linear-gradient(to bottom, #049cdb, #0064cd);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- border-color: #0064cd #0064cd #003f81;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-
.cbi-input-invalid,
.cbi-value-error input {
color: #FF0000;
border-color: #FF0000;
}
-.cbi-button-up,
-.cbi-input-up {
- background-position: center center;
- background-image: url('../resources/cbi/up.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/up.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/up.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/up.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/up.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/up.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-down,
-.cbi-input-down {
- background-position: center center;
- background-image: url('../resources/cbi/down.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/down.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/down.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/down.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/down.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/down.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-positive,
+.cbi-button-fieldadd,
+.cbi-button-add,
+.cbi-button-save {
+ border-color: #4a4;
+ color: #4a4;
}
+.cbi-button-neutral,
+.cbi-button-download,
.cbi-button-find,
-.cbi-input-find {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/find.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/find.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/find.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/find.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/find.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/find.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-add,
-.cbi-input-add {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/add.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/add.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/add.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/add.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/add.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/add.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-link,
+.cbi-button-up,
+.cbi-button-down {
+ border-color: #444;
+ color: #444;
}
+.btn.primary,
+.cbi-button-action,
.cbi-button-apply,
-.cbi-input-apply {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/apply.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/apply.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/apply.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/apply.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/apply.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/apply.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-reload,
+.cbi-button-edit {
+ border-color: #0069d6;
+ color: #0069d6;
}
+.cbi-button-negative,
+.cbi-section-remove .cbi-button,
.cbi-button-reset,
-.cbi-input-reset {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/reset.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/reset.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reset.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reset.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reset.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reset.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-edit,
-.cbi-input-edit {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/edit.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/edit.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/edit.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/edit.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/edit.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/edit.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-remove,
-.cbi-input-remove {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/remove.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/remove.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/remove.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/remove.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/remove.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/remove.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-remove {
+ border-color: #c44;
+ color: #c44;
}
-.cbi-button-reload,
-.cbi-input-reload {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/reload.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/reload.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reload.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reload.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reload.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/reload.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.btn.primary,
+.cbi-button-action.important,
+.cbi-page-actions .cbi-button-apply,
+.cbi-section-actions .cbi-button-edit {
+ color: #fff;
+ background: #0069d6;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
-.cbi-button-link,
-.cbi-input-link {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/link.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/link.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/link.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/link.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/link.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/link.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-positive.important,
+.cbi-page-actions .cbi-button-save {
+ color: #fff;
+ background: #4a4;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
-.cbi-button-download,
-.cbi-input-download {
- background-position: 6px center, left top;
- padding-left: 28px;
- background-image: url('../resources/cbi/download.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: url('../resources/cbi/download.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/download.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/download.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/download.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: url('../resources/cbi/download.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-page-actions .cbi-button-apply + .cbi-button-save {
+ background: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+ text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.75);
+ color: #4a4;
+}
+
+.cbi-dropdown {
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ display: inline-flex;
+ padding: 0;
+ cursor: pointer;
+ height: auto;
+ background: linear-gradient(#fff 0%, #e9e8e6 100%);
+ position: relative;
+ color: #404040;
+}
+
+.cbi-dropdown:focus {
+ outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+ margin: 0 !important;
+ padding: 0;
+ list-style: none;
+ overflow-x: hidden;
+ overflow-y: auto;
+ display: flex;
+ width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+ display: none;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+ flex-grow: 0;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ text-align: center;
+ line-height: 2em;
+ padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+ color: #777;
+ font-weight: bold;
+ text-shadow: 1px 1px 0px #fff;
+ display: none;
+}
+
+.cbi-dropdown > ul > li {
+ display: none;
+ padding: .25em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ flex-shrink: 1;
+ flex-grow: 1;
+ align-items: center;
+ align-self: center;
+ color: #404040;
+ min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+ border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+ max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+ display: none;
+ margin: 0;
+ padding: 0;
+ pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+ vertical-align: middle;
+ margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+ margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+ height: 20px;
+}
+
+.cbi-dropdown[open] {
+ position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+ display: block;
+ background: #f6f6f5;
+ border: 1px solid #918e8c;
+ box-shadow: 0 0 4px #918e8c;
+ position: absolute;
+ z-index: 1000;
+ max-width: none;
+ min-width: 100%;
+ width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+ flex-grow: 1;
+ display: flex;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+ display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+ border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+ background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+ background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+ margin-bottom: 0;
+ border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+ pointer-events: none;
+ opacity: .6;
+}
+
+.cbi-tooltip-container {
+ cursor: help;
+}
+
+.cbi-tooltip {
+ position: absolute;
+ z-index: 1000;
+ left: -1000px;
+ opacity: 0;
+ transition: opacity .25s ease-out;
+}
+
+.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) {
+ left: auto;
+ opacity: 1;
+ transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+ padding: 1px;
+ background: inherit;
+ margin: -1.6em 0 0 -5px;
+ border-radius: 3px;
+ pointer-events: none;
+ box-shadow: 0 0 3px #444;
+}
+
+.zonebadge .cbi-tooltip > * {
+ margin: 1px;
+}
+
+.zone-forwards {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.zone-forwards > * {
+ flex: 1 1 40%;
+ padding: 1px;
+}
+
+.zone-forwards > span {
+ flex-basis: 10%;
+ text-align: center;
+}
+
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+ display: flex;
+ flex-direction: column;
}
.btn.active, .btn:active {
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
}
.btn.disabled {
cursor: default;
background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- filter: alpha(opacity=65);
- -khtml-opacity: 0.65;
- -moz-opacity: 0.65;
opacity: 0.65;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
box-shadow: none;
}
.btn[disabled] {
cursor: default;
background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- filter: alpha(opacity=65);
- -khtml-opacity: 0.65;
- -moz-opacity: 0.65;
opacity: 0.65;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
box-shadow: none;
}
@@ -1535,8 +1576,6 @@ footer {
font-size: 15px;
line-height: normal;
padding: 9px 14px 9px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
border-radius: 6px;
}
@@ -1545,50 +1584,6 @@ footer {
font-size: 11px;
}
-/* Button icons for specific pages */
-.Startup .cbi-section-table input.cbi-input-apply,
-.Startup .cbi-section-table input.cbi-button-apply {
- background-image: url("../resources/cbi/apply.gif");
- background-position: 7px 4px;
- padding: 3px 9px 3px 27px;
-}
-
-.Processes .cbi-section-table input.cbi-input-reload,
-.Startup .cbi-section-table input.cbi-input-reload {
- background-image: url("../resources/cbi/reload.gif");
- background-position: 7px 4px;
- padding: 3px 9px 3px 27px;
-}
-
-.Processes .cbi-section-table input.cbi-input-remove,
-.Processes .cbi-section-table div.cbi-section-remove input,
-.Startup .cbi-section-table input.cbi-input-remove,
-.Startup .cbi-section-table div.cbi-section-remove input {
- background-image: url("../resources/cbi/remove.gif");
- background-position: 7px 4px;
- padding: 3px 9px 3px 27px;
-}
-
-.Processes .cbi-section-table input.cbi-input-reset,
-.Processes .cbi-section-table input.cbi-button-reset,
-.Startup .cbi-section-table input.cbi-input-reset,
-.Startup .cbi-section-table input.cbi-button-reset {
- background-image: url("../resources/cbi/reset.gif");
- background-position: 7px 4px;
- padding: 3px 9px 3px 27px;
-}
-
-.Startup .cbi-section-table input.cbi-input-save,
-.Startup .cbi-section-table input.cbi-button-save {
- background-image: url("../resources/cbi/save.gif");
- background-position: 7px 4px;
- padding: 3px 9px 3px 27px;
-}
-
-:root .alert-message, :root .btn {
- border-radius: 0 0;
-}
-
button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
padding: 0;
border: 0;
@@ -1601,47 +1596,30 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
font-weight: bold;
line-height: 13.5px;
text-shadow: 0 1px 0 #ffffff;
- filter: alpha(opacity=25);
- -khtml-opacity: 0.25;
- -moz-opacity: 0.25;
opacity: 0.25;
}
.close:hover {
color: #000000;
text-decoration: none;
- filter: alpha(opacity=40);
- -khtml-opacity: 0.4;
- -moz-opacity: 0.4;
opacity: 0.4;
}
-.alert-message, .errorbox {
+.alert-message {
position: relative;
padding: 7px 15px;
margin-bottom: 18px;
color: #404040;
background-color: #eedc94;
background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));
- background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
- background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));
- background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
- background-image: -o-linear-gradient(top, #fceec1, #eedc94);
background-image: linear-gradient(to bottom, #fceec1, #eedc94);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
border-color: #eedc94 #eedc94 #e4c652;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
border-width: 1px;
border-style: solid;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
}
@@ -1677,8 +1655,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
}
.alert-message .btn {
- -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
- -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
}
@@ -1690,8 +1666,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
text-transform: uppercase;
white-space: nowrap;
background-color: #bfbfbf;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
border-radius: 3px;
text-shadow: none;
}
@@ -1761,10 +1735,26 @@ header .pull-right { padding-top: 8px; }
font-weight: normal;
}
+.cbi-section-table-titles.named::before,
+.cbi-section-table-descr.named::before,
+.cbi-section-table-row[data-title]::before {
+ content: attr(data-title) " ";
+ display: table-cell;
+ padding: 10px 10px 9px;
+ line-height: 18px;
+ font-weight: bold;
+}
+
+.cbi-section-table-row[data-title]::before {
+ border-top: 1px solid #ddd;
+}
+
.left { text-align: left !important; }
.right { text-align: right !important; }
+.center { text-align: center !important; }
+
.cbi-value-field { line-height: 1.5em; }
.cbi-value-field input[type=checkbox],
@@ -1778,28 +1768,32 @@ table table td,
border: none;
}
-table.cbi-section-table input,
-table.cbi-section-table textarea,
-table.cbi-section-table select {
+.table.cbi-section-table input,
+.table.cbi-section-table textarea,
+.table.cbi-section-table select {
width: auto;
}
-table.cbi-section-table td.cbi-section-table-cell {
+.table.cbi-section-table .td.cbi-section-table-cell {
white-space: nowrap;
text-align: right;
}
-table.cbi-section-table td.cbi-section-table-cell select {
+.table.cbi-section-table .td.cbi-section-table-cell select {
width: inherit;
}
-table.valign-middle td {
+.table.valign-middle .td {
vertical-align: middle;
}
-.cbi-value-description { display: inline; }
-
-.cbi-value-description img { vertical-align: middle; }
+.cbi-value-description {
+ background-image: url(/luci-static/resources/cbi/help.gif);
+ background-position: .25em .2em;
+ background-repeat: no-repeat;
+ margin: .25em 0 0 0;
+ padding: 0 0 0 1.7em;
+}
.cbi-section-error {
border: 1px solid #FF0000;
@@ -1821,25 +1815,24 @@ table.valign-middle td {
margin: 0 10px;
text-align: center;
white-space: nowrap;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ display: inline-flex;
+ flex-direction: column;
+ line-height: 1.2em;
+ min-width: 100px;
}
.ifacebox .ifacebox-head {
border-bottom: 1px solid #CCCCCC;
padding: 2px;
+ background: #eee;
+}
+
+.ifacebox .ifacebox-head.active {
+ background: #90c0e0;
}
.ifacebox .ifacebox-body {
@@ -1847,33 +1840,25 @@ table.valign-middle td {
}
.ifacebadge {
- display: inline-block;
+ display: inline-flex;
+ flex-direction: row;
white-space: nowrap;
background-color: #FFFFFF;
border: 1px solid #CCCCCC;
padding: 2px;
- margin-left: 2px;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
cursor: default;
+ line-height: 1.2em;
}
.ifacebadge img {
width: 16px;
height: 16px;
vertical-align: middle;
+ margin-right: .25em;
}
.ifacebadge-active {
@@ -1881,6 +1866,40 @@ table.valign-middle td {
font-weight: bold;
}
+.network-status-table {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox {
+ margin: .5em;
+ flex-grow: 1;
+}
+
+.network-status-table .ifacebox-body {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ text-align: left;
+}
+
+.network-status-table .ifacebox-body > span {
+ flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.ifacebadge.large,
+.network-status-table .ifacebox-body .ifacebadge {
+ flex: 1;
+ margin: .5em .25em 0 .25em;
+ padding: .5em;
+ min-width: 220px;
+}
+
.zonebadge {
padding: 2px;
border-radius: 4px;
@@ -1888,12 +1907,11 @@ table.valign-middle td {
white-space: nowrap;
color: #666666;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- cursor: pointer;
}
.zonebadge > em,
.zonebadge > strong {
- margin: 5px;
+ margin: 0 2px;
display: inline-block;
}
@@ -1901,6 +1919,10 @@ table.valign-middle td {
width: 6em;
}
+.zonebadge > .ifacebadge {
+ margin-left: 2px;
+}
+
.zonebadge-empty {
border: 1px dashed #AAAAAA;
color: #AAAAAA;
@@ -1909,7 +1931,7 @@ table.valign-middle td {
}
div.cbi-value var,
-td.cbi-value-field var {
+.td.cbi-value-field var {
font-style: italic;
color: #0069D6;
}
@@ -1945,12 +1967,14 @@ td.cbi-value-field var {
display: block;
font-style: normal;
padding: 2px;
+ line-height: 19px;
+ white-space: pre;
}
.uci-change-list var ins,
.uci-change-list var del {
- /*display: inline;*/
- border: none;
+ display: inline;
+ /*border: none;*/
white-space: pre;
font-style: normal;
padding: 0px;
@@ -1980,3 +2004,7 @@ td.cbi-value-field var {
line-height: 6px;
border: none;
}
+
+html body.apply-overlay-active {
+ height: calc(100vh - 63px);
+}
diff --git a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js b/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js
deleted file mode 100644
index 1ec510f2a4..0000000000
--- a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed
-// Uncompressed source: https://github.com/aFarkas/html5shiv
-(function(a,b){function f(a){var c,d,e,f;b.documentMode>7?(c=b.createElement("font"),c.setAttribute("data-html5shiv",a.nodeName.toLowerCase())):c=b.createElement("shiv:"+a.nodeName);while(a.firstChild)c.appendChild(a.childNodes[0]);for(d=a.attributes,e=d.length,f=0;f<e;++f)d[f].specified&&c.setAttribute(d[f].nodeName,d[f].nodeValue);c.style.cssText=a.style.cssText,a.parentNode.replaceChild(c,a),c.originalElement=a}function g(a){var b=a.originalElement;while(a.childNodes.length)b.appendChild(a.childNodes[0]);a.parentNode.replaceChild(b,a)}function h(a,b){b=b||"all";var c=-1,d=[],e=a.length,f,g;while(++c<e){f=a[c],g=f.media||b;if(f.disabled||!/print|all/.test(g))continue;d.push(h(f.imports,g),f.cssText)}return d.join("")}function i(c){var d=new RegExp("(^|[\\s,{}])("+a.html5.elements.join("|")+")","gi"),e=c.split("{"),f=e.length,g=-1;while(++g<f)e[g]=e[g].split("}"),b.documentMode>7?e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,'$1font[data-html5shiv="$2"]'):e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,"$1shiv\\:$2"),e[g]=e[g].join("}");return e.join("{")}var c=function(a){return a.innerHTML="<x-element></x-element>",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x<style>","article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}","audio{display:none}","canvas,video{display:inline-block;*display:inline;*zoom:1}","[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}","mark{background:#FF0;color:#000}","</style>"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e;if(c||!a.attachEvent)return;a.attachEvent("onbeforeprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;b.namespaces.shiv||b.namespaces.add("shiv");var c=-1,d=new RegExp("^("+a.html5.elements.join("|")+")$","i"),e=b.getElementsByTagName("*"),g=e.length,j,k=i(h(function(a,b){var c=[],d=a.length;while(d)c.unshift(a[--d]);d=b.length;while(d)c.unshift(b[--d]);c.sort(function(a,b){return a.sourceIndex-b.sourceIndex}),d=c.length;while(d)c[--d]=c[d].styleSheet;return c}(b.getElementsByTagName("style"),b.getElementsByTagName("link"))));while(++c<g)j=e[c],d.test(j.nodeName)&&f(j);b.appendChild(b._shivedStyleSheet=b.createElement("style")).styleSheet.cssText=k}),a.attachEvent("onafterprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;var c=-1,d=b.getElementsByTagName("*"),e=d.length,f;while(++c<e)f=d[c],f.originalElement&&g(f);b._shivedStyleSheet&&b._shivedStyleSheet.parentNode.removeChild(b._shivedStyleSheet)})})(this,document) \ No newline at end of file
diff --git a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
index 4881535acb..aaacf56b84 100644
--- a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
+++ b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
@@ -160,7 +160,6 @@
<head>
<meta charset="utf-8">
<title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
- <!--[if lt IE 9]><script src="<%=media%>/html5.js"></script><![endif]-->
<meta name="viewport" content="initial-scale=1.0">
<link rel="stylesheet" href="<%=media%>/cascade.css">
<link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="<%=media%>/mobile.css" type="text/css" />
@@ -191,22 +190,20 @@
</div>
</header>
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
- <div class="container">
+ <div id="maincontent" class="container">
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
<div class="alert-message warning">
<h4><%:No password set!%></h4>
- <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
- <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+ <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+ <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
</div>
- </div>
- <%- end -%>
+ <%- end -%>
- <noscript>
- <div class="alert-message warning">
- <strong><%:JavaScript required!%></strong><br />
- <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
- </div>
- </noscript>
+ <noscript>
+ <div class="alert-message warning">
+ <h4><%:JavaScript required!%></h4>
+ <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
+ </div>
+ </noscript>
- <div id="maincontent" class="container">
<% if category then render_tabmenu(category, cattree) end %>
diff --git a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg b/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg
deleted file mode 100644
index 822527ead8..0000000000
--- a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg
+++ /dev/null
Binary files differ
diff --git a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css b/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css
index ed97427c91..d5e87ebef0 100644
--- a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css
+++ b/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css
@@ -9,7 +9,7 @@ html {
body {
color: #ccc;
- background:#e5eef5 url(bg.jpg) repeat-x top left;
+ background: #e5eef5 linear-gradient(#fff 0%, #e5eef5 100%) no-repeat;
font-family: Verdana, Arial, sans-serif;
font-size: 100%;
line-height: 100%;
@@ -23,6 +23,42 @@ html, body {
* {
margin: 0;
padding: 0;
+ box-sizing: border-box;
+}
+
+.table { display: table; width: 100%; position: relative; }
+.tr { display: table-row; }
+.thead { display: table-header-group; }
+.tbody { display: table-row-group; }
+.tfoot { display: table-footer-group; }
+.td, .th { display: table-cell; }
+.th { font-weight: bold; }
+
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
+.col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; }
+.col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; }
+.col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; }
+.col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; }
+.col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; }
+.col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; }
+.col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; }
+.col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; }
+.col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; }
+.col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; }
+
+.tr.placeholder {
+ height: 3.5em;
+}
+
+.tr.placeholder > .td {
+ position: absolute;
+ left: 1px;
+ right: 1px;
+ bottom: 1px;
+ text-align: center;
+ line-height: 3em;
}
abbr,
@@ -49,6 +85,34 @@ code {
white-space: pre;
}
+h2, h3, h4, legend {
+ font-size: 150%;
+ font-family: Trebuchet MS, Verdana, sans-serif;
+ font-weight: bold;
+ margin: .25em 0 .5em 0;
+ border-bottom: 1px solid;
+ padding-bottom: 4px;
+ display: block;
+ width: 100%;
+}
+
+h3, legend {
+ font-size: 125%;
+}
+
+h4 {
+ font-size: 112%;
+}
+
+.cbi-section-node + h4 {
+ margin-top: 1em;
+}
+
+fieldset { border: none; }
+
+fieldset > legend { float: left; }
+fieldset > legend + * { clear: both; }
+
#maincontent ul {
margin-left: 2em;
}
@@ -85,37 +149,63 @@ a img {
background-color: white;
}
-.errorbox {
- border: 1px solid #F00;
- background-color: #FCC;
- padding: 5px;
+.alert-message {
+ font-weight: normal;
+ padding: .5em;
+ border-radius: 3px;
+ color: #000;
}
+.alert-message.notice {
+ background: linear-gradient(#ccc 0%, #eee 100%);
+ color: #4a6b7c;
+}
-.ifacebox {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
- margin: 0 10px;
- text-align: center;
- white-space: nowrap;
+.alert-message.warning {
+ background: linear-gradient(#dda 0%, #dd8 100%);
+ color: #c00;
}
-.ifacebox .ifacebox-head {
- border-bottom: 1px solid #CCCCCC;
- padding: 2px;
+.alert-message > * {
+ margin: .5em;
}
-.ifacebox .ifacebox-body {
- padding: 2px;
+.alert-message > h4 {
+ font-weight: bold;
}
-.ifacebadge {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
+.ifacebadge, .ifacebox {
+ display: inline-flex;
+ align-content: center;
+ border: 1px solid #ccc;
+ border-radius: 3px;
padding: 2px;
- margin-left: 2px;
+ background: #fff;
+ margin: .25em .5em;
+}
+
+.ifacebox-head {
+ background: #eee;
+}
+
+.ifacebox-head.active {
+ background: #90c0e0;
+}
+
+.ifacebadge, .zonebadge {
+ align-items: center;
+}
+
+.ifacebadge > * {
+ align-self: flex-start;
+}
+
+.ifacebadge > img,
+.ifacebadge > em {
+ margin-right: 5px;
display: inline-block;
+ height: 16px;
}
.ifacebadge-active {
@@ -123,18 +213,70 @@ a img {
font-weight: bold;
}
+.ifacebox {
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+ min-width: 100px;
+ text-align: center;
+}
+
+.ifacebox > * {
+ padding: 2px;
+}
+
+.td > .ifacebadge,
+.td > .zonebadge {
+ margin: 0;
+ vertical-align: top;
+}
+
+.network-status-table {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox {
+ margin: .5em;
+ font-size: 90%;
+ flex-grow: 1;
+}
+
+.network-status-table .ifacebox-body {
+ display: flex;
+ flex-direction: column;
+ flex: 1 0;
+}
+
+.network-status-table .ifacebox-body > span {
+ flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.ifacebadge.large,
+.network-status-table .ifacebox-body .ifacebadge {
+ flex: 1;
+ margin: .5em .25em .25em .25em;
+ padding: .5em;
+ min-width: 220px;
+ white-space: nowrap;
+}
+
.zonebadge {
padding: 2px;
display: inline-block;
white-space: nowrap;
- cursor: pointer;
+ border-radius: 3px;
}
-.zonebadge em,
-.zonebadge strong {
+.zonebadge > em,
+.zonebadge > strong {
margin: 3px;
- display: inline-block;
}
.zonebadge input {
@@ -142,6 +284,18 @@ a img {
height: 1.5em;
}
+.zonebadge .ifacebadge,
+.cbi-dropdown .ifacebadge {
+ margin: 1px;
+}
+
+.zonebadge .ifacebadge img,
+.zonebadge .ifacebadge em,
+.cbi-dropdown .ifacebadge img,
+.cbi-dropdown .ifacebadge em {
+ margin: 0 1px;
+}
+
.zonebadge-empty {
border: 1px dashed #AAAAAA;
color: #AAAAAA;
@@ -150,6 +304,7 @@ a img {
}
+
#header {
height: auto;
background: #FFF url(header.jpg) repeat-x left bottom;
@@ -158,9 +313,12 @@ a img {
text-align:right;
}
+.header_left {
+ padding-bottom: 10px;
+}
+
.header_left img {
padding: 10px 10px 0px 10px;
- margin-bottom: 10px;
}
.header_banner {
@@ -173,15 +331,15 @@ a img {
padding: 0px;
}
-.header_left{
+.header_left {
text-align:left;
max-width: 50%;
float:left;
}
-.header_left a{
+.header_left a {
color: #dc0067;
- font: bold 36px Helvetica;
+ font: bold 36px Helvetica, Verdana, Arial, sans-serif;
text-decoration: none;
}
@@ -454,53 +612,15 @@ textarea#syslog {
font-size: 80%;
}
-#maincontent h2 {
- font:normal bold 150% "Trebuchet MS", Verdana, sans-serif;
- margin: 0.25em 0 0.7em 0;
- border-bottom: 1px solid;
- padding: 10px 0 4px 0;
- color: #404040;
-}
-
-#maincontent h3 {
- margin: 0.5em 0 1.1em 0;
- font:italic bold 125% "Trebuchet MS", Verdana, sans-serif;
- color: #404040;
-}
-
#maincontent p {
margin-bottom: 1em;
}
.cbi-section {
- margin-bottom: 0.5em;
- padding: 0.5em 1em;
- border: 1px dotted #555;
- background-color: #fff;
+ margin-bottom: 1.5em;
color: #000;
}
-.cbi-section legend {
- font-size: 110%;
- font-weight: bold;
- height: 1em;
- padding: 0.5em 0.25em;
- background-color: transparent;
- color: #404040 ;
-}
-
-.cbi-section h2 {
- margin: 0em 0 0.5em -0.5em !important;
-}
-
-.cbi-section h3 {
- text-decoration: none !important;
- font-weight: bold !important;
- color: #555 !important;
- margin: 0.25em !important;
- font-size: 100% !important;
-}
-
.cbi-section-descr {
margin-bottom: 0.5em;
font-size: 95%;
@@ -519,46 +639,52 @@ ul.cbi-apply {
}
ul.cbi-tabmenu {
- padding: 3px 0;
- margin-left: 0 !important;
- margin-bottom: -1px;
list-style-type: none;
+ display: flex;
+ margin: 0 0 .5em 0 !important;
+ padding: 0 0 0 5px;
+ border-bottom: 1px solid #bbb;
}
-ul.cbi-tabmenu li.cbi-tab,
-ul.cbi-tabmenu li.cbi-tab-disabled {
- display: inline;
- margin: 0;
+ul.cbi-tabmenu li {
+ display: inline-flex;
+ margin: 0 5px -1px 0;
+ flex: 0 1 auto;
+ border: 1px solid #bbb;
+ border-bottom: none;
+ border-radius: 3px 3px 0 0;
+ background: linear-gradient(#ddd 90%, #aaa 100%);
+ color: #888;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
}
-ul.cbi-tabmenu li.cbi-tab a,
-ul.cbi-tabmenu li.cbi-tab-disabled a {
+ul.cbi-tabmenu li a,
+ul.cbi-tabmenu li a:hover {
text-decoration: none;
- padding: 3px 7px;
- margin-right: 3px;
- border: 1px dotted #bbb;
- border-bottom: none;
- background-color: #eee;
- color: #bbb;
+ color: inherit;
+ padding: 5px;
+ flex: 1;
+ width: 100%;
+ height: 100%;
}
-ul.cbi-tabmenu li.cbi-tab-highlighted a {
+ul.cbi-tabmenu li.cbi-tab-highlighted {
color: #000;
- background-color: #FFEEAA;
+ background: #fea;
}
-ul.cbi-tabmenu li a:hover {
+ul.cbi-tabmenu li.cbi-tab {
color: #000;
+ background: #fff;
}
-ul.cbi-tabmenu li.cbi-tab a {
- position: relative;
- top: 1px;
- padding-top: 4px;
- color: #000;
- background-color: #fff;
+ul.cbi-tabmenu + .cbi-section-node {
+ margin-top: -.5em;
}
+
div.cbi-tab-descr {
background-image: url(/luci-static/resources/cbi/help.gif);
background-position: 0.25em 50%;
@@ -601,151 +727,126 @@ select,
input[type=text],
input[type=password] {
width: 20em;
+ font-size: inherit;
+ line-height: 13pt;
+ height: 14pt;
}
-td select,
-td input[type=text],
-td input[type=password] {
- width: 99%;
+select[multiple] {
+ height: auto;
}
-img.cbi-image-button {
- cursor: pointer;
- margin: 0 2px;
+input[type=radio],
+input[type=checkbox],
+[data-dynlist] > input + img,
+input.cbi-input-password + img {
vertical-align: middle;
}
-input.cbi-input-user {
- background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- text-indent: 17px;
-}
-
-input.cbi-input-password {
- background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- text-indent: 17px;
-}
-
-input.cbi-input-find,
-input.cbi-button-find {
- background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding-left: 17px;
- border: none;
-}
-
-input.cbi-input-reload {
- background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding-left: 17px;
-}
-
-input.cbi-button{
- margin-top: 1.3em;
+.td select,
+.td .cbi-dropdown,
+.td input[type=text] {
+ width: 100%;
}
-input.cbi-input-add,
-input.cbi-button-add {
- background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
- border: 1px solid #FFF;
+.td [data-dynlist] > input,
+.td input.cbi-input-password {
+ width: calc(100% - 20px);
}
-input.cbi-input-fieldadd,
-input.cbi-button-fieldadd {
- background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
+img.cbi-image-button {
+ cursor: pointer;
+ margin: 0 2px;
+ vertical-align: middle;
}
-input.cbi-input-reset,
-input.cbi-button-reset {
- background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
- background-color: inherit;
+.btn, .cbi-button {
+ padding: 0 .5em;
+ border-radius: 3px;
+ border: 1px solid #aaa;
+ text-decoration: none;
color: #000;
- padding: 0 1px 0 17px;
-}
-
-
+ display: inline-block;
+ font-size: inherit;
+ -webkit-appearance: none;
+ background: #fff;
+ text-align: center;
+ font-weight: bold;
+ line-height: 13pt;
+ height: 14pt;
}
-input.cbi-input-save,
-input.cbi-button-save {
- background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
+.btn:hover, .cbi-button:hover {
+ box-shadow: 0 0 3px #59d;
}
-input.cbi-input-apply,
-input.cbi-button-apply {
- background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
+.btn[disabled],
+.btn[disabled]:hover,
+.cbi-button[disabled],
+.cbi-button[disabled]:hover {
+ opacity: .6;
+ cursor: default;
+ pointer-events: none;
}
-input.cbi-input-link,
-input.cbi-button-link {
- background: url('../resources/cbi/link.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
- border: none;
+.cbi-button-positive,
+.cbi-button-fieldadd,
+.cbi-button-add,
+.cbi-button-save {
+ border-color: #7b7;
+ color: #7b7;
}
-input.cbi-input-download,
-input.cbi-button-download {
- background: url('../resources/cbi/download.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
- border: none;
+.cbi-button-neutral,
+.cbi-button-reset,
+.cbi-button-download,
+.cbi-button-find,
+.cbi-button-link,
+.cbi-button-up,
+.cbi-button-down {
+ border-color: #444;
+ color: #444;
}
-input.cbi-input-remove,
-div.cbi-section-remove input {
- background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
- background-color: inherit;
- color: #000;
- padding: 0 1px 0 17px;
- border: 1px solid #fff;
+.cbi-button-action,
+.cbi-button-apply,
+.cbi-button-reload,
+.cbi-button-edit {
+ border-color: #59d;
+ color: #59d;
}
-input.cbi-button-up {
- background-image: url('../resources/cbi/up.gif');
- padding: 0 1px 0 11px;
+.cbi-button-negative,
+.cbi-section-remove .cbi-button,
+.cbi-button-remove {
+ border-color: #b77;
+ color: #b77;
}
-input.cbi-button-down {
- background-image: url('../resources/cbi/down.gif');
- padding: 0 1px 0 11px;
+.cbi-button-action.important,
+.cbi-page-actions .cbi-button-apply,
+.cbi-section-actions .cbi-button-edit {
+ color: #fff;
+ background: #59d;
}
-input.cbi-button-edit {
- background: url('../resources/cbi/edit.gif') no-repeat scroll 1px center;
- color: #000000;
- padding: 0 1px 0 17px;
+.cbi-button-positive.important,
+.cbi-page-actions .cbi-button-save {
+ color: #fff;
+ background: #7b7;
}
-input.cbi-button-reload {
- background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
- color: #000000;
- padding: 0 1px 0 17px;
+.cbi-page-actions .cbi-button-apply + .cbi-button-save {
+ background: #fff;
+ color: #7b7;
}
-input.cbi-button-remove {
- background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
- color: #000000;
- padding: 0 1px 0 17px;
+.cbi-input-invalid {
+ background-image: url('../resources/cbi/reset.gif');
+ background-repeat: no-repeat;
+ background-position: right;
+ color: #FF0000 !important;
+ border-color: #FF0000;
}
.cbi-input-invalid {
@@ -765,18 +866,12 @@ textarea {
margin-bottom: 0.5em;
}
-form > div > input[type=submit],
-form > div > input[type=reset] {
- float: right;
- margin-left: 0.5em;
-}
-
-table td,
-table th {
- color: #000;
+.table .td, .table .th {
+ color: #000000;
+ padding: .25em;
}
-table.smalltext {
+.table.smalltext {
background: #f5f5f5;
color: #000;
border: 1px solid #666;
@@ -787,48 +882,62 @@ table.smalltext {
border-collapse: collapse;
}
-table.smalltext tr:hover td {
+.table.smalltext .tr:hover .td {
background-color: #bbddee;
color: #000;
}
-table.smalltext tr th {
+.table.smalltext .tr .th {
padding: 0 0.25em;
border-left: 1px dotted #666;
text-align: left;
}
-table.smalltext tr td {
+.table.smalltext .tr .td {
padding: 0.2em;
border-top: 1px dotted #666;
border-left: 1px dotted #666;
}
-table.cbi-section-table .cbi-rowstyle-1 {
- background-color: #f1f6fa;
- color: #000;
+.cbi-section-node .tr:not(.placeholder):nth-child(even) {
+ background: #e5eef5;
}
-table.cbi-section-table .cbi-rowstyle-1:hover,
-table.cbi-section-table .cbi-rowstyle-2:hover {
- background-color: #b2c8d4;
- color: #000000;
-}
-
-table.cbi-section-table .cbi-section-table-cell {
+.table.cbi-section-table .cbi-section-table-cell {
padding: 3px;
white-space: nowrap;
}
-.cbi-section .cbi-rowstyle-1 h3 {
- background-color: #f1f6fa;
- color: #555;
+.table .tr > .th:empty {
+ display: none;
}
-.cbi-rowstyle-2 {
- color: #000;
+.table.cbi-section-table .tr > *,
+.table.cbi-section-table .tr[data-title]::before {
+ border-top: 1px dotted #bbb;
+ display: table-cell;
+}
+
+.table.cbi-section-table .tr.table-titles > *,
+.table.cbi-section-table .tr.cbi-section-table-titles > *,
+.table.cbi-section-table .tr.cbi-section-table-desc > *,
+.table.cbi-section-table .tr.table-titles::before,
+.table.cbi-section-table .tr.cbi-section-table-titles::before,
+.table.cbi-section-table .tr.cbi-section-table-desc::before {
+ border-top: none;
}
+.table.cbi-section-table .tr:hover::before,
+.table.cbi-section-table .tr:hover > * {
+ background: #eee;
+}
+
+.table.cbi-section-table .tr:nth-child(even):hover::before,
+.table.cbi-section-table .tr:nth-child(even):hover > * {
+ background: #bde;
+}
+
+
div.cbi-value {
clear: left;
vertical-align: middle;
@@ -847,34 +956,49 @@ div.cbi-value:hover {
line-height: 1.8em;
}
-div.cbi-value-field {
+.cbi-value-field {
width: 58%;
margin-left: 40%;
padding: 0.25em 0;
}
-div.cbi-value-description {
- font-size: 90%;
- display: inline;
+.td.cbi-value-field {
+ width: auto;
+ margin-left: 0;
+ align-self: center;
}
-div.cbi-section-create {
- clear: left;
- white-space: nowrap;
- vertical-align: top;
+.cbi-value-description {
+ background-image: url(/luci-static/resources/cbi/help.gif);
+ background-position: .25em .25em;
+ background-repeat: no-repeat;
+ margin: .25em 0 0 0;
+ padding: .25em .25em .25em 1.75em;
}
-div.cbi-tblsection-create {
- border-bottom: 1px dotted #bbb;
+.cbi-section-create {
+ padding: 0 0 .25em 0;
+ margin: -3px;
+ display: inline-flex;
+ align-items: center;
+}
+
+.cbi-section-create > * {
+ margin: 3px;
+ flex: 1 1 auto;
+}
+
+.cbi-section-create > * > input {
+ width: 100%;
}
-div.cbi-section-create .cbi-button {
- margin: 0.25em;
+.cbi-section-remove > .cbi-button {
+ margin-bottom: -1px;
+ border-radius: 3px 3px 0 0;
}
-input.cbi-section-create-name {
- margin-right: -0.25em;
- border: 1px solid #999;
+.cbi-section-node + .cbi-section-create {
+ padding-top: 0;
}
div.cbi-map-descr {
@@ -886,46 +1010,147 @@ div.cbi-optionals {
border-bottom: 1px dotted #bbb;
}
-div.cbi-section-remove {
- float: right;
-}
+
.cbi-section-node {
clear: both;
- border: 1px dotted #bbb;
- border-bottom: none;
padding-bottom: 0;
+ position: relative;
+ border: 1px dotted #555;
+ background: #fff;
+ margin-bottom: 5px;
}
-.cbi-section-node table div {
- padding-bottom: 0;
- border-bottom: none;
+.cbi-section-node-tabbed {
+ border-top: none;
}
-.cbi-section-node div.cbi-section-table-row {
- margin: 0.25em;
+.cbi-section-node .cbi-optionals:last-child,
+.cbi-section-node .cbi-value:last-child {
+ border-bottom: none;
}
-table.cbi-section-table {
+.table.cbi-section-table {
width: 100%;
font-size: 95%;
+ border: 1px dotted #444;
+ background: #fff;
+ margin: 0 0 .5em 0;
}
-table.cbi-section-table th,
-table.cbi-section-table td {
- text-align: center;
+.cbi-section-node > .table.cbi-section-table {
+ border: none;
+ margin: 0;
}
-tr.cbi-section-table-descr th {
- font-weight: bold;
+@keyframes flash {
+ 0% { opacity: 1; }
+ 50% { opacity: .5; }
+ 100% { opacity: 1; }
+}
+
+.tr.cbi-section-table-row.flash {
+ animation: flash .35s;
+}
+
+.tr.cbi-section-table-descr .th {
+ font-weight: normal;
font-size: 90%;
+ vertical-align: top;
}
-td.cbi-section-table-optionals {
+.td.cbi-section-table-optionals {
text-align: left !important;
padding-top: 1em;
}
+.th.cbi-section-actions,
+.td.cbi-section-actions {
+ display: flex;
+ justify-content: flex-end;
+ flex-direction: row;
+ flex: 1 1 150px;
+ margin: auto 0 auto auto;
+}
+
+.td.cbi-section-actions > form {
+ display: flex;
+}
+
+.td.cbi-section-actions > *,
+.td.cbi-section-actions > form > * {
+ flex: 1 1 4em;
+ margin: 1px;
+}
+
+.cbi-page-actions {
+ display: flex;
+ justify-content: flex-end;
+ margin: -3px;
+ padding: 0 .25em .25em .25em;
+}
+
+.cbi-page-actions > form {
+ display: flex;
+}
+
+.cbi-page-actions > * {
+ flex: 0 1 auto;
+ margin: 3px;
+}
+
+.cbi-page-actions > form > * {
+ flex: 1;
+ margin: 0 3px 0 0;
+}
+
+.cbi-page-actions > .cbi-button-link,
+.cbi-page-actions > form[method="get"]:first-child {
+ margin-right: auto;
+}
+
+
+.th[data-type="button"], .td[data-type="button"],
+.th[data-type="fvalue"], .td[data-type="fvalue"] {
+ flex: 1 1 2em;
+ text-align: center;
+}
+
+#cbi-network-switch_vlan .th,
+#cbi-network-switch_vlan .td {
+ flex-basis: 12%;
+}
+
+#cbi-wireless-overview .td:first-child {
+ align-self: center;
+}
+
+.td[data-title]::before {
+ content: attr(data-title) ":\20";
+ font-weight: bold;
+ text-align: left;
+ display: none;
+ padding: 1px;
+ white-space: nowrap;
+}
+
+.tr.placeholder .td[data-title]::before {
+ display: none;
+}
+
+.tr[data-title]::before,
+.tr.cbi-section-table-titles.named::before {
+ content: attr(data-title) "\20";
+ font-weight: bold;
+ text-align: left;
+ display: inline-block;
+ align-self: center;
+ flex: 1 1 5%;
+ padding: .25em;
+ white-space: normal;
+ word-wrap: break-word;
+}
+
.cbi-value-helpicon img {
vertical-align: bottom;
}
@@ -956,14 +1181,241 @@ td.cbi-value-error {
padding: 3px;
}
-.left {
+
+.cbi-dropdown {
+ border: 1px solid #ccc;
+ display: inline-flex;
+ cursor: pointer;
+ background: #fff;
+ position: relative;
+ padding: 0;
+ color: #000;
+ min-width: 20em;
+ max-width: 100%;
+}
+
+.cbi-dropdown:focus {
+ outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+ margin: 0 !important;
+ padding: 0;
+ list-style: none;
+ overflow-x: hidden;
+ overflow-y: auto;
+ display: flex;
+ width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+ display: none;
+}
+
+.cbi-dropdown > .open {
+ background: #eee;
+ border: 2px outset #eee;
+ flex-basis: 15px;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+ flex-grow: 0;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ text-align: center;
+ line-height: 2em;
+ padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+ color: #777;
+ font-weight: bold;
+ text-shadow: 1px 1px 0px #fff;
+ display: none;
+}
+
+.cbi-dropdown > ul > li {
+ display: none;
+ padding: .25em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ flex-shrink: 1;
+ flex-grow: 1;
+ align-items: center;
+ align-self: center;
+ min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+ border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+ max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+ display: none;
+ margin: 0;
+ padding: 0;
+ pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+ vertical-align: middle;
+ margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+ margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+ height: 20px;
+}
+
+.cbi-dropdown[open] {
+ position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+ display: block;
+ background: #f6f6f5;
+ border: 1px solid #918e8c;
+ box-shadow: 0 0 4px #918e8c;
+ position: absolute;
+ z-index: 1000;
+ max-width: none;
+ min-width: 100%;
+ width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+ display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+ border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+ background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+ background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+ margin-bottom: 0;
+ border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+ pointer-events: none;
+ opacity: .6;
+}
+
+
+.cbi-tooltip-container {
+ cursor: help;
+}
+
+.cbi-tooltip {
+ position: absolute;
+ z-index: 1000;
+ left: -1000px;
+ opacity: 0;
+ transition: opacity .25s ease-out;
+ pointer-events: none;
+ box-shadow: 0 0 2px #444;
+}
+
+.cbi-tooltip-container:hover .cbi-tooltip {
+ left: auto;
+ opacity: 1;
+ transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+ padding: 1px;
+ background: inherit;
+ margin: -1.6em 0 0 -5px;
+}
+
+
+.zone-forwards {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.zone-forwards > * {
+ flex: 1 1 45%;
+ padding: 1px;
+}
+
+.zone-forwards > span {
+ flex-basis: 10%;
+ text-align: center;
+}
+
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+ display: flex;
+ flex-direction: column;
+}
+
+
+.left, .left::before {
text-align: left !important;
}
-.right {
+.right, .right::before {
text-align: right !important;
}
+.center, .center::before {
+ text-align: center !important;
+}
+
+.td.bottom {
+ align-self: flex-end;
+}
+
+.td.top {
+ align-self: flex-start;
+}
+
+.td.middle {
+ align-self: center;
+}
+
+
.footer, .push {
height: 2em;
}
@@ -1070,3 +1522,246 @@ td.cbi-value-error {
}
}
+
+@media screen and (max-width: 992px) {
+ body {
+ -webkit-text-size-adjust: 100%;
+ }
+
+ #maincontent {
+ width: 100%;
+ }
+
+ .table {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ }
+
+ .tr {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: flex-end;
+ }
+
+ .th, .td {
+ flex: 2 2 25%;
+ align-self: flex-start;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ display: inline-block;
+ }
+
+ .td select {
+ word-wrap: normal;
+ }
+
+ .td[data-type="button"],
+ .td[data-type="fvalue"] {
+ flex: 1 1 12.5%;
+ text-align: left;
+ }
+
+ .td.cbi-value-field {
+ align-self: flex-start;
+ }
+
+ .td.cbi-value-field .cbi-button {
+ width: 100%;
+ }
+
+ .table.cbi-section-table {
+ border: none;
+ background: none;
+ margin: 0;
+ }
+
+ .tr.table-titles,
+ .cbi-section-table-titles,
+ .cbi-section-table-descr {
+ display: none;
+ }
+
+ .table.cbi-section-table .tr > *,
+ .table.cbi-section-table .tr[data-title]::before {
+ border-top: none;
+ }
+
+ .cbi-section-table-row {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ border: 1px dotted #444;
+ margin: 0 0 .5em 0;
+ background: #fff;
+ }
+
+ .cbi-section-table-row:hover {
+ border: 1px solid #4a6b7c;
+ }
+
+ .table.cbi-section-table .tr:hover > *,
+ .table.cbi-section-table .tr:nth-child(2n):hover > * {
+ background: none;
+ }
+
+ .cbi-section-table + .cbi-section-create {
+ padding-top: 0;
+ }
+
+ .tr[data-title]::before {
+ display: block;
+ flex: 1 1 100%;
+ background: #eef;
+ }
+
+ .td[data-title]::before {
+ display: block;
+ }
+
+ .td.cbi-section-actions {
+ flex-basis: 100%;
+ margin: auto 0 0 auto;
+ }
+
+ .td.cbi-section-actions > *,
+ .td.cbi-section-actions > form > * {
+ flex: 0 1 100%;
+ max-width: 150px;
+ }
+
+ .hide-sm,
+ .hide-xs {
+ display: none;
+ }
+}
+
+@media screen and (max-width: 480px) {
+ body {
+ font-size: 12pt;
+ }
+
+ input, textarea, select {
+ font-size: 12pt !important;
+ line-height: 1.4em;
+ }
+
+ select, input[type="text"], input[type="password"] {
+ width: 100%;
+ height: 1.4em;
+ }
+
+ [data-dynlist] > input,
+ input.cbi-input-password {
+ width: calc(100% - 20px);
+ }
+
+ .cbi-dropdown {
+ min-width: 100%;
+ }
+
+ .btn, .cbi-button {
+ font-size: 9pt !important;
+ line-height: 11pt;
+ }
+
+ #maincontent {
+ padding: .25em;
+ }
+
+ #tabmenu {
+ margin: -.25em -.25em 1em -.25em;
+ }
+
+ .th, .td {
+ flex: 2 2 50%;
+ }
+
+ .td.cbi-value-field {
+ flex-basis: 100%;
+ }
+
+ .td.cbi-value-field[data-type="dvalue"] {
+ flex-basis: 50%;
+ }
+
+ .td.cbi-value-field[data-type="button"],
+ .td.cbi-value-field[data-type="fvalue"] {
+ flex-basis: 25%;
+ text-align: left;
+ }
+
+ .cbi-section {
+ padding: .25em;
+ }
+
+ .cbi-value {
+ padding: 0 .25em;
+ }
+
+ .cbi-value-title {
+ float: none;
+ font-weight: bold;
+ }
+
+ .cbi-value-field {
+ width: 100%;
+ margin: 0;
+ }
+
+ .cbi-value-description {
+ margin-top: 5px;
+ display: block;
+ }
+
+ .cbi-section-create {
+ margin-bottom: 1em;
+ }
+
+ .cbi-optionals {
+ display: flex;
+ }
+
+ .cbi-page-actions {
+ flex-wrap: wrap;
+ }
+
+ .cbi-page-actions > .cbi-button-link {
+ flex-basis: 100%;
+ margin-right: 2px;
+ }
+
+ .cbi-optionals > *,
+ .cbi-page-actions > * {
+ flex: 1 1 auto;
+ margin: 2px;
+ height: auto;
+ }
+
+ ul.cbi-tabmenu {
+ padding: 0 3px;
+ }
+
+ ul.cbi-tabmenu li {
+ font-size: 90%;
+ margin: 0 1px -1px 0;
+ }
+
+ .hide-xs {
+ display: none;
+ }
+
+ #cbi-network .td[id] > strong {
+ display: block;
+ }
+
+ #cbi-network-switch_vlan .td.cbi-section-actions {
+ flex-basis: 100%;
+ }
+
+ .network-status-table .ifacebox {
+ margin: 0 0 .5em 0;
+ }
+}
diff --git a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css b/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css
deleted file mode 100644
index 67ed9fb816..0000000000
--- a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css
+++ /dev/null
@@ -1,20 +0,0 @@
-div.cbi-value-field {
- margin-left: 0 !important;
-}
-
-.cbi-section legend {
- background-color: #ffffff;
- color: #555555;
-}
-
-table.cbi-section-table td .cbi-input-text,
-table.cbi-section-table td .cbi-input-select {
- width: 95% !important;
-}
-
-.cbi-input-user,
-.cbi-input-password {
- text-indent: 0 !important;
- padding-left: 1.5em !important;
- width: 18.5em !important;
-}
diff --git a/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm b/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm
index 16ffc992ac..b6ed1f7134 100644
--- a/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm
+++ b/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm
@@ -74,7 +74,6 @@
<link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="<%=media%>/mobile.css" type="text/css" />
<link rel="stylesheet" media="only screen and (max-width: 854px)" href="<%=media%>/smallscreen.css" type="text/css" />
<link rel="stylesheet" media="handheld" href="<%=media%>/mobile.css" type="text/css" />
-<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
<% end -%>
<% if css then %><style title="text/css">
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/css/style.css b/themes/luci-theme-material/htdocs/luci-static/material/css/style.css
index 57bbaf6afc..17db81edb3 100755
--- a/themes/luci-theme-material/htdocs/luci-static/material/css/style.css
+++ b/themes/luci-theme-material/htdocs/luci-static/material/css/style.css
@@ -32,6 +32,38 @@
font-style: normal;
}
+.table { display: table; position: relative; }
+.tr { display: table-row; }
+.thead { display: table-header-group; }
+.tbody { display: table-row-group; }
+.tfoot { display: table-footer-group; }
+.td, .th {
+ vertical-align: middle;
+ text-align: center;
+ display: table-cell;
+ padding: .5em;
+}
+
+.th {
+ font-weight: bold;
+}
+
+.tr.placeholder {
+ height: 4em;
+}
+
+.tr.placeholder > .td {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-align: center;
+ line-height: 3em;
+}
+
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
.cbi-button-up,
.cbi-button-down,
.cbi-value-helpicon,
@@ -88,7 +120,8 @@ select {
}
select,
-input {
+input,
+.cbi-dropdown {
background-color: transparent;
color: rgba(0, 0, 0, .87);
border: none;
@@ -138,7 +171,7 @@ header {
transition: box-shadow .2s;
float: left;
position: fixed;
- z-index: 101;
+ z-index: 2000;
}
footer {
@@ -268,10 +301,9 @@ header > .container > .brand {
color: black;
}
-.errorbox,
.alert-message {
margin: 2rem 0 0 0;
- padding: 2rem;
+ padding: 1rem;
border: 0;
font-weight: normal;
font-style: normal;
@@ -284,16 +316,19 @@ header > .container > .brand {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
}
-.errorbox {
- color: #fff;
- background-color: #f0ad4e;
- border-color: #eea236;
-}
-
.error {
color: red;
}
+.alert-message > h4 {
+ font-weight: bold;
+ font-size: 110%;
+}
+
+.alert-message > * {
+ margin: .5rem 0;
+}
+
#maincontent > .container > div:nth-child(1).alert-message.warning > a {
font: inherit;
overflow: visible;
@@ -420,10 +455,12 @@ h3 {
}
h4 {
-
+ margin: 2rem 0 0 0;
+ font-size: 1.2rem;
+ padding-bottom: 10px;
}
-fieldset {
+.cbi-section {
margin: 2rem 0 0 0;
padding: 2rem;
border: 0;
@@ -431,11 +468,7 @@ fieldset {
font-style: normal;
line-height: 1;
font-family: inherit;
-
min-width: inherit;
- overflow-x: auto;
- overflow-y: hidden;
-
border-radius: 0;
background-color: #FFF;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
@@ -447,7 +480,7 @@ fieldset {
margin-top: 1rem;
}
-fieldset > legend {
+.cbi-section > legend {
display: none !important;
}
@@ -471,25 +504,89 @@ fieldset > fieldset {
table {
border-spacing: 0;
border-collapse: collapse;
+}
+
+table, .table {
width: 100%;
border: 1px solid #eee;
}
-table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th {
+table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th,
+.table > .tbody > .tr > .td, .table > .tbody > .tr > .th, .table > .tfoot > .tr > .td, .table > .tfoot > .tr > .th, .table > .thead > .tr > .td, .table > .thead > .tr > .th {
padding: .5rem;
border-top: 1px solid #ddd;
white-space: nowrap;
}
+.td.cbi-value-field,
.cbi-section-table-cell {
text-align: center;
+ display: inline-block;
+ flex: 10;
+}
+
+.cbi-section-table-cell {
+ white-space: nowrap;
+ align-self: flex-end;
+ flex: 1;
+}
+
+.td.cbi-value-field[data-title]::before {
+ content: attr(data-title);
+ padding: .5rem;
+ display: block;
+ white-space: nowrap;
+}
+
+.cbi-section-table {
+ border: none;
+}
+
+.tr.cbi-section-table-titles,
+.tr.cbi-section-table-descr {
+ display: none;
}
.cbi-section-table-row {
text-align: center;
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: row;
+ justify-content: space-between;
+ margin-bottom: 1rem;
+ background: #f4f4f4;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+}
+
+.cbi-section-table-row:last-child {
+ margin-bottom: 0;
+}
+
+.cbi-section-table-row[data-title]::before {
+ content: attr(data-title);
+ display: block;
+ width: 100%;
+ margin: .25rem;
+ padding: .25rem .25rem .5rem .25rem;
+ border-bottom: 1px solid rgba(0, 0, 0, .26);
+ text-align: center;
+ font-size: 1rem;
+}
+
+.cbi-section-table-row > .cbi-value-field .cbi-input-select,
+.cbi-section-table-row > .cbi-value-field .cbi-input-text,
+.cbi-section-table-row > .cbi-value-field .cbi-input-password,
+.cbi-section-table-row > .cbi-value-field .cbi-dropdown {
+ width: 100%;
+}
+
+div > table > tbody > tr:nth-of-type(2n),
+div > .table > .tbody > .tr:nth-of-type(2n) {
+ background-color: #f9f9f9;
}
-fieldset > table > tbody > tr:nth-of-type(2n) {
+div > table > tbody > tr:nth-of-type(2n),
+div > .table > .tbody > .tr:nth-of-type(2n) {
background-color: #f9f9f9;
}
@@ -516,25 +613,29 @@ fieldset > table > tbody > tr:nth-of-type(2n) {
/* fix multiple table */
-table table {
+table table,
+.table .table {
border: none;
}
-.cbi-value-field table {
+.cbi-value-field table,
+.cbi-value-field .table {
border: none;
}
-td > table > tbody > tr > td {
+td > table > tbody > tr > td,
+.td > .table > .tbody > .tr > .td {
border: none;
}
-.cbi-value-field > table > tbody > tr > td {
+.cbi-value-field > table > tbody > tr > td,
+.cbi-value-field > .table > .tbody > .tr > .td {
border: none;
}
/* button style */
-.cbi-button {
+.btn, .cbi-button {
-webkit-appearance: none;
text-transform: uppercase;
color: rgba(0, 0, 0, 0.87);
@@ -557,8 +658,13 @@ td > table > tbody > tr > td {
user-select: none;
font-size: 0.8rem;
width: auto !important;
+ display: inline-block;
+ text-decoration: none;
}
+.btn:hover,
+.btn:focus,
+.btn:active,
.cbi-button:hover,
.cbi-button:focus,
.cbi-button:active {
@@ -568,15 +674,19 @@ td > table > tbody > tr > td {
color: rgba(0, 0, 0, 0.87);
}
+.btn:hover,
+.btn:focus,
.cbi-button:hover,
.cbi-button:focus {
box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2);
}
+.btn:active,
.cbi-button:active {
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
}
+.btn:disabled,
.cbi-button:disabled {
cursor: not-allowed;
pointer-events: none;
@@ -584,6 +694,7 @@ td > table > tbody > tr > td {
box-shadow: none;
}
+.btn + .btn,
form.inline + form.inline,
.cbi-button + .cbi-button {
margin-left: 0.6rem;
@@ -762,6 +873,172 @@ form.inline + form.inline,
font-size: small;
}
+
+.cbi-dropdown {
+ display: inline-flex;
+ cursor: pointer;
+ position: relative;
+ padding: 0;
+ height: auto;
+}
+
+.cbi-dropdown:focus {
+ outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+ margin: 0 !important;
+ padding: 0;
+ list-style: none;
+ overflow-x: hidden;
+ overflow-y: auto;
+ display: flex;
+ width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+ display: none;
+}
+
+.cbi-dropdown > .open {
+ border: 2px outset #eee;
+ flex-basis: 15px;
+ background: #eee;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+ flex-grow: 0;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ text-align: center;
+ line-height: 2em;
+ padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+ color: #777;
+ font-weight: bold;
+ text-shadow: 1px 1px 0px #fff;
+ display: none;
+}
+
+.cbi-dropdown > ul > li {
+ display: none;
+ padding: .25em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ flex-shrink: 1;
+ flex-grow: 1;
+ align-items: center;
+ align-self: center;
+ min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+ border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+ max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+ display: none;
+ margin: 0;
+ padding: 0;
+ pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+ vertical-align: middle;
+ margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+ margin: 0;
+ height: auto;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+ height: 20px;
+}
+
+.cbi-dropdown[open] {
+ position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+ display: block;
+ background: #f6f6f5;
+ border: 1px solid #918e8c;
+ box-shadow: 0 0 4px #918e8c;
+ position: absolute;
+ z-index: 1000;
+ max-width: none;
+ min-width: 100%;
+ width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+ display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+ border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+ background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+ background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+ margin-bottom: 0;
+ border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+ pointer-events: none;
+ opacity: .6;
+}
+
+.cbi-dropdown .zonebadge {
+ width: 100%;
+}
+
+.cbi-dropdown[open] .zonebadge {
+ width: auto;
+}
+
+
/* luci */
.hidden {
@@ -776,6 +1053,10 @@ form.inline + form.inline,
text-align: right !important;
}
+.center {
+ text-align: center !important;
+}
+
.inline {
display: inline;
}
@@ -793,27 +1074,71 @@ form.inline + form.inline,
}
/* select */
-.cbi-value-field .cbi-input-select {
+.cbi-value-field .cbi-dropdown {
min-width: 15rem;
}
+.cbi-value-field .cbi-input-select {
+ width: 15rem;
+}
+
.ifacebadge {
display: inline-flex;
border-bottom: 1px solid #CCCCCC;
padding: 0.5rem 1rem;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ background: #fff;
}
-td > .ifacebadge {
+td > .ifacebadge,
+.td > .ifacebadge {
background-color: #F0F0F0;
font-size: 0.9rem;
}
+.ifacebadge > em,
.ifacebadge > img {
- float: right;
- margin: 0 0.3rem;
+ display: inline-block;
+ margin: 0 .2rem;
+ align-self: flex-start;
+}
+
+.ifacebadge > img + img {
+ margin: 0 .2rem 0 0;
+}
+
+.network-status-table {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox {
+ margin: .5em;
+ flex-grow: 1;
+}
+
+.network-status-table .ifacebox-body {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.network-status-table .ifacebox-body > span {
+ flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox-body .ifacebadge {
+ flex: 1;
+ margin: .5em .25em 0 .25em;
+ padding: .5em;
+ min-width: 220px;
+ background-color: #fff;
+ align-items: center;
}
/*textarea*/
@@ -926,6 +1251,23 @@ td > .ifacebadge {
.ifacebox {
border: 1px solid #999;
background-color: #f9f9f9;
+ display: inline-flex;
+ flex-direction: column;
+ line-height: 1.2em;
+ min-width: 100px;
+}
+
+.ifacebox-head {
+ padding: .25em;
+ background: #eee;
+}
+
+.ifacebox-head.active {
+ background: #90c0e0;
+}
+
+.ifacebox-body {
+ padding: .25em;
}
.cbi-image-button {
@@ -935,12 +1277,11 @@ td > .ifacebadge {
.zonebadge {
padding: 0.2rem 0.5rem;
display: inline-block;
- cursor: pointer;
}
-.zonebadge > .ifacebadge {
- padding: 0.2rem 1rem;
- margin: 0.3rem;
+.zonebadge .ifacebadge {
+ padding: .2rem .3rem;
+ margin: 0.1rem 0.2rem;
border: 1px solid #6C6C6C;
}
@@ -950,6 +1291,12 @@ td > .ifacebadge {
margin-top: 0.3rem;
}
+.zonebadge > em,
+.zonebadge > strong {
+ margin: 0 0.2rem;
+ display: inline-block;
+}
+
.cbi-value-field .cbi-input-checkbox,
.cbi-value-field .cbi-input-radio {
margin-top: 0.5rem;
@@ -974,11 +1321,17 @@ td > .ifacebadge {
margin-top: -0.5rem;
}
-.cbi-section-table-row > .cbi-value-field .cbi-input-select {
+.cbi-section-table-row > .cbi-value-field .cbi-dropdown {
min-width: 7rem;
}
-.cbi-section-create > .cbi-button-add {
+.cbi-section-create {
+ margin: .5rem -3px;
+ display: inline-flex;
+ align-items: center;
+}
+
+.cbi-section-create > * {
margin: 0.5rem;
}
@@ -986,7 +1339,7 @@ td > .ifacebadge {
padding: 0.5rem;
}
-div.cbi-value var, td.cbi-value-field var {
+div.cbi-value var, td.cbi-value-field var, .td.cbi-value-field var {
font-style: italic;
color: #0069D6;
}
@@ -1010,6 +1363,62 @@ small {
border-top: 1px solid #CCC;
}
+.cbi-dropdown-container {
+ position: relative;
+}
+
+.cbi-tooltip-container {
+ cursor: help;
+}
+
+.cbi-tooltip {
+ position: absolute;
+ z-index: 1000;
+ left: -1000px;
+ opacity: 0;
+ transition: opacity .25s ease-out;
+ pointer-events: none;
+ box-shadow: 0 0 2px #444;
+}
+
+.cbi-tooltip-container:hover .cbi-tooltip {
+ left: auto;
+ opacity: 1;
+ transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+ padding: .25rem;
+ background: inherit;
+ margin: -1.5rem 0 0 -.5rem;
+}
+
+.zonebadge-empty {
+ background: repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px);
+ color: #404040;
+}
+
+.zone-forwards {
+ display: flex;
+ min-width: 10rem;
+}
+
+.zone-forwards > * {
+ flex: 1 1 45%;
+}
+
+.zone-forwards > span {
+ flex-basis: 10%;
+ text-align: center;
+ padding: 0 .25rem;
+}
+
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+ display: flex;
+ flex-direction: column;
+}
+
#diag-rc-output > pre {
background-color: #f5f5f5;
display: block;
@@ -1134,13 +1543,13 @@ header > .container > .pull-right > * {
/* fix status overview */
-.node-status-overview > .main fieldset:nth-child(4) td:nth-child(2) {
+.node-status-overview > .main fieldset:nth-child(4) .td:nth-child(2) {
white-space: normal;
}
/* fix status processes */
-.node-status-processes > .main table tr td:nth-child(3) {
+.node-status-processes > .main .table .tr .td:nth-child(3) {
white-space: normal;
}
@@ -1194,11 +1603,6 @@ header > .container > .pull-right > * {
margin-top: 0;
}
-/* fix network firewall*/
-.node-network-firewall > .main .cbi-section-table-row > .cbi-value-field .cbi-input-select {
- min-width: 4rem;
-}
-
.node-status-iptables fieldset,
.node-system-packages fieldset,
.node-system-flashops fieldset {
@@ -1234,6 +1638,11 @@ header > .container > .pull-right > * {
min-width: 3.5rem;
}
+#cbi-network-switch_vlan .th,
+#cbi-network-switch_vlan .td {
+ flex-basis: 12%;
+}
+
/* language fix */
body.lang_pl.node-main-login .cbi-value-title {
width: 12rem;
@@ -1248,6 +1657,7 @@ body.lang_pl.node-main-login .cbi-value-title {
width: calc(100% - 13rem);
}
+ .btn,
.cbi-button {
padding: 0.3rem 0.6rem;
font-size: 0.8rem;
@@ -1387,6 +1797,26 @@ body.lang_pl.node-main-login .cbi-value-title {
.node-main-login > .main .cbi-value-title {
text-align: left;
}
+
+ .tr {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ }
+
+ .th, .td {
+ flex: 1;
+ flex-basis: 33%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .th.cbi-value-field,
+ .td.cbi-value-field,
+ .th.cbi-section-table-cell,
+ .td.cbi-section-table-cell {
+ flex-basis: auto;
+ }
}
@media screen and (max-width: 480px) {
@@ -1507,8 +1937,6 @@ body.lang_pl.node-main-login .cbi-value-title {
line-height: 1;
font-family: inherit;
min-width: inherit;
- overflow-x: auto;
- overflow-y: hidden;
border-radius: 0;
background-color: #FFF;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
@@ -1523,37 +1951,48 @@ body.lang_pl.node-main-login .cbi-value-title {
.node-status-iptables > .main div > .cbi-map > form input[type="submit"] + input[type="submit"] {
margin-top: 1rem;
}
+
+ .th, .td {
+ flex-basis: 50%;
+ }
+
+ .td.cbi-value-field {
+ flex-basis: 100%;
+ }
}
@media screen and (min-width: 992px) {
.cbi-value input[type="password"],
- .cbi-value input[type="text"] {
- min-width: 20rem;
+ .cbi-value input[type="text"],
+ .cbi-value-field .cbi-input-select {
+ width: 20rem;
}
- .cbi-value-field .cbi-input-select {
+ .cbi-value-field .cbi-dropdown {
min-width: 20rem;
}
}
@media screen and (min-width: 1280px) {
.cbi-value input[type="password"],
- .cbi-value input[type="text"] {
- min-width: 22rem;
+ .cbi-value input[type="text"],
+ .cbi-value-field .cbi-input-select {
+ width: 22rem;
}
- .cbi-value-field .cbi-input-select {
+ .cbi-value-field .cbi-dropdown {
min-width: 22rem;
}
}
@media screen and (min-width: 1600px) {
.cbi-value input[type="password"],
- .cbi-value input[type="text"] {
- min-width: 25rem;
+ .cbi-value input[type="text"],
+ .cbi-value-field .cbi-input-select {
+ width: 25rem;
}
- .cbi-value-field .cbi-input-select {
+ .cbi-value-field .cbi-dropdown {
min-width: 25rem;
}
}
diff --git a/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js b/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
index f3644431ee..4d9b3a2587 100755
--- a/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
+++ b/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
@@ -1,6 +1,2 @@
-/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
-
-return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
-return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
-//# sourceMappingURL=jquery.min.map \ No newline at end of file
+/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||"*",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,"ms-").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=J.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,"")},u=s(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=J.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",J.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",!t||J.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&N(this,"input"))return this.click(),!1},_default:function(e){return N(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/<script|<style|<link/i,je=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||"")&&!J.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,""),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,"script")).length>0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,u=12===n(t.marginLeft),c.style.right="60%",s=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=w.css(e,"border"+oe[a]+"Width",!0,i))):(u+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=w.css(e,"border"+oe[a]+"Width",!0,i):s+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,"fxshow");n.queue||(null==(a=w._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,"fx").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,"display")),"none"===(c=w.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===w.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?"hidden"in y&&(g=y.hidden):y=J.access(e,"fxshow",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,"fxshow");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=["*"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&"object"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=J.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each(["toggle","show","hide"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut("show"),slideUp:ut("hide"),slideToggle:ut("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||w.expando+"_"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||w.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&w.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?w("<div>").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,"position"),f=w(e),p={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=w.css(e,"top"),u=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});
diff --git a/themes/luci-theme-material/luasrc/view/themes/material/header.htm b/themes/luci-theme-material/luasrc/view/themes/material/header.htm
index 0aca882c05..b6341a2c35 100644
--- a/themes/luci-theme-material/luasrc/view/themes/material/header.htm
+++ b/themes/luci-theme-material/luasrc/view/themes/material/header.htm
@@ -183,35 +183,35 @@
<!DOCTYPE html>
<html lang="<%=luci.i18n.context.lang%>">
<head>
- <meta charset="utf-8">
- <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
- <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
- <meta name="format-detection" content="telephone=no, email=no"/>
- <meta name="apple-mobile-web-app-capable" content="yes">
- <meta name="mobile-web-app-capable" content="yes">
- <meta name="x5-fullscreen" content="true">
- <meta name="full-screen" content="yes">
- <meta name="x5-page-mode" content="app">
- <meta name="browsermode" content="application">
- <meta name="theme-color" content="#0099CC">
- <meta name="msapplication-tap-highlight" content="no">
- <meta name="msapplication-TileColor" content="#0099CC">
-
- <meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
- <meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
- <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
- <link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
- <link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
-
- <link rel="stylesheet" href="<%=media%>/css/style.css">
- <link rel="shortcut icon" href="<%=media%>/favicon.ico">
- <% if node and node.css then %>
- <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
- <% end -%>
- <% if css then %>
- <style title="text/css"><%= css %></style>
- <% end -%>
- <script src="<%=resource%>/xhr.js"></script>
+ <meta charset="utf-8">
+ <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
+ <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+ <meta name="format-detection" content="telephone=no, email=no"/>
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="x5-fullscreen" content="true">
+ <meta name="full-screen" content="yes">
+ <meta name="x5-page-mode" content="app">
+ <meta name="browsermode" content="application">
+ <meta name="theme-color" content="#0099CC">
+ <meta name="msapplication-tap-highlight" content="no">
+ <meta name="msapplication-TileColor" content="#0099CC">
+
+ <meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
+ <meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
+ <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
+ <link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
+ <link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
+
+ <link rel="stylesheet" href="<%=media%>/css/style.css">
+ <link rel="shortcut icon" href="<%=media%>/favicon.ico">
+ <% if node and node.css then %>
+ <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
+ <% end -%>
+ <% if css then %>
+ <style title="text/css"><%= css %></style>
+ <% end -%>
+ <script src="<%=resource%>/xhr.js"></script>
</head>
<body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>">
<header>
@@ -228,26 +228,27 @@
</div>
</header>
<div class="main">
- <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
- <div class="main-left">
+ <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
+ <div class="main-left">
<% render_topmenu() %>
- </div>
+ </div>
<div class="main-right">
- <div class="darkMask"></div>
- <div id="maincontent">
- <div class="container">
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
- <div class="alert-message warning">
- <h4><%:No password set!%></h4>
- <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
- <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
- </div>
- <%- end -%>
- <% if category then render_tabmenu(category, cattree) end %>
+ <div class="darkMask"></div>
+ <div id="maincontent">
+ <div class="container">
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
+ <div class="alert-message warning">
+ <h4><%:No password set!%></h4>
+ <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+ <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
+ </div>
+ <%- end -%>
<noscript>
<div class="alert-message warning">
- <strong><%:JavaScript required!%></strong><br />
- <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
+ <h4><%:JavaScript required!%></h4>
+ <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
</div>
- </noscript>
+ </noscript>
+
+ <% if category then render_tabmenu(category, cattree) end %>
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
index c5ee58fff7..6f1bae6710 100644
--- a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
+++ b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
@@ -18,8 +18,8 @@ body {
background-color: #4a6b7c;
background-position: bottom center;
background-repeat: repeat-x;
- font-family: Verdana, Arial, sans-serif;
- font-size: 11pt;
+ font-family: Arial, Verdana, sans-serif;
+ font-size: 16px;
line-height: 100%;
padding-bottom: 1.5em;
}
@@ -27,6 +27,46 @@ body {
* {
margin: 0;
padding: 0;
+ box-sizing: border-box;
+}
+
+.table { display: table; width: 100%; position: relative; }
+.tr { display: table-row; }
+.thead { display: table-header-group; }
+.tbody { display: table-row-group; }
+.tfoot { display: table-footer-group; }
+.td, .th { display: table-cell; }
+.th { font-weight: bold; }
+
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
+.col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; }
+.col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; }
+.col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; }
+.col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; }
+.col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; }
+.col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; }
+.col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; }
+.col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; }
+.col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; }
+.col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; }
+
+.tr.placeholder {
+ height: 3.5em;
+}
+
+.tr.placeholder > .td {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-align: center;
+ line-height: 3em;
+}
+
+.nowrap {
+ white-space: nowrap;
}
a img {
@@ -34,81 +74,95 @@ a img {
text-decoration: none;
}
-ul.tabmenu {
- margin: 0;
- clear: both;
- display: block;
- vertical-align: bottom;
- font-size: 10pt;
- padding: 5px 0 0 5px;
+#maincontainer {
+ display: flex;
}
-div.tabmenu2 {
- background-color: #AAAAAA;
- background-image: url(tabbg.png);
- background-repeat: repeat-x;
- margin-top: -1px;
- border: 1px solid #444444;
- border-bottom: none;
+#maincontent {
+ flex-basis: 100%;
}
-div.tabmenu3,
-div.tabmenu4,
-div.tabmenu5 {
- background-color: #AAAAAA;
- background-image: url(tabbg.png);
- background-repeat: repeat-x;
- border: none;
+#mainmenu {
+ max-width: 200px;
+ background: #f5f5f5;
+ border: 1px solid #444;
+ border-width: 0 0 1px 1px;
+ font-size: 85%;
+ padding-bottom: 1em;
}
-ul.tabmenu li {
- float: left;
+#mainmenu ul {
display: block;
- overflow: hidden;
+ margin: 0;
+ padding: 0;
}
-.lang_he ul.tabmenu li {
- float: right;
+#mainmenu ul li {
+ display: block;
+ white-space: nowrap;
}
-ul.tabmenu li a {
- text-decoration: none;
- color: #444444;
+#mainmenu ul li > a {
display: block;
- padding: 3px 8px;
- margin: 0 2px;
- line-height: 1.3em;
- border: 1px solid transparent;
- border-bottom: none;
+ color: #444;
+ padding: .4em .5em;
+ text-decoration: none;
+}
+
+#mainmenu ul li.selected > a {
+ background: #fff;
+ color: #59d;
+ border: 1px dotted #444;
+ border-width: 1px 0;
+}
+
+#mainmenu ul li.selected:first-child > a {
+ border-top: none;
+}
+
+#mainmenu ul li li > a {
font-size: 85%;
+ padding-left: 1.5em;
}
-ul.tabmenu li.active a {
- font-weight: bold;
- color: #000000;
- background: #f5f5f5;
- border: 1px solid #AAAAAA;
- border-bottom: none;
+#mainmenu ul li > ul {
+ flex-basis: 100%;
+ max-height: 0;
+ visibility: hidden;
+ transition: max-height .15s;
}
-ul.tabmenu li a:hover {
- color: #444444;
- border-color: #444444;
+#mainmenu ul:not(.active) li.selected > ul,
+#mainmenu ul li.active > ul {
+ max-height: 1000px;
+ visibility: visible;
+ transition: max-height .25s;
}
-ul.l1 li a {
- background-color: #AAAAAA;
- background-image: url(tabbg.png);
- background-repeat: repeat-x;
- border-color: #444444;
+#mainmenu ul li.mainmenu-item-logout {
+ margin-top: 15%;
+}
+
+#tabmenu {
+ padding: 0;
+ margin: -.5em -.5em 1em -.5em;
+ background: #bbb;
}
-ul.l1 li.tabmenu-item-logout a {
- margin-left: 30px;
+#tabmenu ul {
+ border-color: #444;
+ padding-top: .5em;
+ flex-wrap: wrap;
+ background: repeating-linear-gradient(#f5f5f5, #bbb 2.4em, #f5f5f5 2.4em, #bbb);
+ line-height: 1em;
}
-.lang_he ul.l1 li.tabmenu-item-logout a {
- margin-right: 30px;
+#tabmenu ul li {
+ border-color: #444;
+}
+
+#tabmenu ul li.cbi-tab {
+ background: #f5f5f5;
}
abbr,
@@ -135,6 +189,13 @@ code {
white-space: pre;
}
+hr {
+ margin: .5em 0;
+ padding: 0;
+ border: 1px solid #444;
+ border-width: 0 0 1px 0;
+}
+
#maincontent ul {
margin-left: 2em;
}
@@ -166,6 +227,31 @@ code {
background-color: white;
}
+.alert-message {
+ font-weight: normal;
+ padding: .5em;
+ border-radius: 3px;
+ color: #000;
+}
+
+.alert-message.notice {
+ background: linear-gradient(#ccc 0%, #eee 100%);
+ color: #4a6b7c;
+}
+
+.alert-message.warning {
+ background: linear-gradient(#dda 0%, #dd8 100%);
+ color: #c00;
+}
+
+.alert-message > * {
+ margin: .5em;
+}
+
+.alert-message > h4 {
+ font-weight: bold;
+}
+
div.hostinfo {
float: left;
margin: 0;
@@ -305,56 +391,36 @@ textarea#syslog {
direction: rtl;
}
-#maincontent h2 {
+h2, h3, h4, legend {
font-size: 150%;
font-family: Trebuchet MS, Verdana, sans-serif;
font-weight: bold;
- margin: 0.25em 0 0.7em 0;
+ margin: .25em 0 .5em 0;
border-bottom: 1px solid;
- padding-top: 10px;
padding-bottom: 4px;
+ display: block;
+ width: 100%;
}
-#maincontent h3 {
- margin: 0.5em 0 1.1em 0;
+h3, legend {
font-size: 125%;
- font-weight: bold;
- font-style: italic;
- font-family: Trebuchet MS, Verdana, sans-serif;
- color: #27408B;
-}
-
-#maincontent p {
- margin-bottom: 1em;
}
-.cbi-section {
- margin-bottom: 0.5em;
- padding: 0.5em 1em;
- border: 1px dotted #555555;
- background-color: #ffffff;
- color: #000000;
+h4 {
+ font-size: 112%;
}
-.cbi-section legend {
- font-size: 110%;
- font-weight: bold;
- height: 1em;
- padding: 0 0.25em;
- background-color: transparent;
- color: #555555;
-}
+fieldset { border: none; }
+fieldset > legend { float: left; }
+fieldset > legend + * { clear: both; }
-.cbi-section h2 {
- margin: 0em 0 0.5em -0.5em !important;
+#maincontent p {
+ margin-bottom: 1em;
}
-.cbi-section h3 {
- text-decoration: none !important;
- font-weight: bold !important;
- color: #555555 !important;
- margin: 0.25em !important;
- font-size: 100% !important;
+.cbi-section {
+ padding: .5em 0;
+ margin-top: .5em;
}
.cbi-section-descr {
@@ -362,6 +428,10 @@ textarea#syslog {
font-size: 95%;
}
+.cbi-section-descr:empty {
+ display: none;
+}
+
.cbi-title-ref {
color: inherit;
text-decoration: none;
@@ -407,182 +477,134 @@ input[type=image] {
}
input:focus,
-input:hover,
+input:not(.cbi-button):hover,
select:focus,
select:hover {
background-color: #ffffff;
color: #000000;
}
+input[type=text],
+input[type=password] {
+ padding: 0 3px;
+}
+
select,
input[type=text],
input[type=password] {
width: 20em;
+ font-size: inherit;
+ line-height: 13pt;
+ height: 14pt;
}
-td select,
-td input[type=text],
-td input[type=password] {
- width: 99%;
+select[multiple] {
+ height: auto;
}
-img.cbi-image-button {
- cursor: pointer;
- margin: 0 2px;
+input[type=radio],
+input[type=checkbox],
+[data-dynlist] > input + img,
+input.cbi-input-password + img {
vertical-align: middle;
}
-input.cbi-button {
- background-color: #EEEEEE;
- background-repeat: no-repeat;
- background-position: 1px center;
- border: 1px solid #CCCCCC;
- border-radius: 3px;
-}
-
-input.cbi-button:hover {
- border-color: #4A6B7C;
- background-color: #FFFFFF;
-}
-
-input.cbi-button[disabled] {
- color: #CCCCCC;
- border-color: #CCCCCC;
- background-color: #EEEEEE;
- cursor: default;
-}
-
-input.cbi-input-user {
- background-image: url('../resources/cbi/user.gif');
- background-repeat: no-repeat;
- background-position: 1px center;
- color: #000000;
- text-indent: 17px;
-}
-
-input.cbi-input-password {
- background-image: url('../resources/cbi/key.gif');
- background-repeat: no-repeat;
- background-position: 1px center;
- color: #000000;
- text-indent: 17px;
-}
-
-input.cbi-input-find,
-input.cbi-button-find {
- background-image: url('../resources/cbi/find.gif');
- color: #000000;
- padding-left: 17px;
-}
-
-input.cbi-input-reload {
- background-image: url('../resources/cbi/reload.gif');
- color: #000000;
- padding-left: 17px;
-}
-
-input.cbi-input-add,
-input.cbi-button-add {
- background-image: url('../resources/cbi/add.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-input-fieldadd,
-input.cbi-button-fieldadd {
- background-image: url(../resources/cbi/fieldadd.gif);
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.td select,
+.td .cbi-dropdown,
+.td input[type=text] {
+ width: 100%;
}
-input.cbi-input-reset,
-input.cbi-button-reset {
- background-image: url('../resources/cbi/reset.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.td [data-dynlist] > input,
+.td input.cbi-input-password {
+ width: calc(100% - 20px);
}
-input.cbi-input-save,
-input.cbi-button-save {
- background-image: url('../resources/cbi/save.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+img.cbi-image-button {
+ cursor: pointer;
+ margin: 0 2px;
+ vertical-align: middle;
}
-input.cbi-input-apply,
-input.cbi-button-apply {
- background-image: url('../resources/cbi/apply.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.btn, .cbi-button {
+ padding: 0 .5em;
+ border-radius: 3px;
+ border: 1px solid #aaa;
+ text-decoration: none;
+ color: #000;
+ display: inline-block;
+ font-size: inherit;
+ -webkit-appearance: none;
+ background: #fff;
+ text-align: center;
+ font-weight: bold;
+ line-height: 13pt;
+ height: 14pt;
}
-input.cbi-input-link,
-input.cbi-button-link {
- background-image: url('../resources/cbi/link.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.btn:hover, .cbi-button:hover {
+ box-shadow: 0 0 3px #59d;
}
-input.cbi-input-download,
-input.cbi-button-download {
- background-image: url('../resources/cbi/download.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.btn[disabled],
+.btn[disabled]:hover,
+.cbi-button[disabled],
+.cbi-button[disabled]:hover {
+ opacity: .6;
+ cursor: default;
+ pointer-events: none;
}
-input.cbi-input-remove,
-div.cbi-section-remove input {
- background-image: url('../resources/cbi/remove.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.cbi-button-positive,
+.cbi-button-fieldadd,
+.cbi-button-add,
+.cbi-button-save {
+ border-color: #7b7;
+ color: #7b7;
}
-input.cbi-button-up {
- background-image: url('../resources/cbi/up.gif');
- padding-left: 11px;
- padding-right: 1px;
+.cbi-button-neutral,
+.cbi-button-reset,
+.cbi-button-download,
+.cbi-button-find,
+.cbi-button-link,
+.cbi-button-up,
+.cbi-button-down {
+ border-color: #444;
+ color: #444;
}
-input.cbi-button-down {
- background-image: url('../resources/cbi/down.gif');
- padding-left: 11px;
- padding-right: 1px;
+.cbi-button-action,
+.cbi-button-apply,
+.cbi-button-reload,
+.cbi-button-edit {
+ border-color: #59d;
+ color: #59d;
}
-input.cbi-button-edit {
- background-image: url('../resources/cbi/edit.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.cbi-button-negative,
+.cbi-section-remove .cbi-button,
+.cbi-button-remove {
+ border-color: #b77;
+ color: #b77;
}
-input.cbi-button-reload {
- background-image: url('../resources/cbi/reload.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.cbi-button-action.important,
+.cbi-page-actions .cbi-button-apply,
+.cbi-section-actions .cbi-button-edit {
+ color: #fff;
+ background: #59d;
}
-input.cbi-button-reset {
- background-image: url('../resources/cbi/reset.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.cbi-button-positive.important,
+.cbi-page-actions .cbi-button-save {
+ color: #fff;
+ background: #7b7;
}
-input.cbi-button-remove {
- background-image: url('../resources/cbi/remove.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
+.cbi-page-actions .cbi-button-apply + .cbi-button-save {
+ background: #fff;
+ color: #7b7;
}
.cbi-input-invalid {
@@ -593,27 +615,16 @@ input.cbi-button-remove {
border-color: #FF0000;
}
-div.cbi-section-remove input {
- border-bottom: none;
-}
-
-textarea {
- margin-left: -1px;
- margin-bottom: 0.5em;
-}
-
-form > div > input[type=submit],
-form > div > input[type=reset] {
- float: right;
- margin-left: 0.5em;
+table td, table th {
+ color: #000000;
}
-table td,
-table th {
+.table .td, .table .th {
color: #000000;
+ padding: .25em;
}
-table.smalltext {
+.table.smalltext {
background: #f5f5f5;
color: #000000;
border-top: 1px solid #666666;
@@ -626,56 +637,40 @@ table.smalltext {
border-collapse: collapse;
}
-table.smalltext tr:hover td {
+.table.smalltext .tr:hover .td {
background-color: #bbddee;
color: #000000;
}
-table.smalltext tr th {
+.table.smalltext .tr .th {
padding: 0 0.25em;
border-left: 1px solid #666666;
text-align: left;
}
-table.smalltext tr td {
+.table.smalltext .tr .td {
padding: 0 0.25em;
border-top: 1px solid #666666;
border-left: 1px solid #666666;
}
-table.cbi-section-table .cbi-rowstyle-1 {
+.cbi-rowstyle-1 {
background-color: #eeeeff;
color: #000000;
}
-table.cbi-section-table .cbi-rowstyle-1:hover,
-table.cbi-section-table .cbi-rowstyle-2:hover {
- background-color: #b2c8d4;
- color: #000000;
-}
-
-table.cbi-section-table .cbi-section-table-cell {
- padding: 3px;
- white-space: nowrap;
-}
-
-.cbi-section .cbi-rowstyle-1 h3 {
- background-color: #eeeeff;
- color: #555555;
-}
-
.cbi-rowstyle-2 {
color: #000000;
}
-div.cbi-value {
+.cbi-value {
clear: left;
vertical-align: middle;
padding: 0.25em 0.6em;
border-bottom: 1px dotted #bbbbbb;
}
-div.cbi-value:hover {
+.cbi-value:hover {
background: #f8f8f8;
color: #000000;
}
@@ -686,29 +681,49 @@ div.cbi-value:hover {
line-height: 1.8em;
}
-div.cbi-value-field {
+.cbi-value-field {
width: 58%;
margin-left: 40%;
padding: 0.25em 0;
}
-div.cbi-value-description {
- font-size: 90%;
- display: inline;
+.td.cbi-value-field {
+ width: auto;
+ margin-left: 0;
+ align-self: center;
}
-div.cbi-section-create {
- clear: left;
- white-space: nowrap;
- vertical-align: top;
+.cbi-value-description {
+ background-image: url(/luci-static/resources/cbi/help.gif);
+ background-position: .25em .25em;
+ background-repeat: no-repeat;
+ margin: .25em 0 0 0;
+ padding: .25em .25em .25em 1.75em;
+}
+
+.cbi-section-create {
+ padding: 0 0 .25em 0;
+ margin: -3px;
+ display: inline-flex;
+ align-items: center;
}
-div.cbi-section-create .cbi-button {
- margin: 0.25em;
+.cbi-section-create > * {
+ margin: 3px;
+ flex: 1 1 auto;
+}
+
+.cbi-section-create > * > input {
+ width: 100%;
+}
+
+.cbi-section-remove > .cbi-button {
+ margin-bottom: -1px;
+ border-radius: 3px 3px 0 0;
}
-input.cbi-section-create-name {
- margin-right: -0.25em;
+.cbi-section-node + .cbi-section-create {
+ padding-top: 0;
}
div.cbi-map-descr {
@@ -720,68 +735,149 @@ div.cbi-optionals {
border-bottom: 1px dotted #bbbbbb;
}
-div.cbi-section-remove {
- float: right;
-}
-
.cbi-section-node {
clear: both;
- border: 1px solid #BBBBBB;
- border-radius: 3px;
padding-bottom: 0;
position: relative;
+ border: 1px dotted #555;
+ background: #fff;
+ margin-bottom: 5px;
}
.cbi-section-node-tabbed {
- border-top-left-radius: 0;
+ border-top: none;
}
-.cbi-section-node .cbi-value-last {
+.cbi-section-node .cbi-value:last-child {
border-bottom: none;
}
-.cbi-section-node table div {
- padding-bottom: 0;
- border-bottom: none;
+.table.cbi-section-table {
+ width: 100%;
+ font-size: 95%;
+ border: 1px dotted #444;
+ background: #fff;
+ margin: 0 0 .5em 0;
}
-.cbi-section-node div.cbi-section-table-row {
- margin: 0.25em;
+.cbi-section-node > .table.cbi-section-table {
+ border: none;
+ margin: 0;
}
-table.cbi-section-table {
- width: 100%;
- font-size: 95%;
+@keyframes flash {
+ 0% { opacity: 1; }
+ 50% { opacity: .5; }
+ 100% { opacity: 1; }
}
-table.cbi-section-table th,
-table.cbi-section-table td {
- text-align: center;
+.tr.cbi-section-table-row.flash {
+ animation: flash .35s;
}
-tr.cbi-section-table-descr th {
+.tr.cbi-section-table-descr .th {
font-weight: normal;
font-size: 90%;
vertical-align: top;
}
-td.cbi-section-table-optionals {
+.td.cbi-section-table-optionals {
text-align: left !important;
padding-top: 1em;
}
-.cbi-value-helpicon img {
- vertical-align: bottom;
+.th.cbi-section-actions,
+.td.cbi-section-actions {
+ display: flex;
+ justify-content: flex-end;
+ flex-direction: row;
+ flex: 1 1 150px;
+ margin: auto -1px auto auto;
}
-div.cbi-error {
- font-size: 95%;
+.td.cbi-section-actions > form {
+ display: flex;
+}
+
+.td.cbi-section-actions > *,
+.td.cbi-section-actions > form > * {
+ flex: 1 1 4em;
+ margin: 1px;
+}
+
+.cbi-page-actions {
+ display: flex;
+ justify-content: flex-end;
+ margin: -3px;
+ padding: 0 .25em .25em .25em;
+}
+
+.cbi-page-actions > form {
+ display: flex;
+}
+
+.cbi-page-actions > * {
+ flex: 0 1 auto;
+ margin: 3px;
+}
+
+.cbi-page-actions > form > * {
+ flex: 1;
+ margin: 0 3px 0 0;
+}
+
+.cbi-page-actions > .cbi-button-link,
+.cbi-page-actions > form[method="get"]:first-child {
+ margin-right: auto;
+}
+
+
+.th[data-type="button"], .td[data-type="button"],
+.th[data-type="fvalue"], .td[data-type="fvalue"] {
+ flex: 1 1 2em;
+ text-align: center;
+}
+
+#cbi-network-switch_vlan .th,
+#cbi-network-switch_vlan .td {
+ flex-basis: 12%;
+}
+
+#cbi-wireless-overview .td:first-child {
+ align-self: center;
+}
+
+.td[data-title]::before {
+ content: attr(data-title) ":\20";
font-weight: bold;
- color: #ff0000;
- background-color: #ffffff;
+ text-align: left;
+ display: none;
+ padding: 1px;
+ white-space: nowrap;
}
-td.cbi-value-error {
+.tr.placeholder .td[data-title]::before {
+ display: none;
+}
+
+.tr[data-title]::before,
+.tr.cbi-section-table-titles.named::before {
+ content: attr(data-title) "\20";
+ font-weight: bold;
+ text-align: left;
+ display: inline-block;
+ align-self: center;
+ flex: 1 1 5%;
+ padding: .25em;
+ white-space: normal;
+ word-wrap: break-word;
+}
+
+.cbi-value-helpicon img {
+ vertical-align: bottom;
+}
+
+.td.cbi-value-error {
border-color: red;
}
@@ -805,65 +901,293 @@ td.cbi-value-error {
}
ul.cbi-tabmenu {
- padding: 3px 0;
- margin-left: 0 !important;
list-style-type: none;
+ display: flex;
+ margin: 0 !important;
+ padding: 0 0 0 5px;
+ border-bottom: 1px solid #bbb;
+}
+
+ul.cbi-tabmenu li {
+ display: inline-flex;
+ margin: 0 5px -1px 0;
+ flex: 0 1 auto;
+ border: 1px solid #bbb;
+ border-bottom: none;
+ border-radius: 3px 3px 0 0;
+ background: linear-gradient(#ddd 90%, #aaa 100%);
+ color: #888;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+}
+
+ul.cbi-tabmenu li a,
+ul.cbi-tabmenu li a:hover {
+ text-decoration: none;
+ color: inherit;
+ padding: 5px;
+ flex: 1;
+ width: 100%;
+ height: 100%;
+}
+
+ul.cbi-tabmenu li.cbi-tab-highlighted {
+ color: #000;
+ background: #fea;
+}
+
+ul.cbi-tabmenu li.cbi-tab {
+ color: #000;
+ background: #fff;
+}
+
+.cbi-tab-descr {
+ background-image: url(/luci-static/resources/cbi/help.gif);
+ background-position: .25em 50%;
+ background-repeat: no-repeat;
+ border-bottom: 1px solid #ccc;
+ margin: 0 .25em .25em .25em;
+ padding: .5em .5em .5em 2em;
+}
+
+
+.cbi-dropdown {
+ border: 1px inset #000;
+ display: inline-flex;
+ cursor: pointer;
+ background: #eee;
position: relative;
- z-index: 10;
- top: 4px;
- line-height: 20px;
+ padding: 0;
+ color: #000;
+ min-width: 20em;
+ max-width: 100%;
}
-ul.cbi-tabmenu li.cbi-tab,
-ul.cbi-tabmenu li.cbi-tab-disabled {
- display: inline;
+.cbi-dropdown:hover {
+ background: #fff;
+}
+
+.cbi-dropdown:focus {
+ outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+ margin: 0 !important;
+ padding: 0;
+ list-style: none;
+ overflow-x: hidden;
+ overflow-y: auto;
+ display: flex;
+ width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+ display: none;
+}
+
+.cbi-dropdown > .open {
+ border: 2px outset #eee;
+ flex-basis: 15px;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+ flex-grow: 0;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ text-align: center;
+ line-height: 2em;
+ padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+ color: #777;
+ font-weight: bold;
+ text-shadow: 1px 1px 0px #fff;
+ display: none;
+}
+
+.cbi-dropdown > ul > li {
+ display: none;
+ padding: .25em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ flex-shrink: 1;
+ flex-grow: 1;
+ align-items: center;
+ align-self: center;
+ min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+ border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+ max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+ display: none;
margin: 0;
+ padding: 0;
+ pointer-events: none;
}
-ul.cbi-tabmenu li.cbi-tab a,
-ul.cbi-tabmenu li.cbi-tab-disabled a {
- text-decoration: none;
- padding: 3px 7px;
- margin-right: 3px;
- border: 1px solid #BBBBBB;
+.cbi-dropdown > ul > li img {
+ vertical-align: middle;
+ margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+ margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+ height: 20px;
+}
+
+.cbi-dropdown[open] {
+ position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+ display: block;
+ background: #f6f6f5;
+ border: 1px solid #918e8c;
+ box-shadow: 0 0 4px #918e8c;
+ position: absolute;
+ z-index: 1000;
+ max-width: none;
+ min-width: 100%;
+ width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+ display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+ border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+ background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+ background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+ margin-bottom: 0;
border-bottom: none;
- border-radius: 3px 3px 0 0;
- background-color: #EEEEEE;
- color: #BBBBBB;
}
-ul.cbi-tabmenu li.cbi-tab-highlighted a {
- color: #000000;
- background-color: #FFEEAA;
+.cbi-dropdown[disabled] {
+ pointer-events: none;
+ opacity: .6;
}
-ul.cbi-tabmenu li a:hover {
- color: #000000;
+
+.cbi-tooltip-container {
+ cursor: help;
}
-ul.cbi-tabmenu li.cbi-tab a {
- padding-top: 4px;
- color: #000000;
- background-color: #FFFFFF;
+.cbi-tooltip {
+ position: absolute;
+ z-index: 1000;
+ left: -1000px;
+ opacity: 0;
+ transition: opacity .25s ease-out;
+ pointer-events: none;
+ box-shadow: 0 0 2px #444;
}
-div.cbi-tab-descr {
- background-image: url(/luci-static/resources/cbi/help.gif);
- background-position: 0.25em 50%;
- background-repeat: no-repeat;
- border-bottom: 1px solid #CCCCCC;
- margin: 0.25em 0.25em 2em;
- padding: 0.5em 0.5em 0.5em 2em;
+.cbi-tooltip-container:hover .cbi-tooltip {
+ left: auto;
+ opacity: 1;
+ transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+ padding: 1px;
+ background: inherit;
+ margin: -1.6em 0 0 -5px;
+}
+
+
+.zone-forwards {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.zone-forwards > * {
+ flex: 1 1 45%;
+ padding: 1px;
+}
+
+.zone-forwards > span {
+ flex-basis: 10%;
+ text-align: center;
}
-.left {
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+ display: flex;
+ flex-direction: column;
+}
+
+
+.left, .left::before {
text-align: left !important;
}
-.right {
+.right, .right::before {
text-align: right !important;
}
+.center, .center::before {
+ text-align: center !important;
+}
+
+.td.bottom {
+ align-self: flex-end;
+}
+
+.td.top {
+ align-self: flex-start;
+}
+
+.td.middle {
+ align-self: center;
+}
+
.luci {
position: absolute;
bottom: 0;
@@ -892,57 +1216,97 @@ div.cbi-tab-descr {
padding: 0.5em;
}
-.errorbox {
- border: 1px solid #FF0000;
- background-color: #FFCCCC;
- padding: 5px;
- margin-bottom: 5px;
+
+.ifacebadge, .ifacebox {
+ display: inline-flex;
+ align-content: center;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ padding: 2px;
+ background: #fff;
+ margin: .25em .5em;
+}
+
+.ifacebox-head {
+ background: #eee;
+}
+
+.ifacebox-head.active {
+ background: #90c0e0;
+}
+
+.ifacebadge, .zonebadge {
+ align-items: center;
+}
+
+.ifacebadge > * {
+ align-self: flex-start;
}
-.errorbox a {
- color: #000000 !important;
+.ifacebadge > img,
+.ifacebadge > em {
+ margin-right: 5px;
+ display: inline-block;
+ height: 16px;
}
+.ifacebadge-active {
+ border-color: #000000;
+ font-weight: bold;
+}
.ifacebox {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
- margin: 0 10px;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+ min-width: 100px;
text-align: center;
- white-space: nowrap;
}
-.ifacebox .ifacebox-head {
- border-bottom: 1px solid #CCCCCC;
+.ifacebox > * {
padding: 2px;
}
-.ifacebox .ifacebox-body {
- padding: 2px;
+.td > .ifacebadge,
+.td > .zonebadge {
+ margin: 0;
+ vertical-align: top;
}
+.network-status-table {
+ display: flex;
+ flex-wrap: wrap;
+ margin: -.25em;
+}
-.ifacebadge {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
- padding: 1px 2px;
- margin-left: 2px;
- display: inline-block;
- cursor: default;
- white-space: nowrap;
- font-size: 11px;
- border-radius: 3px;
+.network-status-table .ifacebox {
+ margin: .25em;
+ font-size: 90%;
+ flex-grow: 1;
}
-.ifacebadge img {
- width: 16px;
- height: 16px;
- vertical-align: middle;
+.network-status-table .ifacebox-body {
+ display: flex;
+ flex-direction: column;
+ flex: 1 0;
}
-.ifacebadge-active {
- border-color: #000000;
- font-weight: bold;
+.network-status-table .ifacebox-body > span {
+ flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.ifacebadge.large,
+.network-status-table .ifacebox-body .ifacebadge {
+ flex: 1;
+ margin: .5em .25em .25em .25em;
+ padding: .5em;
+ min-width: 220px;
+ white-space: nowrap;
}
@@ -950,13 +1314,12 @@ div.cbi-tab-descr {
padding: 2px;
display: inline-block;
white-space: nowrap;
- cursor: pointer;
+ border-radius: 3px;
}
-.zonebadge em,
-.zonebadge strong {
+.zonebadge > em,
+.zonebadge > strong {
margin: 3px;
- display: inline-block;
}
.zonebadge input {
@@ -964,6 +1327,18 @@ div.cbi-tab-descr {
height: 1.5em;
}
+.zonebadge .ifacebadge,
+.cbi-dropdown .ifacebadge {
+ margin: 1px;
+}
+
+.zonebadge .ifacebadge img,
+.zonebadge .ifacebadge em,
+.cbi-dropdown .ifacebadge img,
+.cbi-dropdown .ifacebadge em {
+ margin: 0 1px;
+}
+
.zonebadge-empty {
border: 1px dashed #AAAAAA;
color: #AAAAAA;
@@ -1042,3 +1417,313 @@ div.cbi-tab-descr {
}
+
+@media screen and (max-width: 992px) {
+ body {
+ -webkit-text-size-adjust: 100%;
+ }
+
+ #maincontainer {
+ flex-direction: column;
+ width: 100%;
+ }
+
+ #maincontent {
+ width: 96%;
+ margin: auto;
+ }
+
+ #mainmenu {
+ border: none;
+ border-radius: 0;
+ max-width: none;
+ background: #000;
+ box-shadow: 0 0 2px #444;
+ padding: 0;
+ border-top: 1px solid #444;
+ position: relative;
+ }
+
+ #mainmenu ul > li.selected > a {
+ background: #444;
+ color: #fff;
+ border-top: none;
+ }
+
+ #mainmenu ul > li.selected:not(.active) > ul {
+ max-height: 0;
+ visibility: hidden;
+ }
+
+ #mainmenu ul > li > a {
+ flex: 1;
+ color: #fff;
+ border: 1px solid #444;
+ border-width: 0 0 1px 1px;
+ }
+
+ #mainmenu ul.l1 {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ position: relative;
+ margin-left: -1px;
+ width: 100%;
+ }
+
+ #mainmenu ul.l1 > li {
+ display: inline-flex;
+ flex: 1 1 auto;
+ position: relative;
+ height: 2em;
+ }
+
+ #mainmenu ul.l1 ul.l2 {
+ position: absolute;
+ top: 2em;
+ right: 0;
+ z-index: 1000;
+ background: #000;
+ box-shadow: 0 0 2px #444;
+ min-width: 120px;
+ display: block;
+ }
+
+ #mainmenu ul.l1 ul.l2.align-left {
+ right: auto;
+ left: 0;
+ }
+
+ #mainmenu ul.l2 > li {
+ display: block;
+ }
+
+ #mainmenu ul.l2 > li > a {
+ padding: .5em;
+ }
+
+ #mainmenu ul li.mainmenu-item-logout {
+ margin-top: 0;
+ margin-left: auto;
+ }
+
+ #mainmenu ul li.mainmenu-item-logout::before {
+ content: "\0a";
+ flex: 10;
+ border: 1px solid #444;
+ border-width: 0 0 1px 1px;
+ }
+
+ .table {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ }
+
+ .tr {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: flex-end;
+ }
+
+ .th, .td {
+ flex: 2 2 25%;
+ align-self: flex-start;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ display: inline-block;
+ }
+
+ .td select {
+ word-wrap: normal;
+ }
+
+ .td[data-type="button"],
+ .td[data-type="fvalue"] {
+ flex: 1 1 12.5%;
+ text-align: left;
+ }
+
+ .td.cbi-value-field {
+ align-self: flex-start;
+ }
+
+ .td.cbi-value-field .cbi-button {
+ width: 100%;
+ }
+
+ .table.cbi-section-table {
+ border: none;
+ background: none;
+ margin: 0;
+ }
+
+ .tr.table-titles,
+ .cbi-section-table-titles,
+ .cbi-section-table-descr {
+ display: none;
+ }
+
+ .cbi-section-table-row {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ border: 1px dotted #444;
+ margin: 0 0 .5em 0;
+ background: #fff;
+ }
+
+ .cbi-section-table-row:hover {
+ border: 1px solid #4a6b7c;
+ }
+
+ .cbi-section-table + .cbi-section-create {
+ padding-top: 0;
+ }
+
+ .tr[data-title]::before {
+ display: block;
+ flex: 1 1 100%;
+ background: #eef;
+ }
+
+ .td[data-title]::before {
+ display: block;
+ }
+
+ .td.cbi-section-actions {
+ flex-basis: 100%;
+ margin: auto -1px 0 auto;
+ }
+
+ .td.cbi-section-actions > *,
+ .td.cbi-section-actions > form > * {
+ flex: 0 1 100%;
+ max-width: 150px;
+ }
+
+ .hide-sm,
+ .hide-xs {
+ display: none;
+ }
+}
+
+@media screen and (max-width: 480px) {
+ body {
+ font-size: 12pt;
+ }
+
+ input, textarea, select {
+ font-size: 12pt !important;
+ line-height: 1.4em;
+ }
+
+ select, input[type="text"], input[type="password"] {
+ width: 100%;
+ height: 1.4em;
+ }
+
+ [data-dynlist] > input,
+ input.cbi-input-password {
+ width: calc(100% - 20px);
+ }
+
+ .cbi-dropdown {
+ min-width: 100%;
+ }
+
+ .btn, .cbi-button {
+ font-size: 9pt !important;
+ line-height: 11pt;
+ }
+
+ #maincontent {
+ padding: .25em;
+ }
+
+ #tabmenu {
+ margin: -.25em -.25em 1em -.25em;
+ }
+
+ .th, .td {
+ flex: 2 2 50%;
+ }
+
+ .td.cbi-value-field {
+ flex-basis: 100%;
+ }
+
+ .td.cbi-value-field[data-type="dvalue"] {
+ flex-basis: 50%;
+ }
+
+ .td.cbi-value-field[data-type="button"],
+ .td.cbi-value-field[data-type="fvalue"] {
+ flex-basis: 25%;
+ text-align: left;
+ }
+
+ .cbi-section {
+ padding: .25em;
+ }
+
+ .cbi-value-title {
+ float: none;
+ font-weight: bold;
+ }
+
+ .cbi-value-field {
+ width: 100%;
+ margin: 0;
+ }
+
+ .cbi-value-description {
+ margin-top: 5px;
+ display: block;
+ }
+
+ .cbi-section-create {
+ margin-bottom: 1em;
+ }
+
+ .cbi-page-actions {
+ flex-wrap: wrap;
+ }
+
+ .cbi-page-actions > .cbi-button-link {
+ flex-basis: 100%;
+ margin-right: 2px;
+ }
+
+ .cbi-page-actions > * {
+ flex: 1 1 auto;
+ margin: 2px;
+ }
+
+ ul.cbi-tabmenu {
+ padding: 0 3px;
+ }
+
+ ul.cbi-tabmenu li {
+ font-size: 90%;
+ margin: 0 1px -1px 0;
+ }
+
+ .hide-xs {
+ display: none;
+ }
+
+ #cbi-network .td[id] > strong {
+ display: block;
+ }
+
+ #cbi-network-switch_vlan .td.cbi-section-actions {
+ flex-basis: 100%;
+ }
+
+ .network-status-table .ifacebox {
+ margin: 0 0 .5em 0;
+ }
+}
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css
deleted file mode 100644
index 14db3f86e5..0000000000
--- a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css
+++ /dev/null
@@ -1,77 +0,0 @@
-/* obligatory IE6 Voodoo Code */
-
-* html body {
- padding-left: 5% !important;
-}
-
-* html div#header {
- margin-left: 100% !important;
-}
-
-* html div#menubar {
- margin-left: -5% !important;
- width: 105% !important;
-}
-
-* html ul.dropdowns li ul {
- width: 10em;
-}
-
-* html ul.dropdowns li li {
- clear: both;
- float: left;
-}
-
-* html ul.dropdowns li li {
- width: 100%;
-}
-
-* html ul.dropdowns li li a {
- height: 10%;
-}
-
-* html div#maincontent {
- margin-left: 0% !important;
- width: 100% !important;
-}
-
-* html div.cbi-value-description {
- width: auto !important;
-}
-
-* html div.cbi-value-field {
- margin-left: 0 !important;
- width: 100% !important;
-}
-
-* html .cbi-input-text,
-* html .cbi-input-user,
-* html .cbi-input-select,
-* html .cbi-input-password {
- width: 50% !important;
-}
-
-* html .cbi-input-user,
-* html .cbi-input-password {
- text-indent: 0 !important;
- padding-left: 1.5em !important;
-}
-
-* html .cbi-section legend {
- background-color: #ffffff;
- color: #555555;
-}
-
-* html table.cbi-section-table td .cbi-input-text,
-* html table.cbi-section-table td .cbi-input-select {
- width: 100% !important;
-}
-
-* html div.cbi-page-actions {
- text-align: right !important;
-}
-
-* html div.cbi-value-field input,
-* html div.cbi-value-field select {
- font-size: 90% !important;
-}
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css
deleted file mode 100644
index 9e569b28bd..0000000000
--- a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css
+++ /dev/null
@@ -1,59 +0,0 @@
-#tabmenu {
- line-height: 0;
-}
-
-ul.tabmenu {
- zoom: 1;
-}
-
-ul.l1 {
- position: relative;
-}
-
-
-table.cbi-section-table td .cbi-input-text,
-table.cbi-section-table td .cbi-input-select {
- width: 95% !important;
-}
-
-
-.cbi-input-user,
-.cbi-input-password {
- text-indent: 0 !important;
- padding-left: 1.5em !important;
- width: 18.5em !important;
-}
-
-
-fieldset.cbi-section {
- position: relative;
- margin-top: 1em;
- padding-top: 0.75em;
- border: 1px solid #CCCCCC;
- zoom: 1;
-}
-
-fieldset.cbi-section legend {
- position: absolute;
- top: -0.75em;
- left: 0.5em;
-}
-
-
-ul.cbi-tabmenu {
- margin-bottom: 0;
-}
-
-ul.cbi-tabmenu li.cbi-tab a {
- position: static; /* fixes misplaced tab after page load */
- border-bottom: 1px solid white;
-}
-
-
-div.cbi-value {
- zoom: 1; /* fixes hanging float */
-}
-
-div.cbi-value-field {
- margin-left: 0 !important;
-}
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css
deleted file mode 100644
index 890988c417..0000000000
--- a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css
+++ /dev/null
@@ -1,12 +0,0 @@
-fieldset.cbi-section {
- position: relative;
- margin-top: 1em;
- padding-top: 0.75em;
- border: 1px solid #CCCCCC;
-}
-
-fieldset.cbi-section legend {
- position: absolute;
- top: -0.75em;
- left: 0.5em;
-}
diff --git a/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm
index a560014d37..773cf1f82e 100644
--- a/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm
+++ b/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm
@@ -56,9 +56,39 @@
local childs = disp.node_childs(node)
if #childs > 0 then
- write('<div class="tabmenu%d"><ul class="tabmenu l%d">' %{
- level, level
- })
+ write('<ul class="mainmenu l%d">' % level)
+
+ local i, v
+ for i, v in ipairs(childs) do
+ local nnode = node.nodes[v]
+
+ write('<li class="mainmenu-item-%s %s"><a href="%s">%s</a>' %{
+ v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'selected' or '',
+ nodeurl(prefix, v, nnode.query),
+ striptags(translate(nnode.title))
+ })
+
+ if level < 2 then
+ render_menu(prefix .. "/" .. v, nnode, level + 1)
+ end
+
+ write('</li>')
+ end
+
+ write('</ul>')
+ end
+ end
+
+ local function render_tabmenu(prefix, node, level)
+ if not level then
+ level = 1
+ end
+
+ local childs = disp.node_childs(node)
+ if #childs > 0 then
+ if level > 2 then
+ write('<ul class="cbi-tabmenu">')
+ end
local selected_node
local selected_name
@@ -71,20 +101,22 @@
selected_name = v
end
- write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{
- v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '',
- nodeurl(prefix, v, nnode.query),
- striptags(translate(nnode.title))
- })
+ if level > 2 then
+ write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{
+ v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'cbi-tab' or '',
+ nodeurl(prefix, v, nnode.query),
+ striptags(translate(nnode.title))
+ })
+ end
end
- write('</ul><br style="clear:both" />')
+ if level > 2 then
+ write('</ul>')
+ end
if selected_node then
- render_menu(prefix .. "/" .. selected_name, selected_node, level + 1)
+ render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1)
end
-
- write('</div>')
end
end
@@ -116,11 +148,9 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
-<!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie6.css" /><![endif]-->
-<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
-<!--[if IE 8]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie8.css" /><![endif]-->
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
<% end -%>
<% if css then %><style title="text/css">
@@ -128,6 +158,47 @@
</style>
<% end -%>
<script type="text/javascript" src="<%=resource%>/xhr.js"></script>
+<script type="text/javascript">//<![CDATA[
+ document.addEventListener('DOMContentLoaded', function() {
+ var event = ('ontouchstart' in window) ? 'touchstart' : 'click';
+
+ document.querySelectorAll('ul.mainmenu.l1 > li > a').forEach(function(a) {
+ a.addEventListener(event, function(ev) {
+ var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling;
+
+ document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) {
+ if (li !== a.parentNode)
+ li.classList.remove('active');
+ });
+
+ if (!ul2)
+ return;
+
+ if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth)
+ ul2.classList.add('align-left');
+
+ ul1.classList.add('active');
+ a.parentNode.classList.add('active');
+ a.blur();
+
+ ev.preventDefault();
+ ev.stopPropagation();
+ });
+ });
+
+ document.addEventListener(event, function(ev) {
+ var t = ev.target;
+
+ while (t && t.id != 'mainmenu')
+ t = t.parentNode;
+
+ if (!t)
+ document.querySelectorAll('ul.mainmenu > li.active').forEach(function(li) {
+ li.classList.remove('active');
+ });
+ });
+ });
+//]]></script>
<title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
</head>
<body class="lang_<%=luci.i18n.context.lang%>">
@@ -164,22 +235,26 @@
</div>
<div id="maincontainer">
- <div id="tabmenu">
+ <div id="mainmenu">
<% if category then render_menu(category, cattree) end %>
</div>
<div id="maincontent">
+ <div id="tabmenu">
+ <% if category then render_tabmenu(category, cattree) end %>
+ </div>
+
<noscript>
- <div class="errorbox">
- <strong><%:JavaScript required!%></strong><br />
- <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
+ <div class="alert-message warning">
+ <h4><%:JavaScript required!%></h4>
+ <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
</div>
</noscript>
<%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and category ~= "failsafe" then -%>
- <div class="errorbox">
- <strong><%:No password set!%></strong><br />
- <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br />
- <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+ <div class="alert-message warning">
+ <h4><%:No password set!%></h4>
+ <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+ <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
</div>
<%- end -%>