From: Hannu Nyman
Date: Thu, 17 Aug 2017 17:01:58 +0000 (+0300)
Subject: Merge pull request #1309 from dibdot/dnscrypt-proxy
X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=5d35777a34d3fda12d7947047351a5151107771e;hp=14dca2f3eef863c03b87bf21dc5787a524d84b62
Merge pull request #1309 from dibdot/dnscrypt-proxy
luci-app-dnscrypt-proxy: new package
---
diff --git a/applications/luci-app-adblock/luasrc/controller/adblock.lua b/applications/luci-app-adblock/luasrc/controller/adblock.lua
index 03b9fc20e..efa99b5b8 100644
--- a/applications/luci-app-adblock/luasrc/controller/adblock.lua
+++ b/applications/luci-app-adblock/luasrc/controller/adblock.lua
@@ -5,7 +5,7 @@ module("luci.controller.adblock", package.seeall)
local fs = require("nixio.fs")
local util = require("luci.util")
-local template = require("luci.template")
+local templ = require("luci.template")
local i18n = require("luci.i18n")
function index()
@@ -19,17 +19,13 @@ function index()
entry({"admin", "services", "adblock", "advanced", "blacklist"}, cbi("adblock/blacklist_tab"), _("Edit Blacklist"), 110).leaf = true
entry({"admin", "services", "adblock", "advanced", "whitelist"}, cbi("adblock/whitelist_tab"), _("Edit Whitelist"), 120).leaf = true
entry({"admin", "services", "adblock", "advanced", "configuration"}, cbi("adblock/configuration_tab"), _("Edit Configuration"), 130).leaf = true
- entry({"admin", "services", "adblock", "advanced", "query"}, call("query"), _("Query domains"), 140).leaf = true
+ entry({"admin", "services", "adblock", "advanced", "query"}, template("adblock/query"), _("Query domains"), 140).leaf = true
entry({"admin", "services", "adblock", "advanced", "result"}, call("queryData"), nil, 150).leaf = true
end
function logread()
local logfile = util.trim(util.exec("logread -e 'adblock'"))
- template.render("adblock/logread", {title = i18n.translate("Adblock Logfile"), content = logfile})
-end
-
-function query()
- template.render("adblock/query", {title = i18n.translate("Adblock Domain Query")})
+ templ.render("adblock/logread", {title = i18n.translate("Adblock Logfile"), content = logfile})
end
function queryData(domain)
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua
index 59cd1e80f..ef70100e4 100644
--- a/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/blacklist_tab.lua
@@ -25,6 +25,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("adblock/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua
index 1607f1440..1d89485e7 100644
--- a/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/configuration_tab.lua
@@ -14,6 +14,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("adblock/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
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 68f9c8897..aa5701487 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
@@ -21,6 +21,8 @@ if parse ~= nil then
dnspath = "/var/lib/unbound"
elseif backend == "named" then
dnspath = "/var/lib/bind"
+ elseif backend == "kresd" then
+ dnspath = "/tmp/kresd"
end
end
end
@@ -180,7 +182,7 @@ e2 = e:option(Flag, "adb_forcesrt", translate("Force Overall Sort"),
e2.default = e2.disabled
e2.rmempty = false
-e3 = e:option(Flag, "adb_manmode", translate("Manual mode"),
+e3 = e:option(Flag, "adb_manmode", translate("Manual / Backup mode"),
translate("Do not automatically update blocklists during startup, use blocklist backups instead."))
e3.default = e3.disabled
e3.rmempty = false
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua
index 10a593859..a3659eb46 100644
--- a/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua
+++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/whitelist_tab.lua
@@ -24,6 +24,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("adblock/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
diff --git a/applications/luci-app-adblock/po/ja/adblock.po b/applications/luci-app-adblock/po/ja/adblock.po
index 07fd783ed..b3e139e12 100644
--- a/applications/luci-app-adblock/po/ja/adblock.po
+++ b/applications/luci-app-adblock/po/ja/adblock.po
@@ -8,15 +8,12 @@ msgstr ""
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.2\n"
+"X-Generator: Poedit 2.0.3\n"
"Language: ja\n"
msgid "Adblock"
msgstr "Adblock"
-msgid "Adblock Domain Query"
-msgstr "Adblock ãã¡ã¤ã³æ¤ç´¢"
-
msgid "Adblock Logfile"
msgstr "Adblock ãã°ãã¡ã¤ã«"
@@ -137,8 +134,8 @@ msgstr "æçµå®è¡æ¥æ"
msgid "Loading"
msgstr "èªè¾¼ä¸"
-msgid "Manual mode"
-msgstr "ããã¥ã¢ã« ã¢ã¼ã"
+msgid "Manual / Backup mode"
+msgstr "æå / ããã¯ã¢ãã ã¢ã¼ã"
msgid "No"
msgstr "ããã"
@@ -189,6 +186,9 @@ msgstr "å®è¡æ
å ±"
msgid "SSL req."
msgstr "SSL å¿
é "
+msgid "Save"
+msgstr "ä¿å"
+
msgid ""
"Space separated list of interfaces that trigger adblock processing. To "
"disable event driven (re-)starts remove all entries."
@@ -201,15 +201,15 @@ msgid "Status"
msgstr "ã¹ãã¼ã¿ã¹"
msgid "Suspend / Resume adblock"
-msgstr "Adblock ã®ä¸æåæ¢/åé"
+msgstr "Adblock ã®ä¸æåæ¢ / åé"
msgid "Suspend adblock"
msgstr "Adblock ã®ä¸æåæ¢"
msgid "The file size is too large for online editing in LuCI (> 512 KB)."
msgstr ""
-"ãã¡ã¤ã« ãµã¤ãºã大ããããããã LuCI ä¸ã§ãªã³ã©ã¤ã³ç·¨éã§ãã¾ããï¼> "
-"512 KBï¼ã"
+"ãã¡ã¤ã« ãµã¤ãºã大ããããï¼512 KBè¶
ï¼ããã LuCI ä¸ã§ãªã³ã©ã¤ã³ç·¨éã§ãã¾ã"
+"ãã"
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
@@ -253,7 +253,7 @@ msgid "View Logfile"
msgstr "ãã°ãã¡ã¤ã«ãè¦ã"
msgid "Waiting for command to complete..."
-msgstr "ã³ãã³ãã®å®äºããå¾
ã¡ãã ãã..."
+msgstr "ã³ãã³ãå®è¡ä¸ã§ã..."
msgid "Yes"
msgstr "ã¯ã"
diff --git a/applications/luci-app-adblock/po/pt-br/adblock.po b/applications/luci-app-adblock/po/pt-br/adblock.po
index 044352da6..586c31801 100644
--- a/applications/luci-app-adblock/po/pt-br/adblock.po
+++ b/applications/luci-app-adblock/po/pt-br/adblock.po
@@ -15,9 +15,6 @@ msgstr ""
msgid "Adblock"
msgstr "Adblock"
-msgid "Adblock Domain Query"
-msgstr ""
-
msgid "Adblock Logfile"
msgstr ""
@@ -127,7 +124,7 @@ msgstr ""
msgid "Loading"
msgstr ""
-msgid "Manual mode"
+msgid "Manual / Backup mode"
msgstr ""
msgid "No"
@@ -176,6 +173,9 @@ msgstr ""
msgid "SSL req."
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid ""
"Space separated list of interfaces that trigger adblock processing. To "
"disable event driven (re-)starts remove all entries."
diff --git a/applications/luci-app-adblock/po/sv/adblock.po b/applications/luci-app-adblock/po/sv/adblock.po
index cf92dbddc..a70a1a1d6 100644
--- a/applications/luci-app-adblock/po/sv/adblock.po
+++ b/applications/luci-app-adblock/po/sv/adblock.po
@@ -4,9 +4,6 @@ msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "Adblock"
msgstr "Adblock"
-msgid "Adblock Domain Query"
-msgstr ""
-
msgid "Adblock Logfile"
msgstr "Adblock's loggfil"
@@ -117,7 +114,7 @@ msgstr ""
msgid "Loading"
msgstr "Laddar"
-msgid "Manual mode"
+msgid "Manual / Backup mode"
msgstr ""
msgid "No"
@@ -164,6 +161,9 @@ msgstr "Information om kör-tid"
msgid "SSL req."
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid ""
"Space separated list of interfaces that trigger adblock processing. To "
"disable event driven (re-)starts remove all entries."
diff --git a/applications/luci-app-adblock/po/templates/adblock.pot b/applications/luci-app-adblock/po/templates/adblock.pot
index 5b5a96866..3b61036e0 100644
--- a/applications/luci-app-adblock/po/templates/adblock.pot
+++ b/applications/luci-app-adblock/po/templates/adblock.pot
@@ -4,9 +4,6 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Adblock"
msgstr ""
-msgid "Adblock Domain Query"
-msgstr ""
-
msgid "Adblock Logfile"
msgstr ""
@@ -114,7 +111,7 @@ msgstr ""
msgid "Loading"
msgstr ""
-msgid "Manual mode"
+msgid "Manual / Backup mode"
msgstr ""
msgid "No"
@@ -161,6 +158,9 @@ msgstr ""
msgid "SSL req."
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid ""
"Space separated list of interfaces that trigger adblock processing. To "
"disable event driven (re-)starts remove all entries."
diff --git a/applications/luci-app-adblock/po/zh-cn/adblock.po b/applications/luci-app-adblock/po/zh-cn/adblock.po
index 46dc99e66..534e8f5cc 100644
--- a/applications/luci-app-adblock/po/zh-cn/adblock.po
+++ b/applications/luci-app-adblock/po/zh-cn/adblock.po
@@ -16,9 +16,6 @@ msgstr ""
msgid "Adblock"
msgstr "Adblock"
-msgid "Adblock Domain Query"
-msgstr ""
-
msgid "Adblock Logfile"
msgstr "Adblock æ¥å¿æ件"
@@ -126,7 +123,7 @@ msgstr ""
msgid "Loading"
msgstr "å è½½ä¸"
-msgid "Manual mode"
+msgid "Manual / Backup mode"
msgstr ""
msgid "No"
@@ -173,6 +170,9 @@ msgstr "è¿è¡ä¿¡æ¯"
msgid "SSL req."
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid ""
"Space separated list of interfaces that trigger adblock processing. To "
"disable event driven (re-)starts remove all entries."
diff --git a/applications/luci-app-aria2/po/sv/aria2.po b/applications/luci-app-aria2/po/sv/aria2.po
index a7f41f250..3a129364c 100644
--- a/applications/luci-app-aria2/po/sv/aria2.po
+++ b/applications/luci-app-aria2/po/sv/aria2.po
@@ -1,5 +1,5 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "\"Falloc\" is not available in all cases."
msgstr ""
diff --git a/applications/luci-app-attendedsysupgrade/Makefile b/applications/luci-app-attendedsysupgrade/Makefile
new file mode 100644
index 000000000..8d7a6163d
--- /dev/null
+++ b/applications/luci-app-attendedsysupgrade/Makefile
@@ -0,0 +1,11 @@
+# See /LICENSE for more information.
+# This is free software, licensed under the GNU General Public License v2.
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI support for attended sysupgrades
+LUCI_DEPENDS:=+luci-base +uhttpd-mod-ubus +rpcd-mod-attendedsysupgrade
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua b/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua
new file mode 100644
index 000000000..1bd050af6
--- /dev/null
+++ b/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua
@@ -0,0 +1,5 @@
+module("luci.controller.attendedsysupgrade", package.seeall)
+
+function index()
+ entry({"admin", "system", "attended_sysupgrade"}, template("attendedsysupgrade"), _("Attended Sysupgrade"), 1)
+end
diff --git a/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm b/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm
new file mode 100644
index 000000000..1edafa7c7
--- /dev/null
+++ b/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm
@@ -0,0 +1,284 @@
+<%+header%>
+<%:Attended Sysupgrade%>
+
+
+
+
+
+
+
+<%+footer%>
diff --git a/applications/luci-app-bcp38/po/templates/bcp38.pot b/applications/luci-app-bcp38/po/templates/bcp38.pot
new file mode 100644
index 000000000..1210784d2
--- /dev/null
+++ b/applications/luci-app-bcp38/po/templates/bcp38.pot
@@ -0,0 +1,45 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Allowed IP ranges"
+msgstr ""
+
+msgid ""
+"Attempt to automatically detect if the upstream IP will be blocked by the "
+"configuration, and add an exception if it will. If this does not work "
+"correctly, you can add exceptions manually below."
+msgstr ""
+
+msgid "Auto-detect upstream IP"
+msgstr ""
+
+msgid "BCP38"
+msgstr ""
+
+msgid "BCP38 config"
+msgstr ""
+
+msgid "Blocked IP ranges"
+msgstr ""
+
+msgid "Enable"
+msgstr ""
+
+msgid "Interface name"
+msgstr ""
+
+msgid ""
+"Interface to apply the blocking to (should be the upstream WAN interface)."
+msgstr ""
+
+msgid ""
+"Takes precedence over blocked ranges. Use to whitelist your upstream network "
+"if you're behind a double NAT and the auto-detection doesn't work."
+msgstr ""
+
+msgid ""
+"This function blocks packets with private address destinations from going "
+"out onto the internet as per BCP 38 . For IPv6, only source specific default routes are "
+"installed, so no BCP38 firewall routes are needed."
+msgstr ""
diff --git a/applications/luci-app-bcp38/po/zh-cn/bcp38.po b/applications/luci-app-bcp38/po/zh-cn/bcp38.po
new file mode 100644
index 000000000..f9e0634b8
--- /dev/null
+++ b/applications/luci-app-bcp38/po/zh-cn/bcp38.po
@@ -0,0 +1,52 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "Allowed IP ranges"
+msgstr "å
许ç IP èå´"
+
+msgid ""
+"Attempt to automatically detect if the upstream IP will be blocked by the "
+"configuration, and add an exception if it will. If this does not work "
+"correctly, you can add exceptions manually below."
+msgstr ""
+"èªå¨æ£æµä¸æ¸¸ IP æ¯å¦ä¼è¢«å½åé
ç½®æé»æ¢ï¼å½æ£æµå°ä¼è¢«é»æ¢æ¶å°ä¼æ·»å ä¾å¤ãå¦æ"
+"èªå¨æ£æµæ æ³æ£å¸¸å·¥ä½ï¼ä½ å¯ä»¥å¨ä¸é¢æå¨æ·»å ä¾å¤ã"
+
+msgid "Auto-detect upstream IP"
+msgstr "èªå¨æ£æµä¸æ¸¸ IP"
+
+msgid "BCP38"
+msgstr "BCP38"
+
+msgid "BCP38 config"
+msgstr "BCP38 é
ç½®"
+
+msgid "Blocked IP ranges"
+msgstr "é»æ¢ç IP èå´"
+
+msgid "Enable"
+msgstr "å¯ç¨"
+
+msgid "Interface name"
+msgstr "æ¥å£å称"
+
+msgid ""
+"Interface to apply the blocking to (should be the upstream WAN interface)."
+msgstr "åºç¨âé»æ¢è§åâçæ¥å£ï¼åºå½ä¸ºä¸æ¸¸ WAN æ¥å£ï¼ã"
+
+msgid ""
+"Takes precedence over blocked ranges. Use to whitelist your upstream network "
+"if you're behind a double NAT and the auto-detection doesn't work."
+msgstr ""
+"è¿éçè§åä¼å
äºé»æ¢è§å被使ç¨ãå¦æä½ å¨åé NAT ä¹å并ä¸èªå¨æ£æµåè½ä¸èµ·ä½"
+"ç¨ï¼è¯·å¨è¿éæ·»å ä½ ä¸æ¸¸ç½ç»çç½ååã"
+
+msgid ""
+"This function blocks packets with private address destinations from going "
+"out onto the internet as per BCP 38 . For IPv6, only source specific default routes are "
+"installed, so no BCP38 firewall routes are needed."
+msgstr ""
+"æ¤åè½å¯ä»¥é»æ¢å
·æç§æç®æ å°åçæ°æ®å
éè¿ BCP 38 åéå°äºèç½ä¸ãå¯¹äº IPv6ï¼ä»
å®è£
æºç¹å®çé»è®¤è·¯ç±ï¼å "
+"æ¤ä¸éè¦ BCP38 é²ç«å¢è·¯ç±ã"
diff --git a/applications/luci-app-clamav/po/sv/clamav.po b/applications/luci-app-clamav/po/sv/clamav.po
index 589d5f9aa..37de249e5 100644
--- a/applications/luci-app-clamav/po/sv/clamav.po
+++ b/applications/luci-app-clamav/po/sv/clamav.po
@@ -1,5 +1,5 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "10"
msgstr "10"
diff --git a/applications/luci-app-commands/po/sv/commands.po b/applications/luci-app-commands/po/sv/commands.po
index 8cb1923e2..a944fdb63 100644
--- a/applications/luci-app-commands/po/sv/commands.po
+++ b/applications/luci-app-commands/po/sv/commands.po
@@ -104,8 +104,8 @@ msgid ""
"This page allows you to configure custom shell commands which can be easily "
"invoked from the web interface."
msgstr ""
-"Den här sidan tillåter dig att ställa in anpassade skalkommandon som lättast kan "
-"åberopas från webbgränssnittet."
+"Den här sidan tillåter dig att ställa in anpassade skalkommandon som lättast "
+"kan åberopas från webbgränssnittet."
msgid "Waiting for command to complete..."
msgstr "Väntar på att kommandot ska slutföras..."
diff --git a/applications/luci-app-ddns/po/sv/ddns.po b/applications/luci-app-ddns/po/sv/ddns.po
index 780a2f9c8..9373fea3a 100644
--- a/applications/luci-app-ddns/po/sv/ddns.po
+++ b/applications/luci-app-ddns/po/sv/ddns.po
@@ -1,5 +1,5 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "&"
msgstr "&"
@@ -237,8 +237,8 @@ msgid ""
"GNU Wget will use the IP of given network, cURL will use the physical "
"interface."
msgstr ""
-"GNU Wget kommer att använda IP-adressen för det angivna nätverket, cURL kommer att använda det fysiska "
-"gränssnittet."
+"GNU Wget kommer att använda IP-adressen för det angivna nätverket, cURL "
+"kommer att använda det fysiska gränssnittet."
msgid "Global Settings"
msgstr "Globala inställningar"
@@ -277,7 +277,8 @@ msgid "IPv6-Address"
msgstr "IPv6-adress"
msgid "If both cURL and GNU Wget are installed, Wget is used by default."
-msgstr "Om både cURL och GNU Wget är installerade så används Wget som standard."
+msgstr ""
+"Om både cURL och GNU Wget är installerade så används Wget som standard."
msgid ""
"If this service section is disabled it could not be started. Neither "
@@ -319,7 +320,9 @@ msgid ""
msgstr ""
msgid "It is NOT recommended for casual users to change settings on this page."
-msgstr "Det är INTE rekommenderat för vanliga användare att ändra inställningar på den här sidan."
+msgstr ""
+"Det är INTE rekommenderat för vanliga användare att ändra inställningar på "
+"den här sidan."
msgid "Last Update"
msgstr "Senaste uppdateringen"
@@ -604,7 +607,9 @@ msgid "cURL without Proxy Support"
msgstr "cURL utan Proxy-stöd"
msgid "can not detect local IP. Please select a different Source combination"
-msgstr "kan inte upptäcka lokal IP-adress. Vänligen välj en annorlunda Käll-kombination"
+msgstr ""
+"kan inte upptäcka lokal IP-adress. Vänligen välj en annorlunda Käll-"
+"kombination"
msgid "can not resolve host:"
msgstr "kan inte avgöra värd:"
diff --git a/applications/luci-app-diag-core/po/sv/diag_core.po b/applications/luci-app-diag-core/po/sv/diag_core.po
index b5679655d..c31433287 100644
--- a/applications/luci-app-diag-core/po/sv/diag_core.po
+++ b/applications/luci-app-diag-core/po/sv/diag_core.po
@@ -29,5 +29,5 @@ msgid ""
"With this menu you can configure network diagnostics, such as network device "
"scans and ping tests."
msgstr ""
-"Med den här menyn så kan du ställa in nätverksdiagnostik så som igenomsökningar och "
-"ping-tester för nätverksenheten."
+"Med den här menyn så kan du ställa in nätverksdiagnostik så som "
+"igenomsökningar och ping-tester för nätverksenheten."
diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua
index 2b3cee328..21a1b2796 100644
--- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua
+++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua
@@ -5,7 +5,7 @@ local fs = require "nixio.fs"
local f = SimpleForm("firewall",
translate("Firewall - Custom Rules"),
- translate("Custom rules allow you to execute arbritary iptables commands \
+ translate("Custom rules allow you to execute arbitrary iptables commands \
which are not otherwise covered by the firewall framework. \
The commands are executed after each firewall restart, right after \
the default ruleset has been loaded."))
diff --git a/applications/luci-app-firewall/po/ca/firewall.po b/applications/luci-app-firewall/po/ca/firewall.po
index 913fb759e..3abdc892d 100644
--- a/applications/luci-app-firewall/po/ca/firewall.po
+++ b/applications/luci-app-firewall/po/ca/firewall.po
@@ -70,7 +70,7 @@ msgid "Custom Rules"
msgstr "Regles personalitzades"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/cs/firewall.po b/applications/luci-app-firewall/po/cs/firewall.po
index 1ab1360f5..c796873de 100644
--- a/applications/luci-app-firewall/po/cs/firewall.po
+++ b/applications/luci-app-firewall/po/cs/firewall.po
@@ -66,7 +66,7 @@ msgid "Custom Rules"
msgstr "Vlastnà pravidla"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/de/firewall.po b/applications/luci-app-firewall/po/de/firewall.po
index 448f951fa..00e259ca7 100644
--- a/applications/luci-app-firewall/po/de/firewall.po
+++ b/applications/luci-app-firewall/po/de/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Benutzerdefinierte Regeln"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/el/firewall.po b/applications/luci-app-firewall/po/el/firewall.po
index 2229bf09f..6ebc2286a 100644
--- a/applications/luci-app-firewall/po/el/firewall.po
+++ b/applications/luci-app-firewall/po/el/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Î ÏοÏαÏμοÏμÎνοι ÎανÏνεÏ"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/en/firewall.po b/applications/luci-app-firewall/po/en/firewall.po
index 9dc277dbe..f7658a5b0 100644
--- a/applications/luci-app-firewall/po/en/firewall.po
+++ b/applications/luci-app-firewall/po/en/firewall.po
@@ -66,7 +66,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/es/firewall.po b/applications/luci-app-firewall/po/es/firewall.po
index 670b4db6f..8550d0567 100644
--- a/applications/luci-app-firewall/po/es/firewall.po
+++ b/applications/luci-app-firewall/po/es/firewall.po
@@ -69,7 +69,7 @@ msgid "Custom Rules"
msgstr "Reglas propias"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/fr/firewall.po b/applications/luci-app-firewall/po/fr/firewall.po
index cdff28296..7be4d8f4f 100644
--- a/applications/luci-app-firewall/po/fr/firewall.po
+++ b/applications/luci-app-firewall/po/fr/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Régles spécifiques"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/he/firewall.po b/applications/luci-app-firewall/po/he/firewall.po
index ce0ad0405..e269e58cb 100644
--- a/applications/luci-app-firewall/po/he/firewall.po
+++ b/applications/luci-app-firewall/po/he/firewall.po
@@ -63,7 +63,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/hu/firewall.po b/applications/luci-app-firewall/po/hu/firewall.po
index c201e3da8..2c3ae02f6 100644
--- a/applications/luci-app-firewall/po/hu/firewall.po
+++ b/applications/luci-app-firewall/po/hu/firewall.po
@@ -66,7 +66,7 @@ msgid "Custom Rules"
msgstr "Egyéni szabályok"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/it/firewall.po b/applications/luci-app-firewall/po/it/firewall.po
index 88535243b..33e835183 100644
--- a/applications/luci-app-firewall/po/it/firewall.po
+++ b/applications/luci-app-firewall/po/it/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Regole Personalizzate"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/ja/firewall.po b/applications/luci-app-firewall/po/ja/firewall.po
index 0e8d71c6b..eb4b06f29 100644
--- a/applications/luci-app-firewall/po/ja/firewall.po
+++ b/applications/luci-app-firewall/po/ja/firewall.po
@@ -69,7 +69,7 @@ msgid "Custom Rules"
msgstr "æåè¨å®ã«ã¼ã«"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/ko/firewall.po b/applications/luci-app-firewall/po/ko/firewall.po
index f43fdc882..e5e0e871e 100644
--- a/applications/luci-app-firewall/po/ko/firewall.po
+++ b/applications/luci-app-firewall/po/ko/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Custom Rule"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/ms/firewall.po b/applications/luci-app-firewall/po/ms/firewall.po
index b82e2c116..edc92514f 100644
--- a/applications/luci-app-firewall/po/ms/firewall.po
+++ b/applications/luci-app-firewall/po/ms/firewall.po
@@ -62,7 +62,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/no/firewall.po b/applications/luci-app-firewall/po/no/firewall.po
index 59167db54..e26e36564 100644
--- a/applications/luci-app-firewall/po/no/firewall.po
+++ b/applications/luci-app-firewall/po/no/firewall.po
@@ -63,7 +63,7 @@ msgid "Custom Rules"
msgstr "Egendefinerte Regler"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/pl/firewall.po b/applications/luci-app-firewall/po/pl/firewall.po
index 2eea8c31f..77e6a956a 100644
--- a/applications/luci-app-firewall/po/pl/firewall.po
+++ b/applications/luci-app-firewall/po/pl/firewall.po
@@ -70,7 +70,7 @@ msgid "Custom Rules"
msgstr "WÅasne reguÅy"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/pt-br/firewall.po b/applications/luci-app-firewall/po/pt-br/firewall.po
index ab714b50b..1ee89cfbf 100644
--- a/applications/luci-app-firewall/po/pt-br/firewall.po
+++ b/applications/luci-app-firewall/po/pt-br/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Regras Personalizadas"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/pt/firewall.po b/applications/luci-app-firewall/po/pt/firewall.po
index f55261671..d803dfab1 100644
--- a/applications/luci-app-firewall/po/pt/firewall.po
+++ b/applications/luci-app-firewall/po/pt/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr "Regras Personalizadas"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/ro/firewall.po b/applications/luci-app-firewall/po/ro/firewall.po
index 69b911e17..e0027de41 100644
--- a/applications/luci-app-firewall/po/ro/firewall.po
+++ b/applications/luci-app-firewall/po/ro/firewall.po
@@ -67,7 +67,7 @@ msgid "Custom Rules"
msgstr "Reguli suplimentare"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/ru/firewall.po b/applications/luci-app-firewall/po/ru/firewall.po
index 98bc92dd6..be16fece8 100644
--- a/applications/luci-app-firewall/po/ru/firewall.po
+++ b/applications/luci-app-firewall/po/ru/firewall.po
@@ -70,7 +70,7 @@ msgid "Custom Rules"
msgstr "ÐолÑзоваÑелÑÑкие пÑавила"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/sk/firewall.po b/applications/luci-app-firewall/po/sk/firewall.po
index f45e74b14..1dda5bf53 100644
--- a/applications/luci-app-firewall/po/sk/firewall.po
+++ b/applications/luci-app-firewall/po/sk/firewall.po
@@ -63,7 +63,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/sv/firewall.po b/applications/luci-app-firewall/po/sv/firewall.po
index 777c81787..8e310c0f9 100644
--- a/applications/luci-app-firewall/po/sv/firewall.po
+++ b/applications/luci-app-firewall/po/sv/firewall.po
@@ -64,7 +64,7 @@ msgid "Custom Rules"
msgstr "Anpassade regler"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/templates/firewall.pot b/applications/luci-app-firewall/po/templates/firewall.pot
index d1e8eeca1..bec02d448 100644
--- a/applications/luci-app-firewall/po/templates/firewall.pot
+++ b/applications/luci-app-firewall/po/templates/firewall.pot
@@ -56,7 +56,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/tr/firewall.po b/applications/luci-app-firewall/po/tr/firewall.po
index 1b5444f0f..5bb897cc2 100644
--- a/applications/luci-app-firewall/po/tr/firewall.po
+++ b/applications/luci-app-firewall/po/tr/firewall.po
@@ -63,7 +63,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/uk/firewall.po b/applications/luci-app-firewall/po/uk/firewall.po
index 1c4117f3f..8ca1428e7 100644
--- a/applications/luci-app-firewall/po/uk/firewall.po
+++ b/applications/luci-app-firewall/po/uk/firewall.po
@@ -67,7 +67,7 @@ msgid "Custom Rules"
msgstr "ÐаÑÑÑоÑÐ²Ð°Ð½Ñ Ð¿Ñавила"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/vi/firewall.po b/applications/luci-app-firewall/po/vi/firewall.po
index 6c00a6f29..9509613f2 100644
--- a/applications/luci-app-firewall/po/vi/firewall.po
+++ b/applications/luci-app-firewall/po/vi/firewall.po
@@ -68,7 +68,7 @@ msgid "Custom Rules"
msgstr ""
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
diff --git a/applications/luci-app-firewall/po/zh-cn/firewall.po b/applications/luci-app-firewall/po/zh-cn/firewall.po
index d36eeeaa6..f2faab880 100644
--- a/applications/luci-app-firewall/po/zh-cn/firewall.po
+++ b/applications/luci-app-firewall/po/zh-cn/firewall.po
@@ -1,17 +1,7 @@
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-30 17:00+0200\n"
-"PO-Revision-Date: 2014-06-14 18:05+0200\n"
-"Last-Translator: jame-he <755085131@qq.com>\n"
-"Language-Team: QQ Group 75543259 \n"
-"Language: zh_CN\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: Pootle 2.0.6\n"
+"Last-Translator: Hing-wang Liao \n"
msgid "%s in %s"
msgstr "%s ä½äº %s"
@@ -23,22 +13,22 @@ msgid "%s, %s in %s"
msgstr "%s, %s ä½äº %s"
msgid "(Unnamed Entry)"
-msgstr "(æªå½åæ¡ç®)"
+msgstr "ï¼æªå½åæ¡ç®ï¼"
msgid "(Unnamed Rule)"
-msgstr "(æªå½åè§å)"
+msgstr "ï¼æªå½åè§åï¼"
msgid "(Unnamed SNAT)"
-msgstr "(æªå½åSNAT)"
+msgstr "ï¼æªå½å SNATï¼"
msgid "%d pkts. per %s "
-msgstr "%d å
.æ¯ %s "
+msgstr "%d æ°æ®å
ãæ¯ %s "
msgid "%d pkts. per %s , burst %d pkts."
-msgstr "%d å
. æ¯ %s , çªå %d å
."
+msgstr "%d æ°æ®å
ãæ¯ %s ï¼çªå %d æ°æ®å
ã"
msgid "%s and limit to %s"
-msgstr "%s 并ä¸éå¶å° %s"
+msgstr "%s 并éå¶å° %s"
msgid "Action"
msgstr "å¨ä½"
@@ -53,10 +43,10 @@ msgid "Advanced Settings"
msgstr "é«çº§è®¾ç½®"
msgid "Allow forward from source zones :"
-msgstr "å
许ä»æºåºå 转å"
+msgstr "å
许ä»æºåºå 转åï¼"
msgid "Allow forward to destination zones :"
-msgstr "å
许转åå°ç®æ åºå "
+msgstr "å
许转åå°ç®æ åºå ï¼"
msgid "Any"
msgstr "ä»»ä½"
@@ -68,15 +58,15 @@ msgid "Custom Rules"
msgstr "èªå®ä¹è§å"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
-"èªå®ä¹è§åå
许è¿è¡ä¸äºé²ç«å¢æ²¡æå
å«çåè½ãè¿äºå½ä»¤å°å¨æ¯æ¬¡éå¯é²ç«å¢æ¶ï¼å¨"
-"é»è®¤çè§åè¿è¡åç«å³æ§è¡ã"
+"èªå®ä¹è§åå
è®¸ä½ æ§è¡ä¸å±äºé²ç«å¢æ¡æ¶çä»»æ iptables å½ä»¤ãæ¯æ¬¡éå¯é²ç«å¢æ¶ï¼"
+"å¨é»è®¤çè§åè¿è¡åè¿äºå½ä»¤å°ç«å³æ§è¡ã"
msgid "Destination IP address"
-msgstr "ç®æ IPå°å"
+msgstr "ç®æ IP å°å"
msgid "Destination address"
msgstr "ç®æ å°å"
@@ -88,7 +78,7 @@ msgid "Destination zone"
msgstr "ç®æ åºå"
msgid "Do not rewrite"
-msgstr "ä¸å¡«å=ï¼ææ端å£ï¼"
+msgstr "ä¸éå"
msgid "Drop invalid packets"
msgstr "丢å¼æ ææ°æ®å
"
@@ -97,16 +87,16 @@ msgid "Enable"
msgstr "å¯ç¨"
msgid "Enable NAT Loopback"
-msgstr "å¯ç¨NATç¯å"
+msgstr "å¯ç¨ NAT ç¯å"
msgid "Enable SYN-flood protection"
-msgstr "å¯ç¨SYN-floodé²å¾¡"
+msgstr "å¯ç¨ SYN-flood é²å¾¡"
msgid "Enable logging on this zone"
-msgstr "å¨æ¤åºåå
许è¿å
¥"
+msgstr "å¯ç¨æ¤åºåçæ¥å¿è®°å½"
msgid "External IP address"
-msgstr "å¤é¨IPå°å"
+msgstr "å¤é¨ IP å°å"
msgid "External port"
msgstr "å¤é¨ç«¯å£"
@@ -130,7 +120,7 @@ msgid "Firewall - Traffic Rules"
msgstr "é²ç«å¢ - éä¿¡è§å"
msgid "Firewall - Zone Settings"
-msgstr "é²ç«å¢-åºå设置"
+msgstr "é²ç«å¢ - åºå设置"
msgid "Force connection tracking"
msgstr "强å¶è¿æ¥è¿½è¸ª"
@@ -142,16 +132,16 @@ msgid "Forward to"
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 æº MAC %s"
msgid "General Settings"
msgstr "åºæ¬è®¾ç½®"
@@ -163,13 +153,13 @@ msgid "IPv4 and IPv6"
msgstr "IPv4 å IPv6"
msgid "IPv4 only"
-msgstr "ä»
IPv4"
+msgstr "ä»
IPv4"
msgid "IPv6"
msgstr "IPv6"
msgid "IPv6 only"
-msgstr "ä»
IPv6"
+msgstr "ä»
IPv6"
msgid "Input"
msgstr "å
¥ç«æ°æ®"
@@ -178,7 +168,7 @@ msgid "Inter-Zone Forwarding"
msgstr "端å£è§¦å"
msgid "Internal IP address"
-msgstr "å
é¨IPå°å"
+msgstr "å
é¨ IP å°å"
msgid "Internal port"
msgstr "å
é¨ç«¯å£"
@@ -190,41 +180,41 @@ msgid "Limit log messages"
msgstr "éå¶æ¥å¿ä¿¡æ¯"
msgid "MSS clamping"
-msgstr "MSSé³å¶"
+msgstr "MSS é³å¶"
msgid "Masquerading"
-msgstr "IPå¨æ伪è£
"
+msgstr "IP å¨æ伪è£
"
msgid "Match"
msgstr "å¹é
è§å"
msgid "Match ICMP type"
-msgstr "å¹é
ICMPç±»å"
+msgstr "å¹é
ICMP ç±»å"
msgid "Match forwarded traffic to the given destination port or port range."
-msgstr "éè¦å¹é
转åæµéå°çç®æ 端å£æ端å£èå´"
+msgstr "å¹é
æå®ç®æ 端å£æç®æ 端å£èå´ç转åæµéã"
msgid ""
"Match incoming traffic directed at the given destination port or port range "
"on this host"
-msgstr "éè¦å¹é
å
¥ç«æµéå°çç®æ 端å£æ端å£èå´"
+msgstr "å¹é
æåæ¤ä¸»æºä¸æå®ç®æ 端å£æç®æ 端å£èå´çå
¥ç«æµéã"
msgid ""
"Match incoming traffic originating from the given source port or port range "
"on the client host."
-msgstr "éè¦å¹é
å
¥ç«æµéçæºç«¯å£æ端å£èå´"
+msgstr "å¹é
æ¥èªå®¢æ·ç«¯ä¸»æºä¸æå®æºç«¯å£ææºç«¯å£èå´çå
¥ç«æµéã"
msgid "Monday"
-msgstr ""
+msgstr "ææä¸"
msgid "Month Days"
-msgstr ""
+msgstr "æ¥æ"
msgid "Name"
msgstr "åå"
msgid "New SNAT rule"
-msgstr "æ°å»ºSNATè§å"
+msgstr "æ°å»º SNAT è§å"
msgid "New forward rule"
msgstr "æ°å»ºè½¬åè§å"
@@ -236,21 +226,21 @@ msgid "New port forward"
msgstr "æ°å»ºç«¯å£è½¬å"
msgid "New source NAT"
-msgstr "æ°å»ºSource NAT"
+msgstr "æ°å»º Source NAT"
msgid "Only match incoming traffic directed at the given IP address."
-msgstr "éè¦å¹é
å
¥ç«æµéçæºIP"
+msgstr "ä»
å¹é
æå®ç®ç IP å°åçå
¥ç«æµéã"
msgid "Only match incoming traffic from these MACs."
-msgstr "éè¦å¹é
å
¥ç«æµéçæºMACsï¼å¯ä»¥ä¸ºå¤ä¸ªï¼"
+msgstr "ä»
å¹é
æ¥èªè¿äº MAC çå
¥ç«æµéã"
msgid "Only match incoming traffic from this IP or range."
-msgstr "éè¦å¹é
å
¥ç«æµéçæºIPæIPèå´"
+msgstr "ä»
å¹é
æ¥èªæ¤ IP æ IP èå´çå
¥ç«æµéã"
msgid ""
"Only match incoming traffic originating from the given source port or port "
"range on the client host"
-msgstr "éè¦å¹é
å
¥ç«æµéçæºç«¯å£æ端å£èå´"
+msgstr "ä»
å¹é
æºèªå®¢æ·ç«¯ä¸»æºä¸ç»å®æºç«¯å£ææºç«¯å£èå´çå
¥ç«æµéã"
msgid "Open ports on router"
msgstr "æå¼è·¯ç±å¨ç«¯å£"
@@ -262,7 +252,7 @@ msgid "Output"
msgstr "åºç«æ°æ®"
msgid "Passes additional arguments to iptables. Use with care!"
-msgstr "ä¼ éå°iptablesçé¢å¤åæ°ãå°å¿ä½¿ç¨ï¼"
+msgstr "ä¼ éå° iptables çé¢å¤åæ°ãå°å¿ä½¿ç¨ï¼"
msgid "Port Forwards"
msgstr "端å£è½¬å"
@@ -270,7 +260,8 @@ msgstr "端å£è½¬å"
msgid ""
"Port forwarding allows remote computers on the Internet to connect to a "
"specific computer or service within the private LAN."
-msgstr "端å£è½¬åå
许æ¥èªInternetç计ç®æºè®¿é®ç§æå±åç½å
ç计ç®æºææå¡"
+msgstr ""
+"端å£è½¬åå
许 Internet ä¸çè¿ç¨è®¡ç®æºè¿æ¥å°å
é¨ç½ç»ä¸çç¹å®è®¡ç®æºææå¡ã"
msgid "Protocol"
msgstr "åè®®"
@@ -280,27 +271,27 @@ msgid ""
msgstr "éå®åå¹é
çå
¥ç«æµéå°å
é¨ä¸»æºç端å£"
msgid "Redirect matched incoming traffic to the specified internal host"
-msgstr "éå®åå¹é
çå
¥ç«æµéå°çå
é¨ä¸»æº"
+msgstr "éå®åå¹é
çå
¥ç«æµéå°æå®çå
é¨ä¸»æº"
msgid "Restart Firewall"
-msgstr ""
+msgstr "éå¯é²ç«å¢"
msgid "Restrict Masquerading to given destination subnets"
-msgstr "è¦éå¶IPå¨æ伪è£
çç®æ åç½"
+msgstr "è¦éå¶ IP å¨æ伪è£
çç®æ åç½"
msgid "Restrict Masquerading to given source subnets"
-msgstr "è¦éå¶IPå¨æ伪è£
çæºåç½"
+msgstr "è¦éå¶ IP å¨æ伪è£
çæºåç½"
msgid "Restrict to address family"
msgstr "éå¶å°å"
msgid "Rewrite matched traffic to the given address."
-msgstr "å°å¹é
æµéçæºå°åæ¹åææå®å°å"
+msgstr "å°å¹é
æµéçæºå°åæ¹åææå®å°åã"
msgid ""
"Rewrite matched traffic to the given source port. May be left empty to only "
"rewrite the IP address."
-msgstr "å°å¹é
æµéçæºç«¯å£æ¹åææå®ç«¯å£ãä¹å¯ä»¥ç空ï¼åªæ¹åIPå°åã"
+msgstr "å°å¹é
æµéçæºç«¯å£æ¹åææå®ç«¯å£ãç空åªæ¹å IP å°åã"
msgid "Rewrite to source %s"
msgstr "æºå°åæ¹åæ %s"
@@ -309,49 +300,19 @@ msgid "Rewrite to source %s, %s"
msgstr "æºå°åæ¹åæ %s, %s"
msgid "SNAT IP address"
-msgstr "SNAT IPå°å"
+msgstr "SNAT IP å°å"
msgid "SNAT port"
msgstr "SNAT 端å£"
msgid "Saturday"
-msgstr ""
+msgstr "ææå
"
-# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
-# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
-# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
-#
-# msgid "Traffic Redirection"
-# msgstr ""
-#
-# msgid ""
-# "Traffic redirection allows you to change the destination address of "
-# "forwarded packets."
-# msgstr ""
-#
-# msgid "Overview"
-# msgstr ""
-#
-# msgid "Name"
-# msgstr ""
-#
-# msgid "Source zone"
-# msgstr ""
-#
-# msgid "Source MAC-address"
-# msgstr ""
-#
-# msgid "Source port"
-# msgstr ""
-#
-# msgid "Protocol"
-# msgstr ""
-#
msgid "Source IP address"
-msgstr "æºIPå°å"
+msgstr "æº IP å°å"
msgid "Source MAC address"
-msgstr "æºMACå°å"
+msgstr "æº MAC å°å"
msgid "Source NAT"
msgstr "Source NAT"
@@ -361,8 +322,8 @@ msgid ""
"control over the source IP used for outgoing traffic, for example to map "
"multiple WAN addresses to internal subnets."
msgstr ""
-"Source NATæ¯ä¸ç§ç¹æ®å½¢å¼çå°å
伪è£
ï¼å®å
许精ç»çæ§å¶ä¼ åºæµéçæºIPï¼ä¾å¦ï¼å°"
-"å¤ä¸ªWANå°åæ å°å°å
é¨åç½ã"
+"Source NAT æ¯ä¸ç§ç¹æ®å½¢å¼çå°å
伪è£
ï¼å®å
许精ç»çæ§å¶ä¼ åºæµéçæº IPï¼ä¾å¦ï¼"
+"å°å¤ä¸ª WAN å°åæ å°å°å
é¨åç½ã"
msgid "Source address"
msgstr "æºå°å"
@@ -374,24 +335,24 @@ msgid "Source zone"
msgstr "æºåºå"
msgid "Start Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "å¼å§æ¥æï¼yyyy-mm-ddï¼"
msgid "Start Time (hh:mm:ss)"
-msgstr ""
+msgstr "å¼å§æ¶é´ï¼hh:mm:ssï¼"
msgid "Stop Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "åæ¢æ¥æï¼yyyy-mm-ddï¼"
msgid "Stop Time (hh:mm:ss)"
-msgstr ""
+msgstr "åæ¢æ¶é´ï¼hh:mm:ssï¼"
msgid "Sunday"
-msgstr ""
+msgstr "æææ¥"
msgid ""
"The firewall creates zones over your network interfaces to control network "
"traffic flow."
-msgstr "é²ç«å¢æç½ç»æ¥å£å为ä¸åçåºåè¿è¡ç®¡ç"
+msgstr "é²ç«å¢éè¿å¨ç½ç»æ¥å£ä¸å建åºåæ¥æ§å¶ç½ç»æµéã"
msgid ""
"The options below control the forwarding policies between this zone (%s) and "
@@ -401,10 +362,10 @@ msgid ""
"rule is unidirectional , e.g. a forward from lan to wan does "
"not imply a permission to forward from wan to lan as well."
msgstr ""
-"以ä¸é项å¯ä»¥æ§å¶åºå(%s)åå
¶å®åºåé´ç转åè§åã ç®æ åºå æ¥æ¶"
-"ä»%q 转åçæµéãæºåºå å¹é
ä»ç®æ 为%q"
-"strong>çåºåçé转åæµéã以ä¸è§åæ æ³è½¬å ,ä¾å¦ï¼è½¬ålanæµéå°wanï¼"
-"ä½æ¯ä¸å
许 ä»wan转åå°lanã"
+"以ä¸é项å¯ä»¥æ§å¶åºåï¼%sï¼åå
¶å®åºåé´ç转åè§åãç®æ åºå æ¥æ¶"
+"æºèª %q ç转åæµéãæºåºå å¹é
ä»ç®æ 为 %q"
+"strong> çåºåçé转åæµéã转åè§åçä½ç¨æ¯åå çï¼ä¾å¦ï¼ä¸æ¡å
许"
+"ä» lan å° wan ç转åè§å并ä¸éå«æå
许ç¸åæ¹åä» wan å° lan çæµé转åã"
msgid ""
"This page allows you to change advanced properties of the port forwarding "
@@ -416,7 +377,6 @@ msgid ""
"entry, such as matched source and destination hosts."
msgstr "æ¬é¡µé¢å¯ä»¥æ´æ¹éä¿¡è§åçé«çº§è®¾ç½®ï¼æ¯å¦ï¼éå¹é
çæºä¸»æºåç®æ 主æºã"
-#, fuzzy
msgid ""
"This section defines common properties of %q. The input and "
"output options set the default policies for traffic entering and "
@@ -424,19 +384,18 @@ msgid ""
"forwarded traffic between different networks within the zone. Covered "
"networks specifies which available networks are members of this zone."
msgstr ""
-"æ¬èå®ä¹ %q çéç¨å±æ§ï¼ å
¥ç«æ°æ® å åºç«æ°æ® è§åç¨äºè®¾ç½®æ°"
-"æ®å
âè¿âåâåºâè·¯ç±å¨ï¼æ个æ¥å£ï¼é»è®¤ç转åååï¼è½¬å è§åç¨äºç¹å®ï¼ä¸"
-"个æå¤ä¸ªï¼åºåçä¸ååç½ä¹é´çæ°æ®å
转åãè¦çç½ç» éæ©ä»å±äºè¿ä¸ªåºå"
-"çç½ç»ã"
+"æ¬èå®ä¹ %q çéç¨å±æ§ï¼ å
¥ç«æ°æ® ååºç«æ°æ® é项ç¨äºè®¾ç½®æ¤åº"
+"åå
¥ç«ååºç«æµéçé»è®¤çç¥ï¼è½¬å é项æ述该åºåå
ä¸åç½ç»ä¹é´çæµé转"
+"åçç¥ãè¦çç½ç» æå®ä»å±äºè¿ä¸ªåºåçç½ç»ã"
msgid "Thursday"
-msgstr ""
+msgstr "ææå"
msgid "Time in UTC"
-msgstr ""
+msgstr "UTC æ¶é´"
msgid "To %s at %s on this device "
-msgstr "å° %s at %s ä½äºæ¬è®¾å¤ "
+msgstr "å° %s å¨ %s ä½äºæ¬è®¾å¤ "
msgid "To %s in %s"
msgstr "å° %s ä½äº %s"
@@ -448,7 +407,7 @@ msgid "To %s, %s in %s"
msgstr "å° %s, %s ä½äº %s"
msgid "To source IP"
-msgstr "å°æºIP"
+msgstr "å°æº IP"
msgid "To source port"
msgstr "å°æºç«¯å£"
@@ -461,23 +420,23 @@ msgid ""
"for example to reject traffic between certain hosts or to open WAN ports on "
"the router."
msgstr ""
-"éä¿¡è§åå®ä¹äºä¸ååºåé´çæµéä¼ éï¼ä¾å¦ï¼æç»ä¸äºä¸»æºä¹é´çéä¿¡ãæå¼å°WANç"
-"端å£ã"
+"éä¿¡è§åå®ä¹äºä¸ååºåé´çæ°æ®å
ä¼ è¾çç¥ï¼ä¾å¦ï¼æç»ä¸äºä¸»æºä¹é´çéä¿¡ï¼å¼æ¾"
+"è·¯ç±å¨ WAN ä¸ç端å£ã"
msgid "Tuesday"
-msgstr ""
+msgstr "ææäº"
msgid "Via %s"
msgstr "éè¿ %s"
msgid "Via %s at %s"
-msgstr "éè¿ %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 "
@@ -503,13 +462,13 @@ msgid "any host"
msgstr "ææ主æº"
msgid "any router IP"
-msgstr "ææè·¯ç±å°å"
+msgstr "ææè·¯ç± IP"
msgid "any zone"
msgstr "ææåºå"
msgid "don't track"
-msgstr "æ å¨ä½"
+msgstr "ä¸è·è¸ª"
msgid "drop"
msgstr "丢å¼"
@@ -518,4 +477,4 @@ msgid "reject"
msgstr "æç»"
msgid "traffic"
-msgstr "交é"
+msgstr "éä¿¡"
diff --git a/applications/luci-app-firewall/po/zh-tw/firewall.po b/applications/luci-app-firewall/po/zh-tw/firewall.po
index b89cfab7f..fff89cbcd 100644
--- a/applications/luci-app-firewall/po/zh-tw/firewall.po
+++ b/applications/luci-app-firewall/po/zh-tw/firewall.po
@@ -66,11 +66,11 @@ msgid "Custom Rules"
msgstr "èªè¨çè¦å群"
msgid ""
-"Custom rules allow you to execute arbritary iptables commands which are not "
+"Custom rules allow you to execute arbitrary iptables commands which are not "
"otherwise covered by the firewall framework. The commands are executed after "
"each firewall restart, right after the default ruleset has been loaded."
msgstr ""
-"èªå®ç¾©è¦åå
è¨±ä½ å·è¡éæ¯ä¸ä»¥å
¶ä»æ¹å¼æ¶åçé²ç«çæ¡æ¶arbritaryçiptableså½ä»¤ã"
+"èªå®ç¾©è¦åå
è¨±ä½ å·è¡éæ¯ä¸ä»¥å
¶ä»æ¹å¼æ¶åçé²ç«çæ¡æ¶arbitraryçiptableså½ä»¤ã"
"該å½ä»¤æ¯æ¯åé²ç«çéåå¾å·è¡ï¼é»èªè¦åéå·²ç¶å è¼ä¹å¾ã"
msgid "Destination IP address"
diff --git a/applications/luci-app-mwan3/luasrc/controller/mwan3.lua b/applications/luci-app-mwan3/luasrc/controller/mwan3.lua
index ca39c9bf3..c24beda28 100644
--- a/applications/luci-app-mwan3/luasrc/controller/mwan3.lua
+++ b/applications/luci-app-mwan3/luasrc/controller/mwan3.lua
@@ -29,6 +29,8 @@ function index()
entry({"admin", "network", "mwan", "configuration"},
alias("admin", "network", "mwan", "configuration", "interface"),
_("Configuration"), 20)
+ entry({"admin", "network", "mwan", "configuration", "globals"},
+ cbi("mwan/globalsconfig"),_("Globals"), 5).leaf = true
entry({"admin", "network", "mwan", "configuration", "interface"},
arcombine(cbi("mwan/interface"), cbi("mwan/interfaceconfig")),
_("Interfaces"), 10).leaf = true
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua
index 0e7b8b11d..1b9708021 100644
--- a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua
+++ b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua
@@ -1,55 +1,40 @@
-- ------ hotplug script configuration ------ --
fs = require "nixio.fs"
-sys = require "luci.sys"
ut = require "luci.util"
-script = "/etc/hotplug.d/iface/16-mwancustom"
-scriptBackup = "/etc/hotplug.d/iface/16-mwancustombak"
-
-if luci.http.formvalue("cbid.luci.1._restorebak") then -- restore button has been clicked
- luci.http.redirect(luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript") .. "?restore=yes")
-elseif luci.http.formvalue("restore") == "yes" then -- restore script from backup
- os.execute("cp -f " .. scriptBackup .. " " .. script)
-end
-
+script = "/etc/mwan3.user"
m5 = SimpleForm("luci", nil)
m5:append(Template("mwan/advanced_hotplugscript")) -- highlight current tab
f = m5:section(SimpleSection, nil,
- translate("This section allows you to modify the contents of /etc/hotplug.d/iface/16-mwancustom " ..
- "This is useful for running system commands and/or scripts based on interface ifup or ifdown hotplug events " ..
+ translate("This section allows you to modify the content of \"/etc/mwan3.user\". " ..
+ "The file is also preserved during sysupgrade. " ..
+ " " ..
"Notes: " ..
- "The first line of the script must be "#!/bin/sh" without quotes " ..
- "Lines beginning with # are comments and are not executed " ..
- "Available variables: " ..
- "$ACTION is the hotplug event (ifup, ifdown) " ..
- "$INTERFACE is the interface name (wan1, wan2, etc.) " ..
- "$DEVICE is the device name attached to the interface (eth0.1, eth1, etc.)"))
-
-
-restore = f:option(Button, "_restorebak", translate("Restore default hotplug script"))
- restore.inputtitle = translate("Restore...")
- restore.inputstyle = "apply"
+ "This file is interpreted as a shell script. " ..
+ "The first line of the script must be "#!/bin/sh" without quotes. " ..
+ "Lines beginning with # are comments and are not executed. " ..
+ "Put your custom mwan3 action here, they will " ..
+ "be executed with each netifd hotplug interface event " ..
+ "on interfaces for which mwan3 is enabled. " ..
+ " " ..
+ "There are three main environment variables that are passed to this script. " ..
+ " " ..
+ "$ACTION Either \"ifup\" or \"ifdown\" " ..
+ "$INTERFACE Name of the interface which went up or down (e.g. \"wan\" or \"wwan\") " ..
+ "$DEVICE Physical device name which interface went up or down (e.g. \"eth0\" or \"wwan0\") " ..
+ " "))
t = f:option(TextValue, "lines")
t.rmempty = true
t.rows = 20
-
function t.cfgvalue()
- local hps = fs.readfile(script)
- if not hps or hps == "" then -- if script does not exist or is blank restore from backup
- sys.call("cp -f " .. scriptBackup .. " " .. script)
- return fs.readfile(script)
- else
- return hps
- end
+ return fs.readfile(script)
end
-
function t.write(self, section, data) -- format and write new data to script
return fs.writefile(script, ut.trim(data:gsub("\r\n", "\n")) .. "\n")
end
-
return m5
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/globalsconfig.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/globalsconfig.lua
new file mode 100644
index 000000000..919ed46cd
--- /dev/null
+++ b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/globalsconfig.lua
@@ -0,0 +1,40 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2017 Florian Eckert
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local net = require "luci.model.network".init()
+
+m = Map("mwan3")
+
+s = m:section(NamedSection, "globals", "globals", translate("Globals mwan3 options"))
+n = s:option(ListValue, "local_source",
+ translate("Local source interface"),
+ translate("Use the IP address of this interface as source IP address for traffic initiated by the router itself"))
+n:value("none")
+n.default = "none"
+for _, net in ipairs(net:get_networks()) do
+ if net:name() ~= "loopback" then
+ n:value(net:name())
+ end
+end
+n.rmempty = false
+
+mask = s:option(
+ Value,
+ "mmx_mask",
+ translate("Firewall mask"),
+ translate("Enter value in hex, starting with 0x
"))
+mask.datatype = "hex(4)"
+mask.default = "0xff00"
+
+return m
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interface.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interface.lua
index aeabc6361..c8c122ad4 100644
--- a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interface.lua
+++ b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interface.lua
@@ -147,6 +147,16 @@ track_ip = mwan_interface:option(DummyValue, "track_ip", translate("Tracking IP"
end
end
+track_method = mwan_interface:option(DummyValue, "track_method", translate("Tracking method"))
+ track_method.rawhtml = true
+ function track_method.cfgvalue(self, s)
+ if tracked then
+ return self.map:get(s, "track_method") or "—"
+ else
+ return "—"
+ end
+ end
+
reliability = mwan_interface:option(DummyValue, "reliability", translate("Tracking reliability"))
reliability.rawhtml = true
function reliability.cfgvalue(self, s)
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua
index 2b4637639..0318091d6 100644
--- a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua
+++ b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua
@@ -102,6 +102,12 @@ enabled = mwan_interface:option(ListValue, "enabled", translate("Enabled"))
enabled:value("1", translate("Yes"))
enabled:value("0", translate("No"))
+initial_state = mwan_interface:option(ListValue, "initial_state", translate("Initial state"),
+ translate("Expect interface state on up event"))
+ initial_state.default = "online"
+ initial_state:value("online", translate("Online"))
+ initial_state:value("offline", translate("Offline"))
+
family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
family.default = "ipv4"
family:value("ipv4", translate("IPv4"))
@@ -111,6 +117,12 @@ track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking ho
translate("This hostname or IP address will be pinged to determine if the link is up or down. Leave blank to assume interface is always online"))
track_ip.datatype = "host"
+track_method = mwan_interface:option(ListValue, "track_method", translate("Tracking method"))
+ track_method.default = "ping"
+ track_method:value("ping")
+ track_method:value("arping")
+ track_method:value("httping")
+
reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
reliability.datatype = "range(1, 100)"
@@ -183,6 +195,10 @@ failure = mwan_interface:option(Value, "failure_interval", translate("Failure in
failure:value("1800", translatef("%d minutes", 30))
failure:value("3600", translatef("%d hour", 1))
+keep_failure = mwan_interface:option(Flag, "keep_failure_interval", translate("Keep failure interval"),
+ translate("Keep ping failure interval during failure state"))
+ keep_failure.default = keep_failure.disabled
+
recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
translate("Ping interval during failure recovering"))
recovery.default = "5"
diff --git a/applications/luci-app-mwan3/po/ja/mwan3.po b/applications/luci-app-mwan3/po/ja/mwan3.po
index 925912e3c..89fa5ea02 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.2\n"
+"X-Generator: Poedit 2.0.3\n"
"Last-Translator: INAGAKI Hiroshi \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ja\n"
@@ -47,7 +47,7 @@ msgid "Check routing table"
msgstr "ã«ã¼ãã£ã³ã° ãã¼ãã«ã®ãã§ãã¯"
msgid "Collecting data..."
-msgstr ""
+msgstr "ãã¼ã¿åéä¸ã§ã..."
msgid "Configuration"
msgstr "è¨å®"
@@ -77,7 +77,7 @@ msgid "Diagnostics"
msgstr "診ææ©è½"
msgid "Disabled"
-msgstr ""
+msgstr "ç¡å¹"
msgid ""
"Downed interface will be deemed up after this many successful ping tests"
@@ -89,11 +89,14 @@ msgid "Enabled"
msgstr "æå¹"
msgid "Error collecting troubleshooting information"
-msgstr ""
+msgstr "ãã©ãã«ã·ã¥ã¼ãã£ã³ã°æ
å ±ã®åéã¨ã©ã¼"
msgid "Errors"
msgstr "ã¨ã©ã¼"
+msgid "Expect interface state on up event"
+msgstr ""
+
msgid "Failure interval"
msgstr "é害æ¤åº ã¤ã³ã¿ã¼ãã«"
@@ -103,6 +106,12 @@ msgstr ""
msgid "Flush global firewall conntrack table on interface events"
msgstr ""
+msgid "Globals"
+msgstr ""
+
+msgid "Globals mwan3 options"
+msgstr ""
+
msgid "Hotplug Script"
msgstr "ããããã©ã° ã¹ã¯ãªãã"
@@ -121,6 +130,9 @@ msgstr "IPv4"
msgid "IPv6"
msgstr "IPv6"
+msgid "Initial state"
+msgstr ""
+
msgid "Interface"
msgstr "ã¤ã³ã¿ã¼ãã§ã¼ã¹"
@@ -144,9 +156,15 @@ msgstr "ã¤ã³ã¿ã¼ãã§ã¼ã¹"
msgid "Internet Protocol"
msgstr "ã¤ã³ã¿ã¼ããã ãããã³ã«"
-msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
+msgid "Keep failure interval"
msgstr ""
+msgid "Keep ping failure interval during failure state"
+msgstr ""
+
+msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
+msgstr "ç´è¿ã® MWAN ã·ã¹ãã ãã°ï¼50è¡ï¼ã§ããä¸çªä¸ãææ°ã®è¡ã§ã:"
+
msgid "Last resort"
msgstr "æçµæ段"
@@ -156,6 +174,9 @@ msgstr "è² è·åæ£"
msgid "Loading"
msgstr "èªè¾¼ä¸"
+msgid "Local source interface"
+msgstr ""
+
msgid "MWAN Config"
msgstr "MWAN è¨å®"
@@ -222,7 +243,7 @@ msgstr ""
"ï¼ä¾: \"1024:2048\"ï¼ããã¯ãªã¼ãã¼ã·ã§ã³ç¡ãã§æå®ãããã¨ãã§ãã¾ãã"
msgid "Member"
-msgstr ""
+msgstr "ã¡ã³ãã¼"
msgid "Member used"
msgstr "使ç¨ãããã¡ã³ãã¼"
@@ -260,28 +281,31 @@ msgid "No"
msgstr "ããã"
msgid "No MWAN interfaces found"
-msgstr ""
+msgstr "MWAN ã¤ã³ã¿ã¼ãã§ã¼ã¹ãè¦ã¤ããã¾ãã"
msgid "No MWAN systemlog history found"
-msgstr ""
+msgstr "MWAN ã·ã¹ãã ãã°ã®å±¥æ´ãè¦ã¤ããã¾ãã"
msgid "No detailed status information available"
-msgstr ""
+msgstr "詳細ã¹ãã¼ã¿ã¹æ
å ±ã¯å©ç¨ã§ãã¾ãã"
msgid "No diagnostic results returned"
-msgstr ""
+msgstr "診æçµæãããã¾ãã"
msgid "No protocol specified"
-msgstr ""
+msgstr "ãããã³ã«ãè¨å®ããã¦ãã¾ãã"
msgid "Offline"
+msgstr "ãªãã©ã¤ã³"
+
+msgid "Online"
msgstr ""
msgid "Online (tracking active)"
-msgstr ""
+msgstr "ãªã³ã©ã¤ã³ï¼è¿½è·¡å®è¡ä¸ï¼"
msgid "Online (tracking off)"
-msgstr ""
+msgstr "ãªã³ã©ã¤ã³ï¼è¿½è·¡ãªãï¼"
msgid "Overview"
msgstr "æ¦è¦"
@@ -332,7 +356,7 @@ msgstr ""
"ã¿ã¼ãã§ã¼ã¹ãã¡ã³ãã¼ãã«ã¼ã«ã¨åãååã使ç¨ãããã¨ã¯ã§ãã¾ããã"
msgid "Policy"
-msgstr ""
+msgstr "ããªã·ã¼"
msgid "Policy assigned"
msgstr "ã¢ãµã¤ã³æ¸ã¿ããªã·ã¼"
@@ -353,7 +377,7 @@ msgid "Restore..."
msgstr "復å
..."
msgid "Rule"
-msgstr ""
+msgstr "ã«ã¼ã«"
msgid "Rules"
msgstr "ã«ã¼ã«"
@@ -477,6 +501,11 @@ msgstr "ãã©ãã«ã·ã¥ã¼ãã£ã³ã°"
msgid "Troubleshooting Data"
msgstr "ãã©ãã«ã·ã¥ã¼ãã£ã³ã° ãã¼ã¿"
+msgid ""
+"Use the IP address of this interface as source IP address for traffic "
+"initiated by the router itself"
+msgstr ""
+
msgid "View the contents of /etc/protocols for protocol descriptions"
msgstr "ãããã³ã«ã®èª¬æã«ã¤ãã¦ã¯ã /etc/protocols ã®å
容ã確èªãã¦ãã ããã"
@@ -575,10 +604,10 @@ msgstr ""
"ãã¾ããï¼ãããã³ã«ãæå®ãç´ãã¦ãã ããï¼"
msgid "Waiting for MWAN to %s..."
-msgstr ""
+msgstr "MWAN ã® %s ãå¾
ã£ã¦ãã¾ã..."
msgid "Waiting for diagnostic results..."
-msgstr ""
+msgstr "診æçµæãå¾
ã£ã¦ãã¾ã..."
msgid "Weight"
msgstr "ã¦ã¨ã¤ã"
@@ -614,13 +643,13 @@ msgid "never"
msgstr "never"
msgid "restart"
-msgstr ""
+msgstr "åèµ·å"
msgid "start"
-msgstr ""
+msgstr "èµ·å"
msgid "stop"
-msgstr ""
+msgstr "åæ¢"
msgid "unreachable (reject)"
msgstr "unreachable (reject)"
diff --git a/applications/luci-app-mwan3/po/templates/mwan3.pot b/applications/luci-app-mwan3/po/templates/mwan3.pot
index 3d25e844a..9e17c3d04 100644
--- a/applications/luci-app-mwan3/po/templates/mwan3.pot
+++ b/applications/luci-app-mwan3/po/templates/mwan3.pot
@@ -79,6 +79,9 @@ msgstr ""
msgid "Errors"
msgstr ""
+msgid "Expect interface state on up event"
+msgstr ""
+
msgid "Failure interval"
msgstr ""
@@ -88,6 +91,12 @@ msgstr ""
msgid "Flush global firewall conntrack table on interface events"
msgstr ""
+msgid "Globals"
+msgstr ""
+
+msgid "Globals mwan3 options"
+msgstr ""
+
msgid "Hotplug Script"
msgstr ""
@@ -106,6 +115,9 @@ msgstr ""
msgid "IPv6"
msgstr ""
+msgid "Initial state"
+msgstr ""
+
msgid "Interface"
msgstr ""
@@ -127,6 +139,12 @@ msgstr ""
msgid "Internet Protocol"
msgstr ""
+msgid "Keep failure interval"
+msgstr ""
+
+msgid "Keep ping failure interval during failure state"
+msgstr ""
+
msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
msgstr ""
@@ -139,6 +157,9 @@ msgstr ""
msgid "Loading"
msgstr ""
+msgid "Local source interface"
+msgstr ""
+
msgid "MWAN Config"
msgstr ""
@@ -245,6 +266,9 @@ msgstr ""
msgid "Offline"
msgstr ""
+msgid "Online"
+msgstr ""
+
msgid "Online (tracking active)"
msgstr ""
@@ -391,6 +415,9 @@ msgstr ""
msgid "Tracking hostname or IP address"
msgstr ""
+msgid "Tracking method"
+msgstr ""
+
msgid "Tracking reliability"
msgstr ""
@@ -408,6 +435,11 @@ msgstr ""
msgid "Troubleshooting Data"
msgstr ""
+msgid ""
+"Use the IP address of this interface as source IP address for traffic "
+"initiated by the router itself"
+msgstr ""
+
msgid "View the contents of /etc/protocols for protocol descriptions"
msgstr ""
diff --git a/applications/luci-app-mwan3/po/zh-cn/mwan3.po b/applications/luci-app-mwan3/po/zh-cn/mwan3.po
index 1e0f34f08..3c505d847 100644
--- a/applications/luci-app-mwan3/po/zh-cn/mwan3.po
+++ b/applications/luci-app-mwan3/po/zh-cn/mwan3.po
@@ -82,6 +82,9 @@ msgstr "æ¶éæ
éæé¤ä¿¡æ¯æ¶åºé"
msgid "Errors"
msgstr "é误"
+msgid "Expect interface state on up event"
+msgstr ""
+
msgid "Failure interval"
msgstr "æ
éæ£æµé´é"
@@ -91,6 +94,12 @@ msgstr "å·æ°è¿æ¥è·è¸ªè¡¨"
msgid "Flush global firewall conntrack table on interface events"
msgstr "å¨æ¥å£äºä»¶è§¦åæ¶å·æ°å
¨å±é²ç«å¢è¿æ¥è·è¸ªè¡¨"
+msgid "Globals"
+msgstr ""
+
+msgid "Globals mwan3 options"
+msgstr ""
+
msgid "Hotplug Script"
msgstr "Hotplug èæ¬"
@@ -109,6 +118,9 @@ msgstr "IPv4"
msgid "IPv6"
msgstr "IPv6"
+msgid "Initial state"
+msgstr ""
+
msgid "Interface"
msgstr "æ¥å£"
@@ -130,6 +142,12 @@ msgstr "æ¥å£"
msgid "Internet Protocol"
msgstr "äºèç½åè®®"
+msgid "Keep failure interval"
+msgstr ""
+
+msgid "Keep ping failure interval during failure state"
+msgstr ""
+
msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
msgstr "æè¿ 50 æ¡ MWAN ç³»ç»æ¥å¿ï¼ææ°æ¡ç®æå¨é¡¶é¨:"
@@ -142,6 +160,9 @@ msgstr "è´è½½åè¡¡"
msgid "Loading"
msgstr "è½½å
¥ä¸"
+msgid "Local source interface"
+msgstr ""
+
msgid "MWAN Config"
msgstr "MWAN é
ç½®æ件"
@@ -260,6 +281,9 @@ msgstr "æªæå®åè®®"
msgid "Offline"
msgstr "离线"
+msgid "Online"
+msgstr ""
+
msgid "Online (tracking active)"
msgstr "å¨çº¿ï¼è¿½è¸ªå¯ç¨ä¸ï¼"
@@ -443,6 +467,11 @@ msgstr "æ
éæé¤"
msgid "Troubleshooting Data"
msgstr "æ
éæé¤æ°æ®"
+msgid ""
+"Use the IP address of this interface as source IP address for traffic "
+"initiated by the router itself"
+msgstr ""
+
msgid "View the contents of /etc/protocols for protocol descriptions"
msgstr "请æ¥ç /etc/protocols è·åå¯éå议详æ
"
diff --git a/applications/luci-app-mwan3/root/etc/uci-defaults/60_luci-mwan3 b/applications/luci-app-mwan3/root/etc/uci-defaults/60_luci-mwan3
index ff9a229ed..509a69436 100755
--- a/applications/luci-app-mwan3/root/etc/uci-defaults/60_luci-mwan3
+++ b/applications/luci-app-mwan3/root/etc/uci-defaults/60_luci-mwan3
@@ -8,6 +8,13 @@ uci -q batch <<-EOF >/dev/null
commit ucitrack
EOF
+uci -q get mwan3.globals >/dev/null || {
+ uci -q add mwan3 globals >/dev/null
+ uci -q rename mwan3.@globals[-1]="globals" >/dev/null
+ uci -q set mwan3.globals.initial_source="none" >/dev/null
+ uci commit mwan3
+}
+
# remove LuCI cache
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
diff --git a/applications/luci-app-nlbwmon/Makefile b/applications/luci-app-nlbwmon/Makefile
new file mode 100644
index 000000000..a00177f2c
--- /dev/null
+++ b/applications/luci-app-nlbwmon/Makefile
@@ -0,0 +1,8 @@
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=Netlink based bandwidth accounting
+LUCI_DEPENDS:=+nlbwmon
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/applications/luci-app-nlbwmon/htdocs/luci-static/resources/nlbw.chart.min.js b/applications/luci-app-nlbwmon/htdocs/luci-static/resources/nlbw.chart.min.js
new file mode 100644
index 000000000..34e302682
--- /dev/null
+++ b/applications/luci-app-nlbwmon/htdocs/luci-static/resources/nlbw.chart.min.js
@@ -0,0 +1,68 @@
+(function(){var p=this,l=p.Chart,e=function(a){this.canvas=a.canvas;this.ctx=a;var b=function(a,b){return a["offset"+b]?a["offset"+b]:document.defaultView.getComputedStyle(a).getPropertyValue(b)};this.width=b(a.canvas,"Width")||a.canvas.width;this.height=b(a.canvas,"Height")||a.canvas.height;this.width=a.canvas.width;this.height=a.canvas.height;this.aspectRatio=this.width/this.height;d.retinaScale(this);return this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",
+showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",
+tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipTitleTemplate:"<%= label%>",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",
+multiTooltipKeyBackground:"#fff",segmentColorDefault:"#A6CEE3 #1F78B4 #B2DF8A #33A02C #FB9A99 #E31A1C #FDBF6F #FF7F00 #CAB2D6 #6A3D9A #B4B482 #B15928".split(" "),segmentHighlightColorDefaults:"#CEF6FF #47A0DC #DAFFB2 #5BC854 #FFC2C1 #FF4244 #FFE797 #FFA728 #F2DAFE #9265C2 #DCDCAA #D98150".split(" "),onAnimationProgress:function(){},onAnimationComplete:function(){}}};e.types={};var d=e.helpers={},k=d.each=function(a,b,c){var f=Array.prototype.slice.call(arguments,3);if(a)if(a.length===+a.length){var d;
+for(d=0;db)return b}else if(u(c)&&aa.indexOf("e-"))return a.split(".")[1].length;if(0>a.indexOf("."))return parseInt(a.split("e-")[1]);a=a.split(".")[1].split("e-");return a[0].length+parseInt(a[1])}return 0},B=d.radians=function(a){return Math.PI/180*a};d.getAngleFromPoint=function(a,b){var c=b.x-a.x,f=b.y-a.y,d=Math.sqrt(c*c+f*f),m=2*Math.PI+Math.atan2(f,c);0>c&&0>f&&(m+=
+2*Math.PI);return{angle:m,distance:d}};var F=d.aliasPixel=function(a){return 0===a%2?0:.5};d.splineCurve=function(a,b,c,f){var d=Math.sqrt(Math.pow(b.x-a.x,2)+Math.pow(b.y-a.y,2)),m=Math.sqrt(Math.pow(c.x-b.x,2)+Math.pow(c.y-b.y,2)),g=f*d/(d+m);f=f*m/(d+m);return{inner:{x:b.x-g*(c.x-a.x),y:b.y-g*(c.y-a.y)},outer:{x:b.x+f*(c.x-a.x),y:b.y+f*(c.y-a.y)}}};var N=d.calculateOrderOfMagnitude=function(a){return Math.floor(Math.log(a)/Math.LN10)};d.calculateScaleRange=function(a,b,c,f,d){b=Math.floor(b/(1.5*
+c));c=2>=b;var m=[];k(a,function(a){null==a||m.push(a)});var g=w(m),e=y(m);e===g&&(e+=.5,.5<=g&&!f?g-=.5:e+=.5);a=N(Math.abs(e-g));f=f?0:Math.floor(g/(1*Math.pow(10,a)))*Math.pow(10,a);for(var e=Math.ceil(e/(1*Math.pow(10,a)))*Math.pow(10,a)-f,g=Math.pow(10,a),n=Math.round(e/g);(n>b||2*nb)g*=2,n=Math.round(e/g),0!==n%1&&(c=!0);else if(d&&0<=a)if(0===g/2%1)g/=2,n=Math.round(e/g);else break;else g/=2,n=Math.round(e/g);c&&(n=2,g=e/n);return{steps:n,stepValue:g,min:f,max:f+n*g}};var t=d.template=
+function(a,b){if(a instanceof Function)return a(b);var c={},c=/\W/.test(a)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):c[a]=c[a];return b?c(b):c};d.generateLabels=function(a,b,c,f){var d=Array(b);a&&k(d,function(b,e){d[e]=t(a,{value:c+
+f*(e+1)})});return d};var x=d.easingEffects={linear:function(a){return a},easeInQuad:function(a){return a*a},easeOutQuad:function(a){return-1*a*(a-2)},easeInOutQuad:function(a){return 1>(a/=.5)?.5*a*a:-.5*(--a*(a-2)-1)},easeInCubic:function(a){return a*a*a},easeOutCubic:function(a){return 1*((a=a/1-1)*a*a+1)},easeInOutCubic:function(a){return 1>(a/=.5)?.5*a*a*a:.5*((a-=2)*a*a+2)},easeInQuart:function(a){return a*a*a*a},easeOutQuart:function(a){return-1*((a=a/1-1)*a*a*a-1)},easeInOutQuart:function(a){return 1>
+(a/=.5)?.5*a*a*a*a:-.5*((a-=2)*a*a*a-2)},easeInQuint:function(a){return 1*(a/=1)*a*a*a*a},easeOutQuint:function(a){return 1*((a=a/1-1)*a*a*a*a+1)},easeInOutQuint:function(a){return 1>(a/=.5)?.5*a*a*a*a*a:.5*((a-=2)*a*a*a*a+2)},easeInSine:function(a){return-1*Math.cos(a/1*(Math.PI/2))+1},easeOutSine:function(a){return 1*Math.sin(a/1*(Math.PI/2))},easeInOutSine:function(a){return-.5*(Math.cos(Math.PI*a/1)-1)},easeInExpo:function(a){return 0===a?1:1*Math.pow(2,10*(a/1-1))},easeOutExpo:function(a){return 1===
+a?1:1*(-Math.pow(2,-10*a/1)+1)},easeInOutExpo:function(a){return 0===a?0:1===a?1:1>(a/=.5)?.5*Math.pow(2,10*(a-1)):.5*(-Math.pow(2,-10*--a)+2)},easeInCirc:function(a){return 1<=a?a:-1*(Math.sqrt(1-(a/=1)*a)-1)},easeOutCirc:function(a){return 1*Math.sqrt(1-(a=a/1-1)*a)},easeInOutCirc:function(a){return 1>(a/=.5)?-.5*(Math.sqrt(1-a*a)-1):.5*(Math.sqrt(1-(a-=2)*a)+1)},easeInElastic:function(a){var b=1.70158,c=0,f=1;if(0===a)return 0;if(1==(a/=1))return 1;c||(c=.3);fa?-.5*f*Math.pow(2,10*--a)*Math.sin(2*
+(1*a-b)*Math.PI/c):f*Math.pow(2,-10*--a)*Math.sin(2*(1*a-b)*Math.PI/c)*.5+1},easeInBack:function(a){return 1*(a/=1)*a*(2.70158*a-1.70158)},easeOutBack:function(a){return 1*((a=a/1-1)*a*(2.70158*a+1.70158)+1)},easeInOutBack:function(a){var b=1.70158;return 1>(a/=.5)?.5*a*a*(((b*=1.525)+1)*a-b):.5*((a-=2)*a*(((b*=1.525)+1)*a+b)+2)},easeInBounce:function(a){return 1-x.easeOutBounce(1-a)},easeOutBounce:function(a){return(a/=1)<1/2.75?7.5625*a*a:a<2/2.75?1*(7.5625*(a-=1.5/2.75)*a+.75):a<2.5/2.75?1*(7.5625*
+(a-=2.25/2.75)*a+.9375):1*(7.5625*(a-=2.625/2.75)*a+.984375)},easeInOutBounce:function(a){return.5>a?.5*x.easeInBounce(2*a):.5*x.easeOutBounce(2*a-1)+.5}},G=d.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){return window.setTimeout(a,1E3/60)}}();d.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||
+window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(a){return window.clearTimeout(a,1E3/60)}}();d.animationLoop=function(a,b,c,f,d,e){var g=0,k=x[c]||x.linear,n=function(){g++;var c=g/b,h=k(c);a.call(e,h,c,g);f.call(e,h,c);gf?b:f});return f},H=d.drawRoundedRectangle=function(a,b,c,f,d,e){a.beginPath();a.moveTo(b+e,c);a.lineTo(b+f-e,c);a.quadraticCurveTo(b+f,c,b+f,c+e);a.lineTo(b+f,c+d-e);a.quadraticCurveTo(b+f,c+d,b+f-e,c+d);a.lineTo(b+e,c+d);a.quadraticCurveTo(b,c+d,b,c+d-e);a.lineTo(b,c+e);a.quadraticCurveTo(b,c,b+e,c);a.closePath()};e.instances={};e.Type=function(a,b,c){this.options=b;this.chart=c;this.id=K();e.instances[this.id]=this;b.responsive&&this.resize();this.initialize.call(this,a)};r(e.Type.prototype,
+{initialize:function(){return this},clear:function(){U(this.chart);return this},stop:function(){e.animationService.cancelAnimation(this);return this},resize:function(a){this.stop();var b=this.chart.canvas,c=R(this.chart.canvas),f=this.options.maintainAspectRatio?c/this.chart.aspectRatio:S(this.chart.canvas);b.width=this.chart.width=c;b.height=this.chart.height=f;T(this.chart);"function"===typeof a&&a.apply(this,Array.prototype.slice.call(arguments,1));return this},reflow:A,render:function(a){a&&this.reflow();
+this.options.animation&&!a?(a=new e.Animation,a.numSteps=this.options.animationSteps,a.easing=this.options.animationEasing,a.render=function(a,c){var f=c.currentStep/c.numSteps,e=(0,d.easingEffects[c.easing])(f);a.draw(e,f,c.currentStep)},a.onAnimationProgress=this.options.onAnimationProgress,a.onAnimationComplete=this.options.onAnimationComplete,e.animationService.addAnimation(this,a)):(this.draw(),this.options.onAnimationComplete.call(this));return this},generateLegend:function(){return t(this.options.legendTemplate,
+this)},destroy:function(){this.clear();Q(this,this.events);var a=this.chart.canvas;a.width=this.chart.width;a.height=this.chart.height;a.style.removeProperty?(a.style.removeProperty("width"),a.style.removeProperty("height")):(a.style.removeAttribute("width"),a.style.removeAttribute("height"));delete e.instances[this.id]},showTooltip:function(a,b){"undefined"===typeof this.activeElements&&(this.activeElements=[]);if(function(a){var b=!1;if(a.length!==this.activeElements.length)return b=!0;k(a,function(a,
+c){a!==this.activeElements[c]&&(b=!0)},this);return b}.call(this,a)||b){this.activeElements=a;this.draw();this.options.customTooltips&&this.options.customTooltips(!1);if(0this.chart.width/2?h:a,y:(l+k)/2}}.call(this,f);(new e.MultiTooltip({x:c.x,y:c.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,
+fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:m,legendColors:g,legendColorBackground:this.options.multiTooltipKeyBackground,title:t(this.options.tooltipTitleTemplate,a[0]),chart:this.chart,
+ctx:this.chart.ctx,custom:this.options.customTooltips})).draw()}else k(a,function(a){var b=a.tooltipPosition();(new e.Tooltip({x:Math.round(b.x),y:Math.round(b.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,
+text:t(this.options.tooltipTemplate,a),chart:this.chart,custom:this.options.customTooltips})).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}});e.Type.extend=function(a){var b=this,c=function(){return b.apply(this,arguments)};c.prototype=h(b.prototype);r(c.prototype,a);c.extend=e.Type.extend;if(a.name||b.prototype.name){var f=a.name||b.prototype.name,d=e.defaults[b.prototype.name]?h(e.defaults[b.prototype.name]):{};e.defaults[f]=
+r(d,a.defaults);e.types[f]=c;e.prototype[f]=function(a,b){var d=I(e.defaults.global,e.defaults[f],b||{});return new c(a,d,this)}}else L("Name not provided for this chart, so it hasn't been registered");return b};e.Element=function(a){r(this,a);this.initialize.apply(this,arguments);this.save()};r(e.Element.prototype,{initialize:function(){},restore:function(a){a?k(a,function(a){this[a]=this._saved[a]},this):r(this,this._saved);return this},save:function(){this._saved=h(this);delete this._saved._saved;
+return this},update:function(a){k(a,function(a,c){this._saved[c]=this[c];this[c]=a},this);return this},transition:function(a,b){k(a,function(a,f){this[f]=(a-this._saved[f])*b+this._saved[f]},this);return this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return u(this.value)}});e.Element.extend=D;e.Point=e.Element.extend({display:!0,inRange:function(a,b){return Math.pow(a-this.x,2)+Math.pow(b-this.y,2)=this.innerRadius&&c.distance<=this.outerRadius;return(m=e:f>=e&&f<=m)&&c},tooltipPosition:function(){var a=
+this.startAngle+(this.endAngle-this.startAngle)/2,b=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(a)*b,y:this.y+Math.sin(a)*b}},draw:function(a){a=this.ctx;a.beginPath();a.arc(this.x,this.y,0>this.outerRadius?0:this.outerRadius,this.startAngle,this.endAngle);a.arc(this.x,this.y,0>this.innerRadius?0:this.innerRadius,this.endAngle,this.startAngle,!0);a.closePath();a.strokeStyle=this.strokeColor;a.lineWidth=this.strokeWidth;a.fillStyle=this.fillColor;a.fill();a.lineJoin=
+"bevel";this.showStroke&&a.stroke()}});e.Rectangle=e.Element.extend({draw:function(){var a=this.ctx,b=this.width/2,c=this.x-b,b=this.x+b,f=this.base-(this.base-this.y),d=this.strokeWidth/2;this.showStroke&&(c+=d,b-=d,f+=d);a.beginPath();a.fillStyle=this.fillColor;a.strokeStyle=this.strokeColor;a.lineWidth=this.strokeWidth;a.moveTo(c,this.base);a.lineTo(c,f);a.lineTo(b,f);a.lineTo(b,this.base);a.fill();this.showStroke&&a.stroke()},height:function(){return this.base-this.y},inRange:function(a,b){return a>=
+this.x-this.width/2&&a<=this.x+this.width/2&&b>=this.y&&b<=this.base}});e.Animation=e.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null});e.Tooltip=e.Element.extend({draw:function(){var a=this.chart.ctx;a.font=v(this.fontSize,this.fontStyle,this.fontFamily);this.xAlign="center";this.yAlign="above";var b=this.caretPadding=2,c=a.measureText(this.text).width+2*this.xPadding,f=this.fontSize+2*this.yPadding,d=f+this.caretHeight+b;this.x+
+c/2>this.chart.width?this.xAlign="left":0>this.x-c/2&&(this.xAlign="right");0>this.y-d&&(this.yAlign="below");var e=this.x-c/2,d=this.y-d;a.fillStyle=this.fillColor;if(this.custom)this.custom(this);else{switch(this.yAlign){case "above":a.beginPath();a.moveTo(this.x,this.y-b);a.lineTo(this.x+this.caretHeight,this.y-(b+this.caretHeight));a.lineTo(this.x-this.caretHeight,this.y-(b+this.caretHeight));a.closePath();a.fill();break;case "below":d=this.y+b+this.caretHeight,a.beginPath(),a.moveTo(this.x,this.y+
+b),a.lineTo(this.x+this.caretHeight,this.y+b+this.caretHeight),a.lineTo(this.x-this.caretHeight,this.y+b+this.caretHeight),a.closePath(),a.fill()}switch(this.xAlign){case "left":e=this.x-c+(this.cornerRadius+this.caretHeight);break;case "right":e=this.x-(this.cornerRadius+this.caretHeight)}H(a,e,d,c,f,this.cornerRadius);a.fill();a.fillStyle=this.textColor;a.textAlign="center";a.textBaseline="middle";a.fillText(this.text,e+c/2,d+f/2)}}});e.MultiTooltip=e.Element.extend({initialize:function(){this.font=
+v(this.fontSize,this.fontStyle,this.fontFamily);this.titleFont=v(this.titleFontSize,this.titleFontStyle,this.titleFontFamily);this.titleHeight=this.title?1.5*this.titleFontSize:0;this.height=this.labels.length*this.fontSize+this.fontSize/2*(this.labels.length-1)+2*this.yPadding+this.titleHeight;this.ctx.font=this.titleFont;var a=this.ctx.measureText(this.title).width,b=C(this.ctx,this.font,this.labels)+this.fontSize+3;this.width=y([b,a])+2*this.xPadding;a=this.height/2;0>this.y-a?this.y=a:this.y+
+a>this.chart.height&&(this.y=this.chart.height-a);this.x=this.x>this.chart.width/2?this.x-(this.xOffset+this.width):this.x+this.xOffset},getLineHeight:function(a){var b=this.y-this.height/2+this.yPadding;return 0===a?b+this.titleHeight/3:b+(1.5*this.fontSize*(a-1)+this.fontSize/2)+this.titleHeight},draw:function(){if(this.custom)this.custom(this);else{H(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var a=this.ctx;a.fillStyle=this.fillColor;a.fill();a.closePath();a.textAlign=
+"left";a.textBaseline="middle";a.fillStyle=this.titleTextColor;a.font=this.titleFont;a.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0));a.font=this.font;d.each(this.labels,function(b,c){a.fillStyle=this.textColor;a.fillText(b,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(c+1));a.fillStyle=this.legendColorBackground;a.fillRect(this.x+this.xPadding,this.getLineHeight(c+1)-this.fontSize/2,this.fontSize,this.fontSize);a.fillStyle=this.legendColors[c].fill;a.fillRect(this.x+this.xPadding,
+this.getLineHeight(c+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}});e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var a=E(this.stepValue),b=0;b<=this.steps;b++)this.yLabels.push(t(this.templateString,{value:(this.min+b*this.stepValue).toFixed(a)}));this.yLabelWidth=this.display&&this.showLabels?C(this.ctx,this.font,this.yLabels)+10:0},addXLabel:function(a){this.xLabels.push(a);this.valuesCount++;this.fit()},removeXLabel:function(){this.xLabels.shift();
+this.valuesCount--;this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0;this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height;this.startPoint+=this.padding;var a=this.endPoint-=this.padding,b=this.endPoint-this.startPoint,c;this.calculateYRange(b);this.buildYLabels();for(this.calculateXLabelRotation();b>this.endPoint-this.startPoint;)b=this.endPoint-this.startPoint,c=this.yLabelWidth,this.calculateYRange(b),this.buildYLabels(),cthis.yLabelWidth?a/2:this.yLabelWidth;this.xLabelRotation=0;if(this.display){var c=C(this.ctx,this.font,this.xLabels),f;this.xLabelWidth=c;for(var d=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>d&&0===this.xLabelRotation||
+this.xLabelWidth>d&&90>=this.xLabelRotation&&0this.yLabelWidth&&(this.xScalePaddingLeft=b+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=f*c;0e&&(e=b.x+d,k=c),b.x-de&&(e=b.x+d,k=c):c>this.valuesCount/2&&b.x-de-g;e=b===g||b===e-g;a.textAlign=0===b?"center":b===c?"center":bthis.animations[c].animationObject.numSteps&&(this.animations[c].animationObject.currentStep=this.animations[c].animationObject.numSteps),this.animations[c].animationObject.render(this.animations[c].chartInstance,this.animations[c].animationObject),this.animations[c].animationObject.currentStep==this.animations[c].animationObject.numSteps&&(this.animations[c].animationObject.onAnimationComplete.call(this.animations[c].chartInstance),
+this.animations.splice(c,1),c--);a=(Date.now()-a-this.frameDuration)/this.frameDuration;1<% for (var i=0; i<%if(segments[i].label){%><%=segments[i].label%><%}%> <%}%>'};p.Type.extend({name:"Doughnut",defaults:e,
+initialize:function(d){this.segments=[];this.outerRadius=(l.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2;this.SegmentArc=p.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2});this.options.showTooltips&&l.bindEvents(this,this.options.tooltipEvents,function(d){d="mouseout"!==d.type?this.getSegmentsAtEvent(d):[];l.each(this.segments,function(d){d.restore(["fillColor"])});l.each(d,function(d){d.fillColor=d.highlightColor});this.showTooltip(d)});
+this.calculateTotal(d);l.each(d,function(e,h){e.color||(e.color="hsl("+360*h/d.length+", 100%, 50%)");this.addData(e,h,!0)},this);this.render()},getSegmentsAtEvent:function(d){var e=[],h=l.getRelativePosition(d);l.each(this.segments,function(d){d.inRange(h.x,h.y)&&e.push(d)},this);return e},addData:function(d,e,h){e=void 0!==e?e:this.segments.length;"undefined"===typeof d.color&&(d.color=p.defaults.global.segmentColorDefault[e%p.defaults.global.segmentColorDefault.length],d.highlight=p.defaults.global.segmentHighlightColorDefaults[e%
+p.defaults.global.segmentHighlightColorDefaults.length]);this.segments.splice(e,0,new this.SegmentArc({value:d.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:d.color,highlightColor:d.highlight||d.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?
+0:this.calculateCircumference(d.value),label:d.label}));h||(this.reflow(),this.update())},calculateCircumference:function(d){return 0
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.controller.nlbw", package.seeall)
+
+function index()
+ entry({"admin", "nlbw"}, firstchild(), _("Bandwidth Monitor"), 80)
+ entry({"admin", "nlbw", "display"}, template("nlbw/display"), _("Display"), 1)
+ entry({"admin", "nlbw", "config"}, cbi("nlbw/config"), _("Configuration"), 2)
+ entry({"admin", "nlbw", "backup"}, template("nlbw/backup"), _("Backup"), 3)
+ entry({"admin", "nlbw", "data"}, call("action_data"), nil, 4)
+ entry({"admin", "nlbw", "list"}, call("action_list"), nil, 5)
+ entry({"admin", "nlbw", "ptr"}, call("action_ptr"), nil, 6).leaf = true
+ entry({"admin", "nlbw", "download"}, call("action_download"), nil, 7)
+ entry({"admin", "nlbw", "restore"}, post("action_restore"), nil, 8)
+ entry({"admin", "nlbw", "commit"}, call("action_commit"), nil, 9)
+end
+
+local function exec(cmd, args, writer)
+ local os = require "os"
+ local nixio = require "nixio"
+
+ local fdi, fdo = nixio.pipe()
+ local pid = nixio.fork()
+
+ if pid > 0 then
+ fdo:close()
+
+ while true do
+ local buffer = fdi:read(2048)
+ local wpid, stat, code = nixio.waitpid(pid, "nohang")
+
+ if writer and buffer and #buffer > 0 then
+ writer(buffer)
+ end
+
+ if wpid and stat == "exited" then
+ break
+ end
+ end
+ elseif pid == 0 then
+ nixio.dup(fdo, nixio.stdout)
+ fdi:close()
+ fdo:close()
+ nixio.exece(cmd, args, nil)
+ nixio.stdout:close()
+ os.exit(1)
+ end
+end
+
+function action_data()
+ local http = require "luci.http"
+
+ local types = {
+ csv = "text/csv",
+ json = "application/json"
+ }
+
+ local args = { }
+ local mtype = http.formvalue("type") or "json"
+ local delim = http.formvalue("delim") or ";"
+ local period = http.formvalue("period")
+ local group_by = http.formvalue("group_by")
+ local order_by = http.formvalue("order_by")
+
+ if types[mtype] then
+ args[#args+1] = "-c"
+ args[#args+1] = mtype
+ else
+ http.status(400, "Unsupported type")
+ return
+ end
+
+ if delim and #delim > 0 then
+ args[#args+1] = "-s%s" % delim
+ end
+
+ if period and #period > 0 then
+ args[#args+1] = "-t"
+ args[#args+1] = period
+ end
+
+ if group_by and #group_by > 0 then
+ args[#args+1] = "-g"
+ args[#args+1] = group_by
+ end
+
+ if order_by and #order_by > 0 then
+ args[#args+1] = "-o"
+ args[#args+1] = order_by
+ end
+
+ http.prepare_content(types[mtype])
+ exec("/usr/sbin/nlbw", args, http.write)
+end
+
+function action_list()
+ local http = require "luci.http"
+
+ local fd = io.popen("/usr/sbin/nlbw -c list")
+ local periods = { }
+
+ if fd then
+ while true do
+ local period = fd:read("*l")
+
+ if not period then
+ break
+ end
+
+ periods[#periods+1] = period
+ end
+
+ fd:close()
+ end
+
+ http.prepare_content("application/json")
+ http.write_json(periods)
+end
+
+function action_ptr(...)
+ local http = require "luci.http"
+ local util = require "luci.util"
+
+ http.prepare_content("application/json")
+ http.write_json(util.ubus("network.rrdns", "lookup", {
+ addrs = {...}, timeout = 3000
+ }))
+end
+
+function action_download()
+ local nixio = require "nixio"
+ local http = require "luci.http"
+ local sys = require "luci.sys"
+ local uci = require "luci.model.uci".cursor()
+
+ local dir = uci:get_first("nlbwmon", "nlbwmon", "database_directory")
+ or "/var/lib/nlbwmon"
+
+ if dir and nixio.fs.stat(dir, "type") == "dir" then
+ local n = "nlbwmon-backup-%s-%s.tar.gz"
+ %{ sys.hostname(), os.date("%Y-%m-%d") }
+
+ http.prepare_content("application/octet-stream")
+ http.header("Content-Disposition", "attachment; filename=\"%s\"" % n)
+ exec("/bin/tar", { "-C", dir, "-c", "-z", ".", "-f", "-" }, http.write)
+ else
+ http.status(500, "Unable to find database directory")
+ end
+end
+
+function action_restore()
+ local nixio = require "nixio"
+ local http = require "luci.http"
+ local i18n = require "luci.i18n"
+ local tpl = require "luci.template"
+ local uci = require "luci.model.uci".cursor()
+
+ local tmp = "/tmp/nlbw-restore.tar.gz"
+ local dir = uci:get_first("nlbwmon", "nlbwmon", "database_directory")
+ or "/var/lib/nlbwmon"
+
+ local fp
+ http.setfilehandler(
+ function(meta, chunk, eof)
+ if not fp and meta and meta.name == "archive" then
+ fp = io.open(tmp, "w")
+ end
+ if fp and chunk then
+ fp:write(chunk)
+ end
+ if fp and eof then
+ fp:close()
+ end
+ end)
+
+ local files = { }
+ local tar = io.popen("/bin/tar -tzf %s" % tmp, "r")
+ if tar then
+ while true do
+ local file = tar:read("*l")
+ if not file then
+ break
+ elseif file:match("^%d%d%d%d%d%d%d%d%.db%.gz$") or
+ file:match("^%./%d%d%d%d%d%d%d%d%.db%.gz$") then
+ files[#files+1] = file
+ end
+ end
+ tar:close()
+ end
+
+ if #files == 0 then
+ http.status(500, "Internal Server Error")
+ tpl.render("nlbw/backup", {
+ message = i18n.translate("Invalid or empty backup archive")
+ })
+ return
+ end
+
+
+ local output = { }
+
+ exec("/etc/init.d/nlbwmon", { "stop" })
+ exec("/bin/mkdir", { "-p", dir })
+
+ exec("/bin/tar", { "-C", dir, "-vxzf", tmp, unpack(files) },
+ function(chunk) output[#output+1] = chunk:match("%S+") end)
+
+ exec("/bin/rm", { "-f", tmp })
+ exec("/etc/init.d/nlbwmon", { "start" })
+
+ tpl.render("nlbw/backup", {
+ message = i18n.translatef(
+ "The following database files have been restored: %s",
+ table.concat(output, ", "))
+ })
+end
+
+function action_commit()
+ local http = require "luci.http"
+ local disp = require "luci.dispatcher"
+
+ http.redirect(disp.build_url("admin/nlbw/display"))
+ exec("/usr/sbin/nlbw", { "-c", "commit" })
+end
diff --git a/applications/luci-app-nlbwmon/luasrc/model/cbi/nlbw/config.lua b/applications/luci-app-nlbwmon/luasrc/model/cbi/nlbw/config.lua
new file mode 100644
index 000000000..71e096c61
--- /dev/null
+++ b/applications/luci-app-nlbwmon/luasrc/model/cbi/nlbw/config.lua
@@ -0,0 +1,215 @@
+-- Copyright 2017 Jo-Philipp Wich
+-- Licensed to the public under the Apache License 2.0.
+
+local utl = require "luci.util"
+local sys = require "luci.sys"
+local fs = require "nixio.fs"
+local ip = require "luci.ip"
+local nw = require "luci.model.network"
+
+local s, m, period, warning, date, days, interval, ifaces, subnets, limit, prealloc, compress, generations, commit, refresh, directory, protocols
+
+m = Map("nlbwmon", translate("Netlink Bandwidth Monitor - Configuration"),
+ translate("The Netlink Bandwidth Monitor (nlbwmon) is a lightweight, efficient traffic accounting program keeping track of bandwidth usage per host and protocol."))
+
+nw.init(luci.model.uci.cursor_state())
+
+s = m:section(TypedSection, "nlbwmon")
+s.anonymous = true
+s.addremove = false
+s:tab("general", translate("General Settings"))
+s:tab("advanced", translate("Advanced Settings"))
+s:tab("protocol", translate("Protocol Mapping"),
+ translate("Protocol mappings to distinguish traffic types per host, one mapping per line. The first value specifies the IP protocol, the second value the port number and the third column is the name of the mapped protocol."))
+
+period = s:taboption("general", ListValue, "_period", translate("Accounting period"),
+ translate("Choose \"Day of month\" to restart the accounting period monthly on a specific date, e.g. every 3rd. Choose \"Fixed interval\" to restart the accounting period exactly every N days, beginning at a given date."))
+
+period:value("relative", translate("Day of month"))
+period:value("absolute", translate("Fixed interval"))
+
+period.write = function(self, cfg, val)
+ if period:formvalue(cfg) == "relative" then
+ m:set(cfg, "database_interval", interval:formvalue(cfg))
+ else
+ m:set(cfg, "database_interval", "%s/%s" %{
+ date:formvalue(cfg),
+ days:formvalue(cfg)
+ })
+ end
+end
+
+period.cfgvalue = function(self, cfg)
+ local val = m:get(cfg, "database_interval") or ""
+ if val:match("^%d%d%d%d%-%d%d%-%d%d/%d+$") then
+ return "absolute"
+ end
+ return "relative"
+end
+
+
+warning = s:taboption("general", DummyValue, "_warning", translate("Warning"))
+warning.default = translatef("Changing the accounting interval type will invalidate existing databases!Download backup .", luci.dispatcher.build_url("admin/nlbw/backup"))
+warning.rawhtml = true
+
+if (m.uci:get_first("nlbwmon", "nlbwmon", "database_interval") or ""):match("^%d%d%d%d-%d%d-%d%d/%d+$") then
+ warning:depends("_period", "relative")
+else
+ warning:depends("_period", "absolute")
+end
+
+
+interval = s:taboption("general", Value, "_interval", translate("Due date"),
+ translate("Day of month to restart the accounting period. Use negative values to count towards the end of month, e.g. \"-5\" to specify the 27th of July or the 24th of Februrary."))
+
+interval.datatype = "or(range(1,31),range(-31,-1))"
+interval.placeholder = "1"
+interval:value("1", translate("1 - Restart every 1st of month"))
+interval:value("-1", translate("-1 - Restart every last day of month"))
+interval:value("-7", translate("-7 - Restart a week before end of month"))
+interval.rmempty = false
+interval:depends("_period", "relative")
+interval.write = period.write
+
+interval.cfgvalue = function(self, cfg)
+ local val = m:get(cfg, "database_interval")
+ return val and tonumber(val)
+end
+
+
+date = s:taboption("general", Value, "_date", translate("Start date"),
+ translate("Start date of the first accounting period, e.g. begin of ISP contract."))
+
+date.datatype = "dateyyyymmdd"
+date.placeholder = "2016-03-15"
+date.rmempty = false
+date:depends("_period", "absolute")
+date.write = period.write
+
+date.cfgvalue = function(self, cfg)
+ local val = m:get(cfg, "database_interval") or ""
+ return (val:match("^(%d%d%d%d%-%d%d%-%d%d)/%d+$"))
+end
+
+
+days = s:taboption("general", Value, "_days", translate("Interval"),
+ translate("Length of accounting interval in days."))
+
+days.datatype = "min(1)"
+days.placeholder = "30"
+days.rmempty = false
+days:depends("_period", "absolute")
+days.write = period.write
+
+days.cfgvalue = function(self, cfg)
+ local val = m:get(cfg, "database_interval") or ""
+ return (val:match("^%d%d%d%d%-%d%d%-%d%d/(%d+)$"))
+end
+
+
+ifaces = s:taboption("general", Value, "_ifaces", translate("Local interfaces"),
+ translate("Only conntrack streams from or to any of these networks are counted."))
+
+ifaces.template = "cbi/network_netlist"
+ifaces.widget = "checkbox"
+ifaces.nocreate = true
+
+ifaces.cfgvalue = function(self, cfg)
+ return m:get(cfg, "local_network")
+end
+
+ifaces.write = function(self, cfg)
+ local item
+ local items = {}
+ for item in utl.imatch(subnets:formvalue(cfg)) do
+ items[#items+1] = item
+ end
+ for item in utl.imatch(ifaces:formvalue(cfg)) do
+ items[#items+1] = item
+ end
+ m:set(cfg, "local_network", items)
+end
+
+
+subnets = s:taboption("general", DynamicList, "_subnets", translate("Local subnets"),
+ translate("Only conntrack streams from or to any of these subnets are counted."))
+
+subnets.datatype = "ipaddr"
+
+subnets.cfgvalue = function(self, cfg)
+ local subnet
+ local subnets = {}
+ for subnet in utl.imatch(m:get(cfg, "local_network")) do
+ subnet = ip.new(subnet)
+ subnets[#subnets+1] = subnet and subnet:string()
+ end
+ return subnets
+end
+
+subnets.write = ifaces.write
+
+
+limit = s:taboption("advanced", Value, "database_limit", translate("Maximum entries"),
+ translate("The maximum amount of entries that should be put into the database, setting the limit to 0 will allow databases to grow indefinitely."))
+
+limit.datatype = "uinteger"
+limit.placeholder = "10000"
+
+prealloc = s:taboption("advanced", Flag, "database_prealloc", translate("Preallocate database"),
+ translate("Whether to preallocate the maximum possible database size in memory. This is mainly useful for memory constrained systems which might not be able to satisfy memory allocation after longer uptime periods."))
+
+prealloc:depends({["database_limit"] = "0", ["!reverse"] = true })
+
+
+compress = s:taboption("advanced", Flag, "database_compress", translate("Compress database"),
+ translate("Whether to gzip compress archive databases. Compressing the database files makes accessing old data slightly slower but helps to reduce storage requirements."))
+
+compress.default = compress.enabled
+
+
+generations = s:taboption("advanced", Value, "database_generations", translate("Stored periods"),
+ translate("Maximum number of accounting periods to keep, use zero to keep databases forever."))
+
+generations.datatype = "uinteger"
+generations.placeholder = "10"
+
+
+commit = s:taboption("advanced", Value, "commit_interval", translate("Commit interval"),
+ translate("Interval at which the temporary in-memory database is committed to the persistent database directory."))
+
+commit.placeholder = "24h"
+commit:value("24h", translate("24h - least flash wear at the expense of data loss risk"))
+commit:value("12h", translate("12h - compromise between risk of data loss and flash wear"))
+commit:value("10m", translate("10m - frequent commits at the expense of flash wear"))
+commit:value("60s", translate("60s - commit minutely, useful for non-flash storage"))
+
+
+refresh = s:taboption("advanced", Value, "refresh_interval", translate("Refresh interval"),
+ translate("Interval at which traffic counters of still established connections are refreshed from netlink information."))
+
+refresh.placeholder = "30s"
+refresh:value("30s", translate("30s - refresh twice per minute for reasonably current stats"))
+refresh:value("5m", translate("5m - rarely refresh to avoid frequently clearing conntrack counters"))
+
+
+directory = s:taboption("advanced", Value, "database_directory", translate("Database directory"),
+ translate("Database storage directory. One file per accounting period will be placed into this directory."))
+
+directory.placeholder = "/var/lib/nlbwmon"
+
+
+protocols = s:taboption("protocol", TextValue, "_protocols")
+protocols.rows = 50
+
+protocols.cfgvalue = function(self, cfg)
+ return fs.readfile("/usr/share/nlbwmon/protocols")
+end
+
+protocols.write = function(self, cfg, value)
+ fs.writefile("/usr/share/nlbwmon/protocols", (value or ""):gsub("\r\n", "\n"))
+end
+
+protocols.remove = protocols.write
+
+
+return m
diff --git a/applications/luci-app-nlbwmon/luasrc/view/nlbw/backup.htm b/applications/luci-app-nlbwmon/luasrc/view/nlbw/backup.htm
new file mode 100644
index 000000000..ea2e0f05c
--- /dev/null
+++ b/applications/luci-app-nlbwmon/luasrc/view/nlbw/backup.htm
@@ -0,0 +1,34 @@
+<%#
+ Copyright 2017 Jo-Philipp Wich
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+
+
+<%:Netlink Bandwidth Monitor - Backup / Restore %>
+
+
+ <%:Restore Database Backup%>
+
+
+
+ <% if message then %>
+ <%=message%>
+ <% end %>
+
+
+ <%:Download Database Backup%>
+
+
+
+
+
+<%+footer%>
diff --git a/applications/luci-app-nlbwmon/luasrc/view/nlbw/display.htm b/applications/luci-app-nlbwmon/luasrc/view/nlbw/display.htm
new file mode 100644
index 000000000..932c8849a
--- /dev/null
+++ b/applications/luci-app-nlbwmon/luasrc/view/nlbw/display.htm
@@ -0,0 +1,1052 @@
+<%#
+ Copyright 2017 Jo-Philipp Wich
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<% css = [[
+
+ #chartjs-tooltip {
+ opacity: 0;
+ position: absolute;
+ background: rgba(0, 0, 0, .7);
+ color: white;
+ padding: 3px;
+ border-radius: 3px;
+ -webkit-transition: all .1s ease;
+ transition: all .1s ease;
+ pointer-events: none;
+ -webkit-transform: translate(-50%, 0);
+ transform: translate(-50%, 0);
+ z-index: 200;
+ }
+
+ #chartjs-tooltip.above {
+ -webkit-transform: translate(-50%, -100%);
+ transform: translate(-50%, -100%);
+ }
+
+ #chartjs-tooltip.above:before {
+ border: solid;
+ border-color: #111 transparent;
+ border-color: rgba(0, 0, 0, .8) transparent;
+ border-width: 8px 8px 0 8px;
+ bottom: 1em;
+ content: "";
+ display: block;
+ left: 50%;
+ top: 100%;
+ position: absolute;
+ z-index: 99;
+ -webkit-transform: translate(-50%, 0);
+ transform: translate(-50%, 0);
+ }
+
+ table {
+ border: 1px solid #999;
+ border-collapse: collapse;
+ margin: 0 0 2px !important;
+ }
+
+ th, td, table table td {
+ border: 1px solid #999;
+ text-align: right;
+ padding: 1px 3px !important;
+ white-space: nowrap;
+ }
+
+ tbody td {
+ border-bottom-color: #ccc;
+ }
+
+ tbody td[rowspan] {
+ border-bottom-color: #999;
+ }
+
+ tbody tr:last-child td {
+ border-bottom-color: #999;
+ }
+
+
+ .pie {
+ width: 200px;
+ display: inline-block;
+ margin: 20px;
+ }
+
+ .pie label {
+ font-weight: bold;
+ font-size: 14px;
+ display: block;
+ margin-bottom: 10px;
+ text-align: center;
+ }
+
+ .kpi {
+ display: inline-block;
+ margin: 80px 20px 20px;
+ vertical-align: top;
+ }
+
+ .kpi ul {
+ list-style: none;
+ }
+
+ .kpi li {
+ margin: 10px;
+ display: none;
+ }
+
+ .kpi big {
+ font-weight: bold;
+ }
+
+ #detail-bubble {
+ position: absolute;
+ opacity: 0;
+ visibility: hidden;
+ }
+
+ #detail-bubble.in {
+ opacity: 1;
+ visibility: visible;
+ transition: opacity 0.5s;
+ }
+
+ #detail-bubble > div {
+ border: 1px solid #ccc;
+ border-radius: 2px;
+ padding: 5px;
+ background: #fcfcfc;
+ }
+
+ #detail-bubble .head {
+ text-align: center;
+ white-space: nowrap;
+ position: relative;
+ }
+
+ #detail-bubble .head .dismiss {
+ top: 0;
+ right: 0;
+ width: 20px;
+ line-height: 20px;
+ text-align: center;
+ text-decoration: none;
+ font-weight: bold;
+ color: #000;
+ position: absolute;
+ font-size: 20px;
+ }
+
+ #detail-bubble .pie {
+ width: 100px;
+ margin: 5px;
+ }
+
+ #detail-bubble .kpi {
+ margin: 40px 5px 5px;
+ font-size: smaller;
+ text-align: left;
+ }
+
+ #detail-bubble .kpi ul {
+ margin: 0;
+ }
+
+ #bubble-arrow {
+ border: 1px solid #ccc;
+ border-width: 1px 0 0 1px;
+ background: #fcfcfc;
+ width: 15px;
+ height: 15px;
+ position: absolute;
+ left: 0;
+ top: -8px;
+ transform: rotate(45deg);
+ margin: 0 0 0 -8px;
+ }
+
+ tr.active > td {
+ border-bottom: 2px solid red;
+ }
+
+ tr.active > td.active {
+ border: 2px solid red;
+ border-bottom: none;
+ }
+
+ td.detail {
+ border: 2px solid red;
+ border-top: none;
+ opacity: 0;
+ transition: opacity 0.5s;
+ }
+
+ td.detail.in {
+ opacity: 1;
+ }
+
+ th.hostname,
+ td.hostname {
+ text-align: left;
+ }
+
+]] -%>
+
+<%+header%>
+
+
+
+
+
+<%:Netlink Bandwidth Monitor%>
+
+
+
+
+
+
Ã
+
+ Download
+
+
+
+ Upload
+
+
+
+
+ <%_Hostname: example.org %>
+ <%_Vendor: Example Corp. %>
+
+
+
+
+
+
+
+
+
+
+ <%:Select accounting period:%>
+
+
+
+
+
+
+
+
+
+
+ <%:Traffic / Host%>
+
+
+
+
+ <%:Connections / Host%>
+
+
+
+
+
+ <%_0 hosts%>
+ <%_0 download%>
+ <%_0 upload%>
+ <%_0 connections%>
+
+
+
+
+
+ <%:Host%>
+ <%:MAC%>
+ <%:Connections%>
+ <%:Download (Bytes / Packets)%>
+ <%:Upload (Bytes / Packets)%>
+
+
+
+
+
+
+
+ <%:Download / Application%>
+
+
+
+
+ <%:Upload / Application%>
+
+
+
+
+
+ <%_0 different application protocols%>
+ <%_0 cause the most download%>
+ <%_0 cause the most upload%>
+ <%_0 cause the most connections%>
+
+
+
+
+
+ <%:Application%>
+ <%:Connections%>
+ <%:Download (Bytes / Packets)%>
+ <%:Upload (Bytes / Packets)%>
+
+
+
+
+
+
+
+ <%:IPv4 vs. IPv6%>
+
+
+
+
+ <%:Dualstack enabled hosts%>
+
+
+
+
+
+ <%_0% IPv6 support rate among hosts%>
+ <%_0% of the total traffic is IPv6%>
+ <%_0B total IPv6 download%>
+ <%_0B total IPv6 upload%>
+
+
+
+
+
+ <%:Host%>
+ <%:MAC%>
+ <%:Family%>
+ <%:Download (Bytes / Packets)%>
+ <%:Upload (Bytes / Packets)%>
+
+
+
+
+
+
+
+
+<%+footer%>
diff --git a/applications/luci-app-nlbwmon/po/ja/nlbwmon.po b/applications/luci-app-nlbwmon/po/ja/nlbwmon.po
new file mode 100644
index 000000000..b5931e0df
--- /dev/null
+++ b/applications/luci-app-nlbwmon/po/ja/nlbwmon.po
@@ -0,0 +1,387 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: INAGAKI Hiroshi \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
+"X-Generator: Poedit 2.0.3\n"
+
+msgid "%d IPv4-only hosts"
+msgstr "%d IPv4 éå®ãã¹ã"
+
+msgid "%d IPv6-only hosts"
+msgstr "%d IPv6 éå®ãã¹ã"
+
+msgid "%d dual-stack hosts"
+msgstr "%d ãã¥ã¢ã«ã¹ã¿ã㯠ãã¹ã"
+
+msgid "%s and %s"
+msgstr "%s, %s"
+
+msgid "%s, %s and %s"
+msgstr "%s, %s, %s"
+
+msgid "-1 - Restart every last day of month"
+msgstr "-1 - æã®æçµæ¥"
+
+msgid "-7 - Restart a week before end of month"
+msgstr "-7 - æã®æçµæ¥ã®ä¸é±éå"
+
+msgid "1 - Restart every 1st of month"
+msgstr "1 - æ¯æ1æ¥"
+
+msgid "10m - frequent commits at the expense of flash wear"
+msgstr "10m - ãã©ãã·ã¥åªä½ã¸ã®è² è·ãé«ãé »ç¹ãªã³ãããï¼10åï¼"
+
+msgid "12h - compromise between risk of data loss and flash wear"
+msgstr "12h - ãã¼ã¿æ¶å¤±ãªã¹ã¯ã¨ãã©ãã·ã¥åªä½ã¸ã®è² è·ã®å¦¥åç¹ï¼12æéï¼"
+
+msgid "24h - least flash wear at the expense of data loss risk"
+msgstr "24h - ãã¼ã¿æ¶å¤±ãªã¹ã¯ã¯é«ãããã©ãã·ã¥åªä½ã¸ã®è² è·ã¯æå°ï¼24æéï¼"
+
+msgid "30s - refresh twice per minute for reasonably current stats"
+msgstr "30s - ç¾å¨ã®ç¶æ
ã®ææ¡ã«é©åãª1åéã«2åã®ãªãã¬ãã·ã¥ï¼30ç§ï¼"
+
+msgid "5m - rarely refresh to avoid frequently clearing conntrack counters"
+msgstr ""
+
+msgid "60s - commit minutely, useful for non-flash storage"
+msgstr "60ç§ - 1åæ¯ã®ã³ããããéãã©ãã·ã¥ ã¹ãã¬ã¼ã¸ã«æç¨"
+
+msgid "0 connections"
+msgstr "0 æ¥ç¶æ°"
+
+msgid "0 hosts"
+msgstr "0 ãã¹ãæ°"
+
+msgid "0% IPv6 support rate among hosts"
+msgstr "0% å
¨ãã¹ãä¸ã® IPv6 ãµãã¼ãæ¯ç"
+
+msgid "0B total IPv6 download"
+msgstr "0B IPv6 ç·ãã¦ã³ãã¼ã"
+
+msgid "0% of the total traffic is IPv6"
+msgstr "0% å
¨ãã©ãã£ãã¯ä¸ã® IPv6 ã®å²å"
+
+msgid "0B total IPv6 upload"
+msgstr "0B IPv6 ç·ã¢ãããã¼ã"
+
+msgid "0 cause the most connections"
+msgstr "0 æ¥ç¶æ°ä¸ä½"
+
+msgid "0 cause the most download"
+msgstr "0 ãã¦ã³ãã¼ãä¸ä½"
+
+msgid "0 cause the most upload"
+msgstr "0 ã¢ãããã¼ãä¸ä½"
+
+msgid "0 different application protocols"
+msgstr "0 ã¢ããªã±ã¼ã·ã§ã³ ãããã³ã«æ°"
+
+msgid "0 download"
+msgstr "0 ãã¦ã³ãã¼ã"
+
+msgid "0 upload"
+msgstr "0 ã¢ãããã¼ã"
+
+msgid "Accounting period"
+msgstr "åéæé"
+
+msgid "Advanced Settings"
+msgstr "æ¡å¼µè¨å®"
+
+msgid "Application"
+msgstr "ã¢ããªã±ã¼ã·ã§ã³"
+
+msgid "Application Protocols"
+msgstr "ã¢ããªã±ã¼ã·ã§ã³ ãããã³ã«"
+
+msgid "Backup"
+msgstr "ããã¯ã¢ãã"
+
+msgid "Bandwidth Monitor"
+msgstr "帯åå¹
ã¢ãã¿ã¼"
+
+msgid "CSV, grouped by IP"
+msgstr "CSVï¼IP ã«ããã°ã«ã¼ãåï¼"
+
+msgid "CSV, grouped by MAC"
+msgstr "CSVï¼MAC ã«ããã°ã«ã¼ãåï¼"
+
+msgid "CSV, grouped by protocol"
+msgstr "CSVï¼ãããã³ã«ã«ããã°ã«ã¼ãåï¼"
+
+msgid ""
+"Changing the accounting interval type will invalidate existing databases!"
+"Download backup ."
+msgstr ""
+"æ¢åã®ãã¼ã¿ãã¼ã¹ã¨äºææ§ã®ç¡ãåéæéã®å½¢å¼ãé¸æããã¾ãããããã¯ã¢ããã®ãã¦ã³ãã¼ã "
+
+msgid ""
+"Choose \"Day of month\" to restart the accounting period monthly on a "
+"specific date, e.g. every 3rd. Choose \"Fixed interval\" to restart the "
+"accounting period exactly every N days, beginning at a given date."
+msgstr ""
+"ææ¯ã§è¨å®ããæ¥ä»ããã®ãã¼ã¿ã®è¨æ¸¬ãè¡ãã«ã¯ã \"æé\" ãé¸æãã¾ãï¼ä¾: "
+"æ¯æ3æ¥ï¼ãè¨å®ããæ¥æ°æ¯ã«ãã¼ã¿ã®åéãè¡ãã«ã¯ã\"ç¹å®ã®éé\" ãé¸æãã¾"
+"ããå¾è
ã®å ´åãæå®ãããæ¥ä»ããéå§ããã¾ãã"
+
+msgid "Commit interval"
+msgstr "ã³ãããéé"
+
+msgid "Compress database"
+msgstr "ãã¼ã¿ãã¼ã¹ã®å§ç¸®"
+
+msgid "Configuration"
+msgstr "è¨å®"
+
+msgid "Conn."
+msgstr "æ¥ç¶æ°"
+
+msgid "Connections"
+msgstr "æ¥ç¶æ°"
+
+msgid "Connections / Host"
+msgstr "ãã¹ãæ¯ã®æ¥ç¶æ°"
+
+msgid "Database directory"
+msgstr "ãã¼ã¿ãã¼ã¹ ãã£ã¬ã¯ããª"
+
+msgid ""
+"Database storage directory. One file per accounting period will be placed "
+"into this directory."
+msgstr ""
+"ãã¼ã¿ãã¼ã¹ã®ä¿åå
ãã£ã¬ã¯ããªã§ããè¨æ¸¬æéããã 1 ã¤ã®ãã¡ã¤ã«ããã®ãã£"
+"ã¬ã¯ããªã«é
ç½®ããã¾ãã"
+
+msgid "Day of month"
+msgstr "æé"
+
+msgid ""
+"Day of month to restart the accounting period. Use negative values to count "
+"towards the end of month, e.g. \"-5\" to specify the 27th of July or the "
+"24th of Februrary."
+msgstr ""
+"æã®ä¸ã§æ°ããªåéæéãéå§ããæ¥ã§ããæã®æçµæ¥ããã®æ¥æ°ããã¤ãã¹å¤ã§æ"
+"å®ãããã¨ãã§ãã¾ãï¼ä¾: 7æ27æ¥ã¾ãã¯2æ24æ¥ã¯ \"-5\"ï¼ã"
+
+msgid "Display"
+msgstr "表示"
+
+msgid "Down. (Bytes / Pkts.)"
+msgstr "ãã¦ã³ãã¼ãï¼Bytes / Pkts.ï¼"
+
+msgid "Download (Bytes / Packets)"
+msgstr "ãã¦ã³ãã¼ãï¼Bytes / Packetsï¼"
+
+msgid "Download / Application"
+msgstr "ãã¦ã³ãã¼ã / ã¢ããªã±ã¼ã·ã§ã³"
+
+msgid "Download Database Backup"
+msgstr "ãã¼ã¿ãã¼ã¹ ããã¯ã¢ããã®ãã¦ã³ãã¼ã"
+
+msgid "Dualstack enabled hosts"
+msgstr "ãã¥ã¢ã«ã¹ã¿ã㯠ãã¹ã"
+
+msgid "Due date"
+msgstr "ææ¥"
+
+msgid "Export"
+msgstr "ã¨ã¯ã¹ãã¼ã"
+
+msgid "Family"
+msgstr "IP 種å¥"
+
+msgid "Fixed interval"
+msgstr "ç¹å®ã®éé"
+
+msgid "Force reloadâ¦"
+msgstr "å¼·å¶ãªãã¼ã..."
+
+msgid "General Settings"
+msgstr "å
¨è¬è¨å®"
+
+msgid "Generate Backup"
+msgstr "ããã¯ã¢ããã®ä½æ"
+
+msgid "Host"
+msgstr "ãã¹ã"
+
+msgid "Hostname: example.org "
+msgstr "ãã¹ãå: example.org "
+
+msgid "IPv4 vs. IPv6"
+msgstr "IPv4 åã³ IPv6"
+
+msgid "IPv6"
+msgstr "IPv6"
+
+msgid "Interval"
+msgstr "éé"
+
+msgid ""
+"Interval at which the temporary in-memory database is committed to the "
+"persistent database directory."
+msgstr ""
+"ã¡ã¢ãªã¼ä¸ã®ä¸æçãªãã¼ã¿ãã¼ã¹ãããæ°¸ç¶çãªãã¼ã¿ãã¼ã¹ ãã£ã¬ã¯ããªã¸ã®ã³"
+"ããããå®è¡ããééã§ãã"
+
+msgid ""
+"Interval at which traffic counters of still established connections are "
+"refreshed from netlink information."
+msgstr ""
+
+msgid "Invalid or empty backup archive"
+msgstr "ç¡å¹ã¾ãã¯ç©ºã®ããã¯ã¢ãã ã¢ã¼ã«ã¤ãã§ãã"
+
+msgid "JSON dump"
+msgstr "JSON ãã³ã"
+
+msgid "Length of accounting interval in days."
+msgstr "åéæéã®æ¥æ°ã§ãã"
+
+msgid "Local interfaces"
+msgstr "ãã¼ã«ã« ã¤ã³ã¿ã¼ãã§ã¼ã¹"
+
+msgid "Local subnets"
+msgstr "ãã¼ã«ã« ãµãããã"
+
+msgid "MAC"
+msgstr "MAC"
+
+msgid "Maximum entries"
+msgstr "æ大件æ°"
+
+msgid ""
+"Maximum number of accounting periods to keep, use zero to keep databases "
+"forever."
+msgstr ""
+"è¨æ¸¬ãã¼ã¿ãä¿æãããåéæéã®æ大åæ°ã§ãã '0' ãè¨å®ããå ´åãå
¨ãã¼ã¿ã"
+"ä¿æãã¾ãã"
+
+msgid "Netlink Bandwidth Monitor"
+msgstr "Netlink Bandwidth Monitor"
+
+msgid "Netlink Bandwidth Monitor - Backup / Restore"
+msgstr "Netlink Bandwidth Monitor - ããã¯ã¢ãã / 復å
"
+
+msgid "Netlink Bandwidth Monitor - Configuration"
+msgstr "Netlink Bandwidth Monitor - è¨å®"
+
+msgid "No data recorded yet."
+msgstr "ã¾ã ãã¼ã¿ãããã¾ããã"
+
+msgid "Only conntrack streams from or to any of these networks are counted."
+msgstr ""
+"é¸æããããããã¯ã¼ã¯ã«ããã conntrack ã¹ããªã¼ã ã®ã¿ãè¨æ¸¬ããã¾ãã"
+
+msgid "Only conntrack streams from or to any of these subnets are counted."
+msgstr "è¨å®ããããµããããã«ããã conntrack ã¹ããªã¼ã ã®ã¿ãè¨æ¸¬ããã¾ãã"
+
+msgid "Preallocate database"
+msgstr "ãã¼ã¿ãã¼ã¹ã®äºåå²å½"
+
+msgid "Protocol"
+msgstr "ãããã³ã«"
+
+msgid "Protocol Mapping"
+msgstr "ãããã³ã« ãããã³ã°"
+
+msgid ""
+"Protocol mappings to distinguish traffic types per host, one mapping per "
+"line. The first value specifies the IP protocol, the second value the port "
+"number and the third column is the name of the mapped protocol."
+msgstr ""
+"ãã¹ãæ¯ã®ãã©ãã£ãã¯å½¢å¼ãåºå¥ããããã®ãããã³ã« ãããã³ã°ã§ãä¸è¡ããã"
+"ä¸ã¤ã®ãããã³ã°ã追å ãã¾ããåã¨ã³ããªã¼ã®ä¸ã¤ç®ã®å¤ã¯ IP ãããã³ã«ãã2ã¤"
+"ç®ã®å¤ã¯ãã¼ãçªå·ã3ã¤ç®ã¯ãããã³ã°ããããããã³ã«ã®ååããããã表ãã¾"
+"ãã"
+
+msgid "Refresh interval"
+msgstr "ãªãã¬ãã·ã¥éé"
+
+msgid "Restore"
+msgstr "復å
"
+
+msgid "Restore Database Backup"
+msgstr "ãã¼ã¿ãã¼ã¹ã®å¾©å
"
+
+msgid "Select accounting period:"
+msgstr "åéæéãé¸æ:"
+
+msgid "Source IP"
+msgstr "ã¢ã¯ã»ã¹å
IP"
+
+msgid "Start date"
+msgstr "éå§æ¥"
+
+msgid "Start date of the first accounting period, e.g. begin of ISP contract."
+msgstr "ååã®ãã¼ã¿åéã®éå§æ¥ã§ãï¼ä¾: ISP å¥ç´ã®éå§æ¥ï¼ã"
+
+msgid "Stored periods"
+msgstr "ä¿åæé"
+
+msgid ""
+"The Netlink Bandwidth Monitor (nlbwmon) is a lightweight, efficient traffic "
+"accounting program keeping track of bandwidth usage per host and protocol."
+msgstr ""
+"Netlink Bandwidth Monitor (nlbwmon) ã¯ã軽éãã¤ããã¹ãããããã³ã«æ¯ã«å¸¯å"
+"å¹
使ç¨éã®è¿½è·¡ãè¡ãå¹ççãªãã©ãã£ãã¯è¨æ¸¬ããã°ã©ã ã§ãã"
+
+msgid "The following database files have been restored: %s"
+msgstr "次ã®ãã¼ã¿ãã¼ã¹ ãã¡ã¤ã«ã復å
ããã¾ãã: %s"
+
+msgid ""
+"The maximum amount of entries that should be put into the database, setting "
+"the limit to 0 will allow databases to grow indefinitely."
+msgstr ""
+"ãã¼ã¿ãã¼ã¹ã«ä¿ç®¡ãããæ大件æ°ã§ãã '0' ãè¨å®ããå ´åãå¶éç¡ãã®ãã¼ã¿"
+"ãã¼ã¹ã®å¢å¤§ã許å¯ãã¾ãã"
+
+msgid "Traffic / Host"
+msgstr "ãã©ãã£ã㯠/ ãã¹ã"
+
+msgid "Traffic Distribution"
+msgstr "ãã©ãã£ãã¯å
訳"
+
+msgid "Up. (Bytes / Pkts.)"
+msgstr "ã¢ãããã¼ãï¼Bytes / Pkts.ï¼"
+
+msgid "Upload (Bytes / Packets)"
+msgstr "ã¢ãããã¼ãï¼Bytes / Packetsï¼"
+
+msgid "Upload / Application"
+msgstr "ã¢ãããã¼ã / ã¢ããªã±ã¼ã·ã§ã³"
+
+msgid "Vendor: Example Corp. "
+msgstr "ãã³ã: Example Corp. "
+
+msgid "Warning"
+msgstr "è¦å"
+
+msgid ""
+"Whether to gzip compress archive databases. Compressing the database files "
+"makes accessing old data slightly slower but helps to reduce storage "
+"requirements."
+msgstr ""
+"ãã¼ã¿ãã¼ã¹ã® gzip å§ç¸®ã¢ã¼ã«ã¤ãåã§ãããã¼ã¿ãã¼ã¹ ãã¡ã¤ã«ãå§ç¸®ããã¨å¤"
+"ããã¼ã¿ã¸ã®ã¢ã¯ã»ã¹ãå¤å°é
ããªãã¾ãããã¹ãã¬ã¼ã¸ä½¿ç¨éã®ä½æ¸ã«å½¹ç«ã¡ã¾"
+"ãã"
+
+msgid ""
+"Whether to preallocate the maximum possible database size in memory. This is "
+"mainly useful for memory constrained systems which might not be able to "
+"satisfy memory allocation after longer uptime periods."
+msgstr ""
+
+msgid "no traffic"
+msgstr "ãã©ãã£ãã¯ç¡ã"
+
+msgid "other"
+msgstr "ãã®ä»"
diff --git a/applications/luci-app-nlbwmon/po/templates/nlbwmon.pot b/applications/luci-app-nlbwmon/po/templates/nlbwmon.pot
new file mode 100644
index 000000000..61d223079
--- /dev/null
+++ b/applications/luci-app-nlbwmon/po/templates/nlbwmon.pot
@@ -0,0 +1,352 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "%d IPv4-only hosts"
+msgstr ""
+
+msgid "%d IPv6-only hosts"
+msgstr ""
+
+msgid "%d dual-stack hosts"
+msgstr ""
+
+msgid "%s and %s"
+msgstr ""
+
+msgid "%s, %s and %s"
+msgstr ""
+
+msgid "-1 - Restart every last day of month"
+msgstr ""
+
+msgid "-7 - Restart a week before end of month"
+msgstr ""
+
+msgid "1 - Restart every 1st of month"
+msgstr ""
+
+msgid "10m - frequent commits at the expense of flash wear"
+msgstr ""
+
+msgid "12h - compromise between risk of data loss and flash wear"
+msgstr ""
+
+msgid "24h - least flash wear at the expense of data loss risk"
+msgstr ""
+
+msgid "30s - refresh twice per minute for reasonably current stats"
+msgstr ""
+
+msgid "5m - rarely refresh to avoid frequently clearing conntrack counters"
+msgstr ""
+
+msgid "60s - commit minutely, useful for non-flash storage"
+msgstr ""
+
+msgid "0 connections"
+msgstr ""
+
+msgid "0 hosts"
+msgstr ""
+
+msgid "0% IPv6 support rate among hosts"
+msgstr ""
+
+msgid "0B total IPv6 download"
+msgstr ""
+
+msgid "0% of the total traffic is IPv6"
+msgstr ""
+
+msgid "0B total IPv6 upload"
+msgstr ""
+
+msgid "0 cause the most connections"
+msgstr ""
+
+msgid "0 cause the most download"
+msgstr ""
+
+msgid "0 cause the most upload"
+msgstr ""
+
+msgid "0 different application protocols"
+msgstr ""
+
+msgid "0 download"
+msgstr ""
+
+msgid "0 upload"
+msgstr ""
+
+msgid "Accounting period"
+msgstr ""
+
+msgid "Advanced Settings"
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "Application Protocols"
+msgstr ""
+
+msgid "Backup"
+msgstr ""
+
+msgid "Bandwidth Monitor"
+msgstr ""
+
+msgid "CSV, grouped by IP"
+msgstr ""
+
+msgid "CSV, grouped by MAC"
+msgstr ""
+
+msgid "CSV, grouped by protocol"
+msgstr ""
+
+msgid ""
+"Changing the accounting interval type will invalidate existing databases!"
+"Download backup ."
+msgstr ""
+
+msgid ""
+"Choose \"Day of month\" to restart the accounting period monthly on a "
+"specific date, e.g. every 3rd. Choose \"Fixed interval\" to restart the "
+"accounting period exactly every N days, beginning at a given date."
+msgstr ""
+
+msgid "Commit interval"
+msgstr ""
+
+msgid "Compress database"
+msgstr ""
+
+msgid "Configuration"
+msgstr ""
+
+msgid "Conn."
+msgstr ""
+
+msgid "Connections"
+msgstr ""
+
+msgid "Connections / Host"
+msgstr ""
+
+msgid "Database directory"
+msgstr ""
+
+msgid ""
+"Database storage directory. One file per accounting period will be placed "
+"into this directory."
+msgstr ""
+
+msgid "Day of month"
+msgstr ""
+
+msgid ""
+"Day of month to restart the accounting period. Use negative values to count "
+"towards the end of month, e.g. \"-5\" to specify the 27th of July or the "
+"24th of Februrary."
+msgstr ""
+
+msgid "Display"
+msgstr ""
+
+msgid "Down. (Bytes / Pkts.)"
+msgstr ""
+
+msgid "Download (Bytes / Packets)"
+msgstr ""
+
+msgid "Download / Application"
+msgstr ""
+
+msgid "Download Database Backup"
+msgstr ""
+
+msgid "Dualstack enabled hosts"
+msgstr ""
+
+msgid "Due date"
+msgstr ""
+
+msgid "Export"
+msgstr ""
+
+msgid "Family"
+msgstr ""
+
+msgid "Fixed interval"
+msgstr ""
+
+msgid "Force reloadâ¦"
+msgstr ""
+
+msgid "General Settings"
+msgstr ""
+
+msgid "Generate Backup"
+msgstr ""
+
+msgid "Host"
+msgstr ""
+
+msgid "Hostname: example.org "
+msgstr ""
+
+msgid "IPv4 vs. IPv6"
+msgstr ""
+
+msgid "IPv6"
+msgstr ""
+
+msgid "Interval"
+msgstr ""
+
+msgid ""
+"Interval at which the temporary in-memory database is committed to the "
+"persistent database directory."
+msgstr ""
+
+msgid ""
+"Interval at which traffic counters of still established connections are "
+"refreshed from netlink information."
+msgstr ""
+
+msgid "Invalid or empty backup archive"
+msgstr ""
+
+msgid "JSON dump"
+msgstr ""
+
+msgid "Length of accounting interval in days."
+msgstr ""
+
+msgid "Local interfaces"
+msgstr ""
+
+msgid "Local subnets"
+msgstr ""
+
+msgid "MAC"
+msgstr ""
+
+msgid "Maximum entries"
+msgstr ""
+
+msgid ""
+"Maximum number of accounting periods to keep, use zero to keep databases "
+"forever."
+msgstr ""
+
+msgid "Netlink Bandwidth Monitor"
+msgstr ""
+
+msgid "Netlink Bandwidth Monitor - Backup / Restore"
+msgstr ""
+
+msgid "Netlink Bandwidth Monitor - Configuration"
+msgstr ""
+
+msgid "No data recorded yet."
+msgstr ""
+
+msgid "Only conntrack streams from or to any of these networks are counted."
+msgstr ""
+
+msgid "Only conntrack streams from or to any of these subnets are counted."
+msgstr ""
+
+msgid "Preallocate database"
+msgstr ""
+
+msgid "Protocol"
+msgstr ""
+
+msgid "Protocol Mapping"
+msgstr ""
+
+msgid ""
+"Protocol mappings to distinguish traffic types per host, one mapping per "
+"line. The first value specifies the IP protocol, the second value the port "
+"number and the third column is the name of the mapped protocol."
+msgstr ""
+
+msgid "Refresh interval"
+msgstr ""
+
+msgid "Restore"
+msgstr ""
+
+msgid "Restore Database Backup"
+msgstr ""
+
+msgid "Select accounting period:"
+msgstr ""
+
+msgid "Source IP"
+msgstr ""
+
+msgid "Start date"
+msgstr ""
+
+msgid "Start date of the first accounting period, e.g. begin of ISP contract."
+msgstr ""
+
+msgid "Stored periods"
+msgstr ""
+
+msgid ""
+"The Netlink Bandwidth Monitor (nlbwmon) is a lightweight, efficient traffic "
+"accounting program keeping track of bandwidth usage per host and protocol."
+msgstr ""
+
+msgid "The following database files have been restored: %s"
+msgstr ""
+
+msgid ""
+"The maximum amount of entries that should be put into the database, setting "
+"the limit to 0 will allow databases to grow indefinitely."
+msgstr ""
+
+msgid "Traffic / Host"
+msgstr ""
+
+msgid "Traffic Distribution"
+msgstr ""
+
+msgid "Up. (Bytes / Pkts.)"
+msgstr ""
+
+msgid "Upload (Bytes / Packets)"
+msgstr ""
+
+msgid "Upload / Application"
+msgstr ""
+
+msgid "Vendor: Example Corp. "
+msgstr ""
+
+msgid "Warning"
+msgstr ""
+
+msgid ""
+"Whether to gzip compress archive databases. Compressing the database files "
+"makes accessing old data slightly slower but helps to reduce storage "
+"requirements."
+msgstr ""
+
+msgid ""
+"Whether to preallocate the maximum possible database size in memory. This is "
+"mainly useful for memory constrained systems which might not be able to "
+"satisfy memory allocation after longer uptime periods."
+msgstr ""
+
+msgid "no traffic"
+msgstr ""
+
+msgid "other"
+msgstr ""
diff --git a/applications/luci-app-nlbwmon/po/zh-cn/nlbwmon.po b/applications/luci-app-nlbwmon/po/zh-cn/nlbwmon.po
new file mode 100644
index 000000000..54fb3f649
--- /dev/null
+++ b/applications/luci-app-nlbwmon/po/zh-cn/nlbwmon.po
@@ -0,0 +1,366 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
+
+msgid "%d IPv4-only hosts"
+msgstr "%d 个主æºä»
æ¯æ IPv4"
+
+msgid "%d IPv6-only hosts"
+msgstr "%d 个主æºä»
æ¯æ IPv6"
+
+msgid "%d dual-stack hosts"
+msgstr "%d 个ååè®®æ 主æº"
+
+msgid "%s and %s"
+msgstr "%s å %s"
+
+msgid "%s, %s and %s"
+msgstr "%s, %s å %s"
+
+msgid "-1 - Restart every last day of month"
+msgstr "-1 - æ¯æçæåä¸å¤©éæ°å¼å§"
+
+msgid "-7 - Restart a week before end of month"
+msgstr "-7 - æ¯æåºåä¸å¨éæ°å¼å§"
+
+msgid "1 - Restart every 1st of month"
+msgstr "1 - æ¯æç第ä¸å¤©éæ°å¼å§"
+
+msgid "10m - frequent commits at the expense of flash wear"
+msgstr "10m - é¢ç¹æ交ï¼éªåæèçå¼éä¹å¢å¤§"
+
+msgid "12h - compromise between risk of data loss and flash wear"
+msgstr "12h - 平衡ç»è®¡æ°æ®ä¸¢å¤±çé£é©ä»¥åéªå使ç¨å¯¿å½"
+
+msgid "24h - least flash wear at the expense of data loss risk"
+msgstr "24h - 以æ°æ®ä¸¢å¤±é£é©ç代价æ¢åæå°çéªåæè"
+
+msgid "30s - refresh twice per minute for reasonably current stats"
+msgstr "30s - æ¯åéå·æ°äºæ¬¡ä»¥è·å¾è¾åç¡®çå½åç»è®¡å¼"
+
+msgid "5m - rarely refresh to avoid frequently clearing conntrack counters"
+msgstr "5m - è¾å°å·æ°ä»¥é¿å
é¢ç¹æ¸
é¤è¿æ¥è·è¸ªè®¡æ°å¨"
+
+msgid "60s - commit minutely, useful for non-flash storage"
+msgstr "60s - æ¯åéæ交ï¼éç¨äºééªåç±»ååå¨"
+
+msgid "0 connections"
+msgstr "è¿æ¥ï¼0 "
+
+msgid "0 hosts"
+msgstr "主æºï¼0 "
+
+msgid "0% IPv6 support rate among hosts"
+msgstr "æ¯æ IPv6 ç主æºæ¯ä¾ï¼0% "
+
+msgid "0B total IPv6 download"
+msgstr "IPv6 æ»ä¸è½½éï¼0B "
+
+msgid "0% of the total traffic is IPv6"
+msgstr "IPv6 æµéæ¯ä¾ï¼0% "
+
+msgid "0B total IPv6 upload"
+msgstr "IPv6 æ»ä¸ä¼ éï¼0B "
+
+msgid "0 cause the most connections"
+msgstr "0 æ¯è¿æ¥æ°æå¤çåè®®"
+
+msgid "0 cause the most download"
+msgstr "0 æ¯ä¸è½½éæ大çåè®®"
+
+msgid "0 cause the most upload"
+msgstr "0 æ¯ä¸ä¼ éæ大çåè®®"
+
+msgid "0 different application protocols"
+msgstr "0 ç§ä¸åçåºç¨å±åè®®"
+
+msgid "0 download"
+msgstr "ä¸è½½ï¼0 "
+
+msgid "0 upload"
+msgstr "ä¸ä¼ ï¼0 "
+
+msgid "Accounting period"
+msgstr "ç»è®¡å¨æ"
+
+msgid "Advanced Settings"
+msgstr "é«çº§è®¾ç½®"
+
+msgid "Application"
+msgstr "åºç¨å±åè®®"
+
+msgid "Application Protocols"
+msgstr "åºç¨å±åè®®"
+
+msgid "Backup"
+msgstr "å¤ä»½"
+
+msgid "Bandwidth Monitor"
+msgstr "带宽çæ§"
+
+msgid "CSV, grouped by IP"
+msgstr "CSVï¼æ IP åç»"
+
+msgid "CSV, grouped by MAC"
+msgstr "CSVï¼æ MAC åç»"
+
+msgid "CSV, grouped by protocol"
+msgstr "CSVï¼æåè®®åç»"
+
+msgid ""
+"Changing the accounting interval type will invalidate existing databases!"
+"Download backup ."
+msgstr ""
+"æ´æ¹ç»è®¡å¨æç±»åä¼ä½¿ç°ææ°æ®åºæ æï¼ä¸è½½å¤ä»½"
+"a> ."
+
+msgid ""
+"Choose \"Day of month\" to restart the accounting period monthly on a "
+"specific date, e.g. every 3rd. Choose \"Fixed interval\" to restart the "
+"accounting period exactly every N days, beginning at a given date."
+msgstr ""
+"éæ©âæ¯æçæä¸å¤©âæ¥è®¾ç½®ç»è®¡å¨æçéå¯æ¶é´ï¼ä¾å¦ï¼æ¯ä¸ªæç第 3 天ãéæ©âåºå®å¨"
+"æâæ¥è®¾ç½®ä»ç»å®æ¥æå¼å§æ¯ N 天éå¯ç»è®¡å¨æã"
+
+msgid "Commit interval"
+msgstr "æ交é´é"
+
+msgid "Compress database"
+msgstr "å缩æ°æ®åº"
+
+msgid "Configuration"
+msgstr "é
ç½®"
+
+msgid "Conn."
+msgstr "è¿æ¥"
+
+msgid "Connections"
+msgstr "è¿æ¥"
+
+msgid "Connections / Host"
+msgstr "è¿æ¥ / 主æº"
+
+msgid "Database directory"
+msgstr "æ°æ®åºç®å½"
+
+msgid ""
+"Database storage directory. One file per accounting period will be placed "
+"into this directory."
+msgstr "æ°æ®åºåå¨ç®å½ãæ¯ä¸ªâç»è®¡å¨æâçæ件å°è¢«æ¾å°è¿ä¸ªç®å½ä¸ã"
+
+msgid "Day of month"
+msgstr "æ¯æçæä¸å¤©"
+
+msgid ""
+"Day of month to restart the accounting period. Use negative values to count "
+"towards the end of month, e.g. \"-5\" to specify the 27th of July or the "
+"24th of Februrary."
+msgstr ""
+"æ¯ä¸ªæéå¯ç»è®¡å¨æçæ¥æã使ç¨è´æ°è¡¨ç¤ºä»æåºå¼å§è®¡ç®ï¼ä¾å¦ï¼\"-5\" å¯ä»¥è¡¨"
+"示 7 æ份ç 27 å·æè
2 æ份ç 24 å·ã"
+
+msgid "Display"
+msgstr "æ¾ç¤º"
+
+msgid "Down. (Bytes / Pkts.)"
+msgstr "ä¸è½½ï¼åè / æ°æ®å
ï¼"
+
+msgid "Download (Bytes / Packets)"
+msgstr "ä¸è½½ï¼åè / æ°æ®å
ï¼"
+
+msgid "Download / Application"
+msgstr "ä¸è½½ / åºç¨å±åè®®"
+
+msgid "Download Database Backup"
+msgstr "ä¸è½½æ°æ®åºå¤ä»½"
+
+msgid "Dualstack enabled hosts"
+msgstr "ååè®®æ 主æº"
+
+msgid "Due date"
+msgstr "éç½®æ¥æ"
+
+msgid "Export"
+msgstr "导åº"
+
+msgid "Family"
+msgstr "å议类å"
+
+msgid "Fixed interval"
+msgstr "åºå®å¨æ"
+
+msgid "Force reloadâ¦"
+msgstr "强å¶éæ°å è½½..."
+
+msgid "General Settings"
+msgstr "åºæ¬è®¾ç½®"
+
+msgid "Generate Backup"
+msgstr "çæå¤ä»½"
+
+msgid "Host"
+msgstr "主æº"
+
+msgid "Hostname: example.org "
+msgstr "主æºåï¼example.org "
+
+msgid "IPv4 vs. IPv6"
+msgstr "IPv4 ä¸ IPv6"
+
+msgid "IPv6"
+msgstr "IPv6"
+
+msgid "Interval"
+msgstr "å¨æ"
+
+msgid ""
+"Interval at which the temporary in-memory database is committed to the "
+"persistent database directory."
+msgstr "å°å
åä¸ç临æ¶æ°æ®åºæ交å°æä¹
æ§æ°æ®åºç®å½çé´éæ¶é´ã"
+
+msgid ""
+"Interval at which traffic counters of still established connections are "
+"refreshed from netlink information."
+msgstr "ä» netlink ä¿¡æ¯ä¸å·æ°â已建ç«è¿æ¥âçæµé计æ°å¨çé´éæ¶é´ã"
+
+msgid "Invalid or empty backup archive"
+msgstr "å¤ä»½åæ¡£æ ææ为空"
+
+msgid "JSON dump"
+msgstr "JSON è¾åº"
+
+msgid "Length of accounting interval in days."
+msgstr "ç»è®¡å¨æï¼å¤©ï¼ã"
+
+msgid "Local interfaces"
+msgstr "æ¬å°æ¥å£"
+
+msgid "Local subnets"
+msgstr "æ¬å°åç½"
+
+msgid "MAC"
+msgstr "MAC"
+
+msgid "Maximum entries"
+msgstr "æ大æ¡ç®"
+
+msgid ""
+"Maximum number of accounting periods to keep, use zero to keep databases "
+"forever."
+msgstr "ä¿ççç»è®¡å¨ææ°æ®åºçæ大æ°éï¼è®¾ç½® 0 表示ä¸éå¶ã"
+
+msgid "Netlink Bandwidth Monitor"
+msgstr "ç½ç»å¸¦å®½çè§å¨"
+
+msgid "Netlink Bandwidth Monitor - Backup / Restore"
+msgstr "ç½ç»å¸¦å®½çè§å¨ - å¤ä»½ / æ¢å¤"
+
+msgid "Netlink Bandwidth Monitor - Configuration"
+msgstr "ç½ç»å¸¦å®½çè§å¨ - é
ç½®"
+
+msgid "No data recorded yet."
+msgstr "ææ æ°æ®è®°å½ã"
+
+msgid "Only conntrack streams from or to any of these networks are counted."
+msgstr "ä»
ç»è®¡æ¥èªæç®æ 为è¿äºç½ç»æ¥å£çè¿æ¥æµéã"
+
+msgid "Only conntrack streams from or to any of these subnets are counted."
+msgstr "ä»
ç»è®¡æ¥èªæç®æ 为è¿äºåç½çè¿æ¥æµéã"
+
+msgid "Preallocate database"
+msgstr "é¢åé
æ°æ®åº"
+
+msgid "Protocol"
+msgstr "åè®®"
+
+msgid "Protocol Mapping"
+msgstr "åè®®æ å°"
+
+msgid ""
+"Protocol mappings to distinguish traffic types per host, one mapping per "
+"line. The first value specifies the IP protocol, the second value the port "
+"number and the third column is the name of the mapped protocol."
+msgstr ""
+"åè®®æ å°ç¨äºåºåæµéç±»åï¼æ¯è¡ä¸æ¡ã第ä¸ä¸ªå¼æå® IP å议类åï¼ç¬¬äºä¸ªå¼æ¯"
+"端å£å·ï¼ç¬¬ä¸ä¸ªå¼æ¯æ å°çåè®®å称ã"
+
+msgid "Refresh interval"
+msgstr "å·æ°é´é"
+
+msgid "Restore"
+msgstr "æ¢å¤"
+
+msgid "Restore Database Backup"
+msgstr "æ¢å¤æ°æ®åºå¤ä»½"
+
+msgid "Select accounting period:"
+msgstr "éæ©ç»è®¡å¨æï¼"
+
+msgid "Source IP"
+msgstr "æº IP"
+
+msgid "Start date"
+msgstr "èµ·å§æ¥æ"
+
+msgid "Start date of the first accounting period, e.g. begin of ISP contract."
+msgstr "第ä¸ä¸ªç»è®¡å¨æçèµ·å§æ¥æï¼ä¾å¦ï¼ISP å约çèµ·å§æ¥æã"
+
+msgid "Stored periods"
+msgstr "å¨åå¨æ"
+
+msgid ""
+"The Netlink Bandwidth Monitor (nlbwmon) is a lightweight, efficient traffic "
+"accounting program keeping track of bandwidth usage per host and protocol."
+msgstr ""
+"ç½ç»å¸¦å®½çè§å¨ï¼nlbwmonï¼æ¯ä¸ä¸ªè½»éãé«æçæµéç»è®¡ç¨åºï¼å¯ä»¥ç»è®¡æ¯ä¸ªä¸»æºå"
+"åè®®ç带宽使ç¨æ
åµã"
+
+msgid "The following database files have been restored: %s"
+msgstr "以ä¸æ°æ®åºæ件已æ¢å¤ï¼%s"
+
+msgid ""
+"The maximum amount of entries that should be put into the database, setting "
+"the limit to 0 will allow databases to grow indefinitely."
+msgstr "æ°æ®åºä¸çæ大æ¡ç®æ°é, 设置为 0 å°å
许æ°æ®åºæ éå¢é¿ã"
+
+msgid "Traffic / Host"
+msgstr "æµé / 主æº"
+
+msgid "Traffic Distribution"
+msgstr "æµéåå¸"
+
+msgid "Up. (Bytes / Pkts.)"
+msgstr "ä¸ä¼ ï¼åè / æ°æ®å
ï¼"
+
+msgid "Upload (Bytes / Packets)"
+msgstr "ä¸ä¼ ï¼åè / æ°æ®å
ï¼"
+
+msgid "Upload / Application"
+msgstr "ä¸ä¼ / åºç¨å±åè®®"
+
+msgid "Vendor: Example Corp. "
+msgstr "ä¾åºå: Example Corp. "
+
+msgid "Warning"
+msgstr "è¦å"
+
+msgid ""
+"Whether to gzip compress archive databases. Compressing the database files "
+"makes accessing old data slightly slower but helps to reduce storage "
+"requirements."
+msgstr ""
+"æ¯å¦ä½¿ç¨ gzip å缩æ°æ®åºåæ¡£ãå缩æ°æ®åºæ件ä¼ä½¿è®¿é®æ§æ°æ®ç¨å¾®æ
¢ä¸äº, ä½æå©"
+"äºåå°åå¨å ç¨ç©ºé´ã"
+
+msgid ""
+"Whether to preallocate the maximum possible database size in memory. This is "
+"mainly useful for memory constrained systems which might not be able to "
+"satisfy memory allocation after longer uptime periods."
+msgstr ""
+"æ¯å¦é¢å
åé
æ°æ®åºæ大å¯è½å ç¨çå
å大å°ãè¿ä¸»è¦éç¨äºå
åè¾å°ç³»ç»ï¼è¿äºç³»ç»"
+"å¨é¿æ¶é´è¿è¡ä¹åå¯è½æ æ³æ»¡è¶³æ°æ®åºçå
åéæ±ã"
+
+msgid "no traffic"
+msgstr "æ æµéæ°æ®"
+
+msgid "other"
+msgstr "å
¶ä»"
diff --git a/applications/luci-app-nlbwmon/root/etc/uci-defaults/40_luci-nlbwmon b/applications/luci-app-nlbwmon/root/etc/uci-defaults/40_luci-nlbwmon
new file mode 100644
index 000000000..c9771779e
--- /dev/null
+++ b/applications/luci-app-nlbwmon/root/etc/uci-defaults/40_luci-nlbwmon
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+uci -q batch <<-EOF >/dev/null
+ delete ucitrack.@nlbwmon[-1]
+ add ucitrack nlbwmon
+ set ucitrack.@nlbwmon[-1].init=nlbwmon
+ commit ucitrack
+EOF
+
+rm -f /tmp/luci-indexcache
+exit 0
diff --git a/applications/luci-app-samba/luasrc/model/cbi/samba.lua b/applications/luci-app-samba/luasrc/model/cbi/samba.lua
index 68a5b3a9b..2e533c3f5 100644
--- a/applications/luci-app-samba/luasrc/model/cbi/samba.lua
+++ b/applications/luci-app-samba/luasrc/model/cbi/samba.lua
@@ -36,7 +36,8 @@ function tmpl.write(self, section, value)
end
-s = m:section(TypedSection, "sambashare", translate("Shared Directories"))
+s = m:section(TypedSection, "sambashare", translate("Shared Directories")
+ , translate("Please add directories to share. Each directory refers to a folder on a mounted device."))
s.anonymous = true
s.addremove = true
s.template = "cbi/tblsection"
diff --git a/applications/luci-app-samba/po/ca/samba.po b/applications/luci-app-samba/po/ca/samba.po
index fadcbdfdb..eb6be15cd 100644
--- a/applications/luci-app-samba/po/ca/samba.po
+++ b/applications/luci-app-samba/po/ca/samba.po
@@ -65,6 +65,11 @@ msgstr "Comparticions de xarxa"
msgid "Path"
msgstr "Ruta"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Només lectura"
diff --git a/applications/luci-app-samba/po/cs/samba.po b/applications/luci-app-samba/po/cs/samba.po
index 4a00124fb..d66d87674 100644
--- a/applications/luci-app-samba/po/cs/samba.po
+++ b/applications/luci-app-samba/po/cs/samba.po
@@ -63,6 +63,11 @@ msgstr "SÃÅ¥ová sdÃlenÃ"
msgid "Path"
msgstr "Cesta"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Pouze pro ÄtenÃ"
diff --git a/applications/luci-app-samba/po/de/samba.po b/applications/luci-app-samba/po/de/samba.po
index 1bcac0c9b..4e8da53b5 100644
--- a/applications/luci-app-samba/po/de/samba.po
+++ b/applications/luci-app-samba/po/de/samba.po
@@ -65,6 +65,11 @@ msgstr "Netzwerkfreigaben"
msgid "Path"
msgstr "Pfad"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Nur Lesen"
diff --git a/applications/luci-app-samba/po/el/samba.po b/applications/luci-app-samba/po/el/samba.po
index 9a15ad1e0..878416a63 100644
--- a/applications/luci-app-samba/po/el/samba.po
+++ b/applications/luci-app-samba/po/el/samba.po
@@ -61,6 +61,11 @@ msgstr ""
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr ""
diff --git a/applications/luci-app-samba/po/en/samba.po b/applications/luci-app-samba/po/en/samba.po
index 94cfdb516..642580e9d 100644
--- a/applications/luci-app-samba/po/en/samba.po
+++ b/applications/luci-app-samba/po/en/samba.po
@@ -61,6 +61,11 @@ msgstr "Network Shares"
msgid "Path"
msgstr "Path"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Read-only"
diff --git a/applications/luci-app-samba/po/es/samba.po b/applications/luci-app-samba/po/es/samba.po
index c14ebd2c3..57c4b862d 100644
--- a/applications/luci-app-samba/po/es/samba.po
+++ b/applications/luci-app-samba/po/es/samba.po
@@ -63,6 +63,11 @@ msgstr "Comparticiones de red"
msgid "Path"
msgstr "Dirección"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Solo lectura"
diff --git a/applications/luci-app-samba/po/fr/samba.po b/applications/luci-app-samba/po/fr/samba.po
index ff040b50d..63960fca1 100644
--- a/applications/luci-app-samba/po/fr/samba.po
+++ b/applications/luci-app-samba/po/fr/samba.po
@@ -63,6 +63,11 @@ msgstr "Partages réseau"
msgid "Path"
msgstr "Chemin"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Lecture seule"
diff --git a/applications/luci-app-samba/po/he/samba.po b/applications/luci-app-samba/po/he/samba.po
index 620f56cf8..010d2b248 100644
--- a/applications/luci-app-samba/po/he/samba.po
+++ b/applications/luci-app-samba/po/he/samba.po
@@ -56,6 +56,11 @@ msgstr ""
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr ""
diff --git a/applications/luci-app-samba/po/hu/samba.po b/applications/luci-app-samba/po/hu/samba.po
index 38a9a0843..0263edb6c 100644
--- a/applications/luci-app-samba/po/hu/samba.po
+++ b/applications/luci-app-samba/po/hu/samba.po
@@ -63,6 +63,11 @@ msgstr "Hálózati megosztások"
msgid "Path"
msgstr "Elérési út"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Csak olvasható"
diff --git a/applications/luci-app-samba/po/it/samba.po b/applications/luci-app-samba/po/it/samba.po
index a2bb9b673..8e5b062a0 100644
--- a/applications/luci-app-samba/po/it/samba.po
+++ b/applications/luci-app-samba/po/it/samba.po
@@ -64,6 +64,11 @@ msgstr "Condivisioni di rete"
msgid "Path"
msgstr "Percorso"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Solo lettura"
diff --git a/applications/luci-app-samba/po/ja/samba.po b/applications/luci-app-samba/po/ja/samba.po
index 9f338defb..eca10efcc 100644
--- a/applications/luci-app-samba/po/ja/samba.po
+++ b/applications/luci-app-samba/po/ja/samba.po
@@ -1,17 +1,17 @@
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n"
-"PO-Revision-Date: 2011-11-03 18:09+0200\n"
-"Last-Translator: Kentaro \n"
-"Language-Team: LANGUAGE \n"
+"PO-Revision-Date: 2017-08-16 00:41+0900\n"
+"Last-Translator: INAGAKI Hiroshi \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: Pootle 2.0.4\n"
+"X-Generator: Poedit 2.0.3\n"
+"Language-Team: \n"
msgid "Allow guests"
msgstr "ã²ã¹ãã¢ã¯ã»ã¹ã許å¯"
@@ -61,6 +61,13 @@ msgstr "ãããã¯ã¼ã¯å
±æ"
msgid "Path"
msgstr "ãã¹"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+"å
±æãããã£ã¬ã¯ããªã追å ãã¦ãã ããããã¦ã³ããããããã¤ã¹çã®ãã£ã¬ã¯ã"
+"ãªãè¨å®ããå
¬éãããã¨ãã§ãã¾ãã"
+
msgid "Read-only"
msgstr "èªã¿è¾¼ã¿ã®ã¿"
diff --git a/applications/luci-app-samba/po/ms/samba.po b/applications/luci-app-samba/po/ms/samba.po
index de4ed7c36..d5f1ce15e 100644
--- a/applications/luci-app-samba/po/ms/samba.po
+++ b/applications/luci-app-samba/po/ms/samba.po
@@ -55,6 +55,11 @@ msgstr ""
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr ""
diff --git a/applications/luci-app-samba/po/no/samba.po b/applications/luci-app-samba/po/no/samba.po
index 7059d7748..349f6b9de 100644
--- a/applications/luci-app-samba/po/no/samba.po
+++ b/applications/luci-app-samba/po/no/samba.po
@@ -52,6 +52,11 @@ msgstr "Nettverks Mapper"
msgid "Path"
msgstr "Fysisk bane"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Skrivebeskyttet"
diff --git a/applications/luci-app-samba/po/pl/samba.po b/applications/luci-app-samba/po/pl/samba.po
index bf54e78c3..d997268cd 100644
--- a/applications/luci-app-samba/po/pl/samba.po
+++ b/applications/luci-app-samba/po/pl/samba.po
@@ -62,6 +62,11 @@ msgstr "UdziaÅy sieciowe"
msgid "Path"
msgstr "Åcieżka"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Tylko do odczytu"
diff --git a/applications/luci-app-samba/po/pt-br/samba.po b/applications/luci-app-samba/po/pt-br/samba.po
index 43ea3b9b9..a2e6e220c 100644
--- a/applications/luci-app-samba/po/pt-br/samba.po
+++ b/applications/luci-app-samba/po/pt-br/samba.po
@@ -63,6 +63,11 @@ msgstr "Compartilhamentos de Rede"
msgid "Path"
msgstr "Caminho"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Somente leitura"
diff --git a/applications/luci-app-samba/po/pt/samba.po b/applications/luci-app-samba/po/pt/samba.po
index 6d4f00386..f58b58818 100644
--- a/applications/luci-app-samba/po/pt/samba.po
+++ b/applications/luci-app-samba/po/pt/samba.po
@@ -63,6 +63,11 @@ msgstr "Partilhas da Rede"
msgid "Path"
msgstr "Caminho"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Apenas Leitura"
diff --git a/applications/luci-app-samba/po/ro/samba.po b/applications/luci-app-samba/po/ro/samba.po
index 78c55e4eb..7cfcda7d1 100644
--- a/applications/luci-app-samba/po/ro/samba.po
+++ b/applications/luci-app-samba/po/ro/samba.po
@@ -62,6 +62,11 @@ msgstr "Partajari pe retea"
msgid "Path"
msgstr "Cale"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Doar citire"
diff --git a/applications/luci-app-samba/po/ru/samba.po b/applications/luci-app-samba/po/ru/samba.po
index 4823dc46d..534770f5f 100644
--- a/applications/luci-app-samba/po/ru/samba.po
+++ b/applications/luci-app-samba/po/ru/samba.po
@@ -64,6 +64,11 @@ msgstr "СеÑевÑе ÑеÑÑÑÑÑ"
msgid "Path"
msgstr "ÐÑÑÑ"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "ТолÑко Ð´Ð»Ñ ÑÑениÑ"
diff --git a/applications/luci-app-samba/po/sk/samba.po b/applications/luci-app-samba/po/sk/samba.po
index 2c511c815..21f102d32 100644
--- a/applications/luci-app-samba/po/sk/samba.po
+++ b/applications/luci-app-samba/po/sk/samba.po
@@ -56,6 +56,11 @@ msgstr ""
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr ""
diff --git a/applications/luci-app-samba/po/sv/samba.po b/applications/luci-app-samba/po/sv/samba.po
index 549a69c5c..f58f8b87d 100644
--- a/applications/luci-app-samba/po/sv/samba.po
+++ b/applications/luci-app-samba/po/sv/samba.po
@@ -58,6 +58,11 @@ msgstr "Nätverksdelningar"
msgid "Path"
msgstr "Genväg"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "Endast läsbar"
diff --git a/applications/luci-app-samba/po/templates/samba.pot b/applications/luci-app-samba/po/templates/samba.pot
index 9e4ab7ff1..674ed331c 100644
--- a/applications/luci-app-samba/po/templates/samba.pot
+++ b/applications/luci-app-samba/po/templates/samba.pot
@@ -49,6 +49,11 @@ msgstr ""
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr ""
diff --git a/applications/luci-app-samba/po/tr/samba.po b/applications/luci-app-samba/po/tr/samba.po
index 486768f2e..98d47beec 100644
--- a/applications/luci-app-samba/po/tr/samba.po
+++ b/applications/luci-app-samba/po/tr/samba.po
@@ -56,6 +56,11 @@ msgstr ""
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr ""
diff --git a/applications/luci-app-samba/po/uk/samba.po b/applications/luci-app-samba/po/uk/samba.po
index 077315e21..a4469f961 100644
--- a/applications/luci-app-samba/po/uk/samba.po
+++ b/applications/luci-app-samba/po/uk/samba.po
@@ -63,6 +63,11 @@ msgstr "ÐагалÑÐ½Ñ Ð¼ÐµÑÐµÐ¶ÐµÐ²Ñ ÑеÑÑÑÑи"
msgid "Path"
msgstr "ШлÑÑ
"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "ТÑлÑки ÑиÑаннÑ"
diff --git a/applications/luci-app-samba/po/vi/samba.po b/applications/luci-app-samba/po/vi/samba.po
index c5f6e02df..7c088cebe 100644
--- a/applications/luci-app-samba/po/vi/samba.po
+++ b/applications/luci-app-samba/po/vi/samba.po
@@ -69,6 +69,11 @@ msgstr "Mạng chia sẻ"
msgid "Path"
msgstr ""
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
#, fuzzy
msgid "Read-only"
msgstr "Chá» Äá»c "
diff --git a/applications/luci-app-samba/po/zh-cn/samba.po b/applications/luci-app-samba/po/zh-cn/samba.po
index 2294b611a..b6fd8f31d 100644
--- a/applications/luci-app-samba/po/zh-cn/samba.po
+++ b/applications/luci-app-samba/po/zh-cn/samba.po
@@ -61,6 +61,11 @@ msgstr "ç½ç»å
񄧮"
msgid "Path"
msgstr "ç®å½"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "åªè¯»"
diff --git a/applications/luci-app-samba/po/zh-tw/samba.po b/applications/luci-app-samba/po/zh-tw/samba.po
index bfa2d7d6d..ed0dabb80 100644
--- a/applications/luci-app-samba/po/zh-tw/samba.po
+++ b/applications/luci-app-samba/po/zh-tw/samba.po
@@ -59,6 +59,11 @@ msgstr "網路å享"
msgid "Path"
msgstr "è·¯å¾"
+msgid ""
+"Please add directories to share. Each directory refers to a folder on a "
+"mounted device."
+msgstr ""
+
msgid "Read-only"
msgstr "å¯è®"
diff --git a/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instance-details.lua b/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instance-details.lua
index d9a61d0bf..22f3106d0 100644
--- a/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instance-details.lua
+++ b/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/instance-details.lua
@@ -24,6 +24,7 @@ s:tab("general", translate("General Settings"))
s:tab("advanced", translate("Advanced Settings"))
s:taboption("general", Flag, "disabled", translate("Disable"))
ss.option_install_package(s, "general")
+ss.options_common(s, "advanced")
if stype == "ss_server" then
ss.options_server(s, "general")
@@ -42,8 +43,11 @@ else
translate("Tunnel address"),
translate("The address ss-tunnel will forward traffic to"))
o.datatype = "hostport"
+ elseif stype == "ss_redir" then
+ o = s:taboption("advanced", Flag, "disable_sni",
+ translate("Disable SNI"),
+ translate("Disable parsing HTTP/HTTPS payload to find then resolve hostname at remote server"))
end
end
-ss.options_common(s, "advanced")
return m
diff --git a/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/rules.lua b/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/rules.lua
index fe5f9c31b..5df59cb0a 100644
--- a/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/rules.lua
+++ b/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev/rules.lua
@@ -16,8 +16,13 @@ m = Map("shadowsocks-libev",
If the prior check results in action checkdst , packets will continue \
to have their destination addresses checked."))
+local sdata = m:get('ss_rules')
+if not sdata then
+ m:set('ss_rules', nil, 'ss_rules')
+ m:set('ss_rules', 'ss_rules', 'disabled', true)
+end
-s = m:section(NamedSection, "ss_rules", "ss-rules")
+s = m:section(NamedSection, "ss_rules", "ss_rules")
s:tab("general", translate("General Settings"))
s:tab("srcip", translate("Source Settings"))
s:tab("dstip", translate("Destination Settings"))
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 2753f458b..6608ee8d3 100644
--- a/applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua
+++ b/applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua
@@ -22,7 +22,7 @@ end
function values_redir(o, xmode)
o.map.uci.foreach("shadowsocks-libev", "ss_redir", function(sdata)
local sname = sdata[".name"]
- local mode = sdata["mode"]
+ local mode = sdata["mode"] or "tcp_only"
if mode and mode:find(xmode) then
local desc = "%s - %s" % {sname, mode}
o:value(sname, desc)
@@ -108,6 +108,7 @@ function options_common(s, tab)
s:taboption(tab, Value, "user", translate("Run as"))
s:taboption(tab, Flag, "verbose", translate("Verbose"))
+ s:taboption(tab, Flag, "ipv6_first", translate("IPv6 First"), translate("Prefer IPv6 addresses when resolving names"))
s:taboption(tab, Flag, "fast_open", translate("Enable TCP Fast Open"))
s:taboption(tab, Flag, "reuse_port", translate("Enable SO_REUSEPORT"))
end
@@ -131,6 +132,8 @@ function cfgvalue_overview(sdata)
cfgvalue_overview_(sdata, lines, names_options_client)
if stype == "ss_tunnel" then
cfgvalue_overview_(sdata, lines, {"tunnel_address"})
+ elseif stype == "ss_redir" then
+ cfgvalue_overview_(sdata, lines, {"disable_sni"})
end
cfgvalue_overview_(sdata, lines, names_options_common)
else
@@ -153,6 +156,9 @@ function cfgvalue_overview_(sdata, lines, names)
for _, n in ipairs(names) do
local v = sdata[n]
if v ~= nil then
+ if n == "key" or n == "password" then
+ v = translate("")
+ end
local fv = "%s " % ut.pcdata(v)
if sdata[".type"] ~= "ss_server" and n == "server" then
fv = '%s ' % {
@@ -205,6 +211,7 @@ names_options_client = {
names_options_common = {
"verbose",
+ "ipv6_first",
"fast_open",
"reuse_port",
"mode",
@@ -247,7 +254,4 @@ methods = {
"salsa20",
"chacha20",
"chacha20-ietf",
- "aes-128-gcm",
- "aes-192-gcm",
- "aes-256-gcm",
}
diff --git a/applications/luci-app-statistics/po/ca/statistics.po b/applications/luci-app-statistics/po/ca/statistics.po
index 33d5051f4..738af5510 100644
--- a/applications/luci-app-statistics/po/ca/statistics.po
+++ b/applications/luci-app-statistics/po/ca/statistics.po
@@ -15,6 +15,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Acció (objectiu)"
@@ -295,6 +301,9 @@ msgstr "Monitoritza els discs i les particions"
msgid "Monitor filesystem types"
msgstr "Monitoritza els tipus de sistema de fitxers"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitoritza mà quines"
@@ -381,6 +390,9 @@ msgstr "Configuració del connector ping"
msgid "Port"
msgstr "Port"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Processos"
@@ -506,6 +518,9 @@ msgstr "TTL per paquets ping"
msgid "Table"
msgstr "Taula"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/cs/statistics.po b/applications/luci-app-statistics/po/cs/statistics.po
index 849831607..fc3f513c5 100644
--- a/applications/luci-app-statistics/po/cs/statistics.po
+++ b/applications/luci-app-statistics/po/cs/statistics.po
@@ -11,6 +11,12 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Akce (cÃl)"
@@ -290,6 +296,9 @@ msgstr "Sledovat disky a oddÃly"
msgid "Monitor filesystem types"
msgstr "Sledovat typy souborových systémů"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Sledovat hostitele"
@@ -376,6 +385,9 @@ msgstr "Nastavenà pluginu Ping"
msgid "Port"
msgstr "Port"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Procesy"
@@ -500,6 +512,9 @@ msgstr "TTL pro pakety pingu"
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/de/statistics.po b/applications/luci-app-statistics/po/de/statistics.po
index 196433e50..45ba020ad 100644
--- a/applications/luci-app-statistics/po/de/statistics.po
+++ b/applications/luci-app-statistics/po/de/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Aktion (Ziel)"
@@ -297,6 +303,9 @@ msgstr "Geräte und Partitionen überwachen"
msgid "Monitor filesystem types"
msgstr "Datesystemtypen überwachen"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Hosts überwachen"
@@ -383,6 +392,9 @@ msgstr "Ping Plugin Konfiguration"
msgid "Port"
msgstr "Port"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Prozesse"
@@ -506,6 +518,9 @@ msgstr "TTL für Ping Pakete"
msgid "Table"
msgstr "Tabelle"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
"Das NUT-Plugin liest Informationen über Unterbrechungsfreie Stromversorgungen"
diff --git a/applications/luci-app-statistics/po/el/statistics.po b/applications/luci-app-statistics/po/el/statistics.po
index da54cdac6..406286844 100644
--- a/applications/luci-app-statistics/po/el/statistics.po
+++ b/applications/luci-app-statistics/po/el/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.4\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -288,6 +294,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -374,6 +383,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "ÎιεÏγαÏίεÏ"
@@ -497,6 +509,9 @@ msgstr ""
msgid "Table"
msgstr "ΠίνακαÏ"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/en/statistics.po b/applications/luci-app-statistics/po/en/statistics.po
index d9ab59ce0..f7ebfe0c2 100644
--- a/applications/luci-app-statistics/po/en/statistics.po
+++ b/applications/luci-app-statistics/po/en/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 1.1.1\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Action (target)"
@@ -293,6 +299,9 @@ msgstr "Monitor disks and partitions"
msgid "Monitor filesystem types"
msgstr "Monitor filesystem types"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitor hosts"
@@ -379,6 +388,9 @@ msgstr "Ping Plugin Configuration"
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Processes"
@@ -502,6 +514,9 @@ msgstr "TTL for ping packets"
msgid "Table"
msgstr "Table"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/es/statistics.po b/applications/luci-app-statistics/po/es/statistics.po
index 18c25819a..3c811ffef 100644
--- a/applications/luci-app-statistics/po/es/statistics.po
+++ b/applications/luci-app-statistics/po/es/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Acción (objetivo)"
@@ -292,6 +298,9 @@ msgstr "Monitorizar discos y particiones"
msgid "Monitor filesystem types"
msgstr "Monitorizar tipos de sistema de archivos"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitorizar máquinas"
@@ -378,6 +387,9 @@ msgstr "Configuración del plugin \"Ping\""
msgid "Port"
msgstr "Puerto"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Procesos"
@@ -501,6 +513,9 @@ msgstr "TTL para paquetes de ping"
msgid "Table"
msgstr "Tabla"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
"El plugin NUT obtiene información sobre Sistemas de Alimentación "
diff --git a/applications/luci-app-statistics/po/fr/statistics.po b/applications/luci-app-statistics/po/fr/statistics.po
index b657bd38f..bc156dd42 100644
--- a/applications/luci-app-statistics/po/fr/statistics.po
+++ b/applications/luci-app-statistics/po/fr/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Pootle 2.0.4\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Action (cible)"
@@ -294,6 +300,9 @@ msgstr "Disques et partitions à surveiller"
msgid "Monitor filesystem types"
msgstr "types de systèmes de fichier à surveiller"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Hôtes à surveiller"
@@ -380,6 +389,9 @@ msgstr "Configuration du greffon Ping"
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Processus"
@@ -503,6 +515,9 @@ msgstr "TTL des paquets ping"
msgid "Table"
msgstr "Table"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/he/statistics.po b/applications/luci-app-statistics/po/he/statistics.po
index 6f40a47a2..35f978ed2 100644
--- a/applications/luci-app-statistics/po/he/statistics.po
+++ b/applications/luci-app-statistics/po/he/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -283,6 +289,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -369,6 +378,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -492,6 +504,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/hu/statistics.po b/applications/luci-app-statistics/po/hu/statistics.po
index 979c72f0f..e5c4e601c 100644
--- a/applications/luci-app-statistics/po/hu/statistics.po
+++ b/applications/luci-app-statistics/po/hu/statistics.po
@@ -11,6 +11,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Tevékenység (cél)"
@@ -295,6 +301,9 @@ msgstr "Lemezek és partÃciók figyelése"
msgid "Monitor filesystem types"
msgstr "Fájlrendszer tÃpusok figyelése"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Gépek figyelése"
@@ -381,6 +390,9 @@ msgstr "Ping bÅvÃtmény beállÃtása"
msgid "Port"
msgstr "Port"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Folyamatok"
@@ -508,6 +520,9 @@ msgstr "TTL a ping csomagokhoz"
msgid "Table"
msgstr "Táblázat"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr "A NUT bÅvÃtmény a szünetmentes tápokról ad információkat."
diff --git a/applications/luci-app-statistics/po/it/statistics.po b/applications/luci-app-statistics/po/it/statistics.po
index b0ae3d6b7..2451503f2 100644
--- a/applications/luci-app-statistics/po/it/statistics.po
+++ b/applications/luci-app-statistics/po/it/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Azione (destinazione)"
@@ -293,6 +299,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -379,6 +388,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -502,6 +514,9 @@ msgstr ""
msgid "Table"
msgstr "Tabella"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/ja/statistics.po b/applications/luci-app-statistics/po/ja/statistics.po
index 690d9207d..53941cf0f 100644
--- a/applications/luci-app-statistics/po/ja/statistics.po
+++ b/applications/luci-app-statistics/po/ja/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"X-Generator: Poedit 1.8.11\n"
"Language-Team: \n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "ã¢ã¯ã·ã§ã³ï¼å¯¾è±¡ï¼"
@@ -295,6 +301,9 @@ msgstr "ãã£ã¹ã¯ã¨ãã¼ãã£ã·ã§ã³ãã¢ãã¿ã¼ãã"
msgid "Monitor filesystem types"
msgstr "ãã¡ã¤ã«ã·ã¹ãã ã¿ã¤ããã¢ãã¿ã¼ãã"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "ãã¹ããã¢ãã¿ã¼ãã"
@@ -384,6 +393,9 @@ msgstr "Ping ãã©ã°ã¤ã³è¨å®"
msgid "Port"
msgstr "ãã¼ã"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "ããã»ã¹"
@@ -507,6 +519,9 @@ msgstr "pingãã±ããã®TTL"
msgid "Table"
msgstr "ãã¼ãã«"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr "NUT ãã©ã°ã¤ã³ã¯ãç¡åé»é»æºè£
ç½®ã«ã¤ãã¦ã®æ
å ±ãèªã¿åãã¾ãã"
diff --git a/applications/luci-app-statistics/po/ms/statistics.po b/applications/luci-app-statistics/po/ms/statistics.po
index 582314c54..c02556fc8 100644
--- a/applications/luci-app-statistics/po/ms/statistics.po
+++ b/applications/luci-app-statistics/po/ms/statistics.po
@@ -10,6 +10,12 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -280,6 +286,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -366,6 +375,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -489,6 +501,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/no/statistics.po b/applications/luci-app-statistics/po/no/statistics.po
index d37bc488f..4de2ee6b5 100644
--- a/applications/luci-app-statistics/po/no/statistics.po
+++ b/applications/luci-app-statistics/po/no/statistics.po
@@ -4,6 +4,12 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Handling (mål)"
@@ -282,6 +288,9 @@ msgstr "Overvåk disker og partisjoner"
msgid "Monitor filesystem types"
msgstr "Overvåk filsystem typer"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Overvåk verter"
@@ -368,6 +377,9 @@ msgstr "Ping plugin konfigurasjon"
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Prosesser"
@@ -491,6 +503,9 @@ msgstr "TTL for ping pakker"
msgid "Table"
msgstr "Tabell"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/pl/statistics.po b/applications/luci-app-statistics/po/pl/statistics.po
index bf2ec9351..6e34ce072 100644
--- a/applications/luci-app-statistics/po/pl/statistics.po
+++ b/applications/luci-app-statistics/po/pl/statistics.po
@@ -14,6 +14,12 @@ msgstr ""
"|| n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Akcja (cel)"
@@ -296,6 +302,9 @@ msgstr "Monitoruj dyski i partycje"
msgid "Monitor filesystem types"
msgstr "Monitoruj system plików"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitoruj hosty"
@@ -382,6 +391,9 @@ msgstr "Konfiguracja wtyczki Ping"
msgid "Port"
msgstr "Port"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Procesy"
@@ -506,6 +518,9 @@ msgstr "TTL dla pakietów ping"
msgid "Table"
msgstr "Tabela"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr "Wtyczka Nut Informuje o Nie przerywalnym Zasilaniu"
diff --git a/applications/luci-app-statistics/po/pt-br/statistics.po b/applications/luci-app-statistics/po/pt-br/statistics.po
index 74c4a2603..c5d689933 100644
--- a/applications/luci-app-statistics/po/pt-br/statistics.po
+++ b/applications/luci-app-statistics/po/pt-br/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"X-Generator: Poedit 1.8.11\n"
"Language-Team: \n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Ação (destino)"
@@ -299,6 +305,9 @@ msgstr "Monitoras discos e partições"
msgid "Monitor filesystem types"
msgstr "Monitorar tipos de sistemas de arquivos"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitorar os equipamentos"
@@ -388,6 +397,9 @@ msgstr "Configuração do plugin Ping"
msgid "Port"
msgstr "Porta"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Processos"
@@ -511,6 +523,9 @@ msgstr "TTL para os pacotes do ping"
msgid "Table"
msgstr "Tabela"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr "O plugin NUT lê informações sobre Fontes de alimentação ininterruptas."
diff --git a/applications/luci-app-statistics/po/pt/statistics.po b/applications/luci-app-statistics/po/pt/statistics.po
index 79c7bd03e..245e6e9bf 100644
--- a/applications/luci-app-statistics/po/pt/statistics.po
+++ b/applications/luci-app-statistics/po/pt/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Ação (destino)"
@@ -295,6 +301,9 @@ msgstr "Monitoras discos e partições"
msgid "Monitor filesystem types"
msgstr "Monitorar tipos de sistemas de arquivos"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitorar os hosts"
@@ -381,6 +390,9 @@ msgstr "Configuração do plugin Ping"
msgid "Port"
msgstr "Porta"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Processos"
@@ -504,6 +516,9 @@ msgstr "TTL para os pacotes do ping"
msgid "Table"
msgstr "Tabela"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/ro/statistics.po b/applications/luci-app-statistics/po/ro/statistics.po
index c5dfcfe55..a326fec79 100644
--- a/applications/luci-app-statistics/po/ro/statistics.po
+++ b/applications/luci-app-statistics/po/ro/statistics.po
@@ -14,6 +14,12 @@ msgstr ""
"20)) ? 1 : 2);;\n"
"X-Generator: Pootle 2.0.4\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -287,6 +293,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -373,6 +382,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Procese"
@@ -496,6 +508,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/ru/statistics.po b/applications/luci-app-statistics/po/ru/statistics.po
index 3a418dec7..9d0ff9fdf 100644
--- a/applications/luci-app-statistics/po/ru/statistics.po
+++ b/applications/luci-app-statistics/po/ru/statistics.po
@@ -15,6 +15,12 @@ msgstr ""
"X-Generator: Pootle 2.0.6\n"
"X-Poedit-SourceCharset: UTF-8\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "ÐейÑÑвие (ÑелÑ)"
@@ -297,6 +303,9 @@ msgstr "СобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ñ Ð´Ð¸Ñков и Ñаздело
msgid "Monitor filesystem types"
msgstr "СобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ñ ÑайловÑÑ
ÑиÑÑем"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "СобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ñ Ñ
оÑÑов"
@@ -383,6 +392,9 @@ msgstr "ÐонÑигÑÑаÑÐ¸Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ping"
msgid "Port"
msgstr "ÐоÑÑ"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "ÐÑоÑеÑÑÑ"
@@ -508,6 +520,9 @@ msgstr "TTL Ð´Ð»Ñ ping-пакеÑов"
msgid "Table"
msgstr "ТаблиÑа"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/sk/statistics.po b/applications/luci-app-statistics/po/sk/statistics.po
index 6dba7d09b..53858ca54 100644
--- a/applications/luci-app-statistics/po/sk/statistics.po
+++ b/applications/luci-app-statistics/po/sk/statistics.po
@@ -8,6 +8,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -278,6 +284,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -364,6 +373,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -487,6 +499,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/sv/statistics.po b/applications/luci-app-statistics/po/sv/statistics.po
index bef0f2d6c..9d738f2f3 100644
--- a/applications/luci-app-statistics/po/sv/statistics.po
+++ b/applications/luci-app-statistics/po/sv/statistics.po
@@ -9,6 +9,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -283,6 +289,9 @@ msgstr "Ãvervaka hÃ¥rddiskar och partitioner"
msgid "Monitor filesystem types"
msgstr "Ãvervaka filsystemtyper"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Ãvervaka värdar"
@@ -369,6 +378,9 @@ msgstr ""
msgid "Port"
msgstr "Port"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Processer"
@@ -492,6 +504,9 @@ msgstr "TTL för ping-paket"
msgid "Table"
msgstr "Tabell"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/templates/statistics.pot b/applications/luci-app-statistics/po/templates/statistics.pot
index c57a85b76..ec630b696 100644
--- a/applications/luci-app-statistics/po/templates/statistics.pot
+++ b/applications/luci-app-statistics/po/templates/statistics.pot
@@ -1,6 +1,12 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -271,6 +277,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -357,6 +366,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -480,6 +492,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/tr/statistics.po b/applications/luci-app-statistics/po/tr/statistics.po
index 6d7056f3b..860ff95e8 100644
--- a/applications/luci-app-statistics/po/tr/statistics.po
+++ b/applications/luci-app-statistics/po/tr/statistics.po
@@ -9,6 +9,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -279,6 +285,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -365,6 +374,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -488,6 +500,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/uk/statistics.po b/applications/luci-app-statistics/po/uk/statistics.po
index de17a3caf..ac9ae5094 100644
--- a/applications/luci-app-statistics/po/uk/statistics.po
+++ b/applications/luci-app-statistics/po/uk/statistics.po
@@ -14,6 +14,12 @@ msgstr ""
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.6\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -284,6 +290,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -370,6 +379,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -493,6 +505,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/vi/statistics.po b/applications/luci-app-statistics/po/vi/statistics.po
index bdb7f1a3a..f5798a265 100644
--- a/applications/luci-app-statistics/po/vi/statistics.po
+++ b/applications/luci-app-statistics/po/vi/statistics.po
@@ -14,6 +14,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Pootle 1.1.0\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "Action (target)"
@@ -294,6 +300,9 @@ msgstr "Kiá»m soát ÄÄ©a và phân vùng"
msgid "Monitor filesystem types"
msgstr "Kiá»m soát loại filesystem"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "Monitor hosts"
@@ -380,6 +389,9 @@ msgstr "Cấu hình Ping plugin"
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "Quá trình xỠlý"
@@ -503,6 +515,9 @@ msgstr "TTl cho gói ping"
msgid "Table"
msgstr "Table"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-statistics/po/zh-cn/statistics.po b/applications/luci-app-statistics/po/zh-cn/statistics.po
index 46cf59fee..20f5a93cb 100644
--- a/applications/luci-app-statistics/po/zh-cn/statistics.po
+++ b/applications/luci-app-statistics/po/zh-cn/statistics.po
@@ -13,6 +13,12 @@ msgstr ""
"X-Generator: Poedit 2.0.1\n"
"Language-Team: \n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr "å¨ä½ï¼ç®æ ï¼"
@@ -289,6 +295,9 @@ msgstr "çæµç£çåååº"
msgid "Monitor filesystem types"
msgstr "çæµæ件系ç»ç±»å"
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr "çæµä¸»æº"
@@ -377,6 +386,9 @@ msgstr "Pingæ件é
ç½®"
msgid "Port"
msgstr "端å£"
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr "è¿ç¨"
@@ -500,6 +512,9 @@ msgstr "pingå
TTL"
msgid "Table"
msgstr "表"
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr "NUTæ件读åUPSä¿¡æ¯ã"
diff --git a/applications/luci-app-statistics/po/zh-tw/statistics.po b/applications/luci-app-statistics/po/zh-tw/statistics.po
index cbd6d9d38..36e42c1d0 100644
--- a/applications/luci-app-statistics/po/zh-tw/statistics.po
+++ b/applications/luci-app-statistics/po/zh-tw/statistics.po
@@ -7,6 +7,12 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
+msgid "APC UPS"
+msgstr ""
+
+msgid "APCUPS Plugin Configuration"
+msgstr ""
+
msgid "Action (target)"
msgstr ""
@@ -277,6 +283,9 @@ msgstr ""
msgid "Monitor filesystem types"
msgstr ""
+msgid "Monitor host"
+msgstr ""
+
msgid "Monitor hosts"
msgstr ""
@@ -363,6 +372,9 @@ msgstr ""
msgid "Port"
msgstr ""
+msgid "Port for apcupsd communication"
+msgstr ""
+
msgid "Processes"
msgstr ""
@@ -486,6 +498,9 @@ msgstr ""
msgid "Table"
msgstr ""
+msgid "The APCUPS plugin collects statistics about the APC UPS."
+msgstr ""
+
msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
msgstr ""
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua
index 009ed805d..e5a048fa8 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_firewall_tab.lua
@@ -12,6 +12,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua
index 4d43637d9..0096d6a8c 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_network_tab.lua
@@ -12,6 +12,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua
index a025c1379..7ef9920a0 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/cfg_wireless_tab.lua
@@ -12,6 +12,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua
index 4233da6ac..8a20ab9cc 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/configuration_tab.lua
@@ -14,6 +14,7 @@ end
m = SimpleForm("input", nil)
m:append(Template("travelmate/config_css"))
+m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua
index 64ab880c4..add52317b 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/overview_tab.lua
@@ -4,8 +4,8 @@
local fs = require("nixio.fs")
local uci = require("luci.model.uci").cursor()
local json = require("luci.jsonc")
-local nw = require("luci.model.network").init()
-local fw = require("luci.model.firewall").init()
+local nw = require("luci.model.network").init()
+local fw = require("luci.model.firewall").init()
local trmiface = uci.get("travelmate", "global", "trm_iface") or "trm_wwan"
local trminput = uci.get("travelmate", "global", "trm_rtfile") or "/tmp/trm_runtime.json"
local uplink = uci.get("network", trmiface) or ""
@@ -18,7 +18,7 @@ m = Map("travelmate", translate("Travelmate"),
.. "see online documentation", "https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md"))
function m.on_after_commit(self)
- luci.sys.call("/etc/init.d/travelmate restart >/dev/null 2>&1")
+ luci.sys.call("env -i /etc/init.d/travelmate restart >/dev/null 2>&1")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
end
@@ -27,43 +27,38 @@ s = m:section(NamedSection, "global", "travelmate")
-- Interface Wizard
if uplink == "" then
- dv = s:option(DummyValue, "nil", translate("Interface Wizard"))
+ dv = s:option(DummyValue, "", translate("Interface Wizard"))
dv.template = "cbi/nullsection"
- o = s:option(Value, "trm_iface", translate("Uplink interface"))
+ o = s:option(Value, "", translate("Uplink interface"))
o.datatype = "and(uciname,rangelength(3,15))"
- o.default = "trm_wwan"
+ o.default = trmiface
o.rmempty = false
- function o.validate(self, value)
- iface = value
- return iface
- end
-
- function o.write(self, section, value)
- uci:set("travelmate", section, "trm_iface", iface)
- uci:save("travelmate")
- uci:commit("travelmate")
- end
-
- btn = s:option(Button, "", translate("Create Uplink Interface"),
+ btn = s:option(Button, "trm_iface", translate("Create Uplink Interface"),
translate("Create a new wireless wan uplink interface, configure it to use dhcp and ")
.. translate("add it to the wan zone of the firewall. This step has only to be done once."))
btn.inputtitle = translate("Add Interface")
btn.inputstyle = "apply"
btn.disabled = false
- function btn.write()
- local net = nw:add_network(iface, { proto = "dhcp" })
- if net then
- nw:save("network")
- nw:commit("network")
- local zone = fw:get_zone_by_network("wan")
- if zone then
- zone:add_network(iface)
- fw:save("firewall")
- fw:commit("firewall")
- luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
+ function btn.write(self, section, value)
+ local iface = o:formvalue(section)
+ if iface then
+ uci:set("travelmate", section, "trm_iface", iface)
+ uci:save("travelmate")
+ uci:commit("travelmate")
+ local net = nw:add_network(iface, { proto = "dhcp" })
+ if net then
+ nw:save("network")
+ nw:commit("network")
+ local zone = fw:get_zone_by_network("wan")
+ if zone then
+ zone:add_network(iface)
+ fw:save("firewall")
+ fw:commit("firewall")
+ end
end
+ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>&1")
end
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
end
@@ -77,14 +72,24 @@ o1.default = o1.disabled
o1.rmempty = false
o2 = s:option(Flag, "trm_automatic", translate("Enable 'automatic' mode"),
- translate("Keep travelmate in an active state."))
+ translate("Keep travelmate in an active state. Check every n seconds the connection status, i.e. the uplink availability."))
o2.default = o2.enabled
o2.rmempty = false
+btn = s:option(Button, "", translate("Manual Rescan"))
+btn:depends("trm_automatic", "")
+btn.inputtitle = translate("Rescan")
+btn.inputstyle = "find"
+btn.disabled = false
+function btn.write()
+ luci.sys.call("env -i /etc/init.d/travelmate start >/dev/null 2>&1")
+ luci.http.redirect(luci.dispatcher.build_url("admin", "services", "travelmate"))
+end
+
o3 = s:option(Value, "trm_iface", translate("Uplink / Trigger interface"),
- translate("Name of the uplink interface that triggers travelmate processing."))
+ translate("Name of the uplink interface that triggers travelmate processing in 'manual' mode."))
o3.datatype = "and(uciname,rangelength(3,15))"
-o3.default = "trm_wwan"
+o3.default = trmiface
o3.rmempty = false
o4 = s:option(Value, "trm_triggerdelay", translate("Trigger delay"),
@@ -159,6 +164,7 @@ translate("Options for further tweaking in case the defaults are not suitable fo
e1 = e:option(Value, "trm_radio", translate("Radio selection"),
translate("Restrict travelmate to a dedicated radio, e.g. 'radio0'"))
+e1.datatype = "and(uciname,rangelength(6,6))"
e1.rmempty = true
e2 = e:option(Value, "trm_maxretry", translate("Connection Limit"),
@@ -176,7 +182,7 @@ e3.rmempty = false
e4 = e:option(Value, "trm_timeout", translate("Overall Timeout"),
translate("Timeout in seconds between retries in 'automatic' mode"))
e4.default = 60
-e4.datatype = "range(5,300)"
+e4.datatype = "range(60,300)"
e4.rmempty = false
return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua
index 979307e00..dcfa17c8b 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua
@@ -7,6 +7,7 @@ local http = require("luci.http")
local trmiface = uci.get("travelmate", "global", "trm_iface") or "trm_wwan"
m = SimpleForm("add", translate("Add Wireless Uplink Configuration"))
+m.submit = translate("Save")
m.cancel = translate("Back to overview")
m.reset = false
@@ -18,7 +19,7 @@ m.hidden = {
device = http.formvalue("device"),
ssid = http.formvalue("ssid"),
wep = http.formvalue("wep"),
- wpa_suites = http.formvalue("wpa_suites"),
+ wpa_suites = http.formvalue("wpa_suites"),
wpa_version = http.formvalue("wpa_version")
}
@@ -45,11 +46,11 @@ end
function wssid.write(self, section, value)
newsection = uci:section("wireless", "wifi-iface", nil, {
- mode = "sta",
- network = trmiface,
- device = m.hidden.device,
- ssid = wssid:formvalue(section),
- disabled = "1"
+ mode = "sta",
+ network = trmiface,
+ device = m.hidden.device,
+ ssid = wssid:formvalue(section),
+ disabled = "1"
})
if (tonumber(m.hidden.wep) or 0) == 1 then
uci:set("wireless", newsection, "encryption", "wep-open")
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua
index 97ec1ca3c..0c3cc1865 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_delete.lua
@@ -10,5 +10,4 @@ if cfg ~= nil then
uci:save("wireless")
uci:commit("wireless")
end
-
http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua
index 0bae98460..c60ff22c4 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua
@@ -6,6 +6,7 @@ local uci = require("luci.model.uci").cursor()
local http = require("luci.http")
m = SimpleForm("edit", translate("Edit Wireless Uplink Configuration"))
+m.submit = translate("Save")
m.cancel = translate("Back to overview")
m.reset = false
@@ -21,11 +22,15 @@ local s = uci:get_all("wireless", m.hidden.cfg)
if s ~= nil then
wssid = m:field(Value, "ssid", translate("SSID"))
wssid.default = s.ssid
-
+ wssid.datatype = "rangelength(1,32)"
if s.encryption and s.key then
wkey = m:field(Value, "key", translatef("Passphrase (%s)", s.encryption))
+ elseif s.encryption and s.password then
+ wkey = m:field(Value, "password", translatef("Passphrase (%s)", s.encryption))
+ end
+ if s.encryption and (s.key or s.password) then
wkey.password = true
- wkey.default = s.key
+ wkey.default = s.key or s.password
if s.encryption == "wep" then
wkey.datatype = "wepkey"
else
@@ -33,17 +38,19 @@ if s ~= nil then
end
end
else
- http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
+ m.on_cancel()
end
function wssid.write(self, section, value)
uci:set("wireless", m.hidden.cfg, "ssid", wssid:formvalue(section))
if s.encryption and s.key then
uci:set("wireless", m.hidden.cfg, "key", wkey:formvalue(section))
+ elseif s.encryption and s.password then
+ uci:set("wireless", m.hidden.cfg, "password", wkey:formvalue(section))
end
uci:save("wireless")
uci:commit("wireless")
- http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
+ m.on_cancel()
end
return m
diff --git a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua
index 573484103..6eb4c7206 100644
--- a/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua
+++ b/applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_order.lua
@@ -1,22 +1,36 @@
-- Copyright 2017 Dirk Brenken (dev@brenken.org)
-- This is free software, licensed under the Apache License, Version 2.0
-local uci = require("luci.model.uci").cursor()
local http = require("luci.http")
local cfg = http.formvalue("cfg")
-local pos = http.formvalue("pos")
local dir = http.formvalue("dir")
+local uci = require("luci.model.uci").cursor()
+local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
if cfg ~= nil then
- if dir == "up" then
- pos = pos - 1
- uci:reorder("wireless", cfg, pos)
- elseif dir == "down" then
- pos = pos + 1
- uci:reorder("wireless", cfg, pos)
+ local section = ""
+ local idx = ""
+ local idx_change = ""
+ local changed = ""
+ uci:foreach("wireless", "wifi-iface", function(s)
+ local iface = s.network or ""
+ if iface == trmiface then
+ section = s['.name']
+ if cfg == section then
+ idx = s['.index']
+ else
+ idx_change = s['.index']
+ end
+ if (dir == "up" and idx ~= "" and idx_change ~= "" and idx_change < idx) or
+ (dir == "down" and idx ~= "" and idx_change ~= "" and idx_change > idx) then
+ changed = uci:reorder("wireless", cfg, idx_change)
+ idx = ""
+ end
+ end
+ end)
+ if changed ~= "" then
+ uci:save("wireless")
+ uci:commit("wireless")
end
- uci:save("wireless")
- uci:commit("wireless")
end
-
http.redirect(luci.dispatcher.build_url("admin/services/travelmate/stations"))
diff --git a/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm b/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
index bdb265f19..cbb6c189b 100644
--- a/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
@@ -3,10 +3,9 @@ Copyright 2017 Dirk Brenken (dev@brenken.org)
This is free software, licensed under the Apache License, Version 2.0
-%>
-
<%-
local write = io.write
- local uci = require "luci.model.uci".cursor()
+ local uci = require("luci.model.uci").cursor()
local trmiface = uci:get("travelmate", "global", "trm_iface") or "trm_wwan"
-%>
@@ -14,52 +13,46 @@ This is free software, licensed under the Apache License, Version 2.0
<%:Wireless Stations%>
-
<%:Provides an overview of all configured uplink interfaces for travelmate. You can edit and delete existing interfaces or scan for new uplinks.%>
+
+ <%=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)%>
+
<%:Device%>
- <%:Mode%>
- <%:Uplink Interface%>
<%:SSID%>
<%:Encryption%>
- <%:Disabled%>
+ <%:Actions%>
<%
- local pos = 1
- uci:foreach("wireless", "wifi-iface", function(s)
- pos = pos + 1
- local section = s['.name']
- local device = s.device or ""
- local mode = s.mode or ""
+ uci:foreach("wireless", "wifi-iface", function(s)
local iface = s.network or ""
- local ssid = s.ssid or ""
- local encryption = s.encryption or ""
- local disabled = s.disabled or ""
- local style = "color:#000000"
- if disabled == "0" then
- style = "color:#0069d6"
- end
if iface == trmiface then
+ local section = s['.name'] or ""
+ local device = s.device or ""
+ local ssid = s.ssid or ""
+ local encryption = s.encryption or ""
+ local disabled = s.disabled or ""
+ local style = "color:#000000"
+ if disabled == "0" then
+ style = "color:#0069d6;font-weight:bold"
+ end
%>
-
+
<%=device%>
- <%=mode%>
- <%=iface%>
<%=ssid%>
<%=encryption%>
- <%=disabled%>
-
-
-
+
+
+
-
-
-
+
+
+
-<%
+<%
end
end)
%>
@@ -71,13 +64,14 @@ This is free software, licensed under the Apache License, Version 2.0
local device = s[".name"]
%>
<%
end)
%>
+
<%+footer%>
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 2ce45c63c..af90c18d2 100644
--- a/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
+++ b/applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
@@ -4,8 +4,8 @@ This is free software, licensed under the Apache License, Version 2.0
-%>
<%-
- local sys = require "luci.sys"
- local utl = require "luci.util"
+ local sys = require("luci.sys")
+ local utl = require("luci.util")
local dev = luci.http.formvalue("device")
local iw = luci.sys.wifi.getiwinfo(dev)
@@ -28,7 +28,7 @@ This is free software, licensed under the Apache License, Version 2.0
function percent_wifi_signal(info)
local qc = info.quality or 0
local qm = info.quality_max or 0
- if info.bssid and qc > 0 and qm > 0 then
+ if info.ssid and qc > 0 and qm > 0 then
return math.floor((100 / qm) * qc)
else
return 0
@@ -47,8 +47,8 @@ This is free software, licensed under the Apache License, Version 2.0
<%:Encryption%>
<%:Signal strength%>
- <% for i, net in ipairs(iw.scanlist or { }) do%>
-
+ <% for i, net in ipairs(iw.scanlist or { }) do %>
+
<%=net.ssid and utl.pcdata(net.ssid) or "%s " % translate("hidden")%>
@@ -58,17 +58,17 @@ This is free software, licensed under the Apache License, Version 2.0
<%=percent_wifi_signal(net)%> %
-
+
@@ -76,14 +76,15 @@ This is free software, licensed under the Apache License, Version 2.0
-
+
+
<%+footer%>
diff --git a/applications/luci-app-travelmate/po/ja/travelmate.po b/applications/luci-app-travelmate/po/ja/travelmate.po
index bd1d54739..70561533d 100644
--- a/applications/luci-app-travelmate/po/ja/travelmate.po
+++ b/applications/luci-app-travelmate/po/ja/travelmate.po
@@ -12,6 +12,9 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ja\n"
+msgid "Actions"
+msgstr "æä½"
+
msgid "Add Interface"
msgstr "ã¤ã³ã¿ã¼ãã§ã¼ã¹ã®è¿½å "
@@ -58,9 +61,6 @@ msgstr "ãã®ã¢ãããªã³ã¯ãåé¤"
msgid "Device"
msgstr "ããã¤ã¹"
-msgid "Disabled"
-msgstr "ç¡å¹"
-
msgid "Edit"
msgstr "ç·¨é"
@@ -124,18 +124,31 @@ msgstr "ã¤ã³ã¿ã¼ãã§ã¼ã¹ ã¿ã¤ã ã¢ã¦ã"
msgid "Interface Wizard"
msgstr "ã¤ã³ã¿ã¼ãã§ã¼ã¹ ã¦ã£ã¶ã¼ã"
-msgid "Keep travelmate in an active state."
-msgstr "Travelmate ãã¢ã¯ãã£ãç¶æ
ã§ç¶æãã¾ãã"
+msgid ""
+"Keep travelmate in an active state. Check every n seconds the connection "
+"status, i.e. the uplink availability."
+msgstr ""
+"Travelmate ãã¢ã¯ãã£ãç¶æ
ã§ç¶æãã¾ãã\"å®è¡éé\" ã§è¨å®ãããæéæ¯"
+"ï¼ç§ï¼ã«ãã¢ãããªã³ã¯ã®å¯ç¨æ§ã確èªããããã«æ¥ç¶ç¶æ
ããã§ãã¯ãã¾ã"
msgid "Last rundate"
msgstr "æçµå®è¡æ¥æ"
-msgid "Mode"
-msgstr "ã¢ã¼ã"
+msgid "Manual Rescan"
+msgstr "æååã¹ãã£ã³"
-msgid "Name of the uplink interface that triggers travelmate processing."
+msgid "Move down"
+msgstr "ä¸ã¸"
+
+msgid "Move up"
+msgstr "ä¸ã¸"
+
+msgid ""
+"Name of the uplink interface that triggers travelmate processing in 'manual' "
+"mode."
msgstr ""
-"Travelmate ã®å¦çã®ããªã¬ã¼ã¨ãªããã¢ãããªã³ã¯ ã¤ã³ã¿ã¼ãã§ã¼ã¹ã®ååã§ãã"
+"'manual' ã¢ã¼ãæã« Travelmate ã®å¦çã®ããªã¬ã¼ã¨ãªããã¢ãããªã³ã¯ ã¤ã³ã¿ã¼"
+"ãã§ã¼ã¹ã®ååã§ãã"
msgid "Online Status"
msgstr "ãªã³ã©ã¤ã³ ã¹ãã¼ã¿ã¹"
@@ -148,7 +161,7 @@ msgid ""
msgstr "ããã©ã«ãã®è¨å®ãé©åã§ãªãå ´åãããã«è¨å®ããããã®ãªãã·ã§ã³ã§ãã"
msgid "Overall Timeout"
-msgstr "å
¨ä½ã¿ã¤ã ã¢ã¦ã"
+msgstr "å®è¡éé"
msgid "Overview"
msgstr "æ¦è¦"
@@ -157,12 +170,14 @@ msgid "Passphrase (%s)"
msgstr "æå·ãã¬ã¼ãº (%s)"
msgid ""
-"Provides an overview of all configured uplink interfaces for travelmate. You "
-"can edit and delete existing interfaces or scan for new uplinks."
+"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."
msgstr ""
-"Travelmate ã«ããããå
¨ã¦ã®è¨å®æ¸ã¿ã¢ãããªã³ã¯ ã¤ã³ã¿ã¼ãã§ã¼ã¹ã®ä¸è¦§ã§ãã"
-"æ¢åã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãç·¨éã¾ãã¯åé¤ããããæ°è¦ã¢ãããªã³ã¯ã®è¿½å ã®ããã«"
-"ã¹ãã£ã³ãè¡ããã¨ãã§ãã¾ãã"
+"Travelmate ç¨ã¤ã³ã¿ã¼ãã§ã¼ã¹ï¼%sï¼ã«è¨å®æ¸ã¿ã®å
¨ã¢ãããªã³ã¯ã®ä¸è¦§ã§ããæ¢å"
+"ã®ã¢ãããªã³ã¯ã®ç·¨éãåé¤ã並ã¹æ¿ããè¡ã£ãããã¹ãã£ã³ãè¡ã£ã¦æ°è¦ã¢ãããª"
+"ã³ã¯ã追å ãããã¨ãã§ãã¾ããç¾å¨ä½¿ç¨ããã¦ããã¢ãããªã³ã¯ã¯ãéè²ã§å¼·èª¿ã"
+"ãã¾ãã"
msgid "Radio selection"
msgstr "ç¡ç·ã®é¸æ"
@@ -170,8 +185,11 @@ msgstr "ç¡ç·ã®é¸æ"
msgid "Repeat scan"
msgstr "åã¹ãã£ã³"
+msgid "Rescan"
+msgstr "åã¹ãã£ã³"
+
msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'"
-msgstr "Travelmate ãç¹å®ã®ç¡ç·ã«æ¥ç¶ããããã«ãã¾ããä¾: 'radio0'"
+msgstr "Travelmate ãæå®ãããç¡ç·ã«æ¥ç¶ããããå¶éãã¾ããä¾: 'radio0'"
msgid "Runtime information"
msgstr "å®è¡æ
å ±"
@@ -179,6 +197,12 @@ msgstr "å®è¡æ
å ±"
msgid "SSID"
msgstr "SSID"
+msgid "SSID (hidden)"
+msgstr "SSIDï¼ã¹ãã«ã¹ï¼"
+
+msgid "Save"
+msgstr "ä¿å"
+
msgid "Scan"
msgstr "ã¹ãã£ã³:"
@@ -233,7 +257,7 @@ msgstr ""
"ãã¾ãã"
msgid "Timeout in seconds between retries in 'automatic' mode"
-msgstr "'automatic' ã¢ã¼ãæã«æ¥ç¶ãå試è¡ããééï¼ç§ï¼ã§ãã"
+msgstr "'automatic' ã¢ã¼ãæã«æ¥ç¶ã確èªã¾ãã¯å試è¡ããééï¼ç§ï¼ã§ãã"
msgid "Travelmate"
msgstr "Travelmate"
@@ -251,10 +275,7 @@ msgid "Unknown"
msgstr "ä¸æ"
msgid "Uplink / Trigger interface"
-msgstr "ã¢ãããªã³ã¯/ããªã¬ã¼ ã¤ã³ã¿ã¼ãã§ã¼ã¹"
-
-msgid "Uplink Interface"
-msgstr "ã¢ãããªã³ã¯ ã¤ã³ã¿ã¼ãã§ã¼ã¹"
+msgstr "ã¢ãããªã³ã¯ / ããªã¬ã¼ ã¤ã³ã¿ã¼ãã§ã¼ã¹"
msgid "Uplink SSID"
msgstr "ã¢ãããªã³ã¯ SSID"
diff --git a/applications/luci-app-travelmate/po/pt-br/travelmate.po b/applications/luci-app-travelmate/po/pt-br/travelmate.po
index 5e09759c4..282dda8da 100644
--- a/applications/luci-app-travelmate/po/pt-br/travelmate.po
+++ b/applications/luci-app-travelmate/po/pt-br/travelmate.po
@@ -12,6 +12,9 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Language: pt_BR\n"
+msgid "Actions"
+msgstr ""
+
msgid "Add Interface"
msgstr ""
@@ -55,9 +58,6 @@ msgstr ""
msgid "Device"
msgstr ""
-msgid "Disabled"
-msgstr ""
-
msgid "Edit"
msgstr ""
@@ -117,16 +117,26 @@ msgstr ""
msgid "Interface Wizard"
msgstr ""
-msgid "Keep travelmate in an active state."
+msgid ""
+"Keep travelmate in an active state. Check every n seconds the connection "
+"status, i.e. the uplink availability."
msgstr ""
msgid "Last rundate"
msgstr ""
-msgid "Mode"
+msgid "Manual Rescan"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Move up"
msgstr ""
-msgid "Name of the uplink interface that triggers travelmate processing."
+msgid ""
+"Name of the uplink interface that triggers travelmate processing in 'manual' "
+"mode."
msgstr ""
msgid "Online Status"
@@ -149,8 +159,9 @@ msgid "Passphrase (%s)"
msgstr ""
msgid ""
-"Provides an overview of all configured uplink interfaces for travelmate. You "
-"can edit and delete existing interfaces or scan for new uplinks."
+"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."
msgstr ""
msgid "Radio selection"
@@ -159,6 +170,9 @@ msgstr ""
msgid "Repeat scan"
msgstr ""
+msgid "Rescan"
+msgstr ""
+
msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'"
msgstr ""
@@ -168,6 +182,12 @@ msgstr ""
msgid "SSID"
msgstr ""
+msgid "SSID (hidden)"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
msgid "Scan"
msgstr ""
@@ -232,9 +252,6 @@ msgstr ""
msgid "Uplink / Trigger interface"
msgstr ""
-msgid "Uplink Interface"
-msgstr ""
-
msgid "Uplink SSID"
msgstr ""
diff --git a/applications/luci-app-travelmate/po/templates/travelmate.pot b/applications/luci-app-travelmate/po/templates/travelmate.pot
index a0e562969..219005568 100644
--- a/applications/luci-app-travelmate/po/templates/travelmate.pot
+++ b/applications/luci-app-travelmate/po/templates/travelmate.pot
@@ -1,6 +1,9 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
+msgid "Actions"
+msgstr ""
+
msgid "Add Interface"
msgstr ""
@@ -44,9 +47,6 @@ msgstr ""
msgid "Device"
msgstr ""
-msgid "Disabled"
-msgstr ""
-
msgid "Edit"
msgstr ""
@@ -106,16 +106,26 @@ msgstr ""
msgid "Interface Wizard"
msgstr ""
-msgid "Keep travelmate in an active state."
+msgid ""
+"Keep travelmate in an active state. Check every n seconds the connection "
+"status, i.e. the uplink availability."
msgstr ""
msgid "Last rundate"
msgstr ""
-msgid "Mode"
+msgid "Manual Rescan"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Move up"
msgstr ""
-msgid "Name of the uplink interface that triggers travelmate processing."
+msgid ""
+"Name of the uplink interface that triggers travelmate processing in 'manual' "
+"mode."
msgstr ""
msgid "Online Status"
@@ -138,8 +148,9 @@ msgid "Passphrase (%s)"
msgstr ""
msgid ""
-"Provides an overview of all configured uplink interfaces for travelmate. You "
-"can edit and delete existing interfaces or scan for new uplinks."
+"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."
msgstr ""
msgid "Radio selection"
@@ -148,6 +159,9 @@ msgstr ""
msgid "Repeat scan"
msgstr ""
+msgid "Rescan"
+msgstr ""
+
msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'"
msgstr ""
@@ -157,6 +171,12 @@ msgstr ""
msgid "SSID"
msgstr ""
+msgid "SSID (hidden)"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
msgid "Scan"
msgstr ""
@@ -221,9 +241,6 @@ msgstr ""
msgid "Uplink / Trigger interface"
msgstr ""
-msgid "Uplink Interface"
-msgstr ""
-
msgid "Uplink SSID"
msgstr ""
diff --git a/applications/luci-app-watchcat/po/sv/watchcat.po b/applications/luci-app-watchcat/po/sv/watchcat.po
index 07aa72649..96c73e311 100644
--- a/applications/luci-app-watchcat/po/sv/watchcat.po
+++ b/applications/luci-app-watchcat/po/sv/watchcat.po
@@ -19,8 +19,8 @@ msgid ""
"How often to check internet connection. Default unit is seconds, you can you "
"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
msgstr ""
-"Hur ofta internet-anslutningen ska kollas. Standardenheten är sekunder, du kan använda "
-"tillägget 'm' för minutrar, 't' för timmar eller 'd' för dagar"
+"Hur ofta internet-anslutningen ska kollas. Standardenheten är sekunder, du "
+"kan använda tillägget 'm' för minutrar, 't' för timmar eller 'd' för dagar"
msgid ""
"In periodic mode, it defines the reboot period. In internet mode, it defines "
diff --git a/applications/luci-app-wifischedule/po/sv/wifischedule.po b/applications/luci-app-wifischedule/po/sv/wifischedule.po
index ca4e5aac7..50953aa28 100644
--- a/applications/luci-app-wifischedule/po/sv/wifischedule.po
+++ b/applications/luci-app-wifischedule/po/sv/wifischedule.po
@@ -1,5 +1,5 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "Activate wifi"
msgstr "Aktivera wifi"
diff --git a/applications/luci-app-wireguard/po/sv/wireguard.po b/applications/luci-app-wireguard/po/sv/wireguard.po
index b7e3ed5b5..1aa68e251 100644
--- a/applications/luci-app-wireguard/po/sv/wireguard.po
+++ b/applications/luci-app-wireguard/po/sv/wireguard.po
@@ -1,5 +1,5 @@
msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
+msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "Allowed IPs"
msgstr "Tillåtna IP-adresser"
diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile
index cc57ce8ee..291789cb6 100644
--- a/modules/luci-base/Makefile
+++ b/modules/luci-base/Makefile
@@ -26,6 +26,7 @@ include $(INCLUDE_DIR)/host-build.mk
define Package/luci-base/conffiles
/etc/luci-uploads
/etc/config/luci
+/etc/config/ucitrack
endef
include ../../luci.mk
diff --git a/modules/luci-base/htdocs/luci-static/resources/cbi.js b/modules/luci-base/htdocs/luci-static/resources/cbi.js
index 4be917d09..b819230cf 100644
--- a/modules/luci-base/htdocs/luci-static/resources/cbi.js
+++ b/modules/luci-base/htdocs/luci-static/resources/cbi.js
@@ -481,8 +481,9 @@ function cbi_d_check(deps) {
istat = (istat && cbi_d_checkvalue(j, deps[i][j]))
}
}
- if (istat) {
- return !reverse;
+
+ if (istat ^ reverse) {
+ return true;
}
}
return def;
@@ -648,9 +649,6 @@ function cbi_combobox(id, values, def, man, focus) {
var dt = obj.getAttribute('cbi_datatype');
var op = obj.getAttribute('cbi_optional');
- if (dt)
- cbi_validate_field(sel, op == 'true', dt);
-
if (!values[obj.value]) {
if (obj.value == "") {
var optdef = document.createElement("option");
@@ -685,6 +683,9 @@ function cbi_combobox(id, values, def, man, focus) {
obj.style.display = "none";
+ if (dt)
+ cbi_validate_field(sel, op == 'true', dt);
+
cbi_bind(sel, "change", function() {
if (sel.selectedIndex == sel.options.length - 1) {
obj.style.display = "inline";
diff --git a/modules/luci-base/htdocs/luci-static/resources/xhr.js b/modules/luci-base/htdocs/luci-static/resources/xhr.js
index 701c12ac1..3385f8f23 100644
--- a/modules/luci-base/htdocs/luci-static/resources/xhr.js
+++ b/modules/luci-base/htdocs/luci-static/resources/xhr.js
@@ -91,8 +91,6 @@ XHR = function()
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
- xhr.setRequestHeader('Content-length', code.length);
- xhr.setRequestHeader('Connection', 'close');
xhr.send(code);
}
diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua
index 1b684aa79..e4f77f18d 100644
--- a/modules/luci-base/luasrc/dispatcher.lua
+++ b/modules/luci-base/luasrc/dispatcher.lua
@@ -219,10 +219,19 @@ function dispatch(request)
local lang = conf.main.lang or "auto"
if lang == "auto" then
local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or ""
- for lpat in aclang:gmatch("[%w-]+") do
- lpat = lpat and lpat:gsub("-", "_")
- if conf.languages[lpat] then
- lang = lpat
+ for aclang in aclang:gmatch("[%w_-]+") do
+ local country, culture = aclang:match("^([a-z][a-z])[_-]([a-zA-Z][a-zA-Z])$")
+ if country and culture then
+ local cc = "%s_%s" %{ country, culture:lower() }
+ if conf.languages[cc] then
+ lang = cc
+ break
+ elseif conf.languages[country] then
+ lang = country
+ break
+ end
+ elseif conf.languages[aclang] then
+ lang = aclang
break
end
end
diff --git a/modules/luci-base/luasrc/sys.lua b/modules/luci-base/luasrc/sys.lua
index 99f3ee291..115c54d54 100644
--- a/modules/luci-base/luasrc/sys.lua
+++ b/modules/luci-base/luasrc/sys.lua
@@ -348,8 +348,10 @@ end
function net.devices()
local devs = {}
+ local seen = {}
for k, v in ipairs(nixio.getifaddrs()) do
- if v.family == "packet" then
+ if v.name and not seen[v.name] then
+ seen[v.name] = true
devs[#devs+1] = v.name
end
end
diff --git a/modules/luci-base/po/ca/base.po b/modules/luci-base/po/ca/base.po
index 9f4efdd1f..0486ec250 100644
--- a/modules/luci-base/po/ca/base.po
+++ b/modules/luci-base/po/ca/base.po
@@ -2342,6 +2342,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "La contrasenya s'ha canviat amb èxit!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Ruta als Certificats CA"
diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po
index 9efe3b7d8..c217b0c39 100644
--- a/modules/luci-base/po/cs/base.po
+++ b/modules/luci-base/po/cs/base.po
@@ -2365,6 +2365,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "Heslo bylo úspÄÅ¡nÄ zmÄnÄno!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Cesta k certifikátu CA"
diff --git a/modules/luci-base/po/de/base.po b/modules/luci-base/po/de/base.po
index fa26a1d72..183e495a2 100644
--- a/modules/luci-base/po/de/base.po
+++ b/modules/luci-base/po/de/base.po
@@ -2427,6 +2427,9 @@ msgstr "Password des inneren, privaten Schlüssels"
msgid "Password successfully changed!"
msgstr "Passwort erfolgreich geändert!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Pfad zum CA-Zertifikat"
diff --git a/modules/luci-base/po/el/base.po b/modules/luci-base/po/el/base.po
index e3969afff..b385651f3 100644
--- a/modules/luci-base/po/el/base.po
+++ b/modules/luci-base/po/el/base.po
@@ -2372,6 +2372,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "ΠκÏδικÏÏ ÏÏÏÏβαÏÎ·Ï Î¬Î»Î»Î±Î¾Îµ εÏιÏÏ
ÏÏÏ!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "ÎιαδÏομή για ΠιÏÏοÏοιηÏÎ¹ÎºÏ CA"
diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po
index 653737015..04207336e 100644
--- a/modules/luci-base/po/en/base.po
+++ b/modules/luci-base/po/en/base.po
@@ -2339,6 +2339,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Path to CA-Certificate"
diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po
index a3476735b..626e374b4 100644
--- a/modules/luci-base/po/es/base.po
+++ b/modules/luci-base/po/es/base.po
@@ -2379,6 +2379,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "¡Contraseña cambiada!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Ruta al Certificado CA"
diff --git a/modules/luci-base/po/fr/base.po b/modules/luci-base/po/fr/base.po
index 1aab5cb9a..b0b4b4334 100644
--- a/modules/luci-base/po/fr/base.po
+++ b/modules/luci-base/po/fr/base.po
@@ -2392,6 +2392,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "Mot de passe changé avec succès !"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Chemin de la CA"
diff --git a/modules/luci-base/po/he/base.po b/modules/luci-base/po/he/base.po
index d8eae1f84..2c2c5d27e 100644
--- a/modules/luci-base/po/he/base.po
+++ b/modules/luci-base/po/he/base.po
@@ -2306,6 +2306,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr ""
diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po
index dfed45de5..8f5aee4c7 100644
--- a/modules/luci-base/po/hu/base.po
+++ b/modules/luci-base/po/hu/base.po
@@ -2382,6 +2382,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "A jelszó megváltoztatása sikeres!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "CA tanúsÃtvány elérési útja"
diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po
index 04331ab75..ea7578e61 100644
--- a/modules/luci-base/po/it/base.po
+++ b/modules/luci-base/po/it/base.po
@@ -2378,6 +2378,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "Password cambiata con successo!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Percorso al certificato CA"
diff --git a/modules/luci-base/po/ja/base.po b/modules/luci-base/po/ja/base.po
index 714b064dc..7d23abede 100644
--- a/modules/luci-base/po/ja/base.po
+++ b/modules/luci-base/po/ja/base.po
@@ -3,14 +3,14 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
-"PO-Revision-Date: 2017-04-03 02:32+0900\n"
+"PO-Revision-Date: 2017-07-28 12:17+0900\n"
"Last-Translator: INAGAKI Hiroshi \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\n"
+"X-Generator: Poedit 2.0.3\n"
"Language-Team: \n"
msgid "%s is untagged in multiple VLANs!"
@@ -44,7 +44,7 @@ msgid "-- match by label --"
msgstr "-- ã©ãã«ãæå® --"
msgid "-- match by uuid --"
-msgstr "-- UUIDãæå® --"
+msgstr "-- UUID ãæå® --"
msgid "1 Minute Load:"
msgstr "éå»1åã®è² è·:"
@@ -157,6 +157,8 @@ msgid ""
" Note: you need to manually restart the cron service if the crontab file "
"was empty before editing."
msgstr ""
+" 注æ: ç·¨éåã® crontab ãã¡ã¤ã«ã空ã®å ´åãæå㧠cron ãµã¼ãã¹ã®åèµ·å"
+"ãè¡ãå¿
è¦ãããã¾ãã"
msgid "A43C + J43 + A43"
msgstr ""
@@ -283,7 +285,7 @@ msgid "Allocate IP sequentially"
msgstr ""
msgid "Allow SSH password authentication"
-msgstr "SSH ãã¹ã¯ã¼ãèªè¨¼ã許å¯ãã¾ã"
+msgstr "SSH ãã¹ã¯ã¼ãèªè¨¼ã許å¯ãã¾ãã"
msgid "Allow all except listed"
msgstr "ãªã¹ãå
ã®ç«¯æ«ããã®ã¢ã¯ã»ã¹ãç¦æ¢"
@@ -299,10 +301,10 @@ msgstr ""
"ãªã¢ã¼ããã¹ããSSH転éããããã¼ã«ã«ã®ãã¼ãã«æ¥ç¶ãããã¨ã許å¯ãã¾ã"
msgid "Allow root logins with password"
-msgstr "ãã¹ã¯ã¼ãã使ç¨ããroot権éã§ã®ãã°ã¤ã³ã許å¯ãã"
+msgstr "ãã¹ã¯ã¼ãã§ã® root ãã°ã¤ã³ã許å¯"
msgid "Allow the root user to login with password"
-msgstr "ãã¹ã¯ã¼ãã使ç¨ããroot 権éã§ã®ãã°ã¤ã³ã許å¯ãã"
+msgstr "ãã¹ã¯ã¼ãã使ç¨ãã root 権éã§ã®ãã°ã¤ã³ã許å¯ãã¾ãã"
msgid ""
"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
@@ -515,8 +517,8 @@ msgid ""
"defined backup patterns."
msgstr ""
"以ä¸ã¯ãããã¯ã¢ããã®éã«å«ã¾ãããã¡ã¤ã«ã®ãªã¹ãã§ãããã®ãªã¹ãã¯ãopkgã«"
-"ãã£ã¦èªèããã¦ããè¨å®ãã¡ã¤ã«ãéè¦ãªãã¼ã¹ãã¡ã¤ã«ãã¦ã¼ã¶ã¼ãè¨å®ããæ£"
-"è¦è¡¨ç¾ã«ä¸è´ãããã¡ã¤ã«ã®ä¸è¦§ã§ãã"
+"ãã£ã¦èªèããã¦ããè¨å®ãã¡ã¤ã«ãéè¦ãªãã¼ã¹ãã¡ã¤ã«ãã¦ã¼ã¶ã¼ãè¨å®ããã"
+"ã¿ã¼ã³ã«ä¸è´ãããã¡ã¤ã«ã®ä¸è¦§ã§ãã"
msgid "Bind interface"
msgstr ""
@@ -858,7 +860,7 @@ msgid "Device is rebooting..."
msgstr "ããã¤ã¹ãåèµ·åä¸ã§ã..."
msgid "Device unreachable"
-msgstr ""
+msgstr "ããã¤ã¹ã«å°éã§ãã¾ãã"
msgid "Diagnostics"
msgstr "診ææ©è½"
@@ -1217,7 +1219,7 @@ msgid "Force TKIP and CCMP (AES)"
msgstr "TKIP åã³CCMP (AES) ã使ç¨"
msgid "Force link"
-msgstr ""
+msgstr "å¼·å¶ãªã³ã¯"
msgid "Force use of NAT-T"
msgstr "NAT-Tã®å¼·å¶ä½¿ç¨"
@@ -1467,7 +1469,7 @@ msgid "IPv6 routed prefix"
msgstr ""
msgid "IPv6 suffix"
-msgstr ""
+msgstr "IPv6 ãµãã£ãã¯ã¹"
msgid "IPv6-Address"
msgstr "IPv6-ã¢ãã¬ã¹"
@@ -2380,6 +2382,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "ãã¹ã¯ã¼ããå¤æ´ãã¾ãã"
+msgid "Password2"
+msgstr "ãã¹ã¯ã¼ã2"
+
msgid "Path to CA-Certificate"
msgstr "CA証ææ¸ã®ãã¹"
@@ -3672,7 +3677,7 @@ msgid "Waiting for command to complete..."
msgstr "ã³ãã³ãå®è¡ä¸ã§ã..."
msgid "Waiting for device..."
-msgstr "ããã¤ã¹ã®èµ·åããå¾
ã¡ãã ãã..."
+msgstr "ããã¤ã¹ã®èµ·åãå¾
ã£ã¦ãã¾ã..."
msgid "Warning"
msgstr "è¦å"
diff --git a/modules/luci-base/po/ko/base.po b/modules/luci-base/po/ko/base.po
index 587b4890a..770a49cc5 100644
--- a/modules/luci-base/po/ko/base.po
+++ b/modules/luci-base/po/ko/base.po
@@ -2332,6 +2332,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr ""
diff --git a/modules/luci-base/po/ms/base.po b/modules/luci-base/po/ms/base.po
index 97912183f..c2f62721d 100644
--- a/modules/luci-base/po/ms/base.po
+++ b/modules/luci-base/po/ms/base.po
@@ -2311,6 +2311,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Path ke CA-Sijil"
diff --git a/modules/luci-base/po/no/base.po b/modules/luci-base/po/no/base.po
index 9e3df81f8..6a6e81868 100644
--- a/modules/luci-base/po/no/base.po
+++ b/modules/luci-base/po/no/base.po
@@ -2357,6 +2357,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "Passordet er endret!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Sti til CA-sertifikat"
diff --git a/modules/luci-base/po/pl/base.po b/modules/luci-base/po/pl/base.po
index 98067c865..e36461615 100644
--- a/modules/luci-base/po/pl/base.po
+++ b/modules/luci-base/po/pl/base.po
@@ -2401,6 +2401,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "PomyÅlnie zmieniono hasÅo!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Åcieżka do certyfikatu CA"
diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po
index f2ba57555..87c32bff9 100644
--- a/modules/luci-base/po/pt-br/base.po
+++ b/modules/luci-base/po/pt-br/base.po
@@ -2497,6 +2497,9 @@ msgstr "Senha da Chave Privada interna"
msgid "Password successfully changed!"
msgstr "A senha foi alterada com sucesso!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Caminho para o Certificado da AC"
diff --git a/modules/luci-base/po/pt/base.po b/modules/luci-base/po/pt/base.po
index cb90df543..bea93f5c3 100644
--- a/modules/luci-base/po/pt/base.po
+++ b/modules/luci-base/po/pt/base.po
@@ -2379,6 +2379,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "Password alterada com sucesso!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Directorio do Certificado CA"
diff --git a/modules/luci-base/po/ro/base.po b/modules/luci-base/po/ro/base.po
index d51f4d05c..2ee8537ac 100644
--- a/modules/luci-base/po/ro/base.po
+++ b/modules/luci-base/po/ro/base.po
@@ -2303,6 +2303,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "Parola schimbata cu succes !"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "Calea catre certificatul CA"
diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po
index d30c643fc..651577262 100644
--- a/modules/luci-base/po/ru/base.po
+++ b/modules/luci-base/po/ru/base.po
@@ -2387,6 +2387,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "ÐаÑÐ¾Ð»Ñ ÑÑпеÑно изменÑн!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "ÐÑÑÑ Ðº ÑенÑÑÑ ÑеÑÑиÑикаÑии"
diff --git a/modules/luci-base/po/sk/base.po b/modules/luci-base/po/sk/base.po
index f4037ea35..ab876ce32 100644
--- a/modules/luci-base/po/sk/base.po
+++ b/modules/luci-base/po/sk/base.po
@@ -2278,6 +2278,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr ""
diff --git a/modules/luci-base/po/sv/base.po b/modules/luci-base/po/sv/base.po
index 6af6d610f..803ac2819 100644
--- a/modules/luci-base/po/sv/base.po
+++ b/modules/luci-base/po/sv/base.po
@@ -2284,6 +2284,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr ""
diff --git a/modules/luci-base/po/templates/base.pot b/modules/luci-base/po/templates/base.pot
index d3fc6a732..1aa1816c2 100644
--- a/modules/luci-base/po/templates/base.pot
+++ b/modules/luci-base/po/templates/base.pot
@@ -2271,6 +2271,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr ""
diff --git a/modules/luci-base/po/tr/base.po b/modules/luci-base/po/tr/base.po
index afabfa29d..3c814cd30 100644
--- a/modules/luci-base/po/tr/base.po
+++ b/modules/luci-base/po/tr/base.po
@@ -2291,6 +2291,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr ""
diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po
index 7ee06885f..83e550196 100644
--- a/modules/luci-base/po/uk/base.po
+++ b/modules/luci-base/po/uk/base.po
@@ -2398,6 +2398,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "ÐаÑÐ¾Ð»Ñ ÑÑпÑÑно змÑнено!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "ШлÑÑ
до ÑенÑÑÑ ÑеÑÑиÑÑкÑÑÑ"
diff --git a/modules/luci-base/po/vi/base.po b/modules/luci-base/po/vi/base.po
index 239e1c251..7bd7868cf 100644
--- a/modules/luci-base/po/vi/base.po
+++ b/modules/luci-base/po/vi/base.po
@@ -2314,6 +2314,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr ""
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "ÄÆ°á»ng dẫn tá»i CA-Certificate"
diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po
index 7f4918557..0ea00ff28 100644
--- a/modules/luci-base/po/zh-cn/base.po
+++ b/modules/luci-base/po/zh-cn/base.po
@@ -7,7 +7,7 @@ msgid "%s is untagged in multiple VLANs!"
msgstr "%s å¨å¤ä¸ª VLAN ä¸åæªå
³èï¼"
msgid "(%d minute window, %d second interval)"
-msgstr "ï¼%d åéä¿¡æ¯ï¼æ¯ %d ç§å·æ°ï¼"
+msgstr "ï¼æè¿ %d åéä¿¡æ¯ï¼æ¯ %d ç§å·æ°ï¼"
msgid "(%s available)"
msgstr "ï¼%s å¯ç¨ï¼"
@@ -85,8 +85,8 @@ msgid ""
"DNS servers will be queried in the "
"order of the resolvfile"
msgstr ""
-"æç
§ resolvfile éç顺åºæ¥è¯¢ DNS æ"
-"å¡å¨"
+"æç
§â解ææ件âéç顺åºæ¥è¯¢ DNS æå¡"
+"å¨"
msgid "ESSID "
msgstr "ESSID "
@@ -620,7 +620,7 @@ msgid "Client"
msgstr "客æ·ç«¯ Client"
msgid "Client ID to send when requesting DHCP"
-msgstr "è¯·æ± DHCP æ¶åéçå®¢æ· ID"
+msgstr "è¯·æ± DHCP æ¶åéç客æ·ç«¯ ID"
msgid ""
"Close inactive connection after the given amount of seconds, use 0 to "
@@ -710,8 +710,7 @@ msgstr "èªå®ä¹è½¯ä»¶æº"
msgid ""
"Customizes the behaviour of the device LED s if possible."
-msgstr ""
-"èªå®ä¹è®¾å¤ LED è¡ä¸ºï¼å¦æå¯è½ï¼ã"
+msgstr "èªå®ä¹æ¤è®¾å¤ç LED è¡ä¸ºã"
msgid "DHCP Leases"
msgstr "DHCP åé
"
@@ -1015,10 +1014,10 @@ msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
msgstr "å¯ç¨åæ¥æç DFï¼ç¦æ¢åçï¼æ å¿ã"
msgid "Enable this mount"
-msgstr "å¯ç¨æè½½ç¹"
+msgstr "å¯ç¨æ¤æè½½ç¹"
msgid "Enable this swap"
-msgstr "å¯ç¨äº¤æ¢åº"
+msgstr "å¯ç¨æ¤ swap ååº"
msgid "Enable/Disable"
msgstr "å¯ç¨/ç¦ç¨"
@@ -1477,8 +1476,8 @@ msgid ""
msgstr ""
"å¦æç©çå
åä¸è¶³ï¼é²ç½®æ°æ®å¯èªå¨ç§»å° swap åºæåï¼ä»¥å¢å å¯ç¨ç RAM ã请注æï¼swap åºçæ°æ®å¤çä¼é常æ
¢ï¼å 为 "
-"swap设å¤æ æ³å RAM è¿æ ·çé«éç访"
-"é®ã"
+"swap 设å¤æ æ³å RAM è¿æ ·çé«éç"
+"访é®ã"
msgid "Ignore /etc/hosts
"
msgstr "å¿½ç¥ /etc/hosts
"
@@ -2794,10 +2793,10 @@ msgid "Scheduled Tasks"
msgstr "计åä»»å¡"
msgid "Section added"
-msgstr "æ·»å çåºå"
+msgstr "æ·»å çèç¹"
msgid "Section removed"
-msgstr "移é¤çåºå"
+msgstr "移é¤çèç¹"
msgid "See \"mount\" manpage for details"
msgstr "详å \"mount\" èæºå¸®å©"
@@ -3124,7 +3123,7 @@ msgid ""
"\">e.g. ext3 "
"samp>)"
msgstr ""
-"ç¨äºæ ¼å¼ååå¨å¨çæ件系ç»ï¼ï¼ä¾å¦ï¼ext3 ï¼"
msgid ""
@@ -3142,7 +3141,7 @@ msgid "The following changes have been reverted"
msgstr "以ä¸æ´æ¹å·²æ¾å¼"
msgid "The following rules are currently active on this system."
-msgstr "ç³»ç»ä¸çæ´»è·è¿æ¥ã"
+msgstr "以ä¸è§åå½åå¨ç³»ç»ä¸å¤äºæ´»å¨ç¶æã"
msgid "The given network name is not unique"
msgstr "ç»å®çç½ç»åéå¤"
@@ -3185,7 +3184,7 @@ msgstr "æ交çå®å
¨ä»¤çæ ææå·²è¿æï¼"
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
-msgstr "ç³»ç»æ£å¨å é¤é
ç½®ååºï¼å®æåä¼èªå¨éå¯ã"
+msgstr "ç³»ç»æ£å¨æ¦é¤é
ç½®ååºï¼å®æåä¼èªå¨éå¯ã"
msgid ""
"The system is flashing now. DO NOT POWER OFF THE DEVICE! Wait a "
@@ -3204,7 +3203,7 @@ 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 "ä¸æ¯ææä¸ä¼ çæä»¶æ ¼å¼ã请确认éæ©çæ件æ 误ã"
+msgstr "ä¸æ¯ææä¸ä¼ çæ åæä»¶æ ¼å¼ï¼è¯·éæ©éåå½åå¹³å°çéç¨æ åæ件ã"
msgid "There are no active leases."
msgstr "没æå·²åé
çç§çº¦ã"
@@ -3286,7 +3285,7 @@ msgstr "è¿é常æ¯é§é代çæ管ççæè¿ç PoP çå°å"
msgid ""
"This list gives an overview over currently running system processes and "
"their status."
-msgstr "ç³»ç»ä¸æ£å¨è¿è¡çè¿ç¨åå
¶ç¶æä¿¡æ¯ã"
+msgstr "ç³»ç»ä¸æ£å¨è¿è¡çè¿ç¨æ¦åµåå®ä»¬çç¶æä¿¡æ¯ã"
msgid "This page allows the configuration of custom button actions"
msgstr "èªå®ä¹æé®å¨ä½ã"
@@ -3318,7 +3317,7 @@ msgid "Total Available"
msgstr "å¯ç¨æ°"
msgid "Traceroute"
-msgstr "è·¯ç±è¿½è¸ª"
+msgstr "Traceroute"
msgid "Traffic"
msgstr "æµé"
diff --git a/modules/luci-base/po/zh-tw/base.po b/modules/luci-base/po/zh-tw/base.po
index 7521324f1..7b2792e61 100644
--- a/modules/luci-base/po/zh-tw/base.po
+++ b/modules/luci-base/po/zh-tw/base.po
@@ -2319,6 +2319,9 @@ msgstr ""
msgid "Password successfully changed!"
msgstr "å¯ç¢¼å·²è®æ´æå!"
+msgid "Password2"
+msgstr ""
+
msgid "Path to CA-Certificate"
msgstr "CA-èæ¸çè·¯å¾"
diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua
index 385e1141e..22f7c5f70 100644
--- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua
+++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua
@@ -38,6 +38,7 @@ if fs.access("/etc/init.d/dsl_control") then
tone:value("bv", translate("B43 + B43C + V43"))
xfer_mode = dsl:option(ListValue, "xfer_mode", translate("Encapsulation mode"))
+ xfer_mode:value("", translate("auto"))
xfer_mode:value("atm", translate("ATM (Asynchronous Transfer Mode)"))
xfer_mode:value("ptm", translate("PTM/EFM (Packet Transfer Mode)"))
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 e1e21bcb5..51913729d 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
@@ -769,6 +769,9 @@ if hwtype == "mac80211" or hwtype == "prism2" then
ieee80211r:depends({mode="ap", encryption="psk"})
ieee80211r:depends({mode="ap", encryption="psk2"})
ieee80211r:depends({mode="ap", encryption="psk-mixed"})
+ ieee80211r:depends({mode="ap-wds", encryption="psk"})
+ ieee80211r:depends({mode="ap-wds", encryption="psk2"})
+ ieee80211r:depends({mode="ap-wds", encryption="psk-mixed"})
end
ieee80211r.rmempty = true