diff options
49 files changed, 2397 insertions, 1609 deletions
diff --git a/applications/luci-app-aria2/po/uk/aria2.po b/applications/luci-app-aria2/po/uk/aria2.po index f239a584a2..d293395e4f 100644 --- a/applications/luci-app-aria2/po/uk/aria2.po +++ b/applications/luci-app-aria2/po/uk/aria2.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-10-27 21:30+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsaria2/uk/>\n" "Language: uk\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" "4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:296 msgid "<abbr title=\"Local Peer Discovery\">LPD</abbr> enabled" @@ -85,7 +85,7 @@ msgstr "Збирання даних..." #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:73 msgid "Config file directory" -msgstr "" +msgstr "Каталог файлів конфігурації" #: applications/luci-app-aria2/luasrc/controller/aria2.lua:21 msgid "Configuration" @@ -93,15 +93,15 @@ msgstr "Конфігурація" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:230 msgid "Connect timeout" -msgstr "" +msgstr "Час очікування з'єднання" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:19 msgid "Content of config file: <code>%s</code>" -msgstr "" +msgstr "Вміст файлу конфігурації: <code>% s </code>" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:29 msgid "Content of session file: <code>%s</code>" -msgstr "" +msgstr "Вміст файлу сеансу: <code>% s </code>" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:341 msgid "DHT Listen port" @@ -109,17 +109,19 @@ msgstr "" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:87 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:422 msgid "" "Disable IPv6. This is useful if you have to use broken DNS and want to avoid " "terribly slow AAAA record lookup." msgstr "" +"Вимкнути IPv6. Це корисно, якщо вам доведеться використовувати зламаний DNS " +"і хочете уникнути надзвичайно повільного пошуку записів AAAA." #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:440 msgid "Disk cache" -msgstr "" +msgstr "Дисковий кеш" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:259 msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M." @@ -127,20 +129,20 @@ msgstr "" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:254 msgid "Download a file using N connections." -msgstr "" +msgstr "Завантажте файл за допомогою N з'єднань." #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:69 msgid "Download directory" -msgstr "" +msgstr "Каталог завантажень" #: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:26 #: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:36 msgid "Empty file." -msgstr "" +msgstr "Порожній файл." #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:280 msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support." -msgstr "" +msgstr "Увімкнути функцію IPv4 DHT. Вона також активує підтримку UDP-трекера." #: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:290 msgid "Enable IPv6 DHT functionality." diff --git a/applications/luci-app-ddns/po/hu/ddns.po b/applications/luci-app-ddns/po/hu/ddns.po index cd6a3b3498..0be30df995 100644 --- a/applications/luci-app-ddns/po/hu/ddns.po +++ b/applications/luci-app-ddns/po/hu/ddns.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: luci-app-ddns 2.4.0-1\n" "POT-Creation-Date: 2016-01-30 11:07+0100\n" -"PO-Revision-Date: 2019-12-10 23:14+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsddns/hu/>\n" @@ -515,7 +515,7 @@ msgstr "Jelszó" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:588 msgid "Path to CA-Certificate" -msgstr "" +msgstr "Útvonal a CA-tanúsítványhoz" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:203 msgid "" diff --git a/applications/luci-app-firewall/luasrc/controller/firewall.lua b/applications/luci-app-firewall/luasrc/controller/firewall.lua deleted file mode 100644 index 5f8cb6ef31..0000000000 --- a/applications/luci-app-firewall/luasrc/controller/firewall.lua +++ /dev/null @@ -1,19 +0,0 @@ -module("luci.controller.firewall", package.seeall) - -function index() - entry({"admin", "network", "firewall"}, - alias("admin", "network", "firewall", "zones"), - _("Firewall"), 60) - - entry({"admin", "network", "firewall", "zones"}, - view("firewall/zones"), _("General Settings"), 10) - - entry({"admin", "network", "firewall", "forwards"}, - view("firewall/forwards"), _("Port Forwards"), 20) - - entry({"admin", "network", "firewall", "rules"}, - view("firewall/rules"), _("Traffic Rules"), 30) - - entry({"admin", "network", "firewall", "custom"}, - view("firewall/custom"), _("Custom Rules"), 40).leaf = true -end diff --git a/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json b/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json new file mode 100644 index 0000000000..c414f36910 --- /dev/null +++ b/applications/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json @@ -0,0 +1,50 @@ +{ + "admin/network/firewall": { + "title": "Firewall", + "order": 60, + "action": { + "type": "alias", + "path": "admin/network/firewall/zones" + }, + "depends": { + "fs": { "/sbin/fw3": "executable" }, + "uci": { "firewall": true } + } + }, + + "admin/network/firewall/zones": { + "title": "General Settings", + "order": 10, + "action": { + "type": "view", + "path": "firewall/zones" + } + }, + + "admin/network/firewall/forwards": { + "title": "Port Forwards", + "order": 20, + "action": { + "type": "view", + "path": "firewall/forwards" + } + }, + + "admin/network/firewall/rules": { + "title": "Traffic Rules", + "order": 30, + "action": { + "type": "view", + "path": "firewall/rules" + } + }, + + "admin/network/firewall/custom": { + "title": "Custom Rules", + "order": 40, + "action": { + "type": "view", + "path": "firewall/custom" + } + } +} diff --git a/applications/luci-app-https_dns_proxy/po/pl/https_dns_proxy.po b/applications/luci-app-https_dns_proxy/po/pl/https_dns_proxy.po index d37c10fd7b..1b2edc9898 100644 --- a/applications/luci-app-https_dns_proxy/po/pl/https_dns_proxy.po +++ b/applications/luci-app-https_dns_proxy/po/pl/https_dns_proxy.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-12-04 12:06+0000\n" -"Last-Translator: Marcin Net <marcin.net@linux.pl>\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" +"Last-Translator: Michal L <michalrmsmi@wp.pl>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationshttps_dns_proxy/pl/>\n" "Language: pl\n" @@ -13,27 +13,27 @@ msgstr "" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/com.adguard.dns-family.lua:11 msgid "AdGuard (Family Protection)" -msgstr "" +msgstr "AdGuard (Ochrona rodziny)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/com.adguard.dns.lua:11 msgid "AdGuard (Standard)" -msgstr "" +msgstr "AdGuard (Standardowy)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/org.cleanbrowsing.doh-adult.lua:11 msgid "CleanBrowsing (Adult Filter)" -msgstr "" +msgstr "CleanBrowsing (Filtr treści dla dorosłych)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/org.cleanbrowsing.doh-family.lua:11 msgid "CleanBrowsing (Family Filter)" -msgstr "" +msgstr "CleanBrowsing (Filtr rodzinny)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/org.cleanbrowsing.doh-security.lua:11 msgid "CleanBrowsing (Security Filter)" -msgstr "" +msgstr "CleanBrowsing (Filtr bezpieczeństwa)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers/com.cloudflare-dns.lua:3 msgid "Cloudflare" -msgstr "" +msgstr "Cloudflare" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:85 msgid "DHCP and DNS" @@ -41,19 +41,19 @@ msgstr "DHCP i DNS" #: applications/luci-app-https_dns_proxy/luasrc/controller/https_dns_proxy.lua:4 msgid "DNS over HTTPS Proxy" -msgstr "" +msgstr "Proxy DNS over HTTPS" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:64 msgid "DNS over HTTPS Proxy Settings" -msgstr "" +msgstr "Ustawiania proxy DNS over HTTPS" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers/sb.dns.lua:3 msgid "DNS.SB" -msgstr "" +msgstr "DNS.SB" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua:3 msgid "Digitale Gesellschaft" -msgstr "" +msgstr "Digitale Gesellschaft" #: applications/luci-app-https_dns_proxy/luasrc/view/https_dns_proxy/buttons.htm:53 msgid "Disable" @@ -61,7 +61,7 @@ msgstr "Wyłącz" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:56 msgid "DoH" -msgstr "" +msgstr "DoH" #: applications/luci-app-https_dns_proxy/luasrc/view/https_dns_proxy/buttons.htm:51 msgid "Enable" @@ -81,7 +81,7 @@ msgstr "Więcej informacji na temat wyboru różnych opcji" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers/com.google.dns.lua:3 msgid "Google" -msgstr "" +msgstr "Google" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:83 msgid "Instances" @@ -101,7 +101,7 @@ msgstr "Ładowanie" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/cz.nic.odvr.lua:3 msgid "ODVR (nic.cz)" -msgstr "" +msgstr "ODVR (nic.cz)" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:91 msgid "Provider" @@ -113,19 +113,19 @@ msgstr "Serwer Proxy" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/net.quad9.dns.lua:11 msgid "Quad 9 (Recommended)" -msgstr "" +msgstr "Quad 9 (Zalecane)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/net.quad9.dns11.lua:11 msgid "Quad 9 (Secured with ECS Support)" -msgstr "" +msgstr "Quad 9 (Zabezpieczony z obsługą ECS)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/net.quad9.dns9.lua:11 msgid "Quad 9 (Secured)" -msgstr "" +msgstr "Quad 9 (Zabezpieczony)" #: applications/luci-app-https_dns_proxy/luasrc/https_dns_proxy/providers.disabled/net.quad9.dns10.lua:11 msgid "Quad 9 (Unsecured)" -msgstr "" +msgstr "Quad 9 (Niezabezpieczony)" #: applications/luci-app-https_dns_proxy/luasrc/view/https_dns_proxy/buttons.htm:43 msgid "Reload" @@ -133,12 +133,12 @@ msgstr "Przeładuj" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:56 msgid "Running" -msgstr "" +msgstr "Uruchomione" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:66 #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:68 msgid "Service Status" -msgstr "" +msgstr "Status usługi" #: applications/luci-app-https_dns_proxy/luasrc/view/https_dns_proxy/buttons.htm:41 msgid "Start" @@ -158,7 +158,7 @@ msgstr "Adres podsieci" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:22 msgid "Uknown Provider" -msgstr "" +msgstr "Nieznany dostawca" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:83 msgid "" @@ -182,11 +182,11 @@ msgstr "i" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:56 msgid "at" -msgstr "" +msgstr "na" #: applications/luci-app-https_dns_proxy/luasrc/model/cbi/https_dns_proxy.lua:32 msgid "is not installed or not found" -msgstr "" +msgstr "nie jest zainstalowany lub nie został znaleziony" #~ msgid "HTTPS DNS Proxy" #~ msgstr "HTTPS DNS Proxy" diff --git a/applications/luci-app-mwan3/po/hu/mwan3.po b/applications/luci-app-mwan3/po/hu/mwan3.po index 24efe6e546..99a027d9b9 100644 --- a/applications/luci-app-mwan3/po/hu/mwan3.po +++ b/applications/luci-app-mwan3/po/hu/mwan3.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-12-10 23:15+0000\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsmwan3/hu/>\n" @@ -559,7 +559,7 @@ msgstr "" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/policy.lua:51 msgid "Policy" -msgstr "" +msgstr "Szabály" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/ruleconfig.lua:66 #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/rule.lua:99 @@ -595,7 +595,7 @@ msgstr "" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/rule.lua:59 msgid "Rule" -msgstr "" +msgstr "Szabály" #: applications/luci-app-mwan3/luasrc/controller/mwan3.lua:57 msgid "Rules" diff --git a/applications/luci-app-mwan3/po/uk/mwan3.po b/applications/luci-app-mwan3/po/uk/mwan3.po index cbdf383e00..2d491fb6be 100644 --- a/applications/luci-app-mwan3/po/uk/mwan3.po +++ b/applications/luci-app-mwan3/po/uk/mwan3.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-11-05 01:57+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsmwan3/uk/>\n" "Language: uk\n" @@ -131,7 +131,7 @@ msgstr "Критична ситуація" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/globalsconfig.lua:38 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/ruleconfig.lua:29 #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/rule.lua:81 diff --git a/applications/luci-app-olsr-services/po/es/olsr-services.po b/applications/luci-app-olsr-services/po/es/olsr-services.po index 8f49a6fe9f..b35c4d9978 100644 --- a/applications/luci-app-olsr-services/po/es/olsr-services.po +++ b/applications/luci-app-olsr-services/po/es/olsr-services.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2019-07-22 17:44-0300\n" -"PO-Revision-Date: 2019-11-18 05:08+0000\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" "Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsolsr-services/es/>\n" @@ -38,7 +38,7 @@ msgstr "Servicios" #: applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm:132 #: applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm:164 msgid "Source" -msgstr "Fuente" +msgstr "Origen" #: applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm:130 #: applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm:162 diff --git a/applications/luci-app-olsr/po/hu/olsr.po b/applications/luci-app-olsr/po/hu/olsr.po index b2ce33ccf5..817292ea64 100644 --- a/applications/luci-app-olsr/po/hu/olsr.po +++ b/applications/luci-app-olsr/po/hu/olsr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-12-10 23:14+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsolsr/hu/>\n" @@ -313,7 +313,7 @@ msgstr "IPv4" #: applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua:103 #: applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua:278 msgid "IPv4 broadcast" -msgstr "" +msgstr "IPv4 üzenetszórás" #: applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua:104 #: applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua:279 diff --git a/applications/luci-app-opkg/luasrc/controller/opkg.lua b/applications/luci-app-opkg/luasrc/controller/opkg.lua index 29c9a08645..ebdcf1b09c 100644 --- a/applications/luci-app-opkg/luasrc/controller/opkg.lua +++ b/applications/luci-app-opkg/luasrc/controller/opkg.lua @@ -3,14 +3,6 @@ module("luci.controller.opkg", package.seeall) -function index() - entry({"admin", "system", "opkg"}, template("opkg"), _("Software"), 30) - entry({"admin", "system", "opkg", "list"}, call("action_list")).leaf = true - entry({"admin", "system", "opkg", "exec"}, post("action_exec")).leaf = true - entry({"admin", "system", "opkg", "statvfs"}, call("action_statvfs")).leaf = true - entry({"admin", "system", "opkg", "config"}, post_on({ data = true }, "action_config")).leaf = true -end - function action_list(mode) local util = require "luci.util" local cmd @@ -26,7 +18,7 @@ function action_list(mode) fd:close() end - if not lists_dir or #lists_dir == "" then + if not lists_dir or #lists_dir == 0 then lists_dir = "/tmp/opkg-lists" end diff --git a/applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json b/applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json new file mode 100644 index 0000000000..9356b586dd --- /dev/null +++ b/applications/luci-app-opkg/root/usr/share/luci/menu.d/luci-app-opkg.json @@ -0,0 +1,44 @@ +{ + "admin/system/opkg": { + "title": "Software", + "order": 30, + "action": { + "type": "template", + "path": "opkg" + } + }, + + "admin/system/opkg/list/*": { + "action": { + "type": "call", + "module": "luci.controller.opkg", + "function": "action_list" + } + }, + + "admin/system/opkg/exec/*": { + "action": { + "type": "call", + "post": true, + "module": "luci.controller.opkg", + "function": "action_exec" + } + }, + + "admin/system/opkg/statvfs/*": { + "action": { + "type": "call", + "module": "luci.controller.opkg", + "function": "action_statvfs" + } + }, + + "admin/system/opkg/config/*": { + "action": { + "type": "call", + "post": { "data": true }, + "module": "luci.controller.opkg", + "function": "action_config" + } + } +} diff --git a/applications/luci-app-radicale/po/uk/radicale.po b/applications/luci-app-radicale/po/uk/radicale.po index 31ee367359..72ad909d1e 100644 --- a/applications/luci-app-radicale/po/uk/radicale.po +++ b/applications/luci-app-radicale/po/uk/radicale.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-10-27 22:31+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsradicale/uk/>\n" "Language: uk\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" "4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: applications/luci-app-radicale/luasrc/model/cbi/radicale.lua:268 msgid "" @@ -133,7 +133,7 @@ msgstr "" #: applications/luci-app-radicale/luasrc/model/cbi/radicale.lua:570 #: applications/luci-app-radicale/luasrc/model/cbi/radicale.lua:592 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: applications/luci-app-radicale/luasrc/model/cbi/radicale.lua:191 msgid "Delay (in seconds) during system boot before Radicale start" diff --git a/applications/luci-app-radicale2/po/hu/radicale2.po b/applications/luci-app-radicale2/po/hu/radicale2.po index ca978b46e2..de12c44cb5 100644 --- a/applications/luci-app-radicale2/po/hu/radicale2.po +++ b/applications/luci-app-radicale2/po/hu/radicale2.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: luci-app-radicale 2\n" -"PO-Revision-Date: 2019-12-10 23:14+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsradicale2/hu/>\n" @@ -37,7 +37,7 @@ msgstr "" #: applications/luci-app-radicale2/luasrc/model/cbi/radicale2/auth.lua:14 msgid "Authentication Type" -msgstr "" +msgstr "Hitelesítés típusa" #: applications/luci-app-radicale2/luasrc/model/cbi/radicale2/auth.lua:171 msgid "Based on settings in 'Rights File'" diff --git a/applications/luci-app-radicale2/po/uk/radicale2.po b/applications/luci-app-radicale2/po/uk/radicale2.po index 4ab1da8e90..9d334320f3 100644 --- a/applications/luci-app-radicale2/po/uk/radicale2.po +++ b/applications/luci-app-radicale2/po/uk/radicale2.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: luci-app-radicale 2\n" -"PO-Revision-Date: 2019-10-27 21:28+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsradicale2/uk/>\n" "Language: uk\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" "4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: applications/luci-app-radicale2/luasrc/model/cbi/radicale2/auth.lua:8 #: applications/luci-app-radicale2/luasrc/model/cbi/radicale2/logging.lua:4 @@ -78,7 +78,7 @@ msgstr "" #: applications/luci-app-radicale2/luasrc/model/cbi/radicale2/logging.lua:26 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: applications/luci-app-radicale2/luasrc/model/cbi/radicale2/auth.lua:15 msgid "Default (htpasswd file from users below)" diff --git a/applications/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po b/applications/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po index 203b21af0c..057d5d5cb0 100644 --- a/applications/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po +++ b/applications/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-12-03 08:27+0000\n" -"Last-Translator: Marcin Net <marcin.net@linux.pl>\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" +"Last-Translator: Michal L <michalrmsmi@wp.pl>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsshadowsocks-libev/pl/>\n" "Language: pl\n" @@ -286,7 +286,7 @@ msgstr "" #: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:116 msgid "Running" -msgstr "" +msgstr "Uruchomione" #: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:138 msgid "Server" diff --git a/applications/luci-app-splash/po/hu/splash.po b/applications/luci-app-splash/po/hu/splash.po index f6abd34746..2b2825edb5 100644 --- a/applications/luci-app-splash/po/hu/splash.po +++ b/applications/luci-app-splash/po/hu/splash.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-11-29 19:44+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationssplash/hu/>\n" @@ -236,7 +236,7 @@ msgstr "" #: applications/luci-app-splash/luasrc/view/admin_status/splash.htm:210 msgid "Policy" -msgstr "" +msgstr "Szabály" #: applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua:11 msgid "Redirect target" diff --git a/applications/luci-app-tinyproxy/po/hu/tinyproxy.po b/applications/luci-app-tinyproxy/po/hu/tinyproxy.po index e217f5711c..edfb341c4d 100644 --- a/applications/luci-app-tinyproxy/po/hu/tinyproxy.po +++ b/applications/luci-app-tinyproxy/po/hu/tinyproxy.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-12-10 23:14+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationstinyproxy/hu/>\n" @@ -214,7 +214,7 @@ msgstr "" #: applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua:218 msgid "Policy" -msgstr "" +msgstr "Szabály" #: applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua:12 msgid "Privacy settings" diff --git a/applications/luci-app-transmission/po/uk/transmission.po b/applications/luci-app-transmission/po/uk/transmission.po index b2bb0140ce..aa2363c389 100644 --- a/applications/luci-app-transmission/po/uk/transmission.po +++ b/applications/luci-app-transmission/po/uk/transmission.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-13 16:16+0200\n" -"PO-Revision-Date: 2019-10-27 21:29+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationstransmission/uk/>\n" "Language: uk\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" "4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:39 msgid "Alternative download speed" @@ -49,19 +49,19 @@ msgstr "" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:34 msgid "Bandwidth settings" -msgstr "" +msgstr "Налаштування пропускної здатності" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:131 msgid "Binding address IPv4" -msgstr "" +msgstr "Прив’язка адреси IPv4" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:133 msgid "Binding address IPv6" -msgstr "" +msgstr "Прив’язка адреси IPv6" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:57 msgid "Block list enabled" -msgstr "" +msgstr "Список заблокованих увімкнено" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:60 msgid "Blocklist URL" @@ -73,11 +73,11 @@ msgstr "" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:31 msgid "Cache size in MB" -msgstr "" +msgstr "Розмір кешу в МБ" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:25 msgid "Config file directory" -msgstr "" +msgstr "Каталог файлів конфігурації" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:32 msgid "Custom WEB UI directory" @@ -89,11 +89,11 @@ msgstr "" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:111 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:65 msgid "Download directory" -msgstr "" +msgstr "Каталог завантажень" #: applications/luci-app-transmission/luasrc/model/cbi/transmission.lua:202 msgid "Download queue enabled" diff --git a/applications/luci-app-travelmate/po/hu/travelmate.po b/applications/luci-app-travelmate/po/hu/travelmate.po index 9b2d159212..11cc2dab70 100644 --- a/applications/luci-app-travelmate/po/hu/travelmate.po +++ b/applications/luci-app-travelmate/po/hu/travelmate.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-12-10 23:14+0000\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationstravelmate/hu/>\n" @@ -336,7 +336,7 @@ msgstr "Személyes kulcs jelszava" #: applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua:111 #: applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua:95 msgid "Path to CA-Certificate" -msgstr "" +msgstr "Útvonal a CA-tanúsítványhoz" #: applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_add.lua:114 #: applications/luci-app-travelmate/luasrc/model/cbi/travelmate/wifi_edit.lua:99 diff --git a/applications/luci-app-ttyd/po/uk/ttyd.po b/applications/luci-app-ttyd/po/uk/ttyd.po index c3a6b4572e..377035d1cd 100644 --- a/applications/luci-app-ttyd/po/uk/ttyd.po +++ b/applications/luci-app-ttyd/po/uk/ttyd.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-11-30 21:06+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsttyd/uk/>\n" "Language: uk\n" @@ -59,7 +59,7 @@ msgstr "" #: applications/luci-app-ttyd/htdocs/luci-static/resources/view/ttyd/config.js:72 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: applications/luci-app-ttyd/htdocs/luci-static/resources/view/ttyd/config.js:41 msgid "Do not allow clients to write to the TTY" diff --git a/applications/luci-app-wireguard/po/hu/wireguard.po b/applications/luci-app-wireguard/po/hu/wireguard.po index 23b8ee9636..144c4f5a42 100644 --- a/applications/luci-app-wireguard/po/hu/wireguard.po +++ b/applications/luci-app-wireguard/po/hu/wireguard.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2019-12-10 23:16+0000\n" +"PO-Revision-Date: 2019-12-13 23:07+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/" "luciapplicationswireguard/hu/>\n" @@ -53,7 +53,7 @@ msgstr "" #: applications/luci-app-wireguard/luasrc/view/wireguard.htm:125 msgid "Listen Port" -msgstr "" +msgstr "Port figyelése" #: applications/luci-app-wireguard/luasrc/view/wireguard.htm:81 msgid "Never" diff --git a/build/i18n-scan.pl b/build/i18n-scan.pl index c19a4386ce..5ac1cb77d4 100755 --- a/build/i18n-scan.pl +++ b/build/i18n-scan.pl @@ -1,5 +1,6 @@ #!/usr/bin/perl +use utf8; use strict; use warnings; use Text::Balanced qw(extract_tagged gen_delimited_pat); @@ -15,12 +16,49 @@ my %stringtable; sub dec_lua_str { my $s = shift; - $s =~ s/\\n/\n/g; - $s =~ s/\\t/\t/g; - $s =~ s/\\(.)/$1/sg; + my %rep = ( + 'a' => "\x07", + 'b' => "\x08", + 'f' => "\x0c", + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'v' => "\x76" + ); + + $s =~ s!\\(?:([0-9]{1,2})|(.))! + $1 ? chr(int($1)) : ($rep{$2} || $2) + !segx; + + $s =~ s/[\s\n]+/ /g; + $s =~ s/^ //; + $s =~ s/ $//; + + return $s; +} + +sub dec_json_str +{ + my $s = shift; + my %rep = ( + '"' => '"', + '/' => '/', + 'b' => "\x08", + 'f' => "\x0c", + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + '\\' => '\\' + ); + + $s =~ s!\\([\\/"bfnrt]|u([0-9a-fA-F]{4}))! + $2 ? chr(hex($2)) : $rep{$1} + !egx; + $s =~ s/[\s\n]+/ /g; $s =~ s/^ //; $s =~ s/ $//; + return $s; } @@ -43,6 +81,8 @@ if( open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.j if( open S, "< $file" ) { + binmode S, ':utf8'; + local $/ = undef; my $raw = <S>; close S; @@ -148,9 +188,84 @@ if( open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' -o -name '*.j close F; } +if( open F, "find @ARGV -type f -path '*/menu.d/*.json' | sort |" ) +{ + while( defined( my $file = readline F ) ) + { + chomp $file; + + if( open S, "< $file" ) + { + binmode S, ':utf8'; + + local $/ = undef; + my $raw = <S>; + close S; + + my $text = $raw; + my $line = 1; + + while ($text =~ s/ ^ (.*?) "title" ([\n\s]*) : //sgx) + { + my ($prefix, $suffix) = ($1, $2); + my $code; + my $res = ""; + my $sub = ""; + + $line += () = $prefix =~ /\n/g; + + my $position = "$file:$line"; + + $line += () = $suffix =~ /\n/g; + + while (defined $sub) + { + undef $sub; + + if ($text =~ /^ ([\n\s]*) " /sx) + { + my $ws = $1; + my $re = gen_delimited_pat('"', '\\'); + + if ($text =~ m/\G\s*($re)/gcs) + { + $sub = $1; + $text = substr $text, pos $text; + } + + $line += () = $ws =~ /\n/g; + + if (defined($sub) && length($sub)) { + $line += () = $sub =~ /\n/g; + + $sub =~ s/^"//; + $sub =~ s/"$//; + $res .= $sub; + } + } + } + + if (defined($res)) + { + $res = dec_json_str($res); + + if ($res) { + $stringtable{$res} ||= [ ]; + push @{$stringtable{$res}}, $position; + } + } + } + } + } + + close F; +} + if( open C, "| msgcat -" ) { + binmode C, ':utf8'; + printf C "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n"; foreach my $key ( sort keys %stringtable ) diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js index 31f89339c4..a60aea9119 100644 --- a/modules/luci-base/htdocs/luci-static/resources/ui.js +++ b/modules/luci-base/htdocs/luci-static/resources/ui.js @@ -457,9 +457,9 @@ var UIDropdown = UIElement.extend({ 'placeholder': this.options.custom_placeholder || this.options.placeholder }); - if (this.options.datatype) - L.ui.addValidator(createEl, this.options.datatype, - true, null, 'blur', 'keyup'); + if (this.options.datatype || this.options.validate) + L.ui.addValidator(createEl, this.options.datatype || 'string', + true, this.options.validate, 'blur', 'keyup'); sb.lastElementChild.appendChild(E('li', { 'data-value': '-' }, createEl)); } @@ -1270,9 +1270,9 @@ var UIDynamicList = UIElement.extend({ dl.lastElementChild.appendChild(inputEl); dl.lastElementChild.appendChild(E('div', { 'class': 'cbi-button cbi-button-add' }, '+')); - if (this.options.datatype) - L.ui.addValidator(inputEl, this.options.datatype, - true, null, 'blur', 'keyup'); + if (this.options.datatype || this.options.validate) + L.ui.addValidator(inputEl, this.options.datatype || 'string', + true, this.options.validate, 'blur', 'keyup'); } for (var i = 0; i < this.values.length; i++) diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua index 0cebfa4f57..68bbd38a71 100644 --- a/modules/luci-base/luasrc/controller/admin/index.lua +++ b/modules/luci-base/luasrc/controller/admin/index.lua @@ -3,85 +3,6 @@ module("luci.controller.admin.index", package.seeall) -function index() - function toplevel_page(page, preflookup, preftarget) - if preflookup and preftarget then - if lookup(preflookup) then - page.target = preftarget - end - end - - if not page.target then - page.target = firstchild() - end - end - - local uci = require("luci.model.uci").cursor() - - local root = node() - if not root.target then - root.target = alias("admin") - root.index = true - end - - local page = node("admin") - - page.title = _("Administration") - page.order = 10 - page.sysauth = "root" - page.sysauth_authenticator = "htmlauth" - page.ucidata = true - page.index = true - page.target = firstnode() - - -- Empty menu tree to be populated by addons and modules - - page = node("admin", "status") - page.title = _("Status") - page.order = 10 - page.index = true - -- overview is from mod-admin-full - toplevel_page(page, "admin/status/overview", alias("admin", "status", "overview")) - - page = node("admin", "system") - page.title = _("System") - page.order = 20 - page.index = true - -- system/system is from mod-admin-full - toplevel_page(page, "admin/system/system", alias("admin", "system", "system")) - - -- Only used if applications add items - page = node("admin", "vpn") - page.title = _("VPN") - page.order = 30 - page.index = true - toplevel_page(page, false, false) - - -- Only used if applications add items - page = node("admin", "services") - page.title = _("Services") - page.order = 40 - page.index = true - toplevel_page(page, false, false) - - -- Even for mod-admin-full network just uses first submenu item as landing - page = node("admin", "network") - page.title = _("Network") - page.order = 50 - page.index = true - toplevel_page(page, false, false) - - page = entry({"admin", "translations"}, call("action_translations"), nil) - page.leaf = true - - page = entry({"admin", "ubus"}, call("action_ubus"), nil) - page.sysauth = false - page.leaf = true - - -- Logout is last - entry({"admin", "logout"}, call("action_logout"), _("Logout"), 999) -end - function action_logout() local dsp = require "luci.dispatcher" local utl = require "luci.util" diff --git a/modules/luci-base/luasrc/controller/admin/uci.lua b/modules/luci-base/luasrc/controller/admin/uci.lua index 6b19c62f81..7aad10d58a 100644 --- a/modules/luci-base/luasrc/controller/admin/uci.lua +++ b/modules/luci-base/luasrc/controller/admin/uci.lua @@ -4,32 +4,6 @@ module("luci.controller.admin.uci", package.seeall) -function index() - local redir = luci.http.formvalue("redir", true) - or table.concat(luci.dispatcher.context.request, "/") - - entry({"admin", "uci"}, nil, _("Configuration")) - entry({"admin", "uci", "revert"}, post("action_revert"), nil) - - local node - local authen = function(checkpass, allowed_users) - return "root", luci.http.formvalue("sid") - end - - node = entry({"admin", "uci", "apply_rollback"}, post("action_apply_rollback"), nil) - node.cors = true - node.sysauth_authenticator = authen - - node = entry({"admin", "uci", "apply_unchecked"}, post("action_apply_unchecked"), nil) - node.cors = true - node.sysauth_authenticator = authen - - node = entry({"admin", "uci", "confirm"}, call("action_confirm"), nil) - node.cors = true - node.sysauth = false -end - - local function ubus_state_to_http(errstr) local map = { ["Invalid command"] = 400, diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua index b43b94fdef..d4293422b5 100644 --- a/modules/luci-base/luasrc/dispatcher.lua +++ b/modules/luci-base/luasrc/dispatcher.lua @@ -17,138 +17,336 @@ _M.fs = fs -- Index table local index = nil --- Fastindex -local fi +local function check_fs_depends(fs) + local fs = require "nixio.fs" + + for path, kind in pairs(fs) do + if kind == "directory" then + local empty = true + for entry in (fs.dir(path) or function() end) do + empty = false + break + end + if empty then + return false + end + elseif kind == "executable" then + if fs.stat(path, "type") ~= "reg" or not fs.access(path, "x") then + return false + end + elseif kind == "file" then + if fs.stat(path, "type") ~= "reg" then + return false + end + end + end + return true +end -function build_url(...) - local path = {...} - local url = { http.getenv("SCRIPT_NAME") or "" } +local function check_uci_depends_options(conf, s, opts) + local uci = require "luci.model.uci" - local p - for _, p in ipairs(path) do - if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then - url[#url+1] = "/" - url[#url+1] = p + if type(opts) == "string" then + return (s[".type"] == opts) + elseif opts == true then + for option, value in pairs(s) do + if option:byte(1) ~= 46 then + return true + end + end + elseif type(opts) == "table" then + for option, value in pairs(opts) do + local sval = s[option] + if type(sval) == "table" then + local found = false + for _, v in ipairs(sval) do + if v == value then + found = true + break + end + end + if not found then + return false + end + elseif value == true then + if sval == nil then + return false + end + else + if sval ~= value then + return false + end + end end end - if #path == 0 then - url[#url+1] = "/" + return true +end + +local function check_uci_depends_section(conf, sect) + local uci = require "luci.model.uci" + + for section, options in pairs(sect) do + local stype = section:match("^@([A-Za-z0-9_%-]+)$") + if stype then + local found = false + uci:foreach(conf, stype, function(s) + if check_uci_depends_options(conf, s, options) then + found = true + return false + end + end) + if not found then + return false + end + else + local s = uci:get_all(conf, section) + if not s or not check_uci_depends_options(conf, s, options) then + return false + end + end end - return table.concat(url, "") + return true end -function _ordered_children(node) - local name, child, children = nil, nil, {} +local function check_uci_depends(conf) + local uci = require "luci.model.uci" - for name, child in pairs(node.nodes) do - children[#children+1] = { - name = name, - node = child, - order = child.order or 100 - } + for config, values in pairs(conf) do + if values == true then + local found = false + uci:foreach(config, nil, function(s) + found = true + return false + end) + if not found then + return false + end + elseif type(values) == "table" then + if not check_uci_depends_section(config, values) then + return false + end + end end - table.sort(children, function(a, b) - if a.order == b.order then - return a.name < b.name - else - return a.order < b.order + return true +end + +local function check_depends(spec) + if type(spec.depends) ~= "table" then + return true + end + + if type(spec.depends.fs) == "table" and not check_fs_depends(spec.depends.fs) then + local satisfied = false + local alternatives = (#spec.depends.fs > 0) and spec.depends.fs or { spec.depends.fs } + for _, alternative in ipairs(alternatives) do + if check_fs_depends(alternative) then + satisfied = true + break + end end - end) + if not satisfied then + return false + end + end - return children + if type(spec.depends.uci) == "table" then + local satisfied = false + local alternatives = (#spec.depends.uci > 0) and spec.depends.uci or { spec.depends.uci } + for _, alternative in ipairs(alternatives) do + if check_uci_depends(alternative) then + satisfied = true + break + end + end + if not satisfied then + return false + end + end + + return true end -local function dependencies_satisfied(node) - if type(node.file_depends) == "table" then - for _, file in ipairs(node.file_depends) do - local ftype = fs.stat(file, "type") - if ftype == "dir" then - local empty = true - for e in (fs.dir(file) or function() end) do - empty = false - end - if empty then - return false - end - elseif ftype == nil then - return false - end +local function target_to_json(target, module) + local action + + if target.type == "call" then + action = { + ["type"] = "call", + ["module"] = module, + ["function"] = target.name, + ["parameters"] = target.argv + } + elseif target.type == "view" then + action = { + ["type"] = "view", + ["path"] = target.view + } + elseif target.type == "template" then + action = { + ["type"] = "template", + ["path"] = target.view + } + elseif target.type == "cbi" then + action = { + ["type"] = "cbi", + ["path"] = target.model + } + elseif target.type == "form" then + action = { + ["type"] = "form", + ["path"] = target.model + } + elseif target.type == "firstchild" then + action = { + ["type"] = "firstchild" + } + elseif target.type == "firstnode" then + action = { + ["type"] = "firstchild", + ["recurse"] = true + } + elseif target.type == "arcombine" then + if type(target.targets) == "table" then + action = { + ["type"] = "arcombine", + ["targets"] = { + target_to_json(target.targets[1], module), + target_to_json(target.targets[2], module) + } + } end + elseif target.type == "alias" then + action = { + ["type"] = "alias", + ["path"] = table.concat(target.req, "/") + } + elseif target.type == "rewrite" then + action = { + ["type"] = "rewrite", + ["path"] = table.concat(target.req, "/"), + ["remove"] = target.n + } end - if type(node.uci_depends) == "table" then - for config, expect_sections in pairs(node.uci_depends) do - if type(expect_sections) == "table" then - for section, expect_options in pairs(expect_sections) do - if type(expect_options) == "table" then - for option, expect_value in pairs(expect_options) do - local val = uci:get(config, section, option) - if expect_value == true and val == nil then - return false - elseif type(expect_value) == "string" then - if type(val) == "table" then - local found = false - for _, subval in ipairs(val) do - if subval == expect_value then - found = true - end - end - if not found then - return false - end - elseif val ~= expect_value then - return false - end - end - end + if target.post and action then + action.post = target.post + end + + return action +end + +local function tree_to_json(node, json) + local fs = require "nixio.fs" + local util = require "luci.util" + + if type(node.nodes) == "table" then + for subname, subnode in pairs(node.nodes) do + local spec = { + title = util.striptags(subnode.title), + order = subnode.order + } + + if subnode.leaf then + spec.wildcard = true + end + + if subnode.cors then + spec.cors = true + end + + if subnode.setuser then + spec.setuser = subnode.setuser + end + + if subnode.setgroup then + spec.setgroup = subnode.setgroup + end + + if type(subnode.target) == "table" then + spec.action = target_to_json(subnode.target, subnode.module) + end + + if type(subnode.file_depends) == "table" then + for _, v in ipairs(subnode.file_depends) do + spec.depends = spec.depends or {} + spec.depends.fs = spec.depends.fs or {} + + local ft = fs.stat(v, "type") + if ft == "dir" then + spec.depends.fs[v] = "directory" + elseif v:match("/s?bin/") then + spec.depends.fs[v] = "executable" else - local val = uci:get(config, section) - if expect_options == true and val == nil then - return false - elseif type(expect_options) == "string" and val ~= expect_options then - return false - end + spec.depends.fs[v] = "file" end end - elseif expect_sections == true then - if not uci:get_first(config) then - return false + end + + if type(subnode.uci_depends) == "table" then + for k, v in pairs(subnode.uci_depends) do + spec.depends = spec.depends or {} + spec.depends.uci = spec.depends.uci or {} + spec.depends.uci[k] = v end end + + if (subnode.sysauth_authenticator ~= nil) or + (subnode.sysauth ~= nil and subnode.sysauth ~= false) + then + if subnode.sysauth_authenticator == "htmlauth" then + spec.auth = { + login = true, + methods = { "cookie:sysauth" } + } + elseif subname == "rpc" and subnode.module == "luci.controller.rpc" then + spec.auth = { + login = false, + methods = { "param:auth", "cookie:sysauth" } + } + elseif subnode.module == "luci.controller.admin.uci" then + spec.auth = { + login = false, + methods = { "param:sid" } + } + end + elseif subnode.sysauth == false then + spec.auth = {} + end + + if not spec.action then + spec.title = nil + end + + spec.satisfied = check_depends(spec) + json.children = json.children or {} + json.children[subname] = tree_to_json(subnode, spec) end end - return true + return json end -function node_visible(node) - if node then - return not ( - (not dependencies_satisfied(node)) or - (not node.title or #node.title == 0) or - (not node.target or node.hidden == true) or - (type(node.target) == "table" and node.target.type == "firstchild" and - (type(node.nodes) ~= "table" or not next(node.nodes))) - ) - end - return false -end +function build_url(...) + local path = {...} + local url = { http.getenv("SCRIPT_NAME") or "" } -function node_childs(node) - local rv = { } - if node then - local _, child - for _, child in ipairs(_ordered_children(node)) do - if node_visible(child.node) then - rv[#rv+1] = child.name - end + local p + for _, p in ipairs(path) do + if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then + url[#url+1] = "/" + url[#url+1] = p end end - return rv + + if #path == 0 then + url[#url+1] = "/" + end + + return table.concat(url, "") end @@ -185,6 +383,38 @@ function error500(message) return false end +local function determine_request_language() + local conf = require "luci.config" + assert(conf.main, "/etc/config/luci seems to be corrupt, unable to find section 'main'") + + local lang = conf.main.lang or "auto" + if lang == "auto" then + local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or "" + 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 + end + + if lang == "auto" then + lang = i18n.default + end + + i18n.setlanguage(lang) +end + function httpdispatch(request, prefix) http.context.request = request @@ -204,6 +434,8 @@ function httpdispatch(request, prefix) r[#r+1] = node end + determine_request_language() + local stat, err = util.coxpcall(function() dispatch(context.request) end, error500) @@ -306,189 +538,245 @@ local function session_setup(user, pass, allowed_users) return nil, nil end -function dispatch(request) - --context._disable_memtrace = require "luci.debug".trap_memtrace("l") - local ctx = context - ctx.path = request +local function check_authentication(method) + local auth_type, auth_param = method:match("^(%w+):(.+)$") + local sid, sdat - local conf = require "luci.config" - assert(conf.main, - "/etc/config/luci seems to be corrupt, unable to find section 'main'") + if auth_type == "cookie" then + sid = http.getcookie(auth_param) + elseif auth_type == "param" then + sid = http.formvalue(auth_param) + end - local i18n = require "luci.i18n" - local lang = conf.main.lang or "auto" - if lang == "auto" then - local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or "" - 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 + return session_retrieve(sid) +end + +local function get_children(node) + local children = {} + + if not node.wildcard and type(node.children) == "table" then + for name, child in pairs(node.children) do + children[#children+1] = { + name = name, + node = child, + order = child.order or 1000 + } end - end - if lang == "auto" then - lang = i18n.default - end - i18n.setlanguage(lang) - local c = ctx.tree - local stat - if not c then - c = createtree() + table.sort(children, function(a, b) + if a.order == b.order then + return a.name < b.name + else + return a.order < b.order + end + end) end - local track = {} - local args = {} - ctx.args = args - ctx.requestargs = ctx.requestargs or args - local n - local preq = {} - local freq = {} + return children +end - for i, s in ipairs(request) do - preq[#preq+1] = s - freq[#freq+1] = s - c = c.nodes[s] - n = i - if not c then - break +local function find_subnode(root, prefix, recurse, descended) + local children = get_children(root) + + if #children > 0 and (not descended or recurse) then + local sub_path = { unpack(prefix) } + + if recurse == false then + recurse = nil end - util.update(track, c) + for _, child in ipairs(children) do + sub_path[#prefix+1] = child.name + + local res_path = find_subnode(child.node, sub_path, recurse, true) - if c.leaf then - break + if res_path then + return res_path + end end end - if c and c.leaf then - for j=n+1, #request do - args[#args+1] = request[j] - freq[#freq+1] = request[j] + if descended then + if not recurse or + root.action.type == "cbi" or + root.action.type == "form" or + root.action.type == "view" or + root.action.type == "template" or + root.action.type == "arcombine" + then + return prefix end end +end - ctx.requestpath = ctx.requestpath or freq - ctx.path = preq +local function merge_trees(node_a, node_b) + for k, v in pairs(node_b) do + if k == "children" then + node_a.children = node_a.children or {} - -- Init template engine - if (c and c.index) or not track.notemplate then - local tpl = require("luci.template") - local media = track.mediaurlbase or luci.config.main.mediaurlbase - if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then - media = nil - for name, theme in pairs(luci.config.themes) do - if name:sub(1,1) ~= "." and pcall(tpl.Template, - "themes/%s/header" % fs.basename(theme)) then - media = theme - end + for name, spec in pairs(v) do + node_a.children[name] = merge_trees(node_a.children[name] or {}, spec) end - assert(media, "No valid theme found") + else + node_a[k] = v end + end + return node_a +end - local function _ifattr(cond, key, val, noescape) - if cond then - local env = getfenv(3) - local scope = (type(env.self) == "table") and env.self - if type(val) == "table" then - if not next(val) then - return '' - else - val = util.serialize_json(val) - end - end - - val = tostring(val or - (type(env[key]) ~= "function" and env[key]) or - (scope and type(scope[key]) ~= "function" and scope[key]) or "") +function menu_json() + local tree = context.tree or createtree() + local lua_tree = tree_to_json(tree, { + action = { + ["type"] = "firstchild", + ["recurse"] = true + } + }) - if noescape ~= true then - val = util.pcdata(val) - end + local json_tree = createtree_json() + return merge_trees(lua_tree, json_tree) +end - return string.format(' %s="%s"', tostring(key), val) - else - return '' +local function init_template_engine(ctx) + local tpl = require "luci.template" + local media = luci.config.main.mediaurlbase + + if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then + media = nil + for name, theme in pairs(luci.config.themes) do + if name:sub(1,1) ~= "." and pcall(tpl.Template, + "themes/%s/header" % fs.basename(theme)) then + media = theme end end + assert(media, "No valid theme found") + end - tpl.context.viewns = setmetatable({ - write = http.write; - include = function(name) tpl.Template(name):render(getfenv(2)) end; - translate = i18n.translate; - translatef = i18n.translatef; - export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end; - striptags = util.striptags; - pcdata = util.pcdata; - media = media; - theme = fs.basename(media); - resource = luci.config.main.resourcebase; - ifattr = function(...) return _ifattr(...) end; - attr = function(...) return _ifattr(true, ...) end; - url = build_url; - }, {__index=function(tbl, key) - if key == "controller" then - return build_url() - elseif key == "REQUEST_URI" then - return build_url(unpack(ctx.requestpath)) - elseif key == "FULL_REQUEST_URI" then - local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") } - local query = http.getenv("QUERY_STRING") - if query and #query > 0 then - url[#url+1] = "?" - url[#url+1] = query + local function _ifattr(cond, key, val, noescape) + if cond then + local env = getfenv(3) + local scope = (type(env.self) == "table") and env.self + if type(val) == "table" then + if not next(val) then + return '' + else + val = util.serialize_json(val) end - return table.concat(url, "") - elseif key == "token" then - return ctx.authtoken - else - return rawget(tbl, key) or _G[key] end - end}) - end - track.dependent = (track.dependent ~= false) - assert(not track.dependent or not track.auto, - "Access Violation\nThe page at '" .. table.concat(request, "/") .. "/' " .. - "has no parent node so the access to this location has been denied.\n" .. - "This is a software bug, please report this message at " .. - "https://github.com/openwrt/luci/issues" - ) + val = tostring(val or + (type(env[key]) ~= "function" and env[key]) or + (scope and type(scope[key]) ~= "function" and scope[key]) or "") - if track.sysauth and not ctx.authsession then - local authen = track.sysauth_authenticator - local _, sid, sdat, default_user, allowed_users + if noescape ~= true then + val = util.pcdata(val) + end - if type(authen) == "string" and authen ~= "htmlauth" then - error500("Unsupported authenticator %q configured" % authen) - return + return string.format(' %s="%s"', tostring(key), val) + else + return '' end + end - if type(track.sysauth) == "table" then - default_user, allowed_users = nil, track.sysauth + tpl.context.viewns = setmetatable({ + write = http.write; + include = function(name) tpl.Template(name):render(getfenv(2)) end; + translate = i18n.translate; + translatef = i18n.translatef; + export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end; + striptags = util.striptags; + pcdata = util.pcdata; + media = media; + theme = fs.basename(media); + resource = luci.config.main.resourcebase; + ifattr = function(...) return _ifattr(...) end; + attr = function(...) return _ifattr(true, ...) end; + url = build_url; + }, {__index=function(tbl, key) + if key == "controller" then + return build_url() + elseif key == "REQUEST_URI" then + return build_url(unpack(ctx.requestpath)) + elseif key == "FULL_REQUEST_URI" then + local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") } + local query = http.getenv("QUERY_STRING") + if query and #query > 0 then + url[#url+1] = "?" + url[#url+1] = query + end + return table.concat(url, "") + elseif key == "token" then + return ctx.authtoken else - default_user, allowed_users = track.sysauth, { track.sysauth } + return rawget(tbl, key) or _G[key] end + end}) - if type(authen) == "function" then - _, sid = authen(sys.user.checkpasswd, allowed_users) - else - sid = http.getcookie("sysauth") + return tpl +end + +function dispatch(request) + --context._disable_memtrace = require "luci.debug".trap_memtrace("l") + local ctx = context + + local auth, cors, suid, sgid + local menu = menu_json() + local page = menu + + local requested_path_full = {} + local requested_path_node = {} + local requested_path_args = {} + + for i, s in ipairs(request) do + if type(page.children) ~= "table" or not page.children[s] then + page = nil + break + end + + if not page.children[s].satisfied then + page = nil + break end - sid, sdat = session_retrieve(sid, allowed_users) + page = page.children[s] + auth = page.auth or auth + cors = page.cors or cors + suid = page.setuser or suid + sgid = page.setgroup or sgid - if not (sid and sdat) and authen == "htmlauth" then + requested_path_full[i] = s + requested_path_node[i] = s + + if page.wildcard then + for j = i + 1, #request do + requested_path_args[j - i] = request[j] + requested_path_full[j] = request[j] + end + break + end + end + + local tpl = init_template_engine(ctx) + + ctx.args = requested_path_args + ctx.path = requested_path_node + ctx.dispatched = page + + ctx.requestpath = ctx.requestpath or requested_path_full + ctx.requestargs = ctx.requestargs or requested_path_args + ctx.requested = ctx.requested or page + + if type(auth) == "table" and type(auth.methods) == "table" and #auth.methods > 0 then + local sid, sdat + for _, method in ipairs(auth.methods) do + sid, sdat = check_authentication(method) + + if sid and sdat then + break + end + end + + if not (sid and sdat) and auth.login then local user = http.getenv("HTTP_AUTH_USER") local pass = http.getenv("HTTP_AUTH_PASS") @@ -497,27 +785,23 @@ function dispatch(request) pass = http.formvalue("luci_password") end - sid, sdat = session_setup(user, pass, allowed_users) + sid, sdat = session_setup(user, pass, { "root" }) if not sid then - local tmpl = require "luci.template" - context.path = {} http.status(403, "Forbidden") http.header("X-LuCI-Login-Required", "yes") - tmpl.render(track.sysauth_template or "sysauth", { - duser = default_user, - fuser = user - }) - return + return tpl.render("sysauth", { duser = "root", fuser = user }) end http.header("Set-Cookie", 'sysauth=%s; path=%s; HttpOnly%s' %{ sid, build_url(), http.getenv("HTTPS") == "on" and "; secure" or "" }) + http.redirect(build_url(unpack(ctx.requestpath))) + return end if not sid or not sdat then @@ -531,81 +815,117 @@ function dispatch(request) ctx.authuser = sdat.username end - if track.cors and http.getenv("REQUEST_METHOD") == "OPTIONS" then + local action = (page and type(page.action) == "table") and page.action or {} + + if action.type == "arcombine" then + action = (#requested_path_args > 0) and action.targets[2] or action.targets[1] + end + + if cors and http.getenv("REQUEST_METHOD") == "OPTIONS" then luci.http.status(200, "OK") luci.http.header("Access-Control-Allow-Origin", http.getenv("HTTP_ORIGIN") or "*") luci.http.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS") return end - if c and require_post_security(c.target, args) then - if not test_post_security(c) then + if require_post_security(action) then + if not test_post_security() then return end end - if track.setgroup then - sys.process.setgroup(track.setgroup) + if sgid then + sys.process.setgroup(sgid) end - if track.setuser then - sys.process.setuser(track.setuser) + if suid then + sys.process.setuser(suid) end - local target = nil - if c then - if type(c.target) == "function" then - target = c.target - elseif type(c.target) == "table" then - target = c.target.target + if action.type == "view" then + tpl.render("view", { view = action.path }) + + elseif action.type == "call" then + local ok, mod = util.copcall(require, action.module) + if not ok then + error500(mod) + return + end + + local func = mod[action["function"]] + + assert(func ~= nil, + 'Cannot resolve function "' .. action["function"] .. '". Is it misspelled or local?') + + assert(type(func) == "function", + 'The symbol "' .. action["function"] .. '" does not refer to a function but data ' .. + 'of type "' .. type(func) .. '".') + + local argv = (type(action.parameters) == "table" and #action.parameters > 0) and { unpack(action.parameters) } or {} + for _, s in ipairs(requested_path_args) do + argv[#argv + 1] = s end - end - if c and (c.index or type(target) == "function") then - ctx.dispatched = c - ctx.requested = ctx.requested or ctx.dispatched - end + local ok, err = util.copcall(func, unpack(argv)) + if not ok then + error500(err) + end - if c and c.index then - local tpl = require "luci.template" + elseif action.type == "firstchild" then + local sub_request = find_subnode(page, requested_path_full, action.recurse) + if sub_request then + dispatch(sub_request) + else + tpl.render("empty_node_placeholder", getfenv(1)) + end - if util.copcall(tpl.render, "indexer", {}) then - return true + elseif action.type == "alias" then + local sub_request = {} + for name in action.path:gmatch("[^/]+") do + sub_request[#sub_request + 1] = name end - end - if type(target) == "function" then - util.copcall(function() - local oldenv = getfenv(target) - local module = require(c.module) - local env = setmetatable({}, {__index= + for _, s in ipairs(requested_path_args) do + sub_request[#sub_request + 1] = s + end - function(tbl, key) - return rawget(tbl, key) or module[key] or oldenv[key] - end}) + dispatch(sub_request) - setfenv(target, env) - end) + elseif action.type == "rewrite" then + local sub_request = { unpack(request) } + for i = 1, action.remove do + table.remove(sub_request, 1) + end - local ok, err - if type(c.target) == "table" then - ok, err = util.copcall(target, c.target, unpack(args)) - else - ok, err = util.copcall(target, unpack(args)) + local n = 1 + for s in action.path:gmatch("[^/]+") do + table.insert(sub_request, n, s) + n = n + 1 end - if not ok then - error500("Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") .. - " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" .. - "The called action terminated with an exception:\n" .. tostring(err or "(unknown)")) + + for _, s in ipairs(requested_path_args) do + sub_request[#sub_request + 1] = s end + + dispatch(sub_request) + + elseif action.type == "template" then + tpl.render(action.path, getfenv(1)) + + elseif action.type == "cbi" then + _cbi({ config = action.config, model = action.path }, unpack(requested_path_args)) + + elseif action.type == "form" then + _form({ model = action.path }, unpack(requested_path_args)) + else - local root = node() - if not root or not root.target then + local root = find_subnode(menu, {}, true) + if not root then error404("No root node was registered, this usually happens if no module was installed.\n" .. "Install luci-mod-admin-full and retry. " .. "If the module is already installed, try removing the /tmp/luci-indexcache file.") else - error404("No page is registered at '/" .. table.concat(request, "/") .. "'.\n" .. + error404("No page is registered at '/" .. table.concat(requested_path_full, "/") .. "'.\n" .. "If this url belongs to an extension, make sure it is properly installed.\n" .. "If the extension was recently installed, try removing the /tmp/luci-indexcache file.") end @@ -659,13 +979,9 @@ function createindex() "' - It must correspond to the file path!") local idx = mod.index - assert(type(idx) == "function", - "Invalid controller file found\n" .. - "The file '" .. path .. "' contains no index() function.\n" .. - "Please make sure that the controller contains a valid " .. - "index function and verify the spelling!") - - index[modname] = idx + if type(idx) == "function" then + index[modname] = idx + end end if indexcache then @@ -675,6 +991,94 @@ function createindex() end end +function createtree_json() + local json = require "luci.jsonc" + local tree = {} + + local schema = { + action = "table", + auth = "table", + cors = "boolean", + depends = "table", + order = "number", + setgroup = "string", + setuser = "string", + title = "string", + wildcard = "boolean" + } + + local files = {} + local fprint = {} + local cachefile + + for file in (fs.glob("/usr/share/luci/menu.d/*.json") or function() end) do + files[#files+1] = file + + if indexcache then + local st = fs.stat(file) + if st then + fprint[#fprint+1] = '%x' % st.ino + fprint[#fprint+1] = '%x' % st.mtime + fprint[#fprint+1] = '%x' % st.size + end + end + end + + if indexcache then + cachefile = "%s.%s.json" %{ + indexcache, + nixio.crypt(table.concat(fprint, "|"), "$1$"):sub(5):gsub("/", ".") + } + + local res = json.parse(fs.readfile(cachefile) or "") + if res then + return res + end + + for file in (fs.glob("%s.*.json" % indexcache) or function() end) do + fs.unlink(file) + end + end + + for _, file in ipairs(files) do + local data = json.parse(fs.readfile(file) or "") + if type(data) == "table" then + for path, spec in pairs(data) do + if type(spec) == "table" then + local node = tree + + for s in path:gmatch("[^/]+") do + if s == "*" then + node.wildcard = true + break + end + + node.children = node.children or {} + node.children[s] = node.children[s] or {} + node = node.children[s] + end + + if node ~= tree then + for k, t in pairs(schema) do + if type(spec[k]) == t then + node[k] = spec[k] + end + end + + node.satisfied = check_depends(spec) + end + end + end + end + end + + if cachefile then + fs.writefile(cachefile, json.stringify(tree)) + end + + return tree +end + -- Build the index before if it does not exist yet. function createtree() if not index then @@ -767,16 +1171,6 @@ function _create_node(path) c = {nodes={}, auto=true, inreq=true} - local _, n - for _, n in ipairs(path) do - if context.path[_] ~= n then - c.inreq = false - break - end - end - - c.inreq = c.inreq and (context.path[#path + 1] == last) - parent.nodes[last] = c context.treecache[name] = c end @@ -786,119 +1180,24 @@ end -- Subdispatchers -- -function _find_eligible_node(root, prefix, deep, types, descend) - local children = _ordered_children(root) - - if not root.leaf and deep ~= nil then - local sub_path = { unpack(prefix) } - - if deep == false then - deep = nil - end - - local _, child - for _, child in ipairs(children) do - sub_path[#prefix+1] = child.name - - local res_path = _find_eligible_node(child.node, sub_path, - deep, types, true) - - if res_path then - return res_path - end - end - end - - if descend and - (not types or - (type(root.target) == "table" and - util.contains(types, root.target.type))) - then - return prefix - end -end - -function _find_node(recurse, types) - local path = { unpack(context.path) } - local name = table.concat(path, ".") - local node = context.treecache[name] - - path = _find_eligible_node(node, path, recurse, types) - - if path then - dispatch(path) - else - require "luci.template".render("empty_node_placeholder") - end -end - -function _firstchild() - return _find_node(false, nil) -end - function firstchild() - return { type = "firstchild", target = _firstchild } -end - -function _firstnode() - return _find_node(true, { "cbi", "form", "template", "arcombine" }) + return { type = "firstchild" } end function firstnode() - return { type = "firstnode", target = _firstnode } + return { type = "firstnode" } end function alias(...) - local req = {...} - return function(...) - for _, r in ipairs({...}) do - req[#req+1] = r - end - - dispatch(req) - end + return { type = "alias", req = { ... } } end function rewrite(n, ...) - local req = {...} - return function(...) - local dispatched = util.clone(context.dispatched) - - for i=1,n do - table.remove(dispatched, 1) - end - - for i, r in ipairs(req) do - table.insert(dispatched, i, r) - end - - for _, r in ipairs({...}) do - dispatched[#dispatched+1] = r - end - - dispatch(dispatched) - end -end - - -local function _call(self, ...) - local func = getfenv()[self.name] - assert(func ~= nil, - 'Cannot resolve function "' .. self.name .. '". Is it misspelled or local?') - - assert(type(func) == "function", - 'The symbol "' .. self.name .. '" does not refer to a function but data ' .. - 'of type "' .. type(func) .. '".') - - if #self.argv > 0 then - return func(unpack(self.argv), ...) - else - return func(...) - end + return { type = "rewrite", n = n, req = { ... } } end function call(name, ...) - return {type = "call", argv = {...}, name = name, target = _call} + return { type = "call", argv = {...}, name = name } end function post_on(params, name, ...) @@ -906,8 +1205,7 @@ function post_on(params, name, ...) type = "call", post = params, argv = { ... }, - name = name, - target = _call + name = name } end @@ -916,25 +1214,16 @@ function post(...) end -local _template = function(self, ...) - require "luci.template".render(self.view) -end - function template(name) - return {type = "template", view = name, target = _template} -end - - -local _view = function(self, ...) - require "luci.template".render("view", { view = self.view }) + return { type = "template", view = name } end function view(name) - return {type = "view", view = name, target = _view} + return { type = "view", view = name } end -local function _cbi(self, ...) +function _cbi(self, ...) local cbi = require "luci.cbi" local tpl = require "luci.template" local http = require "luci.http" @@ -1048,25 +1337,21 @@ function cbi(model, config) type = "cbi", post = { ["cbi.submit"] = true }, config = config, - model = model, - target = _cbi + model = model } end -local function _arcombine(self, ...) - local argv = {...} - local target = #argv > 0 and self.targets[2] or self.targets[1] - setfenv(target.target, self.env) - target:target(unpack(argv)) -end - function arcombine(trg1, trg2) - return {type = "arcombine", env = getfenv(), target = _arcombine, targets = {trg1, trg2}} + return { + type = "arcombine", + env = getfenv(), + targets = {trg1, trg2} + } end -local function _form(self, ...) +function _form(self, ...) local cbi = require "luci.cbi" local tpl = require "luci.template" local http = require "luci.http" @@ -1092,10 +1377,9 @@ end function form(model) return { - type = "cbi", + type = "form", post = { ["cbi.submit"] = true }, - model = model, - target = _form + model = model } end diff --git a/modules/luci-base/luasrc/view/header.htm b/modules/luci-base/luasrc/view/header.htm index 1ef0e5b013..9cdedde5c2 100644 --- a/modules/luci-base/luasrc/view/header.htm +++ b/modules/luci-base/luasrc/view/header.htm @@ -13,8 +13,8 @@ local applyconf = luci.config and luci.config.apply %> -<script type="text/javascript" src="<%=resource%>/promis.min.js"></script> -<script type="text/javascript" src="<%=resource%>/luci.js"></script> +<script type="text/javascript" src="<%=resource%>/promis.min.js?v=git-19.292.31773-cc35194"></script> +<script type="text/javascript" src="<%=resource%>/luci.js?v=git-19.292.31773-cc35206"></script> <script type="text/javascript"> L = new LuCI(<%= luci.http.write_json({ token = token, @@ -22,6 +22,7 @@ scriptname = luci.http.getenv("SCRIPT_NAME"), pathinfo = luci.http.getenv("PATH_INFO"), requestpath = luci.dispatcher.context.requestpath, + dispatchpath = luci.dispatcher.context.path, pollinterval = luci.config.main.pollinterval or 5, sessionid = luci.dispatcher.context.authsession, apply_rollback = math.max(applyconf and applyconf.rollback or 30, 30), diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po index 17ac1b2db3..fa003cb22c 100644 --- a/modules/luci-base/po/cs/base.po +++ b/modules/luci-base/po/cs/base.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-12-07 10:44+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Jiri Tersel <jiri.tersel@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/luci/cs/>\n" "Language: cs\n" @@ -21,12 +21,13 @@ msgid "%d Bit" msgstr "" #: modules/luci-base/htdocs/luci-static/resources/ui.js:2223 +#, fuzzy msgid "%d invalid field(s)" -msgstr "" +msgstr "%d neplatné/á pole" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:32 msgid "%s is untagged in multiple VLANs!" -msgstr "" +msgstr "%s je neotagováno ve více VLAN!" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:290 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:400 @@ -76,12 +77,12 @@ msgstr "-- vlastní --" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:268 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:377 msgid "-- match by label --" -msgstr "" +msgstr "-- párovat dle názvu --" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:254 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:360 msgid "-- match by uuid --" -msgstr "" +msgstr "-- párovat dle UUID --" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 @@ -91,7 +92,7 @@ msgstr "-- prosím vyberte --" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:849 msgid "0 = not using RSSI threshold, 1 = do not change driver default" -msgstr "" +msgstr "0 = nepoužít práh RSSI, 1 = neměnit výchozí nastavení ovladače" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:228 msgid "1 Minute Load:" @@ -116,31 +117,35 @@ msgstr "Zatížení za 5 minut:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1401 msgid "6-octet identifier as a hex string - no colons" -msgstr "" +msgstr "6oktetový identifikátor jako šestnáctkový řetězec - bez dvojteček" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1345 msgid "802.11r Fast Transition" msgstr "802.11r Fast Transition" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 +#, fuzzy msgid "802.11w Association SA Query maximum timeout" -msgstr "" +msgstr "Maximální časový limit 802.11w Association SA Query" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1609 +#, fuzzy msgid "802.11w Association SA Query retry timeout" -msgstr "" +msgstr "Časový limit opakování 802.11w Association SA Query" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 +#, fuzzy msgid "802.11w Management Frame Protection" -msgstr "" +msgstr "802.11w Zabezpečení Řídících Rámců" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1602 msgid "802.11w maximum timeout" -msgstr "" +msgstr "Maximální časový limit 802.11w" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1609 +#, fuzzy msgid "802.11w retry timeout" -msgstr "" +msgstr "Časový limit opakování 802.11w" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:866 msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>" @@ -193,8 +198,11 @@ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway" msgstr "<abbr title=\"Internet Protokol Verze 6\">IPv6</abbr>-Brána" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:398 +#, fuzzy msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)" msgstr "" +"<abbr title=\"Internetový Protokol Verze 6\">IPv6</abbr>-Suffix " +"(šestnáctkový)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:40 #: modules/luci-mod-system/luasrc/controller/admin/system.lua:25 @@ -252,11 +260,11 @@ msgstr "Je nutné se znovu přihlásit, protože vypršela platnost relace." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 msgid "A43C + J43 + A43" -msgstr "" +msgstr "A43C + J43 + A43" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:891 msgid "A43C + J43 + A43 + V43" -msgstr "" +msgstr "A43C + J43 + A43 + V43" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:903 msgid "ADSL" @@ -264,7 +272,7 @@ msgstr "ADSL" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 msgid "ANSI T1.413" -msgstr "" +msgstr "ANSI T1.413" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:94 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:67 @@ -279,7 +287,7 @@ msgstr "ARP limit opakování" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 msgid "ATM (Asynchronous Transfer Mode)" -msgstr "" +msgstr "ATM (asynchronní režim přenosu)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 msgid "ATM Bridges" @@ -318,7 +326,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:541 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:545 msgid "Absent Interface" -msgstr "" +msgstr "Rozhraní chybí" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 msgid "Access Concentrator" @@ -382,7 +390,7 @@ msgstr "Přidat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 msgid "Add ATM Bridge" -msgstr "" +msgstr "Přidat ATM most" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 msgid "Add IPv4 address…" @@ -480,7 +488,7 @@ msgstr "Alias rozhraní" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:140 msgid "Alias of \"%s\"" -msgstr "" +msgstr "Alias \"%s\"" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:166 msgid "All Servers" @@ -550,10 +558,13 @@ msgid "Always announce default router" msgstr "Vždy oznamovat výchozí směrovač" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:817 +#, fuzzy msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" +"Vždy používat kanály šířky 40 MHz, i když se sekundární kanál překrývá. " +"Použití této možnosti nevyhovuje standardu IEEE 802.11n-2009!" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:871 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 @@ -619,10 +630,12 @@ msgstr "Annex M G.992.5" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 msgid "Announce as default router even if no public prefix is available." msgstr "" +"Oznamovat jako výchozí směrovač, i když není k dispozici žádný veřejný " +"prefix." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:654 msgid "Announced DNS domains" -msgstr "" +msgstr "Oznámené DNS domény" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:653 msgid "Announced DNS servers" @@ -630,15 +643,15 @@ msgstr "Oznámené DNS servery" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1531 msgid "Anonymous Identity" -msgstr "" +msgstr "Anonymní identita" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:161 msgid "Anonymous Mount" -msgstr "" +msgstr "Anonymní připojení" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:157 msgid "Anonymous Swap" -msgstr "" +msgstr "Anonymní odkládací oddíl/soubor" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:173 @@ -670,9 +683,10 @@ msgstr "Architektura" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:184 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 +#, fuzzy msgid "" "Assign a part of given length of every public IPv6-prefix to this interface" -msgstr "" +msgstr "Přiřadit zadanou délku každého veřejného IPv6 prefixu k tomuto rozhraní" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:189 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:31 @@ -690,13 +704,15 @@ msgid "Associations" msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:153 +#, fuzzy msgid "Attempt to enable configured mount points for attached devices" -msgstr "" +msgstr "Pokusit se povolit nakonfigurované přípojné body pro připojená zařízení" #: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:104 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 +#, fuzzy msgid "Auth Group" -msgstr "" +msgstr "Autorizační skupina" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1456 msgid "Authentication" @@ -705,7 +721,7 @@ msgstr "Autentizace" #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:70 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:70 msgid "Authentication Type" -msgstr "" +msgstr "Typ autentizace" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:76 msgid "Authoritative" diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po index 56c638aa10..397e69da9a 100644 --- a/modules/luci-base/po/es/base.po +++ b/modules/luci-base/po/es/base.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:41+0200\n" -"PO-Revision-Date: 2019-12-05 17:06+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/luci/es/>" "\n" @@ -2225,7 +2225,7 @@ msgstr "Generar archivo" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:75 msgid "Given password confirmation did not match, password not changed!" msgstr "" -"La confirmación y la contraseña no coinciden. ¡No se ha cambiado la " +"La contraseña y la confirmación no coinciden, ¡No se ha cambiado la " "contraseña!" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:145 @@ -2729,7 +2729,7 @@ msgstr "Reconectando interfaz..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:198 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:204 msgid "Interface is shutting down..." -msgstr "Parando interfaz..." +msgstr "Deteniendo interfaz..." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:248 msgid "Interface is starting..." @@ -4950,11 +4950,11 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61 #: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103 msgid "Source" -msgstr "Fuente" +msgstr "Origen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:83 msgid "Source Address" -msgstr "Dirección de la fuente" +msgstr "Dirección de origen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:290 msgid "Specifies the directory the device is attached to" diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po index 20301df8e0..92fefd9b46 100644 --- a/modules/luci-base/po/hu/base.po +++ b/modules/luci-base/po/hu/base.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2019-12-10 23:13+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/luci/" "hu/>\n" @@ -82,7 +82,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:254 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:360 msgid "-- match by uuid --" -msgstr "" +msgstr "-- egyezés UUID szerint --" #: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 @@ -104,7 +104,7 @@ msgstr "15 perces terhelés:" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1372 msgid "4-character hexadecimal ID" -msgstr "" +msgstr "4 karakteres hexadecimális azonosító" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 @@ -153,7 +153,7 @@ msgstr "<abbr title=\"Domain Name System\">DNS</abbr> lekérdezési port" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:212 msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port" -msgstr "<abbr title=\"Domain Name System\">DNS</abbr> szerver port" +msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-kiszolgáló portja" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:163 msgid "" @@ -201,7 +201,7 @@ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-utótag (hex)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:40 #: modules/luci-mod-system/luasrc/controller/admin/system.lua:25 msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration" -msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> konfiguráció" +msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> beállítása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:51 msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name" @@ -234,7 +234,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:248 msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries" -msgstr "<abbr title=\"maximal\">Max.</abbr> párhuzamos lekérdezés" +msgstr "<abbr title=\"maximal\">Legtöbb</abbr> egyidejű lekérdezés" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:26 msgid "" @@ -277,11 +277,11 @@ msgstr "APN" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 msgid "ARP retry threshold" -msgstr "ARP újrapróbálkozási küszöbérték" +msgstr "ARP újrapróbálkozási küszöbszint" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 msgid "ATM (Asynchronous Transfer Mode)" -msgstr "" +msgstr "ATM (aszinkron átviteli mód)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:919 msgid "ATM Bridges" @@ -290,7 +290,7 @@ msgstr "ATM Hidak" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:951 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 msgid "ATM Virtual Channel Identifier (VCI)" -msgstr "ATM Virtuális Csatorna Azonosító (VCI)" +msgstr "ATM virtuális csatorna-azonosító (VCI)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:952 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 @@ -324,7 +324,7 @@ msgstr "Hiányzó csatoló" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 msgid "Access Concentrator" -msgstr "Elérési központ" +msgstr "Sűrítő elérése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:837 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:942 @@ -389,11 +389,11 @@ msgstr "IPv4-cím hozzáadása…" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:207 msgid "Add IPv6 address…" -msgstr "" +msgstr "IPv6-cím hozzáadása…" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:47 msgid "Add LED action" -msgstr "" +msgstr "LED művelet hozzáadása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:216 msgid "Add VLAN" @@ -407,7 +407,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:148 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:237 msgid "Add key" -msgstr "" +msgstr "Kulcs hozzáadása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:151 msgid "Add local domain suffix to names served from hosts files" @@ -417,7 +417,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:306 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:752 msgid "Add new interface..." -msgstr "Új interfész hozzáadása..." +msgstr "Új csatoló hozzáadása…" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:99 msgid "Add peer" @@ -429,7 +429,7 @@ msgstr "További 'hosts' fájlok" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:158 msgid "Additional servers file" -msgstr "" +msgstr "További kiszolgálók fájlja" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:34 @@ -495,7 +495,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:111 msgid "Allocate IP sequentially" -msgstr "" +msgstr "IP lefoglalása egymás után" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:24 msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication" @@ -556,6 +556,9 @@ msgid "" "Always use 40MHz channels even if the secondary channel overlaps. Using this " "option does not comply with IEEE 802.11n-2009!" msgstr "" +"Mindig a 40 MHz-es csatornákat használja, akkor is ha a másodlagos csatorna " +"átfedi. Ennek a beállításnak a használata nem felel meg az IEEE 802.11n-2009 " +"előírásainak!" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:871 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 @@ -572,7 +575,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:881 msgid "Annex A G.992.2" -msgstr "" +msgstr "A G.992.2 melléklet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 msgid "Annex A G.992.3" @@ -592,7 +595,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:877 msgid "Annex B G.992.3" -msgstr "" +msgstr "B G.992.3 melléklet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:878 msgid "Annex B G.992.5" @@ -604,7 +607,7 @@ msgstr "J melléklet (összes)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:884 msgid "Annex L G.992.3 POTS 1" -msgstr "" +msgstr "L G.992.3 POTS 1 melléklet" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:875 msgid "Annex M (all)" @@ -640,7 +643,7 @@ msgstr "Névtelen csatolás" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:157 msgid "Anonymous Swap" -msgstr "" +msgstr "Névtelen cserehely" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:173 @@ -704,7 +707,7 @@ msgstr "" #: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:104 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 msgid "Auth Group" -msgstr "" +msgstr "Hitelesítési csoport" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1456 msgid "Authentication" @@ -713,7 +716,7 @@ msgstr "Hitelesítés" #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:70 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:70 msgid "Authentication Type" -msgstr "" +msgstr "Hitelesítés típusa" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:76 msgid "Authoritative" @@ -748,7 +751,7 @@ msgstr "" #: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 msgid "Automatic Homenet (HNCP)" -msgstr "" +msgstr "Automatikus otthoni hálózat (HNCP)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:173 msgid "Automatically check filesystem for errors before mounting" @@ -760,7 +763,7 @@ msgstr "Fájlrendszerek automatikus csatolása csatlakoztatáskor" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:165 msgid "Automatically mount swap on hotplug" -msgstr "" +msgstr "Cserehely automatikus csatolása csatlakoztatáskor" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:169 msgid "Automount Filesystem" @@ -768,7 +771,7 @@ msgstr "Fájlrendszer automatikus csatolása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:165 msgid "Automount Swap" -msgstr "" +msgstr "Cserehely automatikus csatolása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 msgid "Available" @@ -798,7 +801,7 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:48 msgid "BR / DMR / AFTR" -msgstr "" +msgstr "BR / DMR / AFTR" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:109 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:131 @@ -840,7 +843,7 @@ msgstr "Sáv" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:820 msgid "Beacon Interval" -msgstr "" +msgstr "Alapjel időköze" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:320 #: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 @@ -849,10 +852,10 @@ msgid "" "configuration files marked by opkg, essential base files and the user " "defined backup patterns." msgstr "" -"Alább található a biztonsági mentésbe kerülő fájlok listája. A lista az opkg " -"által megjelölt módosított konfigurációs fájlokból, fontos alapvető " -"fájlokból valamint a felhasználó által megadott mintáknak megfelelő " -"fájlokból áll." +"Az alább meghatározott fájllista kerül be a biztonsági mentésbe. A lista az " +"opkg által megjelölt módosított beállítófájlokból, a nélkülözhetetlen " +"alapvető fájlokból, valamint a felhasználó által meghatározott biztonsági " +"mentés mintákból áll." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:290 msgid "" @@ -878,7 +881,7 @@ msgstr "Bitsebesség" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:169 msgid "Bogus NX Domain Override" -msgstr "Hamis NX tartomány felülbírálása" +msgstr "Hamis NX-tartomány felülbírálása" #: modules/luci-base/htdocs/luci-static/resources/network.js:2814 #: modules/luci-compat/luasrc/model/network.lua:1420 @@ -978,7 +981,7 @@ msgstr "Csatorna" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:173 msgid "Check filesystems before mount" -msgstr "" +msgstr "Fájlrendszerek ellenőrzése csatolás előtt" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Check this option to delete the existing networks from this radio." @@ -995,7 +998,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:387 msgid "Choose mtdblock" -msgstr "" +msgstr "Az mtdblock kiválasztása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:486 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1879 @@ -1041,6 +1044,8 @@ msgid "" "Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " "FEATURE IS FOR PROFESSIONALS! )" msgstr "" +"Kattintson az „Az mtdblock mentése” gombra egy meghatározott mtdblock fájl " +"letöltéséhez. (MEGJEGYZÉS: EZ A FUNKCIÓ CSAK SZAKEMBEREKNEK VALÓ!)" #: modules/luci-base/htdocs/luci-static/resources/network.js:3602 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:838 @@ -1106,6 +1111,11 @@ msgid "" "workaround might cause interoperability issues and reduced robustness of key " "negotiation especially in environments with heavy traffic load." msgstr "" +"Bonyolulttá teszi a kulcs újratelepítési támadásokat az ügyfél oldalon az " +"EAPOL-kulcskeretek újraátvitelének letiltásával, ami a kulcsok telepítéséhez " +"használható. Ez a kerülő megoldás esetleg interoperabilitási problémákat és " +"a kulcsegyeztetés robusztusságának csökkentését okozhatja, különösen az erős " +"forgalomterheléssel rendelkező környezetekben." #: modules/luci-base/htdocs/luci-static/resources/ui.js:2467 #: modules/luci-base/luasrc/controller/admin/uci.lua:11 @@ -1128,7 +1138,7 @@ msgstr "Beállítás sikertelen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:170 msgid "Confirm disconnect" -msgstr "" +msgstr "Leválasztás megerősítése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 msgid "Confirmation" @@ -1190,7 +1200,7 @@ msgstr "Tűzfal zóna készítés / hozzárendelés" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:782 msgid "Create interface" -msgstr "" +msgstr "Csatoló létrehozása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:166 msgid "Critical" @@ -1211,7 +1221,7 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 #: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 msgid "Custom Interface" -msgstr "Egyéni interfész" +msgstr "Egyéni csatoló" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:36 msgid "Custom delegated IPv6-prefix" @@ -1229,11 +1239,11 @@ msgid "" "\">LED</abbr>s if possible." msgstr "" "Az eszköz <abbr title=\"Light Emitting Diode\">LED</abbr>-jei működésének " -"testreszabása." +"személyre szabása." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1258 msgid "DAE-Client" -msgstr "" +msgstr "DAE-kliens" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1266 msgid "DAE-Port" @@ -1273,7 +1283,7 @@ msgstr "DHCPv6-mód" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:626 msgid "DHCPv6-Service" -msgstr "" +msgstr "DHCPv6-szolgáltatás" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 @@ -1314,7 +1324,7 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:13 msgid "DSL Status" -msgstr "" +msgstr "DSL állapota" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:901 msgid "DSL line mode" @@ -1322,7 +1332,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "DTIM Interval" -msgstr "" +msgstr "DTIM időköze" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:57 msgid "DUID" @@ -1345,7 +1355,7 @@ msgstr "Alapértelmezés %d" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:107 msgid "Default Route" -msgstr "" +msgstr "Alapértelmezett útvonal" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 @@ -1368,7 +1378,7 @@ msgstr "Alapértelmezett állapot" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:596 msgid "Define a name for this network." -msgstr "Adja meg a hálózat nevét." +msgstr "Határozzon meg egy nevet ehhez a hálózathoz." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:614 msgid "" @@ -1393,7 +1403,7 @@ msgstr "Törlés" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:176 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:182 msgid "Delete key" -msgstr "" +msgstr "Kulcs törlése" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1679 msgid "Delete request failed: %s" @@ -1405,7 +1415,7 @@ msgstr "Hálózat törlése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:998 msgid "Delivery Traffic Indication Message Interval" -msgstr "" +msgstr "Kézbesítési forgalom jelző üzenet időköze" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:108 msgid "Description" @@ -1445,7 +1455,7 @@ msgstr "Eszköz" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:771 msgid "Device Configuration" -msgstr "Eszköz beállítások" +msgstr "Eszköz beállításai" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:83 msgid "Device is not active" @@ -1472,7 +1482,7 @@ msgstr "Diagnosztika" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 #: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 msgid "Dial number" -msgstr "" +msgstr "Szám tárcsázása" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1580 msgid "Directory" @@ -1488,13 +1498,13 @@ msgid "" "Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for " "this interface." msgstr "" -"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> tiltása ezen " -"az interfészen." +"A <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> letiltása " +"ennél a csatolónál." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:171 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:370 msgid "Disable DNS lookups" -msgstr "" +msgstr "DNS keresések letiltása" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 msgid "Disable Encryption" @@ -1586,7 +1596,7 @@ msgstr "Ne továbbítson fordított keresési kéréseket a helyi hálózathoz" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1665 msgid "Do you really want to delete \"%s\" ?" -msgstr "" +msgstr "Valóban törölni szeretné ezt: „%s”?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:177 msgid "Do you really want to delete the following SSH key?" @@ -1610,7 +1620,7 @@ msgstr "Tartomány fehérlista" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 msgid "Don't Fragment" -msgstr "" +msgstr "Ne tördeljen" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:73 msgid "" @@ -1630,11 +1640,11 @@ msgstr "Biztonsági mentés letöltése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:394 msgid "Download mtdblock" -msgstr "" +msgstr "Az mtdblock letöltése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:906 msgid "Downstream SNR offset" -msgstr "" +msgstr "Belső SNR eltolás" #: modules/luci-base/htdocs/luci-static/resources/form.js:1174 msgid "Drag to reorder" @@ -1677,7 +1687,7 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 msgid "EA-bits length" -msgstr "" +msgstr "EA-bitek hossza" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1421 msgid "EAP-Method" @@ -1707,7 +1717,7 @@ msgstr "Hálózat szerkesztése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:703 msgid "Edit wireless network" -msgstr "" +msgstr "Vezeték nélküli hálózat szerkesztése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:168 msgid "Emergency" @@ -1723,6 +1733,8 @@ msgid "" "Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> " "snooping" msgstr "" +"<abbr title=\"Internet Group Management Protocol\">IGMP</abbr> szimatolás " +"engedélyezése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:455 msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>" @@ -1761,7 +1773,7 @@ msgstr "NTP-kliens engedélyezése" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 msgid "Enable Single DES" -msgstr "" +msgstr "Egyszeres DES engedélyezése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 msgid "Enable TFTP server" @@ -1818,6 +1830,8 @@ msgid "" "Enables fast roaming among access points that belong to the same Mobility " "Domain" msgstr "" +"Engedélyezi a gyors barangolást a hozzáférési pontok között, amelyek " +"ugyanazon mobilitási tartományhoz tartoznak" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:455 msgid "Enables the Spanning Tree Protocol on this bridge" @@ -1846,7 +1860,7 @@ msgstr "" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:132 msgid "Endpoint Port" -msgstr "" +msgstr "Végpont portja" #: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 msgid "Enter custom value" @@ -1858,7 +1872,7 @@ msgstr "Egyéni értékek megadása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:93 msgid "Erasing..." -msgstr "Törlés..." +msgstr "Törlés…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:97 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 @@ -1871,7 +1885,7 @@ msgstr "Hiba" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 msgid "Errored seconds (ES)" -msgstr "" +msgstr "Hibás másodpercek (ES)" #: modules/luci-base/htdocs/luci-static/resources/network.js:2826 #: modules/luci-compat/luasrc/model/network.lua:1432 @@ -1881,11 +1895,11 @@ msgstr "Ethernet adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2817 #: modules/luci-compat/luasrc/model/network.lua:1422 msgid "Ethernet Switch" -msgstr "Ethernet switch" +msgstr "Ethernet kapcsoló" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 msgid "Exclude interfaces" -msgstr "" +msgstr "Csatolók kizárása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:150 msgid "Expand hosts" @@ -1914,7 +1928,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1412 msgid "External R0 Key Holder List" -msgstr "" +msgstr "Külső R0 kulcstartólista" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1416 msgid "External R1 Key Holder List" @@ -1930,11 +1944,11 @@ msgstr "Külső rendszernapló kiszolgáló port" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:152 msgid "External system log server protocol" -msgstr "" +msgstr "Külső rendszernapló-kiszolgáló protokollja" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 msgid "Extra SSH command options" -msgstr "" +msgstr "További SSH parancs kapcsolók" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1386 msgid "FT over DS" @@ -2001,6 +2015,8 @@ msgid "" "Find all currently attached filesystems and swap and replace configuration " "with defaults based on what was detected" msgstr "" +"Az összes jelenleg csatolt fájlrendszer és cserehely megkeresése, és a " +"beállítások cseréje az alapértelmezettekkel az alapján, hogy mi lett észlelve" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:730 msgid "Find and join network" @@ -2045,7 +2061,7 @@ msgstr "Flash image..." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:275 msgid "Flash image?" -msgstr "" +msgstr "Beírja a lemezképet?" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:401 msgid "Flash new firmware image" @@ -2053,7 +2069,7 @@ msgstr "Új firmware image flash-elése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:352 msgid "Flash operations" -msgstr "Flash műveletek" +msgstr "Beírás műveletei" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:284 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:286 @@ -2096,7 +2112,7 @@ msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 msgid "Force use of NAT-T" -msgstr "" +msgstr "NAT-T használatának kényszerítése" #: modules/luci-base/luasrc/view/csrftoken.htm:8 msgid "Form token mismatch" @@ -2112,7 +2128,7 @@ msgstr "" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 msgid "Forward broadcast traffic" -msgstr "Broadcast forgalom továbbítás" +msgstr "Üzenetszórási forgalom továbbítása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:844 msgid "Forward mesh peer traffic" @@ -2135,6 +2151,8 @@ msgid "" "Further information about WireGuard interfaces and peers at <a href='http://" "wireguard.com'>wireguard.com</a>." msgstr "" +"A WireGuard csatolókról és a partnerekről további információkat a <a " +"href='http://wireguard.com'>wireguard.com</a> oldalon talál." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:133 @@ -2158,7 +2176,7 @@ msgstr "Átjáró portok" #: modules/luci-base/htdocs/luci-static/resources/network.js:9 #: modules/luci-compat/luasrc/model/network.lua:29 msgid "Gateway address is invalid" -msgstr "" +msgstr "Az átjáró címe érvénytelen" #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:98 msgid "Gateway metric" @@ -2189,7 +2207,7 @@ msgstr "PMK előállítása helyileg" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:363 msgid "Generate archive" -msgstr "Archívum készítése" +msgstr "Archívum előállítása" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:75 msgid "Given password confirmation did not match, password not changed!" @@ -2219,7 +2237,7 @@ msgstr "Ugrás a megfelelő beállítási oldalhoz" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 msgid "Group Password" -msgstr "" +msgstr "Csoportjelszó" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 msgid "Guest" @@ -2231,7 +2249,7 @@ msgstr "HE.net jelszó" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "HE.net username" -msgstr "" +msgstr "HE.net felhasználónév" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:45 msgid "Hang Up" @@ -2266,7 +2284,7 @@ msgstr "Gép" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:21 msgid "Host entries" -msgstr "Host bejegyzések" +msgstr "Gépbejegyzések" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "Host expiry timeout" @@ -2304,7 +2322,7 @@ msgstr "Hibrid" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 msgid "IKE DH Group" -msgstr "" +msgstr "IKE DH csoport" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:59 msgid "IP Addresses" @@ -2316,7 +2334,7 @@ msgstr "" #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:88 msgid "IP Type" -msgstr "" +msgstr "IP típusa" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:30 msgid "IP address" @@ -2330,7 +2348,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/network.js:11 #: modules/luci-compat/luasrc/model/network.lua:31 msgid "IP address is missing" -msgstr "" +msgstr "IP-cím hiányzik" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 @@ -2349,11 +2367,11 @@ msgstr "IPv4 tűzfal" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:28 msgid "IPv4 Upstream" -msgstr "" +msgstr "Külső IPv4" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 msgid "IPv4 address" -msgstr "IPv4 cím" +msgstr "IPv4-cím" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 msgid "IPv4 assignment length" @@ -2361,7 +2379,7 @@ msgstr "IPv4 hozzárendelés hossza" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 msgid "IPv4 broadcast" -msgstr "IPv4 broadcast" +msgstr "IPv4 üzenetszórás" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 msgid "IPv4 gateway" @@ -2373,7 +2391,7 @@ msgstr "IPv4 hálózati maszk" #: modules/luci-base/htdocs/luci-static/resources/validation.js:286 msgid "IPv4 network in address/netmask notation" -msgstr "" +msgstr "IPv4 hálózat cím/hálózati maszk jelölésben" #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:90 msgid "IPv4 only" @@ -2432,7 +2450,7 @@ msgstr "IPv6 szomszédok" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:549 msgid "IPv6 Settings" -msgstr "" +msgstr "IPv6 beállítások" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:863 msgid "IPv6 ULA-Prefix" @@ -2440,7 +2458,7 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:28 msgid "IPv6 Upstream" -msgstr "" +msgstr "Külső IPv6" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:205 msgid "IPv6 address" @@ -2449,7 +2467,7 @@ msgstr "IPv6 cím" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:189 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:31 msgid "IPv6 assignment hint" -msgstr "" +msgstr "IPv6 hozzárendelés segítsége" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:184 #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 @@ -2485,7 +2503,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:218 msgid "IPv6 suffix" -msgstr "" +msgstr "IPv6-utótag" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:56 #: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:132 @@ -2557,7 +2575,7 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:74 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:97 msgid "If unchecked, no default route is configured" -msgstr "Ha nincs kiválasztva, akkor nincs alapértelmezett útvonal beállítva" +msgstr "Ha nincs bejelölve, akkor nincs alapértelmezett útvonal beállítva" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:124 @@ -2582,11 +2600,12 @@ msgid "" "slow process as the swap-device cannot be accessed with the high datarates " "of the <abbr title=\"Random Access Memory\">RAM</abbr>." msgstr "" -"Ha a fizikai memória túl kevés a nem használt adatok ideiglenesen áttehetők " -"egy swap-eszközre mely így nagyobb mennyiségű használható <abbr title=" -"\"Random Access Memory\">RAM</abbr>-ot eredményez. Az adatok áttétele egy " -"nagyon lassú folyamat mivel a swap-eszköz nem érhető el akkora sebességgel " -"mint a <abbr title=\"Random Access Memory\">RAM</abbr>." +"Ha a fizikai memória túl kevés, akkor a nem használt adatok átmenetileg " +"áttehetők egy cserehelyeszközre, ami nagyobb mennyiségű használható <abbr " +"title=\"Random Access Memory\">RAM</abbr>-ot eredményez. Legyen tudatában " +"annak, hogy az adatok áttétele nagyon lassú folyamat, mivel a " +"cserehelyeszköz nem érhető el akkora adatsebességgel, mint a <abbr title=\"" +"Random Access Memory\">RAM</abbr>." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:100 msgid "Ignore <code>/etc/hosts</code>" @@ -2594,7 +2613,7 @@ msgstr "Az <code>/etc/hosts</code> mellőzése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:574 msgid "Ignore interface" -msgstr "Interfész figyelmen kívül hagyása" +msgstr "Csatoló mellőzése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:89 msgid "Ignore resolve file" @@ -2719,7 +2738,7 @@ msgstr "Csatolók" #: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 msgid "Internal" -msgstr "" +msgstr "Belső" #: modules/luci-base/luasrc/view/error500.htm:8 msgid "Internal Server Error" @@ -2752,7 +2771,7 @@ msgstr "Érvénytelen argumentum" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:394 msgid "Invalid command" -msgstr "" +msgstr "Érvénytelen parancs" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 msgid "Invalid hexadecimal value" @@ -2804,7 +2823,7 @@ msgstr "Kernel napló" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 msgid "Kernel Version" -msgstr "Kernel verzió" +msgstr "Kernel verziója" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1283 msgid "Key" @@ -2838,7 +2857,7 @@ msgstr "L2TP-kiszolgáló" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:89 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:112 msgid "LCP echo failure threshold" -msgstr "LCP echo hibaküszöb" +msgstr "LCP-visszhang hibaküszöbszintje" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:144 #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 @@ -2847,7 +2866,7 @@ msgstr "LCP echo hibaküszöb" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:102 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:125 msgid "LCP echo interval" -msgstr "LCP Echo időtartam" +msgstr "LCP visszhang időtartama" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:955 msgid "LLC" @@ -2881,7 +2900,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:85 msgid "Leasefile" -msgstr "Bérlet fájl" +msgstr "Bérletfájl" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:36 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:31 @@ -2920,11 +2939,11 @@ msgstr "Figyelés korlátozása ezekre a csatolókra és a visszacsatolásra." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 msgid "Line Attenuation (LATN)" -msgstr "" +msgstr "Vonal csillapítása (LATN)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 msgid "Line Mode" -msgstr "" +msgstr "Vonali mód" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:16 msgid "Line State" @@ -2979,7 +2998,7 @@ msgstr "Domain-ok listája, melyeknél az RFC1918 válaszok megengedettek" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:170 msgid "List of hosts that supply bogus NX domain results" -msgstr "A hamis NX tartomány eredményeket szolgáltató gépek listája" +msgstr "Gépek listája, amelyek hamis NX-tartomány eredményeket szolgáltatnak" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:295 msgid "Listen Interfaces" @@ -2987,7 +3006,7 @@ msgstr "Figyelési csatolók" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:54 msgid "Listen Port" -msgstr "" +msgstr "Port figyelése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:16 msgid "Listen only on the given interface or, if unspecified, on all" @@ -2995,7 +3014,7 @@ msgstr "Figyelés csak a megadott csatolón, vagy az összesen, ha nincs megadva #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:213 msgid "Listening port for inbound DNS queries" -msgstr "Szerver port a beérkező DNS kérések számára" +msgstr "Port figyelése a bejövő DNS-lekérdezésekhez" #: modules/luci-mod-status/luasrc/controller/admin/status.lua:23 #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:202 @@ -3018,7 +3037,7 @@ msgstr "Könyvtártartalmak betöltése…" #: modules/luci-base/luasrc/view/view.htm:4 #: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 msgid "Loading view…" -msgstr "" +msgstr "Nézet betöltése…" #: modules/luci-base/htdocs/luci-static/resources/network.js:10 #: modules/luci-compat/luasrc/model/network.lua:30 @@ -3044,7 +3063,7 @@ msgstr "Helyi IPv6-cím" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:283 msgid "Local Service Only" -msgstr "" +msgstr "Csak helyi szolgáltatás" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 msgid "Local Startup" @@ -3111,7 +3130,7 @@ msgstr "Kijelentkezés" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 msgid "Loss of Signal Seconds (LOSS)" -msgstr "" +msgstr "Jel vesztésének másodpercei (LOSS)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:576 msgid "Lowest leased address as offset from the network address." @@ -3146,12 +3165,12 @@ msgstr "MAC-lista" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 msgid "MAP / LW4over6" -msgstr "" +msgstr "MAP / LW4over6" #: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 msgid "MAP rule is invalid" -msgstr "" +msgstr "A MAP szabály érvénytelen" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:318 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:319 @@ -3178,6 +3197,8 @@ msgid "" "Make sure to clone the root filesystem using something like the commands " "below:" msgstr "" +"Győződjön meg arról, hogy klónozta-e a gyökér fájlrendszert az alábbi " +"parancsokhoz hasonló valami használatával:" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:108 #: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:100 @@ -3200,7 +3221,7 @@ msgstr "Legnagyobb elérhető adatsebesség (ATTNDR)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1017 msgid "Maximum allowed Listen Interval" -msgstr "" +msgstr "Legnagyobb engedélyezett figyelési időköz" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:231 msgid "Maximum allowed number of active DHCP leases" @@ -3226,7 +3247,7 @@ msgstr "Bérelt címek legnagyobb száma." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:796 msgid "Maximum transmit power" -msgstr "" +msgstr "Legnagyobb átviteli teljesítmény" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:80 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:137 @@ -3305,7 +3326,7 @@ msgstr "Modell" #: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 msgid "Modem default" -msgstr "" +msgstr "Modem alapértelmezett" #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 #: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:57 @@ -3333,7 +3354,7 @@ msgstr "Modemkezelő" #: modules/luci-base/htdocs/luci-static/resources/network.js:3605 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:915 msgid "Monitor" -msgstr "Ellenőrzés" +msgstr "Megfigyelés" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:29 msgid "More Characters" @@ -3403,7 +3424,7 @@ msgstr "Mozgatás fel" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1364 msgid "NAS ID" -msgstr "NAS azonosító" +msgstr "NAS-azonosító" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 msgid "NAT-T Mode" @@ -3416,7 +3437,7 @@ msgstr "" #: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 #: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 msgid "NCM" -msgstr "" +msgstr "NCM" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 msgid "NDP-Proxy" @@ -3424,7 +3445,7 @@ msgstr "" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 msgid "NT Domain" -msgstr "" +msgstr "NT-tartomány" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:270 msgid "NTP server candidates" @@ -3490,15 +3511,15 @@ msgstr "Nincs DHCP-kiszolgáló beállítva ehhez a csatolóhoz" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1197 msgid "No Encryption" -msgstr "" +msgstr "Nincs titkosítás" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 msgid "No NAT-T" -msgstr "" +msgstr "Nincs NAT-T" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:398 msgid "No data received" -msgstr "" +msgstr "Nem érkezett adat" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1786 msgid "No entries in this directory" @@ -3529,7 +3550,7 @@ msgstr "Nincs negatív gyorsítótár" #: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:238 #: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:279 msgid "No password set!" -msgstr "Nincs jelszó!" +msgstr "Nincs jelszó beállítva!" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:104 msgid "No peers defined yet" @@ -3570,7 +3591,7 @@ msgstr "Zaj:" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 msgid "Non Pre-emtive CRC errors (CRC_P)" -msgstr "" +msgstr "Nem kezdeményező CRC-hibák (CRC_P)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:289 msgid "Non-wildcard" @@ -3645,7 +3666,7 @@ msgstr "" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 msgid "Obtain IPv6-Address" -msgstr "" +msgstr "IPv6-cím beszerzése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:62 msgid "Off" @@ -3673,7 +3694,7 @@ msgstr "Legalább gépnevet vagy MAC-címet meg kell adni!" #: modules/luci-base/htdocs/luci-static/resources/validation.js:462 msgid "One of the following: %s" -msgstr "" +msgstr "A következők egyike: %s" #: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 #: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 @@ -3701,7 +3722,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:792 msgid "Operating frequency" -msgstr "" +msgstr "Működési gyakoriság" #: modules/luci-base/htdocs/luci-static/resources/ui.js:2476 msgid "Option changed" @@ -3762,7 +3783,7 @@ msgstr "Elhagyható. Az alagút csatoló legnagyobb átviteli egysége." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:132 msgid "Optional. Port of peer." -msgstr "" +msgstr "Elhagyható. A partner portja." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:136 msgid "" @@ -3797,7 +3818,7 @@ msgstr "Kimeneti csatoló" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:164 msgid "Output zone" -msgstr "" +msgstr "Kimeneti zóna" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:54 #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:222 @@ -3820,7 +3841,7 @@ msgstr "MAC-cím felülbírálása" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:119 #: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:97 msgid "Override MTU" -msgstr "MTU felülbíráslás" +msgstr "MTU felülbírálása" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 msgid "Override TOS" @@ -3828,7 +3849,7 @@ msgstr "TOS felülbírálása" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 msgid "Override TTL" -msgstr "" +msgstr "TTL felülbírálása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:989 msgid "Override default interface name" @@ -3856,7 +3877,7 @@ msgstr "Áttekintő" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1632 msgid "Overwrite existing file \"%s\" ?" -msgstr "" +msgstr "Felülírja a meglévő „%s” fájlt?" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 msgid "Owner" @@ -3908,7 +3929,7 @@ msgstr "PIN" #: modules/luci-base/htdocs/luci-static/resources/network.js:19 #: modules/luci-compat/luasrc/model/network.lua:39 msgid "PIN code rejected" -msgstr "" +msgstr "PIN-kód visszautasítva" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1407 msgid "PMK R1 Push" @@ -3993,7 +4014,7 @@ msgstr "" #: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:110 msgid "Password2" -msgstr "" +msgstr "2. jelszó" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:231 msgid "Paste or drag SSH key file…" @@ -4001,7 +4022,7 @@ msgstr "SSH kulcsfájl beszúrása vagy idehúzása…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 msgid "Path to CA-Certificate" -msgstr "CA tanúsítvány elérési útja" +msgstr "Útvonal a CA-tanúsítványhoz" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 msgid "Path to Client-Certificate" @@ -4098,7 +4119,7 @@ msgstr "Adja meg a felhasználónevét és a jelszavát." #: modules/luci-base/htdocs/luci-static/resources/ui.js:2273 msgid "Please select the file to upload." -msgstr "" +msgstr "Válassza ki a feltöltendő fájlt." #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:45 msgid "Policy" @@ -4110,7 +4131,7 @@ msgstr "Port" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:145 msgid "Port %s" -msgstr "" +msgstr "%s. port" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:275 msgid "Port status:" @@ -4134,7 +4155,7 @@ msgstr "" #: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 msgid "Prefer UMTS" -msgstr "" +msgstr "UMTS előnyben részesítése" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 msgid "Prefix Delegated" @@ -4154,8 +4175,8 @@ msgid "" "Presume peer to be dead after given amount of LCP echo failures, use 0 to " "ignore failures" msgstr "" -"A peer halottnak tekintése a megadott számú LCP echo hibák után. Használjon " -"0-t a hibák figyelmen kívül hagyásához." +"A partner halottnak tekintése a megadott mennyiségű LCP visszhang hibák " +"után. Használjon 0 értéket a hibák figyelmen kívül hagyásához." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 msgid "Prevent listening on these interfaces." @@ -4244,7 +4265,7 @@ msgstr "R0 kulcs élettartama" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1401 msgid "R1 Key Holder" -msgstr "" +msgstr "R1 kulcstartó" #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 msgid "RFC3947 NAT-T mode" @@ -4319,11 +4340,11 @@ msgstr "Valós idejű grafikonok" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "Reassociation Deadline" -msgstr "" +msgstr "Újratársítás határideje" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 msgid "Rebind protection" -msgstr "Rebind elleni védelem" +msgstr "Újrakötési védelem" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:13 #: modules/luci-mod-system/luasrc/controller/admin/system.lua:30 @@ -4351,7 +4372,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:343 msgid "Reconnect this interface" -msgstr "Csatlakoztassa újra az interfészt" +msgstr "Csatoló újrakapcsolódása" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:48 msgid "References" @@ -4379,7 +4400,7 @@ msgstr "Átjátszó híd" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 msgid "Remote IPv4 address" -msgstr "Távoli IPv4 cím" +msgstr "Távoli IPv4-cím" #: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 msgid "Remote IPv4 address or FQDN" @@ -4391,7 +4412,7 @@ msgstr "Eltávolítás" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1856 msgid "Replace wireless configuration" -msgstr "Vezetéknélküli beállítások lecserélése" +msgstr "Vezeték nélküli beállítások cseréje" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 msgid "Request IPv6-address" @@ -4407,7 +4428,7 @@ msgstr "Kérés időkorlátja" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1571 msgid "Required" -msgstr "" +msgstr "Kötelező" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:31 msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" @@ -4421,7 +4442,7 @@ msgstr "Kötelező. Base64 kódolású személyes kulcs ehhez a csatolóhoz." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:113 msgid "Required. Base64-encoded public key of peer." -msgstr "" +msgstr "Kötelező. A partner Base64 kódolású nyilvános kulcsa." #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:122 msgid "" @@ -4443,12 +4464,12 @@ msgstr "EAP támogatással rendelkező hostapd szükséges" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1137 msgid "Requires hostapd with OWE support" -msgstr "" +msgstr "OWE támogatással rendelkező hostapd szükséges" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1133 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1134 msgid "Requires hostapd with SAE support" -msgstr "" +msgstr "SAE támogatással rendelkező hostapd szükséges" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 msgid "" @@ -4478,7 +4499,7 @@ msgstr "WPA-ügyfél szükséges" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1147 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1148 msgid "Requires wpa-supplicant with EAP support" -msgstr "" +msgstr "EAP támogatással rendelkező WPA-ügyfél szükséges" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1149 msgid "Requires wpa-supplicant with OWE support" @@ -4488,7 +4509,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1146 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 msgid "Requires wpa-supplicant with SAE support" -msgstr "" +msgstr "SAE támogatással rendelkező WPA-ügyfél szükséges" #: modules/luci-base/htdocs/luci-static/resources/luci.js:2944 #: modules/luci-base/luasrc/view/sysauth.htm:39 @@ -4572,7 +4593,7 @@ msgstr "Gyökér előkészítés" #: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:126 msgid "Route Allowed IPs" -msgstr "" +msgstr "Engedélyezett IP-k irányítása" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:72 msgid "Route table" @@ -4580,7 +4601,7 @@ msgstr "Útválasztó tábla" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:59 msgid "Route type" -msgstr "" +msgstr "Útvonal típusa" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:620 msgid "Router Advertisement-Service" @@ -4589,7 +4610,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:44 #: modules/luci-mod-system/luasrc/controller/admin/system.lua:11 msgid "Router Password" -msgstr "Router jelszó" +msgstr "Útválasztó jelszava" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:14 #: modules/luci-mod-status/luasrc/controller/admin/status.lua:16 @@ -4607,7 +4628,7 @@ msgstr "" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:240 msgid "Rule" -msgstr "" +msgstr "Szabály" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:333 msgid "Run a filesystem check before mounting the device" @@ -4636,11 +4657,11 @@ msgstr "SSH hozzáférés" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:70 msgid "SSH server address" -msgstr "" +msgstr "SSH-kiszolgáló címe" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:74 msgid "SSH server port" -msgstr "" +msgstr "SSH-kiszolgáló portja" #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:58 msgid "SSH username" @@ -4680,11 +4701,11 @@ msgstr "Mentés & Alkalmazás" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 msgid "Save mtdblock" -msgstr "" +msgstr "Az mtdblock mentése" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 msgid "Save mtdblock contents" -msgstr "" +msgstr "Az mtdblock tartalmának mentése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:732 msgid "Scan" @@ -4783,11 +4804,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:560 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:570 msgid "Setup DHCP Server" -msgstr "DHCP kiszolgáló beállítása" +msgstr "DHCP-kiszolgáló beállítása" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 msgid "Severely Errored Seconds (SES)" -msgstr "" +msgstr "Súlyosan hibás másodpercek (SES)" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:70 msgid "Short GI" @@ -4800,7 +4821,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:431 #: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 msgid "Show current backup file list" -msgstr "Mentendő fájlok aktuális listájának megjelenítése" +msgstr "Jelenlegi biztonsági mentés fájllista megjelenítése" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:99 msgid "Show empty chains" @@ -4839,7 +4860,7 @@ msgstr "Méret" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 msgid "Size of DNS query cache" -msgstr "" +msgstr "A DNS lekérdezési gyorsítótár mérete" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:183 msgid "Size of the ZRam device in megabytes" @@ -4861,7 +4882,7 @@ msgstr "Ugrás a navigációhoz" #: modules/luci-base/htdocs/luci-static/resources/network.js:2820 #: modules/luci-compat/luasrc/model/network.lua:1427 msgid "Software VLAN" -msgstr "" +msgstr "Szoftveres VLAN" #: modules/luci-compat/luasrc/view/cbi/header.htm:2 msgid "Some fields are invalid, cannot save values!" @@ -4893,7 +4914,7 @@ msgstr "Forrás" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:83 msgid "Source Address" -msgstr "" +msgstr "Forráscím" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:290 msgid "Specifies the directory the device is attached to" @@ -4904,15 +4925,16 @@ msgid "" "Specifies the maximum amount of failed ARP requests until hosts are presumed " "to be dead" msgstr "" -"Megadja a maximális sikertelen ARP kérések számát, amik után a host nem " -"elérhetőnek tekinthető" +"Megadja a sikertelen ARP-kérések legnagyobb számát, ami után a gépek " +"halottnak tekinthetők" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 msgid "" "Specifies the maximum amount of seconds after which hosts are presumed to be " "dead" msgstr "" -"Megadja a másodpercek számát, amik után a host nem elérhetőnek tekinthető" +"Megadja a másodpercek legnagyobb számát, amely után a gép halottnak " +"tekinthető" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:796 msgid "" @@ -4942,6 +4964,8 @@ msgid "" "Specify an MTU (Maximum Transmission Unit) other than the default (1280 " "bytes)." msgstr "" +"Egy MTU (Maximum Transmission Unit – legnagyobb átviteli egység) megadása az " +"alapértelmezettől (1280 bájttól) eltérően." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1873 msgid "Specify the secret encryption key here." @@ -4959,7 +4983,7 @@ msgstr "Indítás prioritása" #: modules/luci-base/htdocs/luci-static/resources/ui.js:2669 msgid "Starting configuration apply…" -msgstr "" +msgstr "Beállítások alkalmazásának indítása…" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1663 msgid "Starting wireless scan..." @@ -4998,10 +5022,10 @@ msgid "" "to DHCP clients. They are also required for non-dynamic interface " "configurations where only hosts with a corresponding lease are served." msgstr "" -"A statikus bérletekkel a DHCP kliensekhez fix IP-címet és hostnevet " -"rendelhet. Olyan nem dinamikus interfész konfigurációk esetén is " -"szükségesek, ahol a csak a megfelelő bérlettel rendelkező hosztok kerülnek " -"kiszolgálásra." +"A statikus bérleteket a rögzített IP-címek és a szimbolikus gépnevek DHCP " +"ügyfelekhez történő hozzárendeléséhez használják. Ezek olyan nem dinamikus " +"csatoló beállításoknál is szükségesek, ahol csak a megfelelő bérlettel " +"rendelkező gépek kerülnek kiszolgálásra." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1012 msgid "Station inactivity limit" @@ -5082,11 +5106,11 @@ msgstr "Protokoll váltása" #: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 #: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 msgid "Switch to CIDR list notation" -msgstr "" +msgstr "Váltás CIDR lista jelölésre" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1573 msgid "Symbolic link" -msgstr "" +msgstr "Szimbolikus hivatkozás" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:72 msgid "Sync with NTP-Server" @@ -5110,7 +5134,7 @@ msgstr "Rendszernapló" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:100 msgid "System Properties" -msgstr "Rendszer tulajdonságok" +msgstr "Rendszer tulajdonságai" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:137 msgid "System log buffer size" @@ -5160,7 +5184,7 @@ msgstr "Megszakítás" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:83 msgid "The <em>block mount</em> command failed with code %d" -msgstr "" +msgstr "A <em>block mount</em> parancs meghiúsult %d kóddal" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 msgid "" @@ -5191,7 +5215,7 @@ msgstr "" #: modules/luci-compat/luasrc/view/cbi/error.htm:6 msgid "The configuration file could not be loaded due to the following error:" -msgstr "" +msgstr "A beállítófájlt nem sikerült betölteni a következő hiba miatt:" #: modules/luci-base/htdocs/luci-static/resources/ui.js:2566 msgid "" @@ -5203,6 +5227,14 @@ msgid "" "or revert all pending changes to keep the currently working configuration " "state." msgstr "" +"Az eszközt nem sikerült elérni %d másodpercen belül a függőben lévő " +"változtatások alkalmazása után, ami a beállítások visszaállítását okozta " +"biztonsági okokból. Ha hisz abban, hogy a beállítások változtatásai ennek " +"ellenére helyesek, akkor végezze el a beállítások ellenőrizetlen " +"alkalmazását. Alternatívaként eltüntetheti ezt a figyelmeztetést, és " +"szerkesztheti a változtatásokat, mielőtt megpróbálja ismét alkalmazni, vagy " +"visszavonhatja az összes függőben lévő változtatást a jelenleg működő " +"beállítási állapot megtartásához." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:278 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:390 @@ -5210,7 +5242,7 @@ msgid "" "The device file of the memory or partition (<abbr title=\"for example\">e.g." "</abbr> <code>/dev/sda1</code>)" msgstr "" -"A memória vagy partíció eszköz fájlja (<abbr title=\"például\">pl.</abbr> " +"A memória vagy partíció eszközfájlja (<abbr title=\"például\">pl.</abbr> " "<code>/dev/sda1</code>)" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:646 @@ -5218,6 +5250,8 @@ msgid "" "The existing wireless configuration needs to be changed for LuCI to function " "properly." msgstr "" +"A meglévő vezeték nélküli beállítást meg kell változtatni a LuCI-hoz, hogy " +"megfelelően működjön." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:211 msgid "" @@ -5226,7 +5260,7 @@ msgid "" "\"Proceed\" below to start the flash procedure." msgstr "" "A telepítő lemezkép fel lett töltve. Alább található az ellenőrző-összeg és " -"a fájlméret, hasonlítsa össze az eredeti fájllal, hogy megbizonyosodjon az " +"a fájlméret. Hasonlítsa össze az eredeti fájllal, hogy megbizonyosodjon az " "adatok helyességéről.<br />Kattintson a lenti „Folytatás” gombra a " "telepítési eljárás indításához." @@ -5286,13 +5320,13 @@ msgid "" "segments. Often there is by default one Uplink port for a connection to the " "next greater network like the internet and other ports for a local network." msgstr "" -"Az eszközön található hálózati portok kombinálhatók több <abbr title=" -"\"Virtual Local Area Network\">VLAN</abbr>-ba, amelyekben a számítógépek " -"közvetlenül kommunikálhatnak egmással. A <abbr title=\"Virtual Local Area " -"Network\">VLAN</abbr>-ok gyakran a hálózati szegmensek elkülönítésére " -"használják. Gyakran van egy alapértelmezett Uplink port a következő nagyobb " -"hálózathoz (pl. az internet) való kapcsolódásra és a többi port a helyi " -"hálózathoz." +"Az eszközön található hálózati portok kombinálhatók több <abbr title=\"" +"Virtual Local Area Network\">VLAN</abbr>-ba, amelyekben a számítógépek " +"közvetlenül kommunikálhatnak egymással. A <abbr title=\"Virtual Local Area " +"Network\">VLAN</abbr>-okat gyakran a hálózati szegmensek elkülönítésére " +"használják. Gyakran alapértelmezetten van egy kimenő port a következő " +"nagyobb hálózathoz (például az internethez) való kapcsolódásra és egyéb " +"portok a helyi hálózathoz." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:154 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:35 @@ -5341,7 +5375,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:313 msgid "The sysupgrade command failed with code %d" -msgstr "" +msgstr "A rendszerfrissítési parancs meghiúsult %d kóddal" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:116 msgid "" @@ -5349,10 +5383,14 @@ msgid "" "listed below. Press \"Continue\" to restore the backup and reboot, or " "\"Cancel\" to abort the operation." msgstr "" +"A feltöltött biztonsági mentés archívum érvényesnek tűnik, és az alább " +"felsorolt fájlokat tartalmazza. Nyomja meg a „Folytatás” gombot a biztonsági " +"mentés visszaállításához és az újraindításhoz, vagy a „Mégse” gombot a " +"művelet megszakításához." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:111 msgid "The uploaded backup archive is not readable" -msgstr "" +msgstr "A feltöltött biztonsági mentés archívum nem olvasható" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:240 msgid "The uploaded firmware does not allow keeping current configuration." @@ -5374,7 +5412,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/ui.js:2684 msgid "There are no changes to apply" -msgstr "" +msgstr "Nincsenek alkalmazandó változtatások" #: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:174 #: themes/luci-theme-material/luasrc/view/themes/material/header.htm:212 @@ -5384,9 +5422,8 @@ msgid "" "There is no password set on this router. Please configure a root password to " "protect the web interface and enable SSH." msgstr "" -"A routeren jelenleg nincs jelszó beállítva. Állítsa be a root felhasználó " -"jelszavát a felhasználói felület védelme és az SSH elérés engélyezése " -"érdekében." +"Nincs jelszó beállítva ezen az útválasztón. Állítson be rendszergazda " +"jelszót a webes felület védelméhez és az SSH engedélyezéséhez." #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 msgid "This IPv4 address of the relay" @@ -5406,6 +5443,9 @@ msgid "" "'server=1.2.3.4' for domain-specific or full upstream <abbr title=\"Domain " "Name System\">DNS</abbr> servers." msgstr "" +"Ez a fájl olyan sorokat tartalmazhat, mint például „server=/domain/1.2.3.4” " +"vagy „server=1.2.3.4” a tartományra jellemző vagy teljesen külső <abbr title=" +"\"Domain Name System\">DNS</abbr>-kiszolgálókhoz." #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:416 #: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 @@ -5451,12 +5491,14 @@ msgstr "" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 msgid "This is the plain username for logging into the account" -msgstr "" +msgstr "Ez az egyszerű felhasználónév a fiókba történő bejelentkezéshez" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 msgid "" "This is the prefix routed to you by the tunnel broker for use by clients" msgstr "" +"Ez az alagút-közvetítő által Önnek irányított előtag az ügyfelek általi " +"használathoz" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:25 msgid "This is the system crontab in which scheduled tasks can be defined." @@ -5507,14 +5549,14 @@ msgid "" "archive here. To reset the firmware to its initial state, click \"Perform " "reset\" (only possible with squashfs images)." msgstr "" -"Itt tölthet fel egy korábban létrehozott biztonsági mentés archívumot a " -"konfigurációs fájlok visszaállításához. A firmware kezdeti állapotának " -"visszaállításához kattintson a \"Visszaállítás végrehajtása\" gombra (csak " -"squashfs image-ek esetén lehetséges)." +"A beállítófájlok visszaállításához itt feltölthet egy korábban előállított " +"biztonsági mentés archívumot. A firmware kezdeti állapotára történő " +"visszaállításához kattintson a „Visszaállítás végrehajtása” gombra (csak " +"squashfs lemezképekkel lehetséges)." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:888 msgid "Tone" -msgstr "" +msgstr "Tónus" #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:34 msgid "Total Available" @@ -5537,7 +5579,7 @@ msgstr "Átvitel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:99 msgid "Transmit" -msgstr "Küldés" +msgstr "Átvitel" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 msgid "Trigger" @@ -5560,7 +5602,7 @@ msgstr "Tunnel interfész" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 msgid "Tunnel Link" -msgstr "" +msgstr "Alagút hivatkozás" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:134 msgid "Tx-Power" @@ -5686,7 +5728,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/ui.js:2431 msgid "Unsaved Changes" -msgstr "El nem mentett módosítások" +msgstr "Mentetlen változtatások" #: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 msgid "Unspecified error" @@ -5723,7 +5765,7 @@ msgstr "" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:165 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:379 msgid "Upload archive..." -msgstr "Archívum feltöltése..." +msgstr "Archívum feltöltése…" #: modules/luci-base/htdocs/luci-static/resources/ui.js:1725 msgid "Upload file" @@ -5764,7 +5806,7 @@ msgstr "<code>/etc/ethers</code> használata" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:265 msgid "Use DHCP advertised servers" -msgstr "" +msgstr "DHCP által meghirdetett kiszolgálók használata" #: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 msgid "Use DHCP gateway" @@ -5805,7 +5847,7 @@ msgstr "TTL használata az alagút interfészen" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:292 msgid "Use as external overlay (/overlay)" -msgstr "" +msgstr "Használat külső rátétként (/overlay)" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:291 msgid "Use as root filesystem (/)" @@ -5831,7 +5873,7 @@ msgstr "Beépített IPv6-kezelés használata" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:80 #: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:103 msgid "Use custom DNS servers" -msgstr "Egyedi DNS szerverek használata" +msgstr "Egyedi DNS-kiszolgálók használata" #: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 #: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:116 @@ -5904,7 +5946,7 @@ msgstr "Felhasználói tanúsítvány (PEM kódolású)" #: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:125 msgid "User key (PEM encoded)" -msgstr "" +msgstr "Felhasználói kulcs (PEM kódolású)" #: modules/luci-base/luasrc/view/sysauth.htm:23 #: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 @@ -5918,7 +5960,7 @@ msgstr "VC-Mux" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:904 msgid "VDSL" -msgstr "" +msgstr "VDSL" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:170 msgid "VLANs on %q" @@ -5940,7 +5982,7 @@ msgstr "VPN helyi port" #: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 msgid "VPN Server" -msgstr "VPN kiszolgáló" +msgstr "VPN-kiszolgáló" #: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:99 msgid "VPN Server port" @@ -5969,7 +6011,7 @@ msgstr "A feltöltött képfájl ellenőrzése." #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:54 msgid "Virtual dynamic interface" -msgstr "" +msgstr "Virtuális dinamikus csatoló" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:942 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:943 @@ -6033,6 +6075,9 @@ msgid "" "R0/R1 key options below are not applied. Disable this to use the R0 and R1 " "key options." msgstr "" +"Egy PSK használatakor a PMK automatikusan előállítható. Ha engedélyezve van, " +"akkor a lenti R0/R1 kulcsbeállítások nincsenek alkalmazva. Tiltsa le ezt az " +"R0 és az R1 kulcsbeállítások használatához." #: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:386 @@ -6053,14 +6098,14 @@ msgstr "Vezeték nélküli" #: modules/luci-base/htdocs/luci-static/resources/network.js:2811 #: modules/luci-compat/luasrc/model/network.lua:1418 msgid "Wireless Adapter" -msgstr "Vezetéknélküli adapter" +msgstr "Vezeték nélküli adapter" #: modules/luci-base/htdocs/luci-static/resources/network.js:2790 #: modules/luci-base/htdocs/luci-static/resources/network.js:3994 #: modules/luci-compat/luasrc/model/network.lua:1404 #: modules/luci-compat/luasrc/model/network.lua:1865 msgid "Wireless Network" -msgstr "Vezetéknélküli hálózat" +msgstr "Vezeték nélküli hálózat" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:663 msgid "Wireless Overview" @@ -6072,19 +6117,19 @@ msgstr "Vezeték nélküli biztonság" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:645 msgid "Wireless configuration migration" -msgstr "" +msgstr "Vezeték nélküli beállítások költöztetése" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:37 msgid "Wireless is disabled" -msgstr "Vezetéknélküli hálózat le van tiltva" +msgstr "A vezeték nélküli le van tiltva" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:104 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:142 #: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:37 msgid "Wireless is not associated" -msgstr "Vezetéknélküli hálózat nincs kapcsolódva" +msgstr "Vezeték nélküli nincs hozzárendelve" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:787 msgid "Wireless network is disabled" @@ -6100,7 +6145,7 @@ msgstr "Fogadott DNS-kérések írása a rendszernaplóba" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:156 msgid "Write system log to file" -msgstr "" +msgstr "Rendszernapló írása fájlba" #: modules/luci-base/htdocs/luci-static/resources/form.js:1757 #: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:109 @@ -6142,7 +6187,7 @@ msgstr "ZRam tömörítési algoritmus" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:195 msgid "ZRam Compression Streams" -msgstr "" +msgstr "ZRam tömörítési adatfolyamok" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:181 msgid "ZRam Settings" @@ -6263,11 +6308,11 @@ msgstr "továbbítás" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:81 msgid "full-duplex" -msgstr "full-duplex" +msgstr "teljes kétirányú" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:81 msgid "half-duplex" -msgstr "half-duplex" +msgstr "váltakozó kétirányú" #: modules/luci-base/htdocs/luci-static/resources/validation.js:565 msgid "hexadecimal encoded value" @@ -6281,11 +6326,11 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:35 msgid "if target is a network" -msgstr "ha a cél hálózat" +msgstr "ha a cél egy hálózat" #: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 msgid "ignore" -msgstr "" +msgstr "mellőzés" #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 #: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:190 @@ -6295,7 +6340,7 @@ msgstr "bemenet" #: modules/luci-base/htdocs/luci-static/resources/validation.js:390 msgid "key between 8 and 63 characters" -msgstr "" +msgstr "8 és 63 karakter közötti kulcs" #: modules/luci-base/htdocs/luci-static/resources/validation.js:402 msgid "key with either 5 or 13 characters" @@ -6307,7 +6352,7 @@ msgstr "helyi <abbr title=\"Domain Name System\">DNS</abbr>-fájl" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1203 msgid "medium security" -msgstr "" +msgstr "közepes biztonság" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1395 msgid "minutes" @@ -6411,7 +6456,7 @@ msgstr "" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:347 msgid "tagged" -msgstr "cimkézett" +msgstr "címkézett" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1378 msgid "time units (TUs / 1.024 ms) [1000-65535]" @@ -6467,11 +6512,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:249 msgid "valid IPv4 address" -msgstr "" +msgstr "érvényes IPv4-cím" #: modules/luci-base/htdocs/luci-static/resources/validation.js:249 msgid "valid IPv4 address or network" -msgstr "" +msgstr "érvényes IPv4-cím vagy hálózat" #: modules/luci-base/htdocs/luci-static/resources/validation.js:369 msgid "valid IPv4 address:port" @@ -6479,7 +6524,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:309 msgid "valid IPv4 network" -msgstr "" +msgstr "érvényes IPv4 hálózat" #: modules/luci-base/htdocs/luci-static/resources/validation.js:271 msgid "valid IPv4 or IPv6 CIDR" @@ -6503,11 +6548,11 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:299 msgid "valid IPv6 host id" -msgstr "" +msgstr "érvényes IPv6 gépazonosító" #: modules/luci-base/htdocs/luci-static/resources/validation.js:314 msgid "valid IPv6 network" -msgstr "" +msgstr "érvényes IPv6 hálózat" #: modules/luci-base/htdocs/luci-static/resources/validation.js:267 msgid "valid IPv6 prefix value (0-128)" @@ -6523,7 +6568,7 @@ msgstr "érvényes UCI azonosító" #: modules/luci-base/htdocs/luci-static/resources/validation.js:357 msgid "valid UCI identifier, hostname or IP address" -msgstr "" +msgstr "érvényes UCI-azonosító, gépnév vagy IP-cím" #: modules/luci-base/htdocs/luci-static/resources/validation.js:378 #: modules/luci-base/htdocs/luci-static/resources/validation.js:381 @@ -6537,7 +6582,7 @@ msgstr "" #: modules/luci-base/htdocs/luci-static/resources/validation.js:232 msgid "valid decimal value" -msgstr "" +msgstr "érvényes decimális érték" #: modules/luci-base/htdocs/luci-static/resources/validation.js:400 msgid "valid hexadecimal WEP key" @@ -6558,7 +6603,7 @@ msgstr "érvényes gépnév" #: modules/luci-base/htdocs/luci-static/resources/validation.js:340 msgid "valid hostname or IP address" -msgstr "" +msgstr "érvényes gépnév vagy IP-cím" #: modules/luci-base/htdocs/luci-static/resources/validation.js:224 msgid "valid integer value" @@ -6607,7 +6652,7 @@ msgstr "érték %d karakterrel" #: modules/luci-base/htdocs/luci-static/resources/validation.js:436 msgid "value with at least %d characters" -msgstr "" +msgstr "érték legalább %d karakterrel" #: modules/luci-base/htdocs/luci-static/resources/validation.js:441 msgid "value with at most %d characters" diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po index ed322f86ca..c053dcbf31 100644 --- a/modules/luci-base/po/pt-br/base.po +++ b/modules/luci-base/po/pt-br/base.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-06-10 03:41+0200\n" -"PO-Revision-Date: 2019-12-09 20:02+0000\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" "Last-Translator: Wellington Terumi Uemura <wellingtonuemura@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "openwrt/luci/pt_BR/>\n" @@ -2091,7 +2091,7 @@ msgstr "Configurações do Firewall" #: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:44 msgid "Firewall Status" -msgstr "Estado do Firewall" +msgstr "Condição do Firewall" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:913 msgid "Firmware File" diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po index e2d615642e..566293904f 100644 --- a/modules/luci-base/po/uk/base.po +++ b/modules/luci-base/po/uk/base.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2019-11-30 21:05+0000\n" -"Last-Translator: Yurii Petrashko <yuripet@gmail.com>\n" +"PO-Revision-Date: 2019-12-13 23:06+0000\n" +"Last-Translator: Сергій Йовенко <s.yovenko@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/luci/" "uk/>\n" "Language: uk\n" @@ -1371,7 +1371,7 @@ msgstr "Швидк. передавання" #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:161 #: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:172 msgid "Debug" -msgstr "Зневаджування" +msgstr "Відлагодження" #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1218 #: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1242 diff --git a/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json b/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json new file mode 100644 index 0000000000..cdfffb5123 --- /dev/null +++ b/modules/luci-base/root/usr/share/luci/menu.d/luci-base.json @@ -0,0 +1,142 @@ +{ + "admin": { + "title": "Administration", + "order": 10, + "action": { + "type": "firstchild", + "recurse": true + }, + "auth": { + "methods": [ "cookie:sysauth" ], + "login": true + } + }, + + "admin/status": { + "title": "Status", + "order": 10, + "action": { + "type": "firstchild", + "preferred": "overview", + "recurse": true + } + }, + + "admin/system": { + "title": "System", + "order": 20, + "action": { + "type": "firstchild", + "preferred": "system", + "recurse": true + } + }, + + "admin/vpn": { + "title": "VPN", + "order": 30, + "action": { + "type": "firstchild", + "recurse": true + } + }, + + "admin/services": { + "title": "Services", + "order": 40, + "action": { + "type": "firstchild", + "recurse": true + } + }, + + "admin/network": { + "title": "Network", + "order": 50, + "action": { + "type": "firstchild", + "recurse": true + } + }, + + "admin/translations/*": { + "action": { + "type": "call", + "module": "luci.controller.admin.index", + "function": "action_translations" + }, + "auth": { + "methods": [ "cookie:sysauth" ] + } + }, + + "admin/ubus/*": { + "action": { + "type": "call", + "module": "luci.controller.admin.index", + "function": "action_ubus" + }, + "auth": {} + }, + + "admin/logout": { + "title": "Logout", + "order": 999, + "action": { + "type": "call", + "module": "luci.controller.admin.index", + "function": "action_logout" + } + }, + + "admin/uci": { + "action": { + "type": "firstchild" + } + }, + + "admin/uci/revert": { + "action": { + "type": "call", + "module": "luci.controller.admin.uci", + "function": "action_revert", + "post": true + } + }, + + "admin/uci/apply_rollback": { + "cors": true, + "action": { + "type": "call", + "module": "luci.controller.admin.uci", + "function": "action_apply_rollback", + "post": true + }, + "auth": { + "methods": [ "cookie:sysauth" ] + } + }, + + "admin/uci/apply_unchecked": { + "cors": true, + "action": { + "type": "call", + "module": "luci.controller.admin.uci", + "function": "action_apply_unchecked", + "post": true + }, + "auth": { + "methods": [ "cookie:sysauth" ] + } + }, + + "admin/uci/confirm": { + "cors": true, + "action": { + "type": "call", + "module": "luci.controller.admin.uci", + "function": "action_confirm" + }, + "auth": {} + } +} diff --git a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json index 50ddc299fa..e215cf9455 100644 --- a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json +++ b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json @@ -38,7 +38,16 @@ "/proc/sys/kernel/hostname": [ "read" ], "/proc/sys/net/netfilter/nf_conntrack_*": [ "read" ], "/proc/mounts": [ "read" ], - "/usr/lib/lua/luci/version.lua": [ "read" ] + "/usr/lib/lua/luci/version.lua": [ "read" ], + "/bin/ping *": [ "exec" ], + "/bin/ping6 *": [ "exec" ], + "/bin/traceroute *": [ "exec" ], + "/bin/traceroute6 *": [ "exec" ], + "/usr/bin/ping *": [ "exec" ], + "/usr/bin/ping6 *": [ "exec" ], + "/usr/bin/traceroute *": [ "exec" ], + "/usr/bin/traceroute6 *": [ "exec" ], + "/usr/bin/nslookup *": [ "exec" ] }, "ubus": { "file": [ "list", "read", "stat" ], diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js index ab6779e149..9f1f8dc57f 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js @@ -2,8 +2,9 @@ 'require rpc'; 'require uci'; 'require form'; +'require validation'; -var callHostHints, callDUIDHints, callDHCPLeases, CBILeaseStatus; +var callHostHints, callDUIDHints, callDHCPLeases, CBILeaseStatus, CBILease6Status; callHostHints = rpc.declare({ object: 'luci-rpc', @@ -20,8 +21,7 @@ callDUIDHints = rpc.declare({ callDHCPLeases = rpc.declare({ object: 'luci-rpc', method: 'getDHCPLeases', - params: [ 'family' ], - expect: { dhcp_leases: [] } + expect: { '': {} } }); CBILeaseStatus = form.DummyValue.extend({ @@ -43,6 +43,86 @@ CBILeaseStatus = form.DummyValue.extend({ } }); +CBILease6Status = form.DummyValue.extend({ + renderWidget: function(section_id, option_id, cfgvalue) { + return E([ + E('h4', _('Active DHCPv6 Leases')), + E('div', { 'id': 'lease6_status_table', 'class': 'table' }, [ + E('div', { 'class': 'tr table-titles' }, [ + E('div', { 'class': 'th' }, _('Host')), + E('div', { 'class': 'th' }, _('IPv6-Address')), + E('div', { 'class': 'th' }, _('DUID')), + E('div', { 'class': 'th' }, _('Leasetime remaining')) + ]), + E('div', { 'class': 'tr placeholder' }, [ + E('div', { 'class': 'td' }, E('em', _('Collecting data...'))) + ]) + ]) + ]); + } +}); + +function validateHostname(sid, s) { + if (s.length > 256) + return _('Expecting: %s').format(_('valid hostname')); + + var labels = s.replace(/^\.+|\.$/g, '').split(/\./); + + for (var i = 0; i < labels.length; i++) + if (!labels[i].match(/^[a-z0-9_](?:[a-z0-9-]{0,61}[a-z0-9])?$/i)) + return _('Expecting: %s').format(_('valid hostname')); + + return true; +} + +function validateAddressList(sid, s) { + if (s == null || s == '') + return true; + + var m = s.match(/^\/(.+)\/$/), + names = m ? m[1].split(/\//) : [ s ]; + + for (var i = 0; i < names.length; i++) { + var res = validateHostname(sid, names[i]); + + if (res !== true) + return res; + } + + return true; +} + +function validateServerSpec(sid, s) { + if (s == null || s == '') + return true; + + var m = s.match(/^\/(.+)\/(.*)$/); + if (!m) + return _('Expecting: %s').format(_('valid hostname')); + + var res = validateAddressList(sid, m[1]); + if (res !== true) + return res; + + if (m[2] == '' || m[2] == '#') + return true; + + // ipaddr%scopeid#srvport@source@interface#srcport + + m = m[2].match(/^([0-9a-f:.]+)(?:%[^#@]+)?(?:#(\d+))?(?:@([0-9a-f:.]+)(?:@[^#]+)?(?:#(\d+))?)?$/); + + if (!m) + return _('Expecting: %s').format(_('valid IP address')); + else if (validation.parseIPv4(m[1]) && m[3] != null && !validation.parseIPv4(m[3])) + return _('Expecting: %s').format(_('valid IPv4 address')); + else if (validation.parseIPv6(m[1]) && m[3] != null && !validation.parseIPv6(m[3])) + return _('Expecting: %s').format(_('valid IPv6 address')); + else if ((m[2] != null && +m[2] > 65535) || (m[4] != null && +m[4] > 65535)) + return _('Expecting: %s').format(_('valid port value')); + + return true; +} + return L.view.extend({ load: function() { return Promise.all([ @@ -52,7 +132,8 @@ return L.view.extend({ }, render: function(hosts_duids) { - var hosts = hosts_duids[0], + var has_dhcpv6 = L.hasSystemFeature('dnsmasq', 'dhcpv6') || L.hasSystemFeature('odhcpd'), + hosts = hosts_duids[0], duids = hosts_duids[1], m, s, o, ss, so; @@ -182,6 +263,7 @@ return L.view.extend({ o.optional = true; o.placeholder = '/example.org/10.1.2.3'; + o.validate = validateServerSpec; o = s.taboption('general', form.Flag, 'rebind_protection', @@ -204,8 +286,8 @@ return L.view.extend({ o.optional = true; o.depends('rebind_protection', '1'); - o.datatype = 'host(1)'; o.placeholder = 'ihost.netflix.com'; + o.validate = validateAddressList; o = s.taboption('advanced', form.Value, 'port', @@ -288,6 +370,7 @@ return L.view.extend({ o = s.taboption('general', form.Flag, 'nonwildcard', _('Non-wildcard'), _('Bind dynamically to interfaces rather than wildcard address (recommended as linux default)')); + o.default = o.enabled; o.optional = false; o.rmempty = true; @@ -399,9 +482,15 @@ return L.view.extend({ o = s.taboption('leases', CBILeaseStatus, '__status__'); + if (has_dhcpv6) + o = s.taboption('leases', CBILease6Status, '__status6__'); + return m.render().then(function(mapEl) { L.Poll.add(function() { - return callDHCPLeases(4).then(function(leases) { + return callDHCPLeases().then(function(leaseinfo) { + var leases = Array.isArray(leaseinfo.dhcp_leases) ? leaseinfo.dhcp_leases : [], + leases6 = Array.isArray(leaseinfo.dhcp6_leases) ? leaseinfo.dhcp6_leases : []; + cbi_update_table(mapEl.querySelector('#lease_status_table'), leases.map(function(lease) { var exp; @@ -421,6 +510,39 @@ return L.view.extend({ ]; }), E('em', _('There are no active leases'))); + + if (has_dhcpv6) { + cbi_update_table(mapEl.querySelector('#lease6_status_table'), + leases6.map(function(lease) { + var exp; + + if (lease.expires === false) + exp = E('em', _('unlimited')); + else if (lease.expires <= 0) + exp = E('em', _('expired')); + else + exp = '%t'.format(lease.expires); + + var hint = lease.macaddr ? hosts[lease.macaddr] : null, + name = hint ? (hint.name || hint.ipv4 || hint.ipv6) : null, + host = null; + + if (name && lease.hostname && lease.hostname != name && lease.ip6addr != name) + host = '%s (%s)'.format(lease.hostname, name); + else if (lease.hostname) + host = lease.hostname; + else if (name) + host = name; + + return [ + host || '-', + lease.ip6addrs ? lease.ip6addrs.join(' ') : lease.ip6addr, + lease.duid, + exp + ]; + }), + E('em', _('There are no active leases'))); + } }); }); diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js new file mode 100644 index 0000000000..ee2a466151 --- /dev/null +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js @@ -0,0 +1,137 @@ +'use strict'; +'require fs'; +'require ui'; +'require uci'; + +return L.view.extend({ + handleCommand: function(exec, args) { + var buttons = document.querySelectorAll('.diag-action > .cbi-button'); + + for (var i = 0; i < buttons.length; i++) + buttons[i].setAttribute('disabled', 'true'); + + return fs.exec(exec, args).then(function(res) { + var out = document.querySelector('.command-output'); + out.style.display = ''; + + L.dom.content(out, [ res.stdout || '', res.stderr || '' ]); + }).catch(function(err) { + ui.addNotification(null, E('p', [ err ])) + }).finally(function() { + for (var i = 0; i < buttons.length; i++) + buttons[i].removeAttribute('disabled'); + }); + }, + + handlePing: function(ev, cmd) { + var exec = cmd || 'ping', + addr = ev.currentTarget.parentNode.previousSibling.value, + args = (exec == 'ping') ? [ '-c', '5', '-W', '1', addr ] : [ '-c', '5', addr ]; + + return this.handleCommand(exec, args); + }, + + handleTraceroute: function(ev, cmd) { + var exec = cmd || 'traceroute', + addr = ev.currentTarget.parentNode.previousSibling.value, + args = (exec == 'traceroute') ? [ '-q', '1', '-w', '1', '-n', addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; + + return this.handleCommand(exec, args); + }, + + handleNslookup: function(ev, cmd) { + var addr = ev.currentTarget.parentNode.previousSibling.value; + + return this.handleCommand('nslookup', [ addr ]); + }, + + load: function() { + return Promise.all([ + L.resolveDefault(fs.stat('/bin/ping6'), {}), + L.resolveDefault(fs.stat('/usr/bin/ping6'), {}), + L.resolveDefault(fs.stat('/bin/traceroute6'), {}), + L.resolveDefault(fs.stat('/usr/bin/traceroute6'), {}), + uci.load('luci') + ]); + }, + + render: function(res) { + var has_ping6 = res[0].path || res[1].path, + has_traceroute6 = res[2].path || res[3].path, + dns_host = uci.get('luci', 'diag', 'dns') || 'openwrt.org', + ping_host = uci.get('luci', 'diag', 'ping') || 'openwrt.org', + route_host = uci.get('luci', 'diag', 'route') || 'openwrt.org'; + + return E([], [ + E('h2', {}, [ _('Network Utilities') ]), + E('div', { 'class': 'table' }, [ + E('div', { 'class': 'tr' }, [ + E('div', { 'class': 'td left' }, [ + E('input', { + 'style': 'margin:5px 0', + 'type': 'text', + 'value': ping_host + }), + E('span', { 'class': 'diag-action' }, [ + has_ping6 ? new ui.ComboButton('ping', { + 'ping': '%s %s'.format(_('IPv4'), _('Ping')), + 'ping6': '%s %s'.format(_('IPv6'), _('Ping')), + }, { + 'click': ui.createHandlerFn(this, 'handlePing'), + 'classes': { + 'ping': 'cbi-button cbi-button-action', + 'ping6': 'cbi-button cbi-button-action' + } + }).render() : E('button', { + 'class': 'cbi-button cbi-button-action', + 'click': ui.createHandlerFn(this, 'handlePing') + }, [ _('Ping') ]) + ]) + ]), + + E('div', { 'class': 'td left' }, [ + E('input', { + 'style': 'margin:5px 0', + 'type': 'text', + 'value': route_host + }), + E('span', { 'class': 'diag-action' }, [ + has_traceroute6 ? new ui.ComboButton('traceroute', { + 'traceroute': '%s %s'.format(_('IPv4'), _('Traceroute')), + 'traceroute6': '%s %s'.format(_('IPv6'), _('Traceroute')), + }, { + 'click': ui.createHandlerFn(this, 'handleTraceroute'), + 'classes': { + 'traceroute': 'cbi-button cbi-button-action', + 'traceroute6': 'cbi-button cbi-button-action' + } + }).render() : E('button', { + 'class': 'cbi-button cbi-button-action', + 'click': ui.createHandlerFn(this, 'handleTraceroute') + }, [ _('Traceroute') ]) + ]) + ]), + + E('div', { 'class': 'td left' }, [ + E('input', { + 'style': 'margin:5px 0', + 'type': 'text', + 'value': dns_host + }), + E('span', { 'class': 'diag-action' }, [ + E('button', { + 'class': 'cbi-button cbi-button-action', + 'click': ui.createHandlerFn(this, 'handleNslookup') + }, [ _('Nslookup') ]) + ]) + ]) + ]) + ]), + E('pre', { 'class': 'command-output', 'style': 'display:none' }) + ]); + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/modules/luci-mod-network/luasrc/controller/admin/network.lua b/modules/luci-mod-network/luasrc/controller/admin/network.lua index bd00235faa..109c59f2a7 100644 --- a/modules/luci-mod-network/luasrc/controller/admin/network.lua +++ b/modules/luci-mod-network/luasrc/controller/admin/network.lua @@ -4,63 +4,6 @@ module("luci.controller.admin.network", package.seeall) -function index() - local page - --- if page.inreq then - page = entry({"admin", "network", "switch"}, view("network/switch"), _("Switch"), 20) - page.uci_depends = { network = { ["@switch[0]"] = "switch" } } - - page = entry({"admin", "network", "wireless"}, view("network/wireless"), _('Wireless'), 15) - page.uci_depends = { wireless = { ["@wifi-device[0]"] = "wifi-device" } } - page.leaf = true - - page = entry({"admin", "network", "remote_addr"}, call("remote_addr"), nil) - page.leaf = true - - page = entry({"admin", "network", "network"}, view("network/interfaces"), _("Interfaces"), 10) - page.leaf = true - page.subindex = true - - page = node("admin", "network", "dhcp") - page.uci_depends = { dhcp = true } - page.target = view("network/dhcp") - page.title = _("DHCP and DNS") - page.order = 30 - - page = node("admin", "network", "hosts") - page.uci_depends = { dhcp = true } - page.target = view("network/hosts") - page.title = _("Hostnames") - page.order = 40 - - page = node("admin", "network", "routes") - page.target = view("network/routes") - page.title = _("Static Routes") - page.order = 50 - - page = node("admin", "network", "diagnostics") - page.target = template("admin_network/diagnostics") - page.title = _("Diagnostics") - page.order = 60 - - page = entry({"admin", "network", "diag_ping"}, post("diag_ping"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_nslookup"}, post("diag_nslookup"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_traceroute"}, post("diag_traceroute"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_ping6"}, post("diag_ping6"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_traceroute6"}, post("diag_traceroute6"), nil) - page.leaf = true --- end -end - local function addr2dev(addr, src) local ip = require "luci.ip" local route = ip.route(addr, src) @@ -123,45 +66,3 @@ function remote_addr() luci.http.prepare_content("application/json") luci.http.write_json(result) end - -function diag_command(cmd, addr) - if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then - luci.http.prepare_content("text/plain") - - local util = io.popen(cmd % luci.util.shellquote(addr)) - if util then - while true do - local ln = util:read("*l") - if not ln then break end - luci.http.write(ln) - luci.http.write("\n") - end - - util:close() - end - - return - end - - luci.http.status(500, "Bad address") -end - -function diag_ping(addr) - diag_command("ping -c 5 -W 1 %s 2>&1", addr) -end - -function diag_traceroute(addr) - diag_command("traceroute -q 1 -w 1 -n %s 2>&1", addr) -end - -function diag_nslookup(addr) - diag_command("nslookup %s 2>&1", addr) -end - -function diag_ping6(addr) - diag_command("ping6 -c 5 %s 2>&1", addr) -end - -function diag_traceroute6(addr) - diag_command("traceroute6 -q 1 -w 2 -n %s 2>&1", addr) -end diff --git a/modules/luci-mod-network/luasrc/view/admin_network/diagnostics.htm b/modules/luci-mod-network/luasrc/view/admin_network/diagnostics.htm deleted file mode 100644 index 03dd5aab29..0000000000 --- a/modules/luci-mod-network/luasrc/view/admin_network/diagnostics.htm +++ /dev/null @@ -1,117 +0,0 @@ -<%# - Copyright 2010 Jo-Philipp Wich <jow@openwrt.org> - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> - -<% -local fs = require "nixio.fs" -local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6") -local has_traceroute6 = fs.access("/bin/traceroute6") or fs.access("/usr/bin/traceroute6") - -local dns_host = luci.config.diag and luci.config.diag.dns or "dev.openwrt.org" -local ping_host = luci.config.diag and luci.config.diag.ping or "dev.openwrt.org" -local route_host = luci.config.diag and luci.config.diag.route or "dev.openwrt.org" -%> - -<script type="text/javascript">//<![CDATA[ - var stxhr = new XHR(); - - function update_status(field, proto) - { - var tool = field.name; - var addr = field.value; - var protocol = proto ? "6" : ""; - - var legend = document.getElementById('diag-rc-legend'); - var output = document.getElementById('diag-rc-output'); - - if (legend && output) - { - output.innerHTML = - '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + - '<%:Waiting for command to complete...%>' - ; - - legend.parentNode.style.display = 'block'; - legend.style.display = 'inline'; - - stxhr.post('<%=url('admin/network')%>/diag_' + tool + protocol + '/' + addr, { token: '<%=token%>' }, - function(x) - { - if (x.responseText) - { - legend.style.display = 'none'; - output.innerHTML = String.format('<pre>%h</pre>', x.responseText); - } - else - { - legend.style.display = 'none'; - output.innerHTML = '<span class="error"><%:Bad address specified!%></span>'; - } - } - ); - } - } -//]]></script> - -<form method="post" action="<%=url('admin/network/diagnostics')%>"> - <div class="cbi-map"> - <h2 name="content"><%:Diagnostics%></h2> - - <div class="cbi-section"> - <legend><%:Network Utilities%></legend> - - <div class="table"> - <div class="tr"> - <div class="td left"> - <input style="margin: 5px 0" type="text" value="<%=ping_host%>" name="ping" /><br /> - <% if has_ping6 then %> - <span> - <select name="ping_proto" style="width:auto"> - <option value="" selected="selected"><%:IPv4%></option> - <option value="6"><%:IPv6%></option> - </select> - </span> - <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" /> - <% else %> - <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" /> - <% end %> - </div> - - <div class="td left"> - <input style="margin: 5px 0" type="text" value="<%=route_host%>" name="traceroute" /><br /> - <% if has_traceroute6 then %> - <span> - <select name="traceroute_proto" style="width:auto"> - <option value="" selected="selected"><%:IPv4%></option> - <option value="6"><%:IPv6%></option> - </select> - </span> - <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" /> - <% else %> - <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" /> - <% end %> - <% if not has_traceroute6 then %> - <p> </p> - <p><%:Install iputils-traceroute6 for IPv6 traceroute%></p> - <% end %> - </div> - - <div class="td left"> - <input style="margin: 5px 0" type="text" value="<%=dns_host%>" name="nslookup" /><br /> - <input type="button" value="<%:Nslookup%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" /> - </div> - </div> - </div> - </div> - </div> - - <div class="cbi-section" style="display:none"> - <strong id="diag-rc-legend"></strong> - <span id="diag-rc-output"></span> - </div> -</form> - -<%+footer%> diff --git a/modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json b/modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json new file mode 100644 index 0000000000..670f2c1a49 --- /dev/null +++ b/modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json @@ -0,0 +1,85 @@ +{ + "admin/network/switch": { + "title": "Switch", + "order": 20, + "action": { + "type": "view", + "path": "network/switch" + }, + "depends": { + "fs": { "/sbin/swconfig": "executable" }, + "uci": { "network": { "@switch": true } } + } + }, + + "admin/network/wireless": { + "title": "Wireless", + "order": 15, + "action": { + "type": "view", + "path": "network/wireless" + }, + "depends": { + "uci": { "wireless": { "@wifi-device": true } } + } + }, + + "admin/network/remote_addr/*": { + "action": { + "type": "call", + "module": "luci.controller.admin.network", + "function": "remote_addr" + } + }, + + "admin/network/network": { + "title": "Interfaces", + "order": 10, + "action": { + "type": "view", + "path": "network/interfaces" + } + }, + + "admin/network/dhcp": { + "title": "DHCP and DNS", + "order": 30, + "action": { + "type": "view", + "path": "network/dhcp" + }, + "depends": { + "uci": { "dhcp": true } + } + }, + + "admin/network/hosts": { + "title": "Hostnames", + "order": 40, + "action": { + "type": "view", + "path": "network/hosts" + }, + "depends": { + "uci": { "dhcp": true } + } + }, + + "admin/network/routes": { + "title": "Static Routes", + "order": 50, + "action": { + "type": "view", + "path": "network/routes" + } + }, + + "admin/network/diagnostics": { + "title": "Diagnostics", + "order": 60, + "action": { + "type": "view", + "path": "network/diagnostics" + } + } +} diff --git a/modules/luci-mod-status/luasrc/controller/admin/status.lua b/modules/luci-mod-status/luasrc/controller/admin/status.lua index 6f84149223..2684bdf715 100644 --- a/modules/luci-mod-status/luasrc/controller/admin/status.lua +++ b/modules/luci-mod-status/luasrc/controller/admin/status.lua @@ -4,30 +4,6 @@ module("luci.controller.admin.status", package.seeall) -function index() - local page - - entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1) - - entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true - entry({"admin", "status", "iptables_dump"}, call("dump_iptables")).leaf = true - entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true - - entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3) - entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4) - entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5) - entry({"admin", "status", "processes"}, view("status/processes"), _("Processes"), 6) - - entry({"admin", "status", "realtime"}, alias("admin", "status", "realtime", "load"), _("Realtime Graphs"), 7) - - entry({"admin", "status", "realtime", "load"}, view("status/load"), _("Load"), 1) - entry({"admin", "status", "realtime", "bandwidth"}, view("status/bandwidth"), _("Traffic"), 2) - entry({"admin", "status", "realtime", "wireless"}, view("status/wireless"), _("Wireless"), 3).uci_depends = { wireless = true } - entry({"admin", "status", "realtime", "connections"}, view("status/connections"), _("Connections"), 4) - - entry({"admin", "status", "nameinfo"}, call("action_nameinfo")).leaf = true -end - function action_syslog() local syslog = luci.sys.syslog() luci.template.render("admin_status/syslog", {syslog=syslog}) diff --git a/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json b/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json new file mode 100644 index 0000000000..03f7dce3b9 --- /dev/null +++ b/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json @@ -0,0 +1,129 @@ +{ + "admin/status/overview": { + "title": "Overview", + "order": 1, + "action": { + "type": "template", + "path": "admin_status/index" + } + }, + + "admin/status/iptables/*": { + "title": "Firewall", + "order": 2, + "action": { + "type": "template", + "path": "admin_status/iptables" + } + }, + + "admin/status/iptables_dump/*": { + "action": { + "type": "call", + "module": "luci.controller.admin.status", + "function": "dump_iptables" + } + }, + + "admin/status/iptables_action/*": { + "action": { + "type": "call", + "module": "luci.controller.admin.status", + "function": "action_iptables" + } + }, + + "admin/status/routes": { + "title": "Routes", + "order": 3, + "action": { + "type": "template", + "path": "admin_status/routes" + } + }, + + "admin/status/syslog": { + "title": "System Log", + "order": 4, + "action": { + "type": "call", + "module": "luci.controller.admin.status", + "function": "action_syslog" + } + }, + + "admin/status/dmesg": { + "title": "Kernel Log", + "order": 5, + "action": { + "type": "call", + "module": "luci.controller.admin.status", + "function": "action_dmesg" + } + }, + + "admin/status/processes": { + "title": "Processes", + "order": 6, + "action": { + "type": "view", + "path": "status/processes" + } + }, + + "admin/status/realtime": { + "title": "Realtime Graphs", + "order": 7, + "action": { + "type": "alias", + "path": "admin/status/realtime/load" + } + }, + + "admin/status/realtime/load": { + "title": "Load", + "order": 1, + "action": { + "type": "view", + "path": "status/load" + } + }, + + "admin/status/realtime/bandwidth": { + "title": "Traffic", + "order": 2, + "action": { + "type": "view", + "path": "status/bandwidth" + } + }, + + "admin/status/realtime/wireless": { + "title": "Wireless", + "order": 3, + "action": { + "type": "view", + "path": "status/wireless" + }, + "depends": { + "uci": { "wireless": { "@wifi-device": true } } + } + }, + + "admin/status/realtime/connections": { + "title": "Connections", + "order": 4, + "action": { + "type": "view", + "path": "status/connections" + } + }, + + "admin/status/nameinfo/*": { + "action": { + "type": "call", + "module": "luci.controller.admin.status", + "function": "action_nameinfo" + } + } +} diff --git a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm index e0a41e1bca..ec6895f06d 100644 --- a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm +++ b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm @@ -5,25 +5,12 @@ Licensed to the public under the Apache License 2.0. -%> -<% - local ver = require "luci.version" - local disp = require "luci.dispatcher" - local request = disp.context.path - local category = request[1] - local tree = disp.node() - local categories = disp.node_childs(tree) -%> +<% local ver = require "luci.version" %> + <footer> <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> / <%= ver.distversion %> - <% if #categories > 1 then %> - <ul class="breadcrumb pull-right" id="modemenu"> - <% for i, r in ipairs(categories) do %> - <li<% if request[1] == r then %> class="active"<%end%>><a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> <span class="divider">|</span></li> - <% end %> - </ul> - <% end %> + <ul class="breadcrumb pull-right" id="modemenu" style="display:none"></ul> </footer> - </div> </div> </body> </html> diff --git a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm index de1fd73f0e..56a1b230e4 100644 --- a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm +++ b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm @@ -13,123 +13,10 @@ local boardinfo = util.ubus("system", "board") - local request = disp.context.path - local request2 = disp.context.request - - local category = request[1] - local cattree = category and disp.node(category) - - local leaf = request2[#request2] - - local tree = disp.node() local node = disp.context.dispatched - local categories = disp.node_childs(tree) - - local c = tree - local i, r - - -- tag all nodes leading to this page - for i, r in ipairs(request) do - if c.nodes and c.nodes[r] then - c = c.nodes[r] - c._menu_selected = true - end - end - -- send as HTML5 http.prepare_content("text/html") - - local function nodeurl(prefix, name, query) - local u = url(prefix, name) - if query then - u = u .. http.build_querystring(query) - end - return pcdata(u) - end - - local function render_tabmenu(prefix, node, level) - if not level then - level = 1 - end - - local childs = disp.node_childs(node) - if #childs > 0 then - if level > 2 then - write('<ul class="tabs">') - end - - local selected_node - local selected_name - local i, v - - for i, v in ipairs(childs) do - local nnode = node.nodes[v] - if nnode._menu_selected then - selected_node = nnode - selected_name = v - end - - if level > 2 then - write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{ - v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', - nodeurl(prefix, v, nnode.query), - striptags(translate(nnode.title)) - }) - end - end - - if level > 2 then - write('</ul>') - end - - if selected_node then - render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) - end - end - end - - local function render_submenu(prefix, node) - local childs = disp.node_childs(node) - if #childs > 0 then - write('<ul class="dropdown-menu">') - - for i, r in ipairs(childs) do - local nnode = node.nodes[r] - write('<li><a href="%s">%s</a></li>' %{ - nodeurl(prefix, r, nnode.query), - striptags(translate(nnode.title)) - }) - end - - write('</ul>') - end - end - - local function render_topmenu() - local childs = disp.node_childs(cattree) - if #childs > 0 then - write('<ul class="nav">') - - for i, r in ipairs(childs) do - local nnode = cattree.nodes[r] - local grandchildren = disp.node_childs(nnode) - - if #grandchildren > 0 then - write('<li class="dropdown"><a class="menu" href="#">%s</a>' % striptags(translate(nnode.title))) - render_submenu(category .. "/" .. r, nnode) - write('</li>') - else - write('<li><a href="%s">%s</a></li>' %{ - nodeurl(category, r, nnode.query), - striptags(translate(nnode.title)) - }) - end - end - - write('</ul>') - end - end -%> <!DOCTYPE html> <html lang="<%=luci.i18n.context.lang%>"> @@ -149,6 +36,8 @@ <script src="<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>"></script> <script src="<%=resource%>/cbi.js"></script> <script src="<%=resource%>/xhr.js"></script> + + <% include("themes/bootstrap/json-menu") %> </head> <body class="lang_<%=luci.i18n.context.lang%> <% if node then %><%= striptags( node.title ) %><%- end %>" data-page="<%= table.concat(disp.context.requestpath, "-") %>"> @@ -156,7 +45,7 @@ <div class="fill"> <div class="container"> <a class="brand" href="#"><%=boardinfo.hostname or "?"%></a> - <% render_topmenu() %> + <ul class="nav" id="topmenu" style="display:none"></ul> <div class="pull-right"> <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()"> <span class="label success" id="xhr_poll_status_on"><%:Auto Refresh%> <%:on%></span> @@ -185,4 +74,4 @@ </div> </noscript> - <% if category then render_tabmenu(category, cattree) end %> + <div id="tabmenu" style="display:none"></div> diff --git a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/json-menu.htm b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/json-menu.htm new file mode 100644 index 0000000000..b38406f65a --- /dev/null +++ b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/json-menu.htm @@ -0,0 +1,119 @@ +<script type="text/javascript"> + (function() { + function get_children(node) { + var children = []; + + for (var k in node.children) { + if (!node.children.hasOwnProperty(k)) + continue; + + if (!node.children[k].satisfied) + continue; + + if (!node.children[k].hasOwnProperty('title')) + continue; + + children.push(Object.assign(node.children[k], { name: k })); + } + + return children.sort(function(a, b) { + return ((a.order || 1000) - (b.order || 1000)); + }); + } + + function render_tabmenu(tree, url, level) { + var container = document.querySelector('#tabmenu'), + ul = E('ul', { 'class': 'tabs' }), + children = get_children(tree), + activeNode = null; + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[3 + (level || 0)] == children[i].name), + activeClass = isActive ? ' active' : '', + className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); + + ul.appendChild(E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] )])); + + if (isActive) + activeNode = children[i]; + } + + if (ul.children.length == 0) + return E([]); + + container.appendChild(ul); + container.style.display = ''; + + if (activeNode) + render_tabmenu(activeNode, url + '/' + activeNode.name, (level || 0) + 1); + + return ul; + } + + function render_mainmenu(tree, url, level) { + var ul = level ? E('ul', { 'class': 'dropdown-menu' }) : document.querySelector('#topmenu'), + children = get_children(tree); + + if (children.length == 0 || level > 1) + return E([]); + + for (var i = 0; i < children.length; i++) { + var submenu = render_mainmenu(children[i], url + '/' + children[i].name, (level || 0) + 1), + subclass = (!level && submenu.firstElementChild) ? 'dropdown' : null, + linkclass = (!level && submenu.firstElementChild) ? 'menu' : null, + linkurl = submenu.firstElementChild ? '#' : L.url(url, children[i].name); + + var li = E('li', { 'class': subclass }, [ + E('a', { 'class': linkclass, 'href': linkurl }, [ _(children[i].title) ]), + submenu + ]); + + ul.appendChild(li); + } + + ul.style.display = ''; + + return ul; + } + + function render_modemenu(tree) { + var ul = document.querySelector('#modemenu'), + children = get_children(tree); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + ul.appendChild(E('li', { 'class': isActive ? 'active' : null }, [ + E('a', { 'href': L.url(children[i].name) }, [ _(children[i].title) ]), + ' ', + E('span', { 'class': 'divider' }, [ '|' ]) + ])); + + if (isActive) + render_mainmenu(children[i], children[i].name); + } + + if (ul.children.length > 1) + ul.style.display = ''; + } + + document.addEventListener('luci-loaded', function(ev) { + var tree = <%= luci.http.write_json(luci.dispatcher.context.authsession and luci.dispatcher.menu_json() or {}) %>, + node = tree, + url = ''; + + render_modemenu(tree); + + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) + render_tabmenu(node, url); + } + }); + })(); +</script> diff --git a/themes/luci-theme-material/htdocs/luci-static/material/js/script.js b/themes/luci-theme-material/htdocs/luci-static/material/js/script.js index 755191f335..ae39d00751 100755 --- a/themes/luci-theme-material/htdocs/luci-static/material/js/script.js +++ b/themes/luci-theme-material/htdocs/luci-static/material/js/script.js @@ -18,6 +18,7 @@ * Licensed to the public under the Apache License 2.0 */ +document.addEventListener('luci-loaded', function(ev) { (function ($) { $(".main > .loading").fadeOut(); @@ -216,3 +217,4 @@ } })(jQuery); +}); diff --git a/themes/luci-theme-material/luasrc/view/themes/material/footer.htm b/themes/luci-theme-material/luasrc/view/themes/material/footer.htm index 544866ddee..2f9f096bc1 100644 --- a/themes/luci-theme-material/luasrc/view/themes/material/footer.htm +++ b/themes/luci-theme-material/luasrc/view/themes/material/footer.htm @@ -18,27 +18,11 @@ Licensed to the public under the Apache License 2.0 -%> -<% - local ver = require "luci.version" - local disp = require "luci.dispatcher" - local request = disp.context.path - local category = request[1] - local tree = disp.node() - local categories = disp.node_childs(tree) -%> +<% local ver = require "luci.version" %> </div> <footer class="mobile-hide"> <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> / <%= ver.distversion %> - <% if #categories > 1 then %> - <ul class="breadcrumb pull-right" id="modemenu"> - <% for i, r in ipairs(categories) do %> - <li<% if request[1] == r then %> class="active"<%end%>> - <a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> - <span class="divider">|</span> - </li> - <% end %> - </ul> - <% end %> + <ul class="breadcrumb pull-right" id="modemenu" style="display:none"></ul> </footer> </div> </div> diff --git a/themes/luci-theme-material/luasrc/view/themes/material/header.htm b/themes/luci-theme-material/luasrc/view/themes/material/header.htm index 76eeec05eb..5595b14e49 100644 --- a/themes/luci-theme-material/luasrc/view/themes/material/header.htm +++ b/themes/luci-theme-material/luasrc/view/themes/material/header.htm @@ -26,135 +26,10 @@ local boardinfo = util.ubus("system", "board") - local request = disp.context.path - local request2 = disp.context.request - - local category = request[1] - local cattree = category and disp.node(category) - - local leaf = request2[#request2] - - local tree = disp.node() local node = disp.context.dispatched - local categories = disp.node_childs(tree) - - local c = tree - local i, r - - -- tag all nodes leading to this page - for i, r in ipairs(request) do - if c.nodes and c.nodes[r] then - c = c.nodes[r] - c._menu_selected = true - end - end - -- send as HTML5 http.prepare_content("text/html") - - local function nodeurl(prefix, name, query) - local u = url(prefix, name) - if query then - u = u .. http.build_querystring(query) - end - return pcdata(u) - end - - local function render_tabmenu(prefix, node, level) - if not level then - level = 1 - end - - local childs = disp.node_childs(node) - if #childs > 0 then - if level > 2 then - write('<ul class="tabs">') - end - - local selected_node - local selected_name - local i, v - - for i, v in ipairs(childs) do - local nnode = node.nodes[v] - if nnode._menu_selected then - selected_node = nnode - selected_name = v - end - - if level > 2 then - write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{ - v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', - nodeurl(prefix, v, nnode.query), - striptags(translate(nnode.title)) - }) - end - end - - if level > 2 then - write('</ul>') - end - - if selected_node then - render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) - end - end - end - - local function render_submenu(prefix, node) - local childs = disp.node_childs(node) - if #childs > 0 then - write('<ul class="slide-menu">') - - for i, r in ipairs(childs) do - local nnode = node.nodes[r] - local title = striptags(translate(nnode.title)) - - write('<li><a data-title="%s" href="%s">%s</a></li>' %{ - title, - nodeurl(prefix, r, nnode.query), - title - }) - end - - write('</ul>') - end - end - - local function render_topmenu() - local childs = disp.node_childs(cattree) - if #childs > 0 then - write('<ul class="nav">') - - for i, r in ipairs(childs) do - local nnode = cattree.nodes[r] - local grandchildren = disp.node_childs(nnode) - - if #grandchildren > 0 then - local title = striptags(translate(nnode.title)) - - write('<li class="slide"><a class="menu" data-title="%s" href="#">%s</a>' %{ - title, - title - }) - - render_submenu(category .. "/" .. r, nnode) - write('</li>') - else - local title = striptags(translate(nnode.title)) - - write('<li><a data-title="%s" href="%s">%s</a></li>' %{ - title, - nodeurl(category, r, nnode.query), - title - }) - end - end - - write('</ul>') - end - end -%> <!DOCTYPE html> <html lang="<%=luci.i18n.context.lang%>"> @@ -180,6 +55,134 @@ <script src="<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>"></script> <script src="<%=resource%>/cbi.js"></script> <script src="<%=resource%>/xhr.js"></script> + <script type="text/javascript">//<![CDATA[ + (function() { + function get_children(node) { + var children = []; + + for (var k in node.children) { + if (!node.children.hasOwnProperty(k)) + continue; + + if (!node.children[k].satisfied) + continue; + + if (!node.children[k].hasOwnProperty('title')) + continue; + + children.push(Object.assign(node.children[k], { name: k })); + } + + return children.sort(function(a, b) { + return ((a.order || 1000) - (b.order || 1000)); + }); + } + + function render_mainmenu(tree, url, level) { + var l = (level || 0) + 1, + ul = E('ul', { 'class': level ? 'slide-menu' : 'nav' }), + children = get_children(tree); + + if (children.length == 0 || l > 2) + return E([]); + + for (var i = 0; i < children.length; i++) { + var submenu = render_mainmenu(children[i], url + '/' + children[i].name, l), + hasChildren = submenu.children.length; + + ul.appendChild(E('li', { 'class': hasChildren ? 'slide' : null }, [ + E('a', { + 'href': hasChildren ? '#' : L.url(url, children[i].name), + 'class': hasChildren ? 'menu' : null, + 'data-title': hasChildren ? null : _(children[i].title), + }, [ _(children[i].title) ]), + submenu + ])); + } + + if (l == 1) { + var container = document.querySelector('#mainmenu'); + + container.appendChild(ul); + container.style.display = ''; + } + + return ul; + } + + function render_modemenu(tree) { + var ul = document.querySelector('#modemenu'), + children = get_children(tree); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + ul.appendChild(E('li', {}, [ + E('a', { + 'href': L.url(children[i].name), + 'class': isActive ? 'active' : null + }, [ _(children[i].title) ]) + ])); + + if (isActive) + render_mainmenu(children[i], children[i].name); + } + + if (ul.children.length > 1) + ul.style.display = ''; + } + + function render_tabmenu(tree, url, level) { + var container = document.querySelector('#tabmenu'), + l = (level || 0) + 1, + ul = E('ul', { 'class': 'tabs' }), + children = get_children(tree), + activeNode = null; + + if (children.length == 0) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l + 2] == children[i].name), + activeClass = isActive ? ' active' : '', + className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); + + ul.appendChild(E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] ) + ])); + + if (isActive) + activeNode = children[i]; + } + + container.appendChild(ul); + container.style.display = ''; + + if (activeNode) + container.appendChild(render_tabmenu(activeNode, url + '/' + activeNode.name, l)); + + return ul; + } + + document.addEventListener('luci-loaded', function(ev) { + var tree = <%= luci.http.write_json(luci.dispatcher.context.authsession and luci.dispatcher.menu_json() or {}) %>, + node = tree, + url = ''; + + render_modemenu(tree); + + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) + render_tabmenu(node, url); + } + }); + })(); + //]]></script> </head> <body class="lang_<%=luci.i18n.context.lang%> <% if node then %><%= striptags( node.title ) %><% end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>" data-page="<%= table.concat(disp.context.requestpath, "-") %>"> <header> @@ -199,9 +202,7 @@ </header> <div class="main"> <div style="" class="loading"><span><div class="loading-img"></div><%:Collecting data...%></span></div> - <div class="main-left"> - <% render_topmenu() %> - </div> + <div class="main-left" id="mainmenu" style="display:none"></div> <div class="main-right"> <div class="darkMask"></div> <div id="maincontent"> @@ -223,4 +224,4 @@ </div> </noscript> - <% if category then render_tabmenu(category, cattree) end %> + <div id="tabmenu" style="display:none"></div> diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css index faaaf220a1..fbe6b9e0b9 100644 --- a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css +++ b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css @@ -1017,6 +1017,10 @@ ul.cbi-tabmenu { border-bottom: 1px solid #bbb; } +#tabmenu > ul.cbi-tabmenu { + margin: 0 !important; +} + ul.cbi-tabmenu li { display: inline-flex; margin: 0 5px -1px 0; diff --git a/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm index fbe030d18c..9754e8b612 100644 --- a/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm +++ b/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm @@ -15,116 +15,9 @@ local loadinfo = sysinfo.load or { 0, 0, 0 } local boardinfo = util.ubus("system", "board") or { } - local request = disp.context.path - local request2 = disp.context.request - - local category = request[1] - local cattree = category and disp.node(category) - - local leaf = request2[#request2] - - local tree = disp.node() local node = disp.context.dispatched - local categories = disp.node_childs(tree) - - local c = tree - local i, r - - -- tag all nodes leading to this page - for i, r in ipairs(request) do - if c.nodes and c.nodes[r] then - c = c.nodes[r] - c._menu_selected = true - end - end - http.prepare_content("application/xhtml+xml") - - local function nodeurl(prefix, name, query) - local u = url(prefix, name) - if query then - u = u .. http.build_querystring(query) - end - return pcdata(u) - end - - local function render_menu(prefix, node, level) - if not level then - level = 1 - end - - local childs = disp.node_childs(node) - if #childs > 0 then - write('<ul class="mainmenu l%d">' % level) - - local i, v - for i, v in ipairs(childs) do - local nnode = node.nodes[v] - - write('<li class="mainmenu-item-%s %s"><a href="%s">%s</a>' %{ - v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'selected' or '', - nodeurl(prefix, v, nnode.query), - striptags(translate(nnode.title)) - }) - - if level < 2 then - render_menu(prefix .. "/" .. v, nnode, level + 1) - end - - write('</li>') - end - - write('</ul>') - end - end - - local function render_tabmenu(prefix, node, level) - if not level then - level = 1 - end - - local childs = disp.node_childs(node) - if #childs > 0 then - if level > 2 then - if level == 3 then - write('<div id="tabmenu">') - end - write('<ul class="cbi-tabmenu">') - end - - local selected_node - local selected_name - local i, v - - for i, v in ipairs(childs) do - local nnode = node.nodes[v] - if nnode._menu_selected then - selected_node = nnode - selected_name = v - end - - if level > 2 then - write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{ - v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'cbi-tab' or '', - nodeurl(prefix, v, nnode.query), - striptags(translate(nnode.title)) - }) - end - end - - if level > 2 then - write('</ul>') - if level == 3 then - write('</div>') - end - end - - if selected_node then - render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) - end - end - end -%> <?xml version="1.0" encoding="utf-8"?> @@ -145,45 +38,153 @@ <script type="text/javascript" src="<%=resource%>/cbi.js"></script> <script type="text/javascript" src="<%=resource%>/xhr.js"></script> <script type="text/javascript">//<![CDATA[ - document.addEventListener('DOMContentLoaded', function() { - var event = ('ontouchstart' in window) ? 'touchstart' : 'click'; + (function() { + function get_children(node) { + var children = []; - document.querySelectorAll('ul.mainmenu.l1 > li > a').forEach(function(a) { - a.addEventListener(event, function(ev) { - var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling; + for (var k in node.children) { + if (!node.children.hasOwnProperty(k)) + continue; - document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) { - if (li !== a.parentNode) - li.classList.remove('active'); - }); + if (!node.children[k].satisfied) + continue; - if (!ul2) - return; + if (!node.children[k].hasOwnProperty('title')) + continue; - if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth) - ul2.classList.add('align-left'); + children.push(Object.assign(node.children[k], { name: k })); + } - ul1.classList.add('active'); - a.parentNode.classList.add('active'); - a.blur(); + return children.sort(function(a, b) { + return ((a.order || 1000) - (b.order || 1000)); + }); + } + + function handle_mainmenu_expand(ev) { + var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling; - ev.preventDefault(); - ev.stopPropagation(); + document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) { + if (li !== a.parentNode) + li.classList.remove('active'); }); - }); - document.addEventListener(event, function(ev) { - var t = ev.target; + if (!ul2) + return; + + if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth) + ul2.classList.add('align-left'); - while (t && t.id != 'mainmenu') - t = t.parentNode; + ul1.classList.add('active'); + a.parentNode.classList.add('active'); + a.blur(); - if (!t) - document.querySelectorAll('ul.mainmenu > li.active').forEach(function(li) { - li.classList.remove('active'); - }); + ev.preventDefault(); + ev.stopPropagation(); + } + + function render_mainmenu(tree, url, level) { + var l = (level || 0) + 1, + ul = E('ul', { 'class': 'mainmenu l%d'.format(l) }), + children = get_children(tree); + + if (children.length == 0 || l > 2) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l] == children[i].name), + activeClass = 'mainmenu-item-%s%s'.format(children[i].name, isActive ? ' selected' : ''); + + ul.appendChild(E('li', { 'class': activeClass }, [ + E('a', { + 'href': L.url(url, children[i].name), + 'click': (l == 1) ? handle_mainmenu_expand : null, + }, [ _(children[i].title) ]), + render_mainmenu(children[i], url + '/' + children[i].name, l) + ])); + } + + if (l == 1) { + var container = document.querySelector('#mainmenu'); + + container.appendChild(ul); + container.style.display = ''; + } + + return ul; + } + + function render_modemenu(tree) { + var ul = document.querySelector('#modemenu'), + children = get_children(tree); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + ul.appendChild(E('li', {}, [ + E('a', { + 'href': L.url(children[i].name), + 'class': isActive ? 'active' : null + }, [ _(children[i].title) ]) + ])); + + if (isActive) + render_mainmenu(children[i], children[i].name); + } + + if (ul.children.length > 1) + ul.style.display = ''; + } + + function render_tabmenu(tree, url, level) { + var container = document.querySelector('#tabmenu'), + l = (level || 0) + 1, + ul = E('ul', { 'class': 'cbi-tabmenu' }), + children = get_children(tree), + activeNode = null; + + if (children.length == 0) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l + 2] == children[i].name), + activeClass = isActive ? ' cbi-tab' : '', + className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); + + ul.appendChild(E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] ) + ])); + + if (isActive) + activeNode = children[i]; + } + + container.appendChild(ul); + container.style.display = ''; + + if (activeNode) + container.appendChild(render_tabmenu(activeNode, url + '/' + activeNode.name, l)); + + return ul; + } + + document.addEventListener('luci-loaded', function(ev) { + var tree = <%= luci.http.write_json(luci.dispatcher.context.authsession and luci.dispatcher.menu_json() or {}) %>, + node = tree, + url = ''; + + render_modemenu(tree); + + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) + render_tabmenu(node, url); + } }); - }); + })(); //]]></script> <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title> </head> @@ -207,24 +208,16 @@ </span> </div> -<% if #categories > 1 then %> - <ul id="modemenu"> - <% for i, r in ipairs(categories) do %> - <li><a<% if request[1] == r then %> class="active"<%end%> href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a></li> - <% end %> - </ul> -<% end %> +<ul id="modemenu" style="display:none"></ul> <div class="clear"></div> </div> <div id="maincontainer"> - <div id="mainmenu"> - <% if category then render_menu(category, cattree) end %> - </div> + <div id="mainmenu" style="display:none"></div> <div id="maincontent"> - <% if category then render_tabmenu(category, cattree) end %> + <div id="tabmenu" style="display:none"></div> <noscript> <div class="alert-message warning"> |